Gast
#2617842
Hallo Forengemeinde,
benötige bei der Timerprogrammierung einen Denkanstoss.
Habe testweise einmal die folgende Programme erstellt.
Programm 1:
--------------------------------------------------
.include "m88def.inc"
.equ fq = 16000000 ; Quarzfrequenz
.equ baud = 19200 ; Baudrate RS-232 Schnittstelle
.equ bddivH = 0x00 ; Teilfaktor für Baudrate Highbyte
.equ bddivL = (fq/(16*baud))-1 ; Teilfaktor für Baudrate Lowbyte
.def temp = r16
.def leds = r17
.def temp2= r18
.org 0x0000
rjmp main ; Reset Handler
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; PCINT0 Handler
reti ; PCINT1 Handler
reti ; PCINT2 Handler
reti ; Watchdog Timer Handler
reti ; Timer2 Compare A Handler
reti ; Timer2 Compare B Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 Compare A Handler
reti ; Timer1 Compare B Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Compare A Handler
reti ; Timer0 Compare B Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART, RX Complete Handler
reti ; USART, UDR Empty Handler
reti ; USART, TX Complete Handler
reti ; Analog Comparator Handler
reti ; 2-wire Serial Interface Handler
reti ; Store Programm Memory Ready Handler
main:
; Initialisieren
ldi temp, high(RAMEND) ; Stackpointer H initialisieren
out SPH, temp
ldi temp, low(RAMEND) ; Stackpointer L initialisieren
out SPL, temp
ldi temp, 0b00000111 ; Port C0,C1 und C2 Ausgang, Rest
Eingänge
out DDRC, temp ; in Register schreiben
ldi leds, 0xFF ; alle Ausgänge auf high
; Timer0 initialisieren
ldi temp, (1<<CS01|0<<CS00) ; CS1 setzen: Teiler 8
out TCCR0B, temp ; in Register speichern
ldi temp, (1<<TOIE0) ; TOIE0: Interrupt bei Timer Overflow
sts TIMSK0, temp ; in Register speichern
sei ; Interupts aktivieren
loop: out PORTC,leds
wait: in temp, TIFR0
sbrs temp, $0
rjmp wait
ldi temp, 0x01
out TIFR0, temp
com leds
out PORTC,leds
wait1: in temp, TIFR0
sbrs temp, $0
rjmp wait1
ldi temp, 0x01
out TIFR0, temp
rjmp loop ; Schleife
------------------------------------------------
Dieses Programm erzeugt mir einen Rechteckimpuls mit einer Periodendauer
von 1792 µs.
-------------------------------------------------
.include "m88def.inc"
.equ fq = 16000000 ; Quarzfrequenz
.equ baud = 19200 ; Baudrate RS-232 Schnittstelle
.equ bddivH = 0x00 ; Teilfaktor für Baudrate Highbyte
.equ bddivL = (fq/(16*baud))-1 ; Teilfaktor für Baudrate Lowbyte
.def temp = r16
.def leds = r17
.def temp2= r18
.org 0x0000
rjmp main ; Reset Handler
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; PCINT0 Handler
reti ; PCINT1 Handler
reti ; PCINT2 Handler
reti ; Watchdog Timer Handler
reti ; Timer2 Compare A Handler
reti ; Timer2 Compare B Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 Compare A Handler
reti ; Timer1 Compare B Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Compare A Handler
reti ; Timer0 Compare B Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART, RX Complete Handler
reti ; USART, UDR Empty Handler
reti ; USART, TX Complete Handler
reti ; Analog Comparator Handler
reti ; 2-wire Serial Interface Handler
reti ; Store Programm Memory Ready Handler
main:
; Initialisieren
ldi temp, high(RAMEND) ; Stackpointer H initialisieren
out SPH, temp
ldi temp, low(RAMEND) ; Stackpointer L initialisieren
out SPL, temp
ldi temp, 0b00000111 ; Port C0,C1 und C2 Ausgang, Rest
Eingänge
out DDRC, temp ; in Register schreiben
ldi leds, 0xFF ; alle Ausgänge auf high
; Timer0 initialisieren
ldi temp, (1<<CS01|0<<CS00) ; CS1 setzen: Teiler 8
out TCCR0B, temp ; in Register speichern
ldi temp, (1<<OCIE0A) ; OCIE0A: Interrupt bei Timer CompareA
Overflow
sts TIMSK0, temp ; in Register speichern
ldi temp, $77
sts OCR0A, temp
sei ; Interupts aktivieren
loop:out PORTC,leds
wait:in temp, TIFR0
sbrs temp, $02
rjmp wait
sbi TIFR0, (1<<OCF0A)
com leds
out PORTC,leds
wait1:in temp, TIFR0
sbrs temp, $02
rjmp wait1
sbi TIFR0, (1<<OCF0A)
rjmp loop ; Schleife
------------------------------------------------
Dieses Programm erzeugt mir einen Rechteckimpuls mit einer Periodendauer
von 512 µs.
Ich benötige aber eine Periodendauer ca. 366 µs.
Dazu lädt man doch normalerweise den benötigten Wert in das
CompareA-Register und fragt ab ob das CompareA Register mit dem TCNTo
identisch ist.
Was mache ich falsch oder wo liegt mein Gedankenfehler?
Ich möchte es nicht über eine Interuptroutine lösen. Das habe ich
getestet
und dies funktioniert auch.
Gruß
NobbyH