RoboterCC - Robotic Code Compiler
Forum Roboter.CC Webseite Fragen und Probleme GFX.H

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Banner

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7433 private projects
  • 378 public projects
  • 16180353 lines compiled
  • 58212 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
Fragen und Probleme zur Roboter.CC-Plattform können hier diskutiert werden.
  • Seite:
  • 1
  • 2

THEMA: GFX.H

GFX.H 12 Jahre 1 Monat her #888

  • Egon
  • Egons Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 316
Hallo

Ich habe da mal ein paar Fragen zur gfx.h:

1.) GFX.H: dieser Teil stellt Funktionen zur Textausgabe auf dem Grafikdisplay zur Verfügung. Alle Funktionen arbeiten blockierend, das heisst sie kehren erst zurück wenn die Daten übertragen wurden - was bedeutet das für eine timer-isr? Ich habe einen Zähler, der alle 1ms eine timer-isr aufruft - wird diese timer-isr "gestoppt", während die Textausgabe erfolgt oder zählt der Zähler dennoch weiter?

Beispiel: zaehler3_t2 wird alle 1ms per ISR (ISR(TIMER2_COMP_vect) um 1 incrementiert - passiert dies auch während der Textausgabe (diese arbeitet ja blockiert)?

while((zaehler3_t2 < zeit1) &&(merker_S3==0)){ /* Countdown ...*/
if(!get_input_bit(IO_INPUT_1)) merker_S3 = 1; /* S3 gedrueckt -> IO_INPUT_1 = 0! */
sprintf(text, "Restzeit: [%i] sek", (int)(zeit1 - zaehler3_t2)/1000);
gfx_move(5, 30);
gfx_print_text(text);
}
wenn zaehler3_t2 weiter zählt - ok, kein Problem; wenn zaehler3_t2 aber blockiert ist, zählt er nicht weiter => Zeit stimmt nicht mehr...

2.) was bedeuted GFX_DM_JAM1 = 0, GFX_DM_JAM2 = 1, GFX_DM_COMP = 2, GFX_DM_JAM1_INV = 4, GFX_DM_JAM2_INV = 5, GFX_DM_COMP_INV = 6? Dass es ein enum ist, ist schon klar, aber was haben die einzelnen Werte zu bedeuten?


@workwind - vielleicht kannst Du da mal was dazu sagen..

mfg

Egon
lokalisieren, eliminieren, Vollzug melden
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: GFX.H 12 Jahre 1 Monat her #889

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hallo Egon,

1.) die Interrupts laufen natürlich weiter - das ist ja der Zweck der IRQs....
zaehler3_t2 sollte dabei als "volatile uint8_t" deklariert sein - ansonsten kommt es zu Problemen:
  • Die Variable muss volatile deklariert werden, da der Compiler ansonsten davon ausgeht, dass die globale Variable sich in der while Schleife nicht verändern kann
  • Die Variable muss ein Byte gross sein, da sich ansonsten der "halbe Wert" (bei 16 Bit) durch einen IRQ ändern kann.
2.) Verschiedene Zeichenmodi, zBsp. ob nur der Vordergrund(schwarz) oder ob auch der Hintergrund(weiss) gezeichnet werden soll. Die genauen Werte muss ich erst raussuchen...
Letzte Änderung: 12 Jahre 1 Monat her von workwind.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: GFX.H 12 Jahre 1 Monat her #890

  • Egon
  • Egons Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 316
Hallo workwind

Vielen Dank für Deine rasche Antwort!

Ich habe die Variable zaehler3_t2 zwar als volatile deklariert ;) , aber als uint16_t => ich muss also meine Zähler-ISR etwas anders machen - zaehler3_t2 als uint8_t (=> Stichwort "atomar") und mit einem 2ten "Hilfszähler" arbeiten, der auch als uint8_t deklariert ist...

Da hab' ich echt Mist gemacht...

Egon
lokalisieren, eliminieren, Vollzug melden
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: GFX.H 12 Jahre 1 Monat her #891

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hier ein Codeschnipsel bei dem der gcc automatisch (per ATOMIC_BLOCK(ATOMIC_RESTORESTATE)-Macro) die IRQs sperrt, auf die 16 Bit Variable zugreift und danach den ursprünglichen Zustand wiederherstellt....
Das ganze noch in einer .h Datei, damit der Optimizer für den Zugriff keine Funktion generiert sondern die Routine inline macht!

Dokumentation zu atomic.h:
www.nongnu.org/avr-libc/user-manual/group__util__atomic.html
#include <util/atomic.h>

extern volatile int16_t acquisition_val[8];
 
static inline int16_t acquisition_getValue(uint8_t idx) {
  int16_t result;
  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
    result = acquisition_val[idx];
  }
  return result;
}
Letzte Änderung: 12 Jahre 1 Monat her von workwind.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: GFX.H 12 Jahre 1 Monat her #895

  • Egon
  • Egons Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 316
Hallo workwind

Vielen Dank für den Tipp, werde es bei mir einbauen - hatte schon Angst, daß ich keine 16Bit Variablen in einer ISR verwenden kann ;)

Egon
lokalisieren, eliminieren, Vollzug melden
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: GFX.H 12 Jahre 1 Monat her #907

  • Egon
  • Egons Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 316
Hallo workwind

Noch eine Frage - wenn ich im zyklischen Programm den zaehler3_t2 mit cli() und sei() aufrufe:

....
/*uint8_t temp = SREG;*/
cli(); /* sperr die Interrupts */
zaehler3_t2 = 2000; /*setze zaehler3_t2 auf 2000 */
sei(); /* gib die Interrupts wieder frei */
/*SREG = temp;*/
....
.....

damit werden doch auch die Interrupts gesperrt, und der zaehler3_t2 (der ja in einer ISR hochgezählt wird) wird dennoch korrekt geändert - oder sehe ich das falsch?

Egon
lokalisieren, eliminieren, Vollzug melden
Der Administrator hat öffentliche Schreibrechte deaktiviert.
  • Seite:
  • 1
  • 2
Ladezeit der Seite: 0.065 Sekunden

Werbung