| 
    
    
			
  
  
  
  
    
  
    
    
      
      
  
  
  
  
 
      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 ...
 | 1 | .include "tn13def.inc"
 |  | 2 |  
 |  | 3 | .def tmp = r16
 |  | 4 | .def leds = r17
 |  | 5 | .def count = r18
 |  | 6 |  
 |  | 7 | .org 0x0000
 |  | 8 |         rjmp    main        ; Reset Handler
 |  | 9 | .org OVF0addr
 |  | 10 |         rjmp    timer0_overflow    ; Timer Overflow Handler
 |  | 11 |  
 |  | 12 | main:
 |  | 13 |         ldi     tmp, LOW(RAMEND)    ; Stackpointer initialisieren
 |  | 14 |         out     SPL, tmp
 |  | 15 |         
 |  | 16 |         ldi     tmp, 0xFF      ; Port B auf Ausgang
 |  | 17 |         out     DDRB, tmp
 |  | 18 |  
 |  | 19 |         ldi     leds, 0x00        
 |  | 20 |  
 |  | 21 |         ldi     tmp, 0b00000101    ; CS00 und CS02 setzen: Teiler 1024
 |  | 22 |         out     TCCR0B, tmp
 |  | 23 |  
 |  | 24 |         ldi     tmp, 0b00000010    ; TOIE0: Interrupt bei Timer Overflow
 |  | 25 |         out     TIMSK0, tmp
 |  | 26 |      
 |  | 27 |     
 |  | 28 |    
 |  | 29 | loop:   
 |  | 30 |     cpi count, 0x00
 |  | 31 |     sei              ; Interrupt erlauben      
 |  | 32 |     breq led    
 |  | 33 |     rjmp    loop
 |  | 34 |  
 |  | 35 | timer0_overflow:          ; Timer 0 Overflow Handler
 |  | 36 |     dec count          ; Zähler - 1
 |  | 37 |         ret
 |  | 38 | 
 |  | 39 | led:
 |  | 40 |         out     PORTB, leds
 |  | 41 |         com     leds        ; LED's umschalten
 |  | 42 |     ldi count, 7        ; Zähler setzen
 |  | 43 |     rjmp loop
 | 
 
  
  
  
  
 
      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 
  
  
  
  
 
      > 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 
  
  
  
  
 
      > 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 
  
  
  
  
 
      Sollte jetzt vielleicht so aussehen?
 | 1 | timer0_overflow:          ; Timer 0 Overflow Handler
 |  | 2 |     in srsk,sreg
 |  | 3 |     dec count          ; Zähler - 1
 |  | 4 |     out sreg,srsk
 |  | 5 |         reti
 | 
Funktioniert in der Simulation jedenfalls immer noch, aber Register srsk 
bleibt dabei immer auf 0x00 
  
  
  
  
 
      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 
  
  
  
  
 
      Thomas M. wrote:
> Sollte jetzt vielleicht so aussehen?
>
> | 1 | > timer0_overflow:          ; Timer 0 Overflow Handler
 |  | 2 | >     in srsk,sreg
 |  | 3 | >     dec count          ; Zähler - 1
 |  | 4 | >     out sreg,srsk
 |  | 5 | >         reti
 |  | 6 | >
 | 
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 
  
  
      
 
 
      >>
>> 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 :-( 
  
  
      
 
 
      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 
  
  
  
  
 
      >> 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 
  
  
      
 
 
      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 
  
  
  
  
 
      >
> 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 
  
  
      
 
 
      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 
  
  
  
  
 
      >
> 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 
  
  
  
  
 
      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. 
  
  
  
  
 
      >
> Mach das, Wackelkontakte taugen nix.
>
Mit dem neuen Steckbrett läuft alles wie geschmiert! Das alte lag wohl 
doch zu lange im Keller rum ... Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
 |