Du hast natürlich recht, ich war bei einem anderen Wert in Gedanken.
Ich habe jetzt einen Anfang gemacht und möchte das mit dem USART verbinden, allerdings klappt das nicht so wie ich das möchte.
Die Low Time ist jetzt auf 10ms eingestellt, wie könnte ich das erweitern auf 100ms mit einem 8 Bit Timer?
Es wäre lieb wenn Ihr einmal drüber schaut:
Code:
.def temp = r16
.def value = r17
.def timer0 = r20
.def timer1_low = r21
.def timer1_high = r22
/* BEGINN DES HAUPTPROGRAMMES*/
Reset:
ldi temp, HIGH(RAMEND) ; Stackpointer
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, ( (1<<PD2) | (1<<PD3) ) ; Interrupt Pins auf Eingang, der Rest bleibt als Ausgang
out DDRD, temp
ldi temp, 0xFF ; PORTB wird als Ausgang gesetzt
out DDRB, temp
ldi temp, 0x00
out PORTD, temp ; Alle Pins auf 0 setzen (Die beiden Eingänge bekommen keinen Pull-Up)
UART_Reset:
ldi temp, HIGH(UBRR_VAL)
sts UBRR0H, temp
ldi temp, LOW(UBRR_VAL)
sts UBRR0L, temp
ldi temp, ( (1<<UMSEL00) | (1<<UCSZ01) | (1<<UCSZ00) ) ; synchron mit 8 Bit.
sts UCSR0C, temp
ldi temp, (1<<TXEN0)
sts UCSR0B, temp
Timer0_Reset:
ldi temp, (1<<CS01) ; setze Vorteiler auf 8
out TCCR0B, temp
ldi temp, (1<<COM0A1) ; der Ausgang wird immer beim Oberflow
out TCCR0A, temp ; immer auf LOW gesetzt
ldi temp, 0xFA ; 250 Schritte entsprechen genau 100us
out OCR0A, temp
ldi temp, (1<<OCIE0A) ; aktiviere Compare-Overflow Interrupt
sts TIMSK0, temp
Timer1_Reset:
ldi temp, (1<<ICES1)
sts TIMSK1, temp
Loop:
jmp Loop
isUDRclear:
ldi temp, UCSR0A
sbis temp, 5 ; Überprüfe ob das UDR Register LEER ist !!! Hier ist der Fehler :" Invalid number"
rjmp isUDRclear ; Wenn nicht bleibt in einer Schleife bis es so ist.
sts UDR0, value
ret nop
Result_Output:
mov value, timer1_low ; Timerwert auf den USART geben
rcall isUDRclear
mov value, timer1_high ; Timerwert auf den USART geben
rcall isUDRclear
rcall sync_0
jmp Loop
Sound_On:
cbi PORTD, 6
reti nop
TIM0_COM:
/*Die Pegel auf LOW setzen brauch nicht implementiert werden,
da das von der HArdware gemacht wird*/
inc timer0
cpi timer0, 0x64 ; Damit wird der High Timer auf 10ms festgelegt.
breq Sound_On
reti nop
TIM1_CAP:
/*Hardware speichert Werte im RAM*/
ldi timer1_low, TCNT1L
ldi timer1_high, TCNT1H
reti nop
In der Doku steht:
Code:
in r16, UCSRnA
sbrs r16, UDREn
Wenn das so eingetippt wird, ist das UCSR0A Register nicht in der Range.
Ich muss mir noch etwas einfallen lassen, wie ich die Ausgabe zum PC mache, ohne das interrupt zu verlängern und ohne es im Main Loop die ganze Zeit ausgeben zu lassen
Liebe Grüße
Lesezeichen