Ich habe Probleme beim Simulieren des Timer-Überlaufs in Atmel Studio 6. Der Code ist für einen Attiny10 und sieht wie folgt aus. Soweit ich weiß, habe ich alle notwendigen Bits gesetzt, um den Zähler (der in der Simulation funktioniert) und den Interrupt (der in der Simulation nicht funktioniert) zu aktivieren.
Ich denke, es ist nur ein dummer Fehler und ich brauche einen kleinen Hinweis, also würde ich mich sehr freuen, wenn mir jemand sagen könnte, was ich falsch mache.
;======================
; device attiny10
;======================
;.include tn10def.inc
; _____________
; /1 ° 6|
; O--|PB0 PB3|--O RESET
; | t10 |
; O--|GND VCC|--O
; | |
; O--|PB1 PB2|--O
; |______________|
;======================
; defines
;======================
.def temp = r16
;======================
; reset / int. vecs
;======================
.org 0x0000
rjmp reset ; Reset Handler
.org 0x0004
rjmp TIM0_OVF ; Timer0 Overflow Handler
.org 0x000A
;======================
; reset / setup
;======================
reset:
in temp, TCCR0B ; turn timer on
ori temp, (1<<CS00)
out TCCR0B, temp
in temp, TIMSK0 ; turn overflow interrupt on
ori temp, (1<<TOIE0)
out TIMSK0, temp
ldi 0xff
out DDRB, temp
ldi 0x00
out PORTB, temp
ldi temp, 0xff
out TCNT0H, temp
ldi temp, 250
out TCNT0L, temp
ldi temp, 0xff
sei
;======================
; main loop
;======================
main:
rjmp main ; while(1);
; overflow interrupt
;======================
TIM0_OVF:
com temp
out PORTB, temp
reti
EDIT: Gelöst: Sie können nicht in / über eine ISR treten. (Danke an Golaž)
Wenn Sie beim Versuch, genau den von Ihnen geposteten Code zu kompilieren, keinen Compilerfehler erhalten haben, haben Sie ein größeres Problem.
Ihr Code funktioniert einwandfrei (ignoriert die Tatsache, dass Sie die Registernamen in Ihrem 3. Block unter Reset-Label verpasst haben). Allerdings würde ich einige Änderungen vornehmen:
;======================
; device attiny10
;======================
;.include tn10def.inc
; _____________
; /1 ° 6|
; O--|PB0 PB3|--O RESET
; | t10 |
; O--|GND VCC|--O
; | |
; O--|PB1 PB2|--O
; |______________|
;======================
; defines
;======================
.def temp = r16
;======================
; reset / int. vecs
;======================
.org 0x0000
rjmp reset ; Reset Handler
; Replace : .org 0x0004 with:
.org OVF0addr
rjmp TIM0_OVF ; Timer0 Overflow Handler
; Replace: .org 0x000A with:
.org INT_VECTORS_SIZE ; End of vector table.
;======================
; reset / setup
;======================
reset:
; Initialize stack:
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
in temp, TCCR0B ; turn timer on
ori temp, (1<<CS00)
out TCCR0B, temp
in temp, TIMSK0 ; turn overflow interrupt on
ori temp, (1<<TOIE0)
out TIMSK0, temp
; You forgot to specify the regsiter here:
ldi temp, 0xff
out DDRB, temp
ldi temp, 0x00
out PORTB, temp
ldi temp, 0xff
out TCNT0H, temp
ldi temp, 250
out TCNT0L, temp
ldi temp, 0xff
sei
;======================
; main loop
;======================
main:
rjmp main ; while(1);
; overflow interrupt
;======================
TIM0_OVF:
com temp
out PORTB, temp
reti
Sie finden die Include-Dateien für Geräte und alle ihre Besonderheiten (wie OVF0addr, INT_VECTORS_SIZE, RAMEND, ...) in:
C:\Programme (x86)\Atmel\Atmel Toolchain\AVRAssembler\Native\2.1.1117\avrassembler\include
Ich bin mir nicht sicher, was Ihr genaues Ziel hier war. Wenn Sie TCNT0
Register eingestellt haben, haben Sie ihren Wert nur für einen (aktuellen) Zyklus eingestellt. Wenn der Timer seinen Maximalwert erreichen würde, wird er von 0 neu gestartet.
Was war Ihr Ziel mit TIM0_OVF
ISR, ich bin mir nicht sicher.
Stack wird benötigt, damit die MCU weiß, zu welcher Adresse sie zurückkehren soll, nachdem der Aufruf der Unterfunktion oder ISR ausgeführt wurde.
Milchpirat
RAMEND
standardmäßig (vom Simulator) initialisiert, er ändert nichts mit oder ohne ihn manuell zu initialisieren. Ich möchte eine Zeitbasis haben. Wenn Sie diesen Wert einstellenTCNT0
, wird er in einigen Ticks überlaufen, und ich muss nichtF11
~60000
mal drücken, um zu sehen, dass er überläuft. Ich stelle fest, dass der Timer vonMAX
bis überläuft0
, aber wenn das passiert, sollte er den Überlauf ausführen,ISR
aber er tut es nicht und das ist das Problem. Ohne initialisierten Stackpointer sollte der Simulator zwar zumindest in den eintreten,ISR
tut es aber nicht.Golaž
Golaž
Milchpirat
F11
wenn ich das Timer-Register nahe an dem voreingestellt habe,MAX
was ich getan habe. Ich kann sagen, dass es nicht in die ISR eintritt, weil ich in die ( -Taste) eintretenF11
und alle Register und die tatsächliche Programmzählerposition beobachten kann. Ich lasse die Simulation nicht im freien Modus laufen, ich lasse sie Schritt für Schritt laufen, also lasse ich das Programm Op-Code für Op-Code laufen. Und der Code in der ISR, der den Wert von invertieren sollPORTB
, ändert sich nichtPORTB
.Golaž
Milchpirat
Golaž