mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-Tutorial Timer Beispiel auf attiny13


Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe das u.a. Beispiel aus dem Tutorial um eine Schleife erweitert, um 
ca. 1 Sekunde Blinkdauer zu erreichen. Im AVR Studio funktioniert die 
Simulation einwandfrei. Wenn ich das Programm auf den attiny13 flashe, 
blinkt bzw. flackert die LED mehr zufällig und unregelmäßig.
Ist das ein Problem im Programm, oder evtl. meinem Steckbrettaufbau?

Da ich mich erst seit ein paar Tagen mit der Materie beschäftige, bin 
ich für Hinweise dankbar.

Gruß
Thomas

PS. beim Statement ".org OVF0addr" habe ich auch nirgends einen Hinweis 
gefunden was OVF0addr heißt ...
.include "tn13def.inc"
 
.def tmp = r16
.def leds = r17
.def count = r18
 
.org 0x0000
        rjmp    main        ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow    ; Timer Overflow Handler
 
main:
        ldi     tmp, LOW(RAMEND)    ; Stackpointer initialisieren
        out     SPL, tmp
        
        ldi     tmp, 0xFF      ; Port B auf Ausgang
        out     DDRB, tmp
 
        ldi     leds, 0x00        
 
        ldi     tmp, 0b00000101    ; CS00 und CS02 setzen: Teiler 1024
        out     TCCR0B, tmp
 
        ldi     tmp, 0b00000010    ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK0, tmp
     
    
   
loop:   
    cpi count, 0x00
    sei              ; Interrupt erlauben      
    breq led    
    rjmp    loop
 
timer0_overflow:          ; Timer 0 Overflow Handler
    dec count          ; Zähler - 1
        ret

led:
        out     PORTB, leds
        com     leds        ; LED's umschalten
    ldi count, 7        ; Zähler setzen
    rjmp loop

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sichere mal in der ISR das SREG.
Dein SEI ist auch nicht im LOOP nötig, es reicht am Ende von MAIN, das 
ist aber nicht das primäre Problem. Dann solltest Du die ISR aber auch 
mit RETI abschließen, so wie sich das gehört.

Mehr habe ich auf die Schnelle nicht gefunden.

MfG, Bärli, blauer

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PS. beim Statement ".org OVF0addr" habe ich auch nirgends einen Hinweis
> gefunden was OVF0addr heißt ...

Den Hinweis findest Du, wenn Du Dir die entsprechende Include-Datei 
anschaust.

>   out     PORTB, leds
>   com     leds        ; LED's umschalten

Das ist zwar unlogisch (andersrum wär's logischer, erst invertieren, 
dann ausgeben), funktioniert aber trotzdem.

MfG, Heidel-Bär

Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sichere mal in der ISR das SREG.
> Dein SEI ist auch nicht im LOOP nötig, es reicht am Ende von MAIN, das
> ist aber nicht das primäre Problem. Dann solltest Du die ISR aber auch
> mit RETI abschließen, so wie sich das gehört.

SREG in ISR sichern ???
... da muß ich erst nochmal Doku lesen ...

Thomas

Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte jetzt vielleicht so aussehen?
timer0_overflow:          ; Timer 0 Overflow Handler
    in srsk,sreg
    dec count          ; Zähler - 1
    out sreg,srsk
        reti

Funktioniert in der Simulation jedenfalls immer noch, aber Register srsk 
bleibt dabei immer auf 0x00

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. wrote:
> SREG in ISR sichern ???

Jou, Dein Decrement beeinflusst die Flags im SREG. In der LOOP gibt's 
'nen bedingten Sprung (wenn Zero-Flag gesetzt ist), wenn Dein Int exakt 
zwischen CPI und BREQ zuschlägt, dann reagiert BREQ nicht mehr auf das 
Flagsetzen, von CPI sindern auf das der ISR (DEC). Dass Du auch noch SEI 
dazwischen gesetzt hast begünstigt dieses Verhalten noch (geringfügig).

> ... da muß ich erst nochmal Doku lesen ...

Gute Idee...

>
> Thomas

MfG, Heidelbär, blauer

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. wrote:
> Sollte jetzt vielleicht so aussehen?
>
>
> timer0_overflow:          ; Timer 0 Overflow Handler
>     in srsk,sreg
>     dec count          ; Zähler - 1
>     out sreg,srsk
>         reti
> 

Jou, genau so. Oder so ähnlich.

>
> Funktioniert in der Simulation jedenfalls immer noch, aber Register srsk
> bleibt dabei immer auf 0x00

Nö, wenn aud 0 decrementiert wird, dann nicht.

Tip: Setze im Simulator einen Haltepunkt (F9) in die Routine LED, starte 
die Simulation mit F5 und achte im I/O-Workspace auf die Zeiten.

