Beschäftige mich gerade mit Assemblerprogrammierung.
Dieser Code ist für mich nicht so verständlich.
r17 wird mit 0 geladen, soweit sogut, später wird wird zur ISR gesprungen und da wird´s knifflig.
SREG wird gesichert (weiß nicht warum) und r17 um 1 erhöht. Dann wird r17 mit 1 verglichen und nach PulsOn gesprungen und nachher zu return und die ISR beendet.
Das Programm läuft dann wieder bis main und wartet auf den Interrupt. Dabei wird immer r17 auf 0 gesetzt und kann nie mehr als 1 erreichen und somit kann PulsOff nicht aufgerufen werden.
Hier ist ein Puls von ca. 1,92 ms eingestellt (OCR2-120). Was wird hier für eine Ansteuerfrequenz erreicht?
Der Code ist von hier genommen.
Der Code von Seitenanfang werkelt bereits auf meinem µC.
Danke schonmal für eure Hilfe!
lg, Daniel
.include "m16def.inc"
.equ XTAL = 4000000
rjmp init
.org OC2addr
rjmp Compare_vect
init:
ldi r16, HIGH(RAMEND) ; Stackpointer initialisieren
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, 0x80
out DDRB, r16 ; Servo Ausgangspin -> Output
ldi r17, 0 ; Software-Zähler
ldi r16, 120
out OCR2, r16 ; OCR2 ist der Servowert
ldi r16, 1<<OCIE2
out TIMSK, r16
ldi r16, (1<<WGM21) | (1<<CS22) ; CTC, Prescaler: 64
out TCCR2, r16
sei
main:
rjmp main
Compare_vect:
in r18, SREG
inc r17
cpi r17, 1
breq PulsOn
cpi r17, 2
breq PulsOff
cpi r17, 10
brne return
ldi r17, 0
return: out SREG, r18
reti
PulsOn: sbi PORTB, 0
rjmp return
PulsOff: cbi PORTB, 0
rjmp return
Dieser Code ist für mich nicht so verständlich.
r17 wird mit 0 geladen, soweit sogut, später wird wird zur ISR gesprungen und da wird´s knifflig.
SREG wird gesichert (weiß nicht warum) und r17 um 1 erhöht. Dann wird r17 mit 1 verglichen und nach PulsOn gesprungen und nachher zu return und die ISR beendet.
Das Programm läuft dann wieder bis main und wartet auf den Interrupt. Dabei wird immer r17 auf 0 gesetzt und kann nie mehr als 1 erreichen und somit kann PulsOff nicht aufgerufen werden.
Hier ist ein Puls von ca. 1,92 ms eingestellt (OCR2-120). Was wird hier für eine Ansteuerfrequenz erreicht?
Der Code ist von hier genommen.
Der Code von Seitenanfang werkelt bereits auf meinem µC.
Danke schonmal für eure Hilfe!
lg, Daniel
.include "m16def.inc"
.equ XTAL = 4000000
rjmp init
.org OC2addr
rjmp Compare_vect
init:
ldi r16, HIGH(RAMEND) ; Stackpointer initialisieren
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, 0x80
out DDRB, r16 ; Servo Ausgangspin -> Output
ldi r17, 0 ; Software-Zähler
ldi r16, 120
out OCR2, r16 ; OCR2 ist der Servowert
ldi r16, 1<<OCIE2
out TIMSK, r16
ldi r16, (1<<WGM21) | (1<<CS22) ; CTC, Prescaler: 64
out TCCR2, r16
sei
main:
rjmp main
Compare_vect:
in r18, SREG
inc r17
cpi r17, 1
breq PulsOn
cpi r17, 2
breq PulsOff
cpi r17, 10
brne return
ldi r17, 0
return: out SREG, r18
reti
PulsOn: sbi PORTB, 0
rjmp return
PulsOff: cbi PORTB, 0
rjmp return