Hallo ich habe folgendes Problem: Ich wollte einen String, der auf einem LCD ausgegeben wird, auf dem Display verschieben. Mein Überlegung ging dahin einen Timer hierfür zu verwenden, da es bestimmte keine Sinn macht dort mit "delays" zu arbeiten. (ein solches Programm habe ich ja schon zum Laufen gebracht--> leider ist dann die CPU immer oft in diesen delays) Also wollte ich nun den Timer0 des "ATmega8" verwenden. -Ich habe den Vorteiler auf 1024 gestellt --> ldi temp4, ( 1 << CS02 ) | ( 1 << CS01 ) | ( 1 << CS00 ) ;setze den Vorteiler des Timers auf 1024 out TCCR0, temp4 ; ein Interrupt wird nun 15mal pro Sekunde ausgelöst 4MHz/1024/25 den TimerInterrupt im TIMSK aktivert --> ldi temp4, 1 << TOIE0 ; TOIE0: Interrupt bei Timer0Overflow einschalten out TIMSK, temp4 Und Interrupts generell aktiviert --> sei Leider wird meine ISR gar nicht aufgerufen? Ist der Timer noch nicht aktiviert?
Olli R. schrieb: > -Ich habe den Vorteiler auf > 1024 gestellt --> > > ldi temp4, ( 1 << CS02 ) | ( 1 << CS01 ) | ( 1 << CS00 ) ;setze den > Vorteiler des Timers auf 1024 sieh dir nochmal im Datenblatt die Vorteilereinstellung an. Das ist kein Vorteiler von 1024. Das ist: externer Takt. Und da du den wahrscheinlich nicht haben wirst, läuft der Timer gar nicht.
Karl heinz Buchegger schrieb: >> ldi temp4, ( 1 << CS02 ) | ( 1 << CS01 ) | ( 1 << CS00 ) ;setze den >> Vorteiler des Timers auf 1024 > > sieh dir nochmal im Datenblatt die Vorteilereinstellung an. > Das ist kein Vorteiler von 1024. Ok Danke das war schon mal der erste Fehler richtig müsste es heißen ldi temp4, ( 1 << CS02 ) | ( 0 << CS01 ) | ( 1 << CS00 ) leider läuft der Timer noch immer nicht?
Der müsste eigentlich schon laufen. Aber deine ISR ist noch fehlerhaft.
:
Wiederhergestellt durch User
Der brsh ist falsch. Denn jede Zahl ist same or higher als 0 dec setzt das Zero-Flag, wenn 0 erreicht wird. Du brauchst es nur noch abfragen und springen
1 | timer0_shift: |
2 | dec temp4 ; dekrementiert die Zählvariable |
3 | brne timer0_shift_1 |
4 | rcall lcd_shift_left |
5 | ldi temp4, 7 |
6 | timer0_shift_1: |
7 | reti |
Karl heinz Buchegger schrieb: > Der brsh ist falsch. > > Denn jede Zahl ist same or higher als 0 Stimmt der brsh war falsch. Ich verwende jetzt brne und inkrementieren meinen Zähler statt ihn zu dekrementieren. Jetzt wird der Inhalt alle ca. 500ms nach einen weiter nach links verschoben. Danke, und endliche glaube ich den Timer immer besser zu verstehen ;) Ist es eigentlich normal, dass mir die Zeichen beim Schieben des Displayinhalts ein wnig so vorkommen als würden sie flackern?
Olli R. schrieb: > Ich verwende jetzt brne und inkrementieren meinen Zähler statt ihn zu > dekrementieren. Merk dir: Auf Assembler Ebene ist es meistens einfacher, wenn man decrementiert. Den ein dec beeinflusst die Flags. D.h. nach dem dec kannst du immer abfragen, ob du auf 0 gekommen bist oder nicht. Und zwar ohne dezidierten Compare. Wenn schon Assembler, dann auch richtig und unter Einsparung jeds unnötigen Taktzykluses. > Ist es eigentlich normal, dass mir die Zeichen beim Schieben des > Displayinhalts ein wnig so vorkommen als würden sie flackern? Keine Ahnung. Hab ich noch nie am LCD probiert. Könnte aber schon sein.
Karl heinz Buchegger schrieb: > Merk dir: Auf Assembler Ebene ist es meistens einfacher, wenn man > decrementiert. Den ein dec beeinflusst die Flags. D.h. nach dem dec > kannst du immer abfragen, ob du auf 0 gekommen bist oder nicht. Und zwar > ohne dezidierten Compare. Wenn schon Assembler, dann auch richtig und > unter Einsparung jeds unnötigen Taktzykluses. D.h. dekrementieren und dann dann welcher Befehl? - branch if Status Flag Cleared? (brbc) aber ansonsten werd ich mir das merken.
Ok jetzt ist das auch so klar. Schließlich wird vorher nur geprüft, ob das letzte Ergebnis "0" war.
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.