Guten morgen, ich habe die Zeitschleife eines kleine LED Blinker Programmes geändert. Assambler sagt OK, PonyProng macht kein Ärger, doch LED blinkt nicht.Frequenz bei ca.75 hz. Falls jemand Zeit und Lust hat. Danke. include "tn13def.inc" ;----- Main: ldi r16, $1f ; Pb0 ... Pb4 Alle Pins als Ausgänge out DDRB,r16 ldi r16, $00 ; Pb0 ... Pb4 Alle Ausgänge sind ;gleich 00000 out PORTB,r16 ;----- Loop: sbi PORTB, 0 ; Pb0 = Level 1 rcall Warte ; VerzögerungsSchleife Subroutine cbi PORTB, 0 ; Pb0 = Level 0 rcall Warte ; VerzögerungsSchleife Subroutine rjmp Loop ; Und zurück zum Loop ad infinitum ;----- Warte:; ============================= ; Warteschleifen-Generator ; 51613 Zyklen: ; ----------------------------- ; warte 51612 Zyklen: ldi R17, $44 WGLOOP0: ldi R18, $FC WGLOOP1: dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; =============================
>Frequenz bei ca.75 hz
Und wie kommst Du auf diese Frequenz? 75 Hz siehst Du definitiv nicht
blinken!
Codesammlung Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr sie hier posten. Fragen werden gelöscht!
Ich habe eine return Funktion eingebaut. Trotzdem funzt es nicht. LED leuchtet nicht und lt.Messgerät fließt auch kein Strom. Der tiny ist ok und auch die Schaltung funzt. Also kann es doch nur am Programm liegen, oder ?
Andreas schrieb:
> Ich habe eine return Funktion eingebaut.
Und damit sieht das Programm nun wie aus?
Ich weiß es jetzt gerade nicht so genau (also schlagt mich nicht): Adresse 0x0000 ist doch der Sprungvektor für Reset. Gehört da ein jmp hinein oder nicht? Wenn nein, fehlt die passende Angabe in den Vektoren (also in Deinem Fall ein "jmp Main". Mit "Return Funktion" meinst Du doch "ret" und keine zusätzliche Funktion.
Quatsch.... sorry. Wenn in die Vektorliste ein jmp mit hineingehört, sollte es so laufen. Wenn nicht, fehlt die Adresse von Main im Vektor.
Netzwanze schrieb: > Ich weiß es jetzt gerade nicht so genau (also schlagt mich nicht): > > Adresse 0x0000 ist doch der Sprungvektor für Reset. Gehört da ein jmp > hinein oder nicht? Wenn nein, fehlt die passende Angabe in den Vektoren > (also in Deinem Fall ein "jmp Main". > > Mit "Return Funktion" meinst Du doch "ret" und keine zusätzliche > Funktion. Solange keine anderen Interrupt Vektoren im Spiel sind, ist das belanglos. Ob der µC nach einem Reset als erstes auf einen rjmp stösst, oder ob dort das Programm direkt losgeht, spielt keine Rolle.
Andreas schrieb:
> Du meinst "jmp main" zum Abschluß ?
Welcher Abschluss.
Zeig doch bitte das komplette Programm.
Du hast Änderungen gemacht und wir wissen nicht welche.
include "tn13def.inc" ;----- Main: ldi r16, $1f ; Pb0 ... Pb4 Alle Pins als Ausgänge out DDRB,r16 ldi r16, $00 ; Pb0 ... Pb4 Alle Ausgänge sind ;gleich 00000 out PORTB,r16 ;----- Loop: sbi PORTB, 0 ; Pb0 = Level 1 rcall Warte ; VerzögerungsSchleife Subroutine cbi PORTB, 0 ; Pb0 = Level 0 rcall Warte ; VerzögerungsSchleife Subroutine rjmp Loop ; Und zurück zum Loop ad infinitum ;----- Warte:; ============================= ; Warteschleifen-Generator ; 51613 Zyklen: ; ----------------------------- ; warte 51612 Zyklen: ldi R17, $44 WGLOOP0: ldi R18, $FC WGLOOP1: dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= jmp main ***** Es tut sich aber nichts...
Andreas schrieb: Dachte ichs mir doch. > ; ----------------------------- > ; warte 1 Zyklus: > nop > ; ============================= > > jmp main Nein. Bei main ist dein Programmanfang. Wenn du nach main hüpfst beginnt das Programm wieder von vorne. Und das bedeutet: alles wird initialisiert und die Ports wieder auf 0 gestellt. ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret Mit rcall wird ein Unterprogramm aufgerufen. Zurück geht aus aus dem Unterprogramm zur Stelle des Aufrufs mit einem ret (Darf ich dir das AVR-Tutorial nahelegen?)
Danke.Ich meine das ich das auch schon versucht hatte. Ich werd es aber noch mal probieren.
Bei der angegebenen Schleife und 4MHz Takt dauert ein schleifendurchlauf 0,01290325s = etwa 12,9ms. Ob er das sieht?
;****Time Delay Subroutine for LED flash************* delay: ldi coarse,5 ;triple nested FOR loop cagain: ldi medium,255 ;giving about 1/4 second magain: ldi fine,255 ;delay on 4 MHz clock fagain: dec fine brne fagain dec medium brne magain dec coarse brne cagain ret
Ich habe es jetzt mit "ret" probiert.Kein Erfolg. Auch bei 1 hz. funzt es nicht. Lt.Messgerät fließt auch kein Strom. Tiny und Schaltung sind aber OK. Es muss wohl am Programm liegen. Ich vermute es könnte an den Aus- und Eingängen liegen. Pbo und Pb3 sind Ausgänge. Pb1 ist ein Taster.In diesem Fall aber wohl unbedeutend,oder ?
Zu meiner Zeit mußte man den Stack initialisieren, bevor man Unterprogramme aufrufen wollte. Kann sein, dass der Prozessor mit einem sinnvollen Wert hochfährt. Bitte prüfen.
.include "tn13def.inc" .def temp = r16 ;general scratch space .def fine = r18 ;loop delay counters .def medium = r19 .def coarse = r20 ;----- Main: ldi temp, RAMEND ; Stackpointer initialisieren out SPL, temp ldi r16, $1f ; Pb0 ... Pb4 Alle Pins als Ausgänge out DDRB,r16 ldi r16, $00 ; Pb0 ... Pb4 Alle Ausgänge sind ;gleich 00000 out PORTB,r16 ;----- Loop: sbi PORTB, 0 ; Pb0 = Level 1 rcall Warte ; VerzögerungsSchleife Subroutine cbi PORTB, 0 ; Pb0 = Level 0 rcall Warte ; VerzögerungsSchleife Subroutine rjmp Loop ; Und zurück zum Loop ad infinitum ;----- /* Warte:; ============================= ; Warteschleifen-Generator ; 51613 Zyklen: ; ----------------------------- ; warte 51612 Zyklen: ldi R17, $44 WGLOOP0: ldi R18, $FC WGLOOP1: dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ret ; ============================= */ ;****Time Delay Subroutine for LED flash******************* warte: ldi coarse,5 ;triple nested FOR loop cagain: ldi medium,255 ;giving about 1/4 second magain: ldi fine,255 ;delay on 4 MHz clock fagain: dec fine brne fagain dec medium brne magain dec coarse brne cagain ret rjmp main Sollte so funktionieren.
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.