Dann nochmal als Fließtext. In Deiner Interrupt-Routine zählst Du eine Variable hoch. Abhängig von deren Wert kannst Du jetzt zu bestimmten Zeiten, die ein Vielfaches von 25 us sind, weitere Routinen ausführen.
Das ist kein C, irgendein Pseudo-Code eben. Ersetzte einfach IF-THEN-ELSE durch wenn-dann-sonst, da setzt du dann deine Tests und bedingten Sprünge rein.
Das nach Assembler codieren oder C oder Basic oder Ada oder was auch immer ist doch kein Thema mehr, wenn man weiß, was zu tun ist.
Du machst eben das, was zu tun ist nicht jedes mal sondern nur jedes 3. mal und anstatt bei 25µs bist du bei 3·25µs=75µs. Noch einfacher erklären geht nun echt nicht...
Disclaimer: none. Sue me.
Dann nochmal als Fließtext. In Deiner Interrupt-Routine zählst Du eine Variable hoch. Abhängig von deren Wert kannst Du jetzt zu bestimmten Zeiten, die ein Vielfaches von 25 us sind, weitere Routinen ausführen.
Aus dir machen wir schon noch nen Softwareking!
Also nochmal:
Wir betreiben jetzt 3 LEDs.
LED1: 25ms ein...25ms aus.
LED2: 50ms ein...50ms aus.
LED3: 75ms ein...75ms aus.
Also machen wir uns drei Variablen. Für jede LED eine:
LED1: irq_25ms
LED2: irq_50ms
LED3: irq_75ms
Der kleinste gemeinsame Teiler ist 25ms. Also stellen wir den TIMER0 zB so ein, dass er alle 25ms eine Interruptrutine ausführt.
START der Interruptrutine {
WENN irq_25ms GLEICH 25ms IST, DANN: Setze irq_25ms auf 0 Zurück ANSONSTEN zähle irq_25ms um 25ms hoch.
WENN irq_50ms GLEICH 50ms IST, DANN: Setze irq_50ms auf 0 Zurück ANSONSTEN zähle irq_50ms um 25ms hoch.
WENN irq_75ms GLEICH 75ms IST, DANN: Setze irq_70ms auf 0 Zurück ANSONSTEN zähle irq_75ms um 25ms hoch.
}ENDE
Das war jetzt die Funktion, die der Timer alle 25ms ausführt!
In dieser Funktion, welche alle 25ms ausgeführt wird, wird jede Variable um 25ms hochgezählt. Wenn sie ihr maximum erreicht haben, setzt man wie wieder auf 0! Sie werden NUR von der Timer-Routine beeinflusst!!!
Im Hauptprogramm untersucht man jetzt diese Variablen:
WENN irq_25ms GLEICH 25ms IST, DANN verändere LED1
WENN irq_50ms GLEICH 50ms IST, DANN verändere LED2
WENN irq_75ms GLEICH 75ms IST, DANN verändere LED3
Gruß,
Franz
Um auf das im Hauptprogramm noch genauer einzugehen:
WENN irq_25ms GLEICH 25ms IST, DANN SCHAUE OB LED1 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
WENN irq_50ms GLEICH 50ms IST, DANN SCHAUE OB LED2 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
WENN irq_75ms GLEICH 75ms IST, DANN SCHAUE OB LED3 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
Gruß,
Franz
wie soll ich 25ms vegleichen?? oder 50ms oder 75 ms???
soll ich den Timer abfragen?
MFG
Michael
Die Variablen frägst du ab! Die Timer-Interrupt-routine aktualisiert sie!!!Das war jetzt die Funktion, die der Timer alle 25ms ausführt!
In dieser Funktion, welche alle 25ms ausgeführt wird, wird jede Variable um 25ms hochgezählt. Wenn sie ihr maximum erreicht haben, setzt man wie wieder auf 0! Sie werden NUR von der Timer-Routine beeinflusst!!!
Das läuft alles völlig im hintergrund!
Du musst nur noch beobachten, wann eine dieser Variablen den maximalen wert annimmt!
Und wenn das der Fall ist, dann veränderst die LED!!!
Um auf das im Hauptprogramm noch genauer einzugehen:
WENN irq_25ms GLEICH 25ms IST, DANN SCHAUE OB LED1 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
WENN irq_50ms GLEICH 50ms IST, DANN SCHAUE OB LED2 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
WENN irq_75ms GLEICH 75ms IST, DANN SCHAUE OB LED3 AN IST: WENN JA, MACH SIE AUS, WENN NEIN, MACH SIE AN!
Gruß,
Franz
Ich weiß nicht wie ich dass in assembler richtig schreibe!
Ich verstehe dich jetzt ganz gut.
MFG
Michael
Hm.. mit assembler kenn i ich mich nicht aus...
Evtl steigst du ja auf C um.... Ich denke das lohnt sich![]()
Gruß,
Franz
Gibts hier irgendwo im internet eine seit wo c programmieren beschrieben ist für assembler? Wenn ja welche?
MFG
Michael
O man, das ist jetzt echt lustig hier...
Assembler...
zuerst machen wir uns einen "Merker"
jetzt ein Interrupt, der sagenwirmal alle 25 mS aufgeführt wird.Code:.equ LED2 = 0 .def Merkerregister = R17 .. .. .. clr Merkerregister
Code:interrupt: ... ... ... sbrc Merkerregister,LED2 rjmp led2sollleuchten sbr Merkerregister,(1<<LED2) rjmp zweiteled led2sollleuchten: cbr Merkerregister,(1<<LED2) sbic PORTB,PB2 rjmp led2sollleuchten_ sbi PORTB,PB2 rjmp zweiteled led2sollleuchten_: cbi PORTB,PB2 zweiteled: sbic PORTB,PB1 rjmp zweiteled_ sbi PORTB,PB1 rjmp fertig zweiteled_: cbi PORTB,PB1 fertig_: ... ... reti
So in etwa PB2 wird nur jeden zweiten durchgang getoggelt, alle 50 mS und PB1 wird bei jedem Durchgang umgeschaltet...
Bedenke daß es nur ein Pseudocode ist.
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Lesezeichen