Hallo Leute, ich habe folgendes Problem : Ich lasse eine Led mit etwa 1Hz blinken, klappt ca. 3-4 Minuten wunderbar, aber danach hängt sich das Programm auf.... Ich habe den Watchdog Timer nicht gesetzt ... (auch sonst nichts) Muss ich bei einer Endlosschleife etwas spezielles beachten ? MFG Frank
@Frank Das kann sein, vieleicht auch in der 5. Zeile | Zeichen 3-7 :-) @Simon Küppers Das ist natürlich eine Lösung oder... @frank müller Wie wärs wenn du mal den code posten würdest ??? Aber wenn du willst können wir ja weiterhin ins "Blaue" raten ;D Mfg. ~ Lightning
;***************************************** .nolist .include "tn26def.inc" .list ;******************************************* ;******************************************** RJMP RESET ; RESET: RETI ; EXT_INTO RETI ; PIN_CHANGE RETI ; TIM1_CMP1A RETI ; TIM1_CMP1B RETI ; TIM1_OVF RETI ; TIM0_OVF RETI ; USI_STRT RETI ; USI_OVF RETI ; EE_RDY RETI ; ANA_COMP RETI ; ADC ;****************************************** RESET: ldi r16, RAMEND out SP , r16 ; Stackpointer init ldi r16 ,0b00000111 ; I/O init (PortA) out DDRA ,r16 ldi r16 , 0b11111010 ; I/O init (PortB) out DDRB , r16 ; sei ; interrupts allowed globally sbi PortB,3 ; Test of programm init (unnecessary) ;***************************************************** ;**********************; Endless GO: ; LOOP for process flow simulation sbi PortA, 2 ; LED ON cbi PortB, 6 ldi work , 5 BACK: INC r0 BRNE BACK INC r1 BRNE BACK DEC work BRNE BACK cbi PortA, 2 ; LED OFF cbi PortB, 6 ldi work , 5 LACK: INC r0 BRNE LACK INC r1 BRNE LACK DEC work BRNE LACK RJMP GO ; the switching has about 1 HZ frequency ;***********************; Endless (8 MHz clock frequency)
Meine Güte, gerade mal die ersten Gehversuche und schon müssens englische Kommentare sein. Es könnte ja jemand von MS entdecken und beeindruckt sein ;-) Nur mal so am Rande. Da Du keinen Interrupt verwendest und Dein Programm eigenlich nichts macht als einen Pin Ein- und Auszuschalten und 2 schleifen durchlaufen werden kann man sich nicht vorstellen an was es liegen könnte. Würde an Deiner Stelle die Schaltung prüfen ob Du auch nen Vorwiderstand vor der/den LED/s geschaltet hast oder ob irgend wo anders zu viel Strom fließt bis alles zusammen bricht (Ampermeter zwischenhängen). MfG Andi
Eventuell kannst Du auf den Reset über einen 4,7KOhm-Widerstand 5V legen um Störungen an den Reset-Pin zu vermeiden. MfG Andi
Für was ist eigentlich das 2-fache "cbi PortB,6"? Hängt da vielleicht was drann? MfG Andi
Warum eigentlich "sei", wenn keine Interrupts verwendet werden. Wer oder was ist übrigens "work"?
Ja, stimmt, hatte das "sei" zuerst übersehen, also wozu bei lauter "RETI"´s? Ich denke mal, "work" ist r16, benutzen einige hier, allerdings fehlt das ".def" dafür. MfG Andi
@Frank Müller Also ich hab das progreamm da von dir mal in meinen Mega8 gebrannt, das funzt aber. Habs zu testzwecken 15min laufen lassen (Hatte grad nix Anderes zu tun :D ) keine fehler nix... Ich hab da mal so n Kauderwelsch Programm gemacht da kannst n bisschen rummexperimentieren. (Habe grad immernoch nix Anderes zu tun :D)
Hi! wait1s: ;Eine Schleife die die wit_01s Schleife "loop" mal ausführt. ldi loop, 10 ;Loop muss 10 sein denn 10*0.1(wait_01s) = ???? --> Rischtisch !!! 1 wt1s_0: ;Schleifeninterne sprungmarke (Fachchinesisch :D) dec loop ;loop um1 verringern breq next1 ;Wenn loop = 0 springe zu next1 und damit aus der Schleife raus. rjmp wt1s_0 next1: ret Kann da irgend wie keinen Aufruf von wait_01s finden. Übrigens: Eine Pause von 0,1 Sekunden läßt sich auch wie folgt machen: wait_01s: ;Eine Schleife die eine Pause von 0.1sek (bei 8Mhz) bewirkt. ldi r24,low(50000) ldi r25,high(50000) wt_0: rcall wt_1 ; 7 rcall (4) + ret (3) = 7 nop ; + 1 sbiw r25:r24,0 ; + 2 sbiw r25:r24,0 ; + 2 sbiw r25:r24,1 ; + 2 brne wt_0 ; + 2 wt_1: ret ; = 16 * 50000 = 800000 Takte = 0.1 Sek. MfG Andi
@Andi K. Wooops !!! naja war ja auch ein "Kauderwelsch" Programm, aber danke für die info werd das gleich mal nachtragen. hmmmm... deine Lösung von ner Schleife ist gut, wirklich nicht schlecht. MfG ~ Lightning
Hier noch ein Beispiel für Pausen bis zu 4.294.967.296 µ-Sekunden. Das sind max. 4294,96 Sekunden oder 1 Stunde, 11 Minuten und fast 35 Sekunden. Die Sub zählt mit 4 Register, also 32 Bit. Aufruf erfolgt mit dem Macro "CallWait µS-Zeit". Also für 1 Sekunde gibt man 1000000 µS an. In der Konstante "AVRTakt" gibt man die Freauenz des AVR in MHz an. .equ AVRTakt=8 ;Takt des AVR in MHz .macro CallWait ldi r22,byte1(@0*AVRTakt/8-2) ldi r23,byte2(@0*AVRTakt/8-2) ldi r24,byte3(@0*AVRTakt/8-2) ldi r25,byte4(@0*AVRTakt/8-2) rcall wait .endm CallWait 1000000 wait: ;Eine Schleife die eine Pause von n µS bewirkt. wt_0: sbiw r25:r24,0 ; 2 Hat keine Auswirkung auf die Reg. subi r22,1 ; + 1 sbci r23,0 ; + 1 sbci r24,0 ; + 1 sbci r25,0 ; + 1 brne wt_0 ; + 2 sbiw r25:r24,0 sbiw r25:r24,0 nop ret Irgendwie habe ich wohl auch nix anderes zu tun, obwohl eigentlich schon aber keine Lust ;-) MfG Andi
Kleiner Fehler am Ende der Sub. Da gehören 10 Takte hin und nicht 9 da man auf 17 Takte inkl. Ende der Sub und Vorladen der Register im Macro kommen muß da das letzte BRNE nur 1 Takt benötigt statt 2. wait: ;Eine Schleife die eine Pause von n µS bewirkt. wt_0: sbiw r25:r24,0 ; 2 Hat keine Auswirkung auf die Reg. subi r22,1 ; + 1 sbci r23,0 ; + 1 sbci r24,0 ; + 1 sbci r25,0 ; + 1 brne wt_0 ; + 2 sbiw r25:r24,0 sbiw r25:r24,0 sbiw r25:r24,0 ret MfG Andi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.