Forum: Mikrocontroller und Digitale Elektronik Timer0-Interrupt-Overflow für Schieben des LCD-Inhaltes verwenden!


von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

Der müsste eigentlich schon laufen.
Aber deine ISR ist noch fehlerhaft.

: Wiederhergestellt durch User
von Karl H. (kbuchegg)


Lesenswert?

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

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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
Noch kein Account? Hier anmelden.