Ich glaub ich habe dir gestern falsche Daten gegeben in meiner Tabelle verlesen und habe die Gleichung für den FAST-PWM-Mode genutzt (Asche auf mein Haupt)
So Korrektur für den CTC-Mode bei 20Mhz für 100µs: Teiler = 8; OCR0A = $7c (124dez) = 100µs
CTC-Mode bei 20Mhz für 100µs: Teiler = 64; OCR0A = $0f (15dez) = 104µs
Tja und mit 100ms im CTC-Mode siehts schlecht aus.
jetzt zum Programm...
Versuche mal die ganze Initialisierung in kleine Unterprogramme zu packen
z.B.:
Code:init_stack: ldi temp, HIGH(RAMEND) ; Stackpointer out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp rcall UART_Reset loop: jmp loop UART_Reset: .... ..... ret
UART_Reset: ich hoffe du hast UBRR_VAL irgendwo definiert denn die Angabe fehlt in deinem Post.
Timer0_Reset: gut wäre es den Timer erst zu starten wenn du alle Timerinitalisierungen erledigt hast und du bist auch nicht m CTC-Mode weil WGM01 nicht gesetzt ist.
isUDRclear: sbis temp, 5 dieser Befehl bezieht sich auf die PORTS, du möchtest aber ein Register nutzen dann nutze SBRS ......
Code:isUDRclear: lds temp, UCSR0A ; Hier ist der Fehler LDS weil MOMERY MAPPED sbrs temp, UDRE0 ; Ü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
> Wenn das so eingetippt wird, ist das UCSR0A Register nicht in der Range.
In einen meiner Posts hatte ich es geschrieben, schau dir bitte mal die Inlcudedatei an, da steht bei einigen Registern MOMERY MAPPED und diese RegisterCode:in r16, UCSRnA sbrs r16, UDREn
werden mit LDS r16,UCSR0A geladen und mit STS gespeichert, einfach mal reinschauen
> 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
Naja in dem du es Anforderst, du sendest über den PC ein 'A' und vergleichst es im µC wenn es stimmt machste ne Ausgabe.
hier mal überarbeitet
Nachtrag: Schon mal überlegt auf´s AVR-Studio 4.19 zu wechseln ? Das 6er ist so ziemlich noch nicht das gelbe vom Ei. Funktioniert auch mit MK2.Code: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) rcall UART_Reset rcall Timer0_Reset rcall Timer1_Reset sei ;sonst wirds nix mit den INTS das ist die Globale Freigabe Loop: jmp Loop 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 ;***Init UART 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 ret isUDRclear: lds temp, UCSR0A sbrs temp, UDRE0 ; Ü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 ;****Iint_T0 Timer0_Reset: ldi temp, (1<<COM0A1|1<<WGM01) ; der Ausgang wird immer beim Oberflow out TCCR0A, temp ; immer auf LOW gesetzt ldi temp, $7c ; 250 Schritte entsprechen genau 100us out OCR0A, temp ldi temp, (1<<OCIE0A) ; aktiviere Compare-Overflow Interrupt sts TIMSK0, temp ldi temp, (0<<CS02|1<<CS01|0<<CS00) ; setze Vorteiler auf 8 out TCCR0B, temp ret ;***Init_T1 Timer1_Reset: ldi temp, (1<<ICES1) sts TIMSK1, temp ret ;**********UP´s INT´s************* Sound_On: cbi PORTD, 6 reti 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 TIM1_CAP: /*Hardware speichert Werte im RAM------>> nein Das ist nicht der RAM ganz normaler RegisterBereich wenn mit .equ timer1_low = $0100 festlegen*/ ldi timer1_low, TCNT1L ldi timer1_high, TCNT1H reti







Zitieren

Lesezeichen