www.mikrocontroller.net

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


Autor: Olli R. (downunderthunder42)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olli R. (downunderthunder42)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der müsste eigentlich schon laufen.
Aber deine ISR ist noch fehlerhaft.

: Wiederhergestellt durch Moderator
Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
timer0_shift:
       dec    temp4         ; dekrementiert die Zählvariable
       brne   timer0_shift_1
       rcall  lcd_shift_left
       ldi    temp4, 7
timer0_shift_1:
           reti

Autor: Olli R. (downunderthunder42)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olli R. (downunderthunder42)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olli R. (downunderthunder42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok jetzt ist das auch so klar.
Schließlich wird vorher nur geprüft, ob das letzte Ergebnis "0" war.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.