Hallo
Ich habe neulich bei Experimenten mit dem Timer bei meinem ATmega8 ein äußerst merkwürdiges Verhalten bemerkt.
Eigentlich sollte der Käfer nur eine LED dimmen (jaja, nix Neus ;)).
Änderungen, die ich im Code vorgenommen habe, hat er jedoch entweder dann erst ausgeführt wenn ich den Code bereits wieder umgeschrieben und den Controller neu beschrieben habe, oder der Käfer hat was völllig anderes gemacht...
Beispiel:
Mit dem nop-Befehl in der Warteschleife (rot markiert) tut der Käfer endlich, was er soll: die LED blinken lassen.
Wenn ich den nop-Befehl jedoch entferne leuchtet die LED durchgehend....nix Blinker.
Dabei hat nop doch gar keine Funktion als eben "nichts" zu tun...?
Wenn ich PORT D definiere, aber nicht auf Low (grün markiert) setze (das ändert die Interruptschleife später ja ständig), dann funktioniert der Blinker
brav...aber warum so, und nicht wenn ich PORTD auf low setze?
.include "m8def.inc"
.def temp = r16
.def LEDs = r17
.ORG 0x00
rjmp Start
.ORG 0x009
rjmp Timer0_Uberlauf
Start:
ldi temp, 0b11100000 ;Port D: Ausgang
out DDRD, temp
ldi LEDs, 0b00000000 ;LEDs einschalten
out PORTD, temp
ldi temp, 0b00000101 ;Vorteiler 1
out TCCR0, temp
ldi temp, 0b00000001 ;TOIE0: Interrupt bei Timer-Überlauf
out TIMSK, temp
ldi temp, 0b00000000
out TCNT0, temp
sei
main:
nop
rjmp main
Timer0_Uberlauf:
com LEDs
out PORTD, LEDs
reti
Alles anzeigen
Noch ein Programm:
Dieses Programm erzeugt mit zwei LEDs einen Wechselblinker: Eine LED ein, die andere aus, und das eben im Wechsel.
Dabei ist das Wechseln im Code gar nicht vorgesehen, der Käfer soll beide LEDs gleichzeitig schalten.
Warum wechselt er aber trotzdem?
.include "m8def.inc"
.def temp = r16
.def LEDs = r17
.ORG 0x00
rjmp Start
.ORG 0x009
rjmp Timer0_Uberlauf
Start:
ldi temp, 0b11100000 ;Port D: Ausgang
out DDRD, temp
ldi temp, 0b00000101 ;Vorteiler 1
out TCCR0, temp
ldi temp, 0b00000001 ;TOIE0: Interrupt bei Timer-Überlauf
out TIMSK, temp
ldi temp, 0b10000000
out TCNT0, temp
sei
main:
rjmp main
Timer0_Uberlauf:
com LEDs
out PORTD, LEDs
reti
Alles anzeigen
Zu guterletzt noch etwas äußerst Merkwürdiges.
Ich habe folgenden Code in den ATmega8 geflasht. Der Controller scheint den Code aber jedesmal einen Gang schneller abzuspielen. Anstatt die LED und den Summer regelmäßig zu betätigen schaltet er völlig unregelmäßig (wenn auch rythmisch, kann man gut an den kurzen Piepstönen vom Summer erkennen wo er am Anfang sonst nur brummt) und wird nach und nach immer schneller...klingt fast wie ein tuckernder Diesel der anläuft.
Egal was er auch macht-warum macht er es nichtregelmäßig?
Das ist der Code:
.include "m8def.inc"
.def temp = r16
.def LEDs = r17
.ORG 0x00
rjmp Start
.ORG 0x009
rjmp Timer0_Uberlauf
Start:
ldi temp, 0b11100000 ;Port D: Ausgang
out DDRD, temp
ldi temp, 0b00000101 ;Vorteiler 1
out TCCR0, temp
ldi LEDs, 0b11100000 ;LEDs einschalten
out PORTD, temp
ldi temp, 0b00000001 ;TOIE0: Interrupt bei Timer-Überlauf
out TIMSK, temp
ldi temp, 0b00000001
out TCNT0, temp
sei
Timer0_Uberlauf:
com LEDs
out PORTD, LEDs
reti
Alles anzeigen
Und hier könnt ihr euch ansehen was der Käfer aus dem Code macht:
http://ul.to/kr8k66wy