Hallo, ich beginne erst mit der Programmierung von µC (atmega128) und habe eine Frage: Ich brauche eine Art Zeitbasis um verschiedene Dinge Zeitgesteuert ablaufen zu lassen. Das wären z.B. das Entprellen der Taster, das anwerfen und abfragen des ADCs in bestimmten Zeitabständen, irgendwas blinken lassen, etc. Lasse ich dazu einfach einen 16Bit Timer hochlaufen und nutze den CompareMatch oder Overflow Interrupt und zähle damit zyklisch eine globale Variable hoch, die ich dann an den vereizelten Stellen auf ihren Wert abfrage? Oder wie Stelle ic das am Besten an? Gesamtaufgabe: Einlesen von Analogen Werten über Zeitbereich (Oszilloskop-Funktion), Steuerung des Vorgangs über ein Tastenfeld und über die serielle (aus Windows, VB Programm), Übertragen der Werte an das VB Programm, Anzeige einer Trendkurve aus den Werten auf einem Farbdisplay 132x132, etc...
Quote:""Einlesen von Analogen Werten über Zeitbereich (Oszilloskop-Funktion)"" Das über den Timer machen, um da eine feste Zeitbasis zu bekommen, diese Sache ist zeitkritisch. Alles andere kann in einer freilaufenden Schleife abgearbeitet werden. Denn weder Tasten, noch Display oder serielle Übertragung sind zeitkritisch. Gruss Jadeclaw.
Ok, danke soweit. Aber ich hatte hier z.B. ein Programm zum Entprellen der Taster gesehen (Debounce - Bulletproof), da wurde ein Timer so verwendet das man einen "Takt" von 10ms erhält... Wie mache ich es ohne Timer? Im GCC Tutorial wird es über die delay.h gemacht, aber das blockiert ja wieder alles. Ist evtl. nicht schlimm, aber doch eher unschön, gerade wenn ich schnellen Code brauche um auch das Display schnell ansteuern zu können... Und vor allem generell: Was ist wenn ich viele Zeikritische Dinge habe? Immer für jede Aufgabe einen Timer? Wie ihr bemerkt bin ich mir generell nicht ganz sicher wie ich einen Timer sinnvoll einsetze. Einfaches Beispiel: Eine LED blinkt im sekundentakt, die andere alle 5 sekunden. Ich werfe nen Timer an und mache mit dem Interrupt was? Globale Variable hochzählen und diese im Mainprogramm abfagen um die LEDs passend blinken zu lassen? Abfragen auf Gleichheit (Könnte dann doch sein das der Timer schneller läuft als mein Main-Prog und somit die abgefagte Zahl schon wieder vorüber ist ohne erkannt worden zu sein, oder?)? Mein erster Versuch um zu schauen ob die Timer laufen war wie im Code unten, jetzt möchte ich halt schauen wie man die Dinger sinnvoll mit den Interrupts nutzt: int main(void) { uint8_t i; //Ausgang deklarieren DDRC = (1<<PC0) | (1<<PC7); //Ausgang rücksetzen PORTC = 0x00; //8-Bit Timer starten, Vorteiler 1024 TCCR0 |= (1<<CS02) | (1<<CS01) | (1<<CS00); //16-Bit Timer starten, Vorteiler 1024 TCCR1B |= (1<<CS12) | (1<<CS10); while(1) { //Endlosschleife i = 0; while (i < 10) { TCNT0 = 0x00; //Timer Reset while (TCNT0 < 200); i++; } PORTC = 0x80; i = 0; while (i < 10) { TCNT1L = 0x00; //Timer Reset L while (TCNT1L < 200); i++; } PORTC = 0x01; } return 0; }
Nee, das ist schon richtig mit dem Timer. Gesetzt den Fall, Du brauchst für andere Funktionen einen Millisekunden-Takt. Alle 20 ms willst Du die Taster abfragen. Also wird in dem "Millisekunden-Takt-Interrupt-Handler" (sinnvollerweise ein Compare Match Interrupt von einem Timer) eine Zählvariable inkrementiert und wenn diese den Wert 20 erreicht, werden die Taster eingelesen. Was die A/D-Wandler-Geschichte angeht: Wenn Du nicht zu 100% an den Mega128 gebunden bist, dann nimm lieber nen (pinkompatiblen) Mega1281 oder verwandtes. Die haben nämlich die Möglichkeit, den ADC per Auto Trigger zu starten, ohne dass das Programm noch eingreifen muss. Da kann man unterschiedliche Quellen auswählen (z.B. denselben Compare, mit dem man den Millisekunden-Takt erzeugt) und muss den ADC nicht per Software starten.
Zu deinen LED's! Setze diese einfach in dem Interrupt! Du kannst ja auch über Schleifen mehrere Variablen hochzählen und dir dann im Interrupt mehrere Timer selber basteln.
Ok, danke... Dann ist es ja so wie ich es mir gedacht habe. @Bastler: Das Progrämmchen oben war nur um zu schauen ob die Timer laufen... Und nun mache ich mich halt gerade mit den Interrupts vertraut... Beim UART war ich faul und habe Peter Fleurys lib genommen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.