Oder den Haltepunkt in die ISR. Dann kannst Du mit F5 durchsteppen und 
kommst schneller zu der gewünschten Konstellation.

MfG, Bär, blauer

Autor: Thomas M. (tmo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>>
>> Funktioniert in der Simulation jedenfalls immer noch, aber Register srsk
>> bleibt dabei immer auf 0x00
>
> Nö, wenn aud 0 decrementiert wird, dann nicht.

Der Wert für SREG ändert sich schon, aber das müßte ich nach "in 
srsk,sreg" doch auch in sreg (habe ich auf r19 gesetzt) sehen, oder ?

Simulator mit F9 und F5 betätigen war ein guter Tip!

Leider blinkt die LED mit dem geänderten Programm immer noch nicht :-(

Autor: Troll Blaubär (blaubeer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. wrote:
> Der Wert für SREG ändert sich schon, aber das müßte ich nach "in
> srsk,sreg" doch auch in sreg (habe ich auf r19 gesetzt) sehen, oder ?

Ich verstehe nicht wie Du das meinst.

"in srsk,sreg" kopiert den Augenblickswert des SREG nach SRSK.
Danach darf die ISR das SREG verändern, die Kopie in SRSK bleibt 
erhalten.
Am Ende der ISR stellt "out sreg,srsk" den alten Zustand (außer i-Flag, 
das macht reti) wieder her, damit sich das Hauptprogramm nicht 
veralbert, weil ihm die ISR das SREG (ein Flag davon) unterm Hintern 
verstellt hat, falls der Interrupt genau zwischen Flagbeeinflussung 
(CPI) und Flagabfrage (BREQ) zugeschlagen hat. Dieser Fall tritt selten 
auf, man muss schon lange simulieren, um das zu bemerken, aber er tritt 
auf und macht Unsinn. Also immer schön das SREG sichern, wenn ISR und 
Hauptprogramm es verändern bzw. auswerten.

Achja, Dein AVR hat auch "untere Register". Die können zwar nicht mit 
Konstanten operieren, sind aber trotzdem ganz brauchbar. R19 für die 
SREG-Sicherung ist daher Ressourcenverschwendung.

>
> Simulator mit F9 und F5 betätigen war ein guter Tip!
>
> Leider blinkt die LED mit dem geänderten Programm immer noch nicht :-(

Ich habe es etwas umgestellt und halbwegs lesbar formatiert, im 
Simulator läuft es. Einen Tiny13 habe ich dafür aber nicht geopfert.

Tip: Stelle mal unter Tools/Options/Editor die Tab-Schrittweite auf 4 
ein und lass die Tabs durch Spaces ersetzen. Dann stimmt die 
Formatierung auch bei der Darstellung durch Fremdprogramme (Browser).

MfG, BlauBär, trolliger

Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Der Wert für SREG ändert sich schon, aber das müßte ich nach "in
>> srsk,sreg" doch auch in sreg (habe ich auf r19 gesetzt) sehen, oder ?
>
> Ich verstehe nicht wie Du das meinst.
>
Im I/O View beim Simulieren bleibt r2 (srsk) immer auf 0 !?

Danke für die Programmrevision, sieht jetzt doch etwas professioneller 
aus, obwohl ich prinzipiell doch gar nicht so falsch lag ...

...aber blinken tut's nicht. LED bleibt bei Deiner Version auf 
Dauerlicht.
Wenn das program und verify vom attiny funktioniert kann er doch nicht 
kaputt oder falsch angeschlossen sein?

Irgendwie brauch ich jetzt bald mal ein Erfolgserlebnis ...

Gruß Thomas

Autor: Troll Blaubär (blaubeer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. wrote:

> Danke für die Programmrevision, sieht jetzt doch etwas professioneller
> aus, obwohl ich prinzipiell doch gar nicht so falsch lag ...

Das ist noch lange nicht professionell. Aber immer langsam mit den 
jungen Pferden... Ich hatte bewusst darauf verzichtet, darauf 
hinzuweisen, dass man die Bits im I/O-Bereich besser mit ihrem Namen 
anspricht.

> ...aber blinken tut's nicht. LED bleibt bei Deiner Version auf
> Dauerlicht.

Dann ist da was Anderes falsch.

Ich habe jetzt mal einen Tiny13 in mein STK500 gesteckt und das Programm 
draufgeschossen, das geht wunderbar (Anhang). Die Blinkdauer beträgt 
(wie im Simulator) etwa 1,5 Sekunden, die Pause auch. Es sollte also 
auch bei Dir funktionieren.

> Wenn das program und verify vom attiny funktioniert kann er doch nicht
> kaputt oder falsch angeschlossen sein?

An welchem Pin ist Deine LED? ich habe an PB0 und PB1 LEDs dran, die 
blinken wie gewünscht. Die anderen Portpins sind derzeit durch die 
ISP-Anschlüsse blockiert.

>
> Irgendwie brauch ich jetzt bald mal ein Erfolgserlebnis ...

Dann checke Deine Hardware. Der Teufel (nicht der Robert) steckt meist 
im Detail.

>
> Gruß Thomas

MfG, Troll, blaubäriger

Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> An welchem Pin ist Deine LED? ich habe an PB0 und PB1 LEDs dran, die
> blinken wie gewünscht. Die anderen Portpins sind derzeit durch die
> ISP-Anschlüsse blockiert.
>
LED ist an PB0
>
> Dann checke Deine Hardware. Der Teufel (nicht der Robert) steckt meist
> im Detail.
>
Habe den Aufbau nochmal mit einem M8 auf dem Steckbrett aufgebaut und 
das Programm dafür umgestrickt. Das hat im Prinzip funktioniert, aber 
sehr unzuverlässig je nachdem an welchem Kabel ich gewackelt habe...
Ich denke, ich werde die paar Teile besser zusammenlöten. Das STK500 hat 
schon seine Vorteile!

Ich verstehe aber immer noch nicht, warum im I/O View beim Simulieren 
der r2 (srsk) immer auf 0 bleibt, er sollte doch den Wert von SREG 
annehmen?

Gruß
Thomas

Autor: Troll Blaubär (blaubeer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. wrote:

> Habe den Aufbau nochmal mit einem M8 auf dem Steckbrett aufgebaut und
> das Programm dafür umgestrickt. Das hat im Prinzip funktioniert, aber
> sehr unzuverlässig je nachdem an welchem Kabel ich gewackelt habe...

Nunja, solche Wackelkonstruktionen macht man nicht. Den Chip steckt man 
in eine Präzisionsfassung, dann mit Fassung in das Steckbrett. Dann 
achtet man darauf, dass man das Steckbrett nicht durch zu dicke Drähte 
(Dioden) ausgrackelt.

Hast Du wenigstens Keramik-Kondensatoren (100nF) an der Betriebsspannung 
(ganz dicht am AVR)?

> Ich denke, ich werde die paar Teile besser zusammenlöten.

Steckbrett ist schon ok, wenn man es ordentlich benutzt. Ich habe auch 
einige Steckbretter im Einsatz.

> Das STK500 hat
> schon seine Vorteile!

Gutes Werkzeug hat aber auch seinen Preis.

>
> Ich verstehe aber immer noch nicht, warum im I/O View beim Simulieren
> der r2 (srsk) immer auf 0 bleibt, er sollte doch den Wert von SREG
> annehmen?

R2 nimmt den Wert von SREG an, den SREG exakt im Moment der Zuweisung 
hatte. Zwischendurch und von alleine ändert sich der Inhalt von r2 
nicht. Da Dein Programm noch sehr klein ist und wenige bedingte Sprünge 
hat, ist das im Moment in der ISR (i-Flag gelöscht) der Wert 0.

Warum arbeitest Du mit I/O-View? Schau Dir mal das Watch-Fenster an 
(Anhang).

>
> Gruß
> Thomas

Mfg, Troll, bärisch Blauer

Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> R2 nimmt den Wert von SREG an, den SREG exakt im Moment der Zuweisung
> hatte. Zwischendurch und von alleine ändert sich der Inhalt von r2
> nicht. Da Dein Programm noch sehr klein ist und wenige bedingte Sprünge
> hat, ist das im Moment in der ISR (i-Flag gelöscht) der Wert 0.
>
Jetzt hab ich's kapiert, ich hatte den Breakpoint immer bei den LED's 
gesetzt, da war sreg natürlich nicht 0, wurde aber auch nicht auf srsk 
gesichert.

Ich werde mich dann mal mit der Hardware beschäftigen ...

Vielen Dank für die Hilfe!

Gruß
Thomas

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. wrote:
> Jetzt hab ich's kapiert, ich hatte den Breakpoint immer bei den LED's
> gesetzt, da war sreg natürlich nicht 0, wurde aber auch nicht auf srsk
> gesichert.

Schau Dir auch mal im Menü Debug/New Breakpoint/Data Breakpoint an. 
Damit kannst Du anhalten, wenn ein von Dir vorbestimmtes Ereignis 
eintritt (Variablenänderung, I/O-Konstellation usw.).

>
> Ich werde mich dann mal mit der Hardware beschäftigen ...

Mach das, Wackelkontakte taugen nix.

MfG, Bb.

Autor: Thomas M. (tmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> Mach das, Wackelkontakte taugen nix.
>
Mit dem neuen Steckbrett läuft alles wie geschmiert! Das alte lag wohl 
doch zu lange im Keller rum ...

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.