robocat
29.08.2006, 16:12
liebe assembler gemeinde,
seit tagen plage ich mich mit meinem atmega8 (1MHz takt) und folgendem problem herum:
der CTC Timer soll ein 33kHz rechteck an PB1 erzeugen, gleichzeitig sollen in der hauptschleife im 1s takt PB0, PD7 und PD5, PD6 abwechselnd geschalten werden.
beides funktioniert für sich genommen ganz prima, aber alles zusammen will partout nicht klappen.
.NOLIST
.INCLUDE <m8def.inc>
.LIST
.CSEG
RESET:
rjmp init
rjmp DUMMY
rjmp DUMMY
rjmp DUMMY
rjmp DUMMY
rjmp DUMMY
rjmp MYINT
rjmp init
rjmp MYINT
.ORG INT_VECTORS_SIZE
init:
ldi R16,HIGH(RAMEND)
out SPH,R16
ldi R16,LOW(RAMEND)
out SPL,R16
; CTC klarmachen
ldi r17,0;
ldi r16,(1<<WGM12)|(1<<CS10)
out TCCR1A,r17
out TCCR1B,r16
; port b und d als ausgang
LDI r24,255
OUT DDRB,r24
LDI r24,255
OUT DDRD,r24
; interrupt
ldi r16,(1<<OCIE1A)|TIMSK;
out TIMSK,r16
; zaehler laden
ldi r16,0
out OCR1AH,r16
ldi r16,255 ;29 (mit 29 sind es ca 33kHz, mit 255 ca 3,8kHz)
out OCR1AL,r16
; PB1 ist anfangs HIGH
ldi r18,2
out portb,r18
sei ; Interrupts aktivieren
; hauptschleife
loop:
ldi r24,32
out portd,r24
; delay loop, 1Hz
ldi r17,$09
WGLOOP0: ldi r18,$BC
WGLOOP1: ldi r19,$C4
WGLOOP2: dec r19
brne WGLOOP2
dec r18
brne WGLOOP1
dec r17
brne WGLOOP0
nop
ldi r24,192
out portd,r24; PD5+6 auf HIGH
; delay loop, 1Hz
ldi r17,$09
WGLOOP3: ldi r18,$BC
WGLOOP4: ldi r19,$C4
WGLOOP5: dec r19
brne WGLOOP5
dec r18
brne WGLOOP4
dec r17
brne WGLOOP3
nop
; immer wiederholen
rjmp loop
; isr, klappt nicht mit meinen pushes..
MYINT:
;push r16
;push r17
;push r18
;push r19
;ldi r20,SREG
;push r20
;push r23
;push r24
; toggle funktion:
; "wenn portb=0 ist, wird portb=2"
; "wenn portb=2 ist, wird portb=0"
ldi r20,0
ldi r21,portb
cp r21,r20
breq setport
out portb,r20
rjmp intend
setport:
ldi r21,2
;ldi r22,portb
;or r21,r22
out portb,r21
intend: ; auch diese pops taugen nicht
;pop r24
;pop r23
;pop r20
;out SREG,r20
;pop r19
;pop r18
;pop r17
;pop r16
reti
DUMMY:
reti
vielleicht ist der atmel mit 1MHz auch zu langsam für das, was ich erreichen will? dann würde ich ein 16MHz quarz dranbasteln. aber auch mit erheblich niedrigerer CTC frequenz geht es nicht.
ausserdem komme ich mit push und pop nicht zurecht. im code sind diese befehle auskommentiert, da ansonsten gar keine 33kHz zustande kommen. aber eigentlich ist es doch ein LIFO, also warum sollte das nicht gehen?
entschuldigt die vielleicht dummen fragen, ich bin noch kein ASM experte, und habe mich bemüht, es alleine (mit datenblatt und forum-suche) zu schaffen. nur langsam verzweifle ich.
bin dankbar für jede hilfe!
eure katze
seit tagen plage ich mich mit meinem atmega8 (1MHz takt) und folgendem problem herum:
der CTC Timer soll ein 33kHz rechteck an PB1 erzeugen, gleichzeitig sollen in der hauptschleife im 1s takt PB0, PD7 und PD5, PD6 abwechselnd geschalten werden.
beides funktioniert für sich genommen ganz prima, aber alles zusammen will partout nicht klappen.
.NOLIST
.INCLUDE <m8def.inc>
.LIST
.CSEG
RESET:
rjmp init
rjmp DUMMY
rjmp DUMMY
rjmp DUMMY
rjmp DUMMY
rjmp DUMMY
rjmp MYINT
rjmp init
rjmp MYINT
.ORG INT_VECTORS_SIZE
init:
ldi R16,HIGH(RAMEND)
out SPH,R16
ldi R16,LOW(RAMEND)
out SPL,R16
; CTC klarmachen
ldi r17,0;
ldi r16,(1<<WGM12)|(1<<CS10)
out TCCR1A,r17
out TCCR1B,r16
; port b und d als ausgang
LDI r24,255
OUT DDRB,r24
LDI r24,255
OUT DDRD,r24
; interrupt
ldi r16,(1<<OCIE1A)|TIMSK;
out TIMSK,r16
; zaehler laden
ldi r16,0
out OCR1AH,r16
ldi r16,255 ;29 (mit 29 sind es ca 33kHz, mit 255 ca 3,8kHz)
out OCR1AL,r16
; PB1 ist anfangs HIGH
ldi r18,2
out portb,r18
sei ; Interrupts aktivieren
; hauptschleife
loop:
ldi r24,32
out portd,r24
; delay loop, 1Hz
ldi r17,$09
WGLOOP0: ldi r18,$BC
WGLOOP1: ldi r19,$C4
WGLOOP2: dec r19
brne WGLOOP2
dec r18
brne WGLOOP1
dec r17
brne WGLOOP0
nop
ldi r24,192
out portd,r24; PD5+6 auf HIGH
; delay loop, 1Hz
ldi r17,$09
WGLOOP3: ldi r18,$BC
WGLOOP4: ldi r19,$C4
WGLOOP5: dec r19
brne WGLOOP5
dec r18
brne WGLOOP4
dec r17
brne WGLOOP3
nop
; immer wiederholen
rjmp loop
; isr, klappt nicht mit meinen pushes..
MYINT:
;push r16
;push r17
;push r18
;push r19
;ldi r20,SREG
;push r20
;push r23
;push r24
; toggle funktion:
; "wenn portb=0 ist, wird portb=2"
; "wenn portb=2 ist, wird portb=0"
ldi r20,0
ldi r21,portb
cp r21,r20
breq setport
out portb,r20
rjmp intend
setport:
ldi r21,2
;ldi r22,portb
;or r21,r22
out portb,r21
intend: ; auch diese pops taugen nicht
;pop r24
;pop r23
;pop r20
;out SREG,r20
;pop r19
;pop r18
;pop r17
;pop r16
reti
DUMMY:
reti
vielleicht ist der atmel mit 1MHz auch zu langsam für das, was ich erreichen will? dann würde ich ein 16MHz quarz dranbasteln. aber auch mit erheblich niedrigerer CTC frequenz geht es nicht.
ausserdem komme ich mit push und pop nicht zurecht. im code sind diese befehle auskommentiert, da ansonsten gar keine 33kHz zustande kommen. aber eigentlich ist es doch ein LIFO, also warum sollte das nicht gehen?
entschuldigt die vielleicht dummen fragen, ich bin noch kein ASM experte, und habe mich bemüht, es alleine (mit datenblatt und forum-suche) zu schaffen. nur langsam verzweifle ich.
bin dankbar für jede hilfe!
eure katze