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:
In der Doku steht: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
Wenn das so eingetippt wird, ist das UCSR0A Register nicht in der Range.Code:in r16, UCSRnA sbrs r16, UDREn
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







Zitieren

Lesezeichen