mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zum Timer1


Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich mochte einen 8-Stunden Timer programmieren. Ich habe berechenet das 
ich mit Timer 1 beim größten Vorteiler (1024) 1717 Overflows durchlaufe. 
Jetzt wollte ich fragen ob folgender Code richtig ist, oder ob es da 
noch was einfacheres oder "eleganteres" gibt, auf 1717 zu zählen.
Die grundeinstellungen (PORT, TIMER, Interrupt-Org.) hab ich jetzt mal 
nicht mitkopiert, weil hier gibts ja keine Probleme:

  
    ldi    r17, 101
    ldi    r18, 17

    rjmp  loop

  
  loop:
    rjmp   loop   

  
  timer1_overflow:

    cpi    r17, 0
    breq  loop2
    dec    r17
    
    rjmp  loop

  
  loop2:
  
    ldi    r17, 101
    cpi    r18, 0
    breq  loop3
    dec    r18
    
    rjmp   loop

  loop3:

    ldi    temp, 0b11111110
    out   PORTD, temp

    rjmp   loop

Vielen Dank

Flo

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es wirklich so schwer, bei einer Anfrage zu schreiben, um welchen 
verd***ten Controller es geht? Wozu steht das eigentlich in den 
Forenregeln drin?

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung,

aber ich dachte, das bei dieser Fragestellung die µc auswahl nachrangig 
wär. Aber um die Gemüter zu Befriedigen:

 ATmega 16


MfG Flo

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo wrote:
> aber ich dachte, das bei dieser Fragestellung die µc auswahl nachrangig
> wär.
Klar, deshalb gibt's ja so viele Typen von µCs, eben weil die alle 
gleich sind...

Dein Codeschnipsel lässt mich allerdings ahnen, dass in dem /nicht 
gezeigten/ Teil Deines Programmes etwas ganz wichtiges steckt, das zu 
einem vermutlichen generellen Nichtfunktionieren des Codes führt. Wer 
oder was ruft eigentlich die Marke timer1_overflow auf? Wenn das mit 
einem (r)call geschieht, wo ist dann das ret(i)? Also poste bitte den 
kompletten Code (wenn er etwas länger ist, bitte als Anhang, und zwar 
als .asm-Datei und nicht als .txt oder so).

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code ist falsch:

Es kann nicht sein, dass eine ISR (timer1_overflow) ohne RETI da steht. 
Du hast mit RJMP loop eine klassische Endlosschleife *in der 
Interruptroutine*

Und:

> Die grundeinstellungen (PORT, TIMER, Interrupt-Org.) hab ich jetzt mal
> nicht mitkopiert, weil hier gibts ja keine Probleme

DAS hätte ich nicht gemacht.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. wrote:
> Der Code ist falsch:
>
> Es kann nicht sein, dass eine ISR (timer1_overflow) ohne RETI da steht.
Naja, von Interrupt sehe ich da oben erstmal gar nichts (bis auf den 
Kommentar im zweiten Posting). In dem Kontext ist timer1_overflow 
zunächst nur eine Marke. Deshalb auch meine obige Nachfrage...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Muss man relativieren. Der Code ist sehr sehr wahrscheinlich 
falsch.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. wrote:
> Stimmt. Muss man relativieren. Der Code ist sehr sehr wahrscheinlich
> falsch.
Yep. Es ist auch immer wieder erstaunlich, dass viele erstens 
hellseherische Fähigkeiten bei anderen voraussetzen und v.a. 
genialerweise den Fehler schon auf ein paar Zeilen eingrenzen können. 
Der Rest vom Code ist dann ja total uninteressant...




Typ1: "Ich war letztens bei einer Hellseherin."
Typ2: "Und, wie war's?"
Typ1: "Naja, als ich geklingelt hatte, hat sie gerufen 'Wer ist da?' Da 
bin ich direkt wieder gegangen..."

Autor: Flo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang mal die Vorläufige Version....

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht besser aus.

Ein 16-bit Zähler (r17, r18) wird mit der Anzahl der Überläufe gefüllt, 
die dann pro Overflow um eins runtergezählt wird. Wenn der Zähler auf 0 
steht, wird die Aktion im ISR ausgelöst.

Wenn es eine kurze Aktion wie hier ist, kann man das so machen. Wenn es 
eine längere Aktion (LCD-Ausgabe, ADC-Messung...) ist, sollte man die 
Aktion in der Hauptschleife loop: ... jrmp loop durchführen.

Der Timer läuft nach dem ersten Anspringen nach 8 h übrigens nicht 
initialisiert weiter, d.h. nach der Aktion sollte man den Zähler 
entweder neu initialisieren oder den Timer abschalten (disablen).

Timerinitialisierungen mit absoluten Bitwerten kontrolliere ich 
prinzipiell nicht.

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.