Hallo, ich habe irgendwie mittlerweile ein Verständnisproblem bezüglich meines Timers im Mega128. Ich möchte Daten per USART senden: 8Bit, 1 Startbit, 2 Stoppbit, 9600Baud Das Senden geht ohne Probleme, aber ich muss ein Reset über den Bus senden. Dazu wird der TX abgeschaltet und der entsprechende PIN auf 0 gesetzt, nach Zeit X wird die TX wieder aktiviert, eine Weile lang 1 ausgegeben und dann (jetzt nur noch) 1 Byte gesendet. Für die Zeit 0 und 1 auf TXD verwende ich TIMER 0 , der mittlerweile permanent läuft, da ich hier schön länger grübel und nicht verstehe, weshalb ich 0 auf TX nur mit 920µs erhalte und 1 auf TX mit ca. 2200µs. Lt. Simulation im AVR Studio sollten beide Zeiten 2200µs lang sein. Ich denke im Code klemmt etwas, aber wo??? Im beigefügten Bild sieht man das Timing! 0 --> 920µs 1--> 2040µs Der Code für Timer und USART ohne Initialisierung: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ USART0_INIT: ldi temp0, (1<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01) sts UCSR0C, temp0 ; set frame format: 8 data + 2 stop clr temp0 sts UBRR0H, temp0 ldi temp0, 103 ; 9600 baud @ 16mhz out UBRR0L, temp0 ldi temp0, (1<<UDRIE0)|(1<<TXEN0) out UCSR0B, temp0 ; set USART 0 tx_status to generate tx_reset ldi XL, LOW(TX_STATUS) ldi XH, HIGH(TX_STATUS) ser temp0 st X, temp0 ... TIMER0_INIT: ldi temp0, (1<<CS02)|(1<<CS00); Prescaler 1024 out TCCR0, temp0 ... ; ************************************************************************ * ; ***** TIMER 0 OVF ; ************************************************************************ * TIM0_OVF: ; reset counter clr temp0 out TCNT0, temp0 ; reset TOIIE0 ldi temp0, (1<<TOIE1);|(1<<TOIE1) out TIMSK, temp0 ; enable TXD ldi temp0, (1<<TXEN0)|(1<<UDRE0) out UCSR0B, temp0 ; generate mark after break MAB_LOOP: ; wait for TOV0 flag in temp0, TIFR sbrs temp0, TOV0 rjmp MAB_LOOP ; reset TOV0 flag in temp0, TIFR ori temp0, 0b00000001 out TIFR, temp0 ; load status byte tx0 ldi XL, LOW(TX_STATUS) ldi XH, HIGH(TX_STATUS) ; set tx0_status = 0 clr temp0 st X, temp0 reti ; ************************************************************************ * ; ***** USART0_TXC ; ************************************************************************ * USART0_UDRE: ; check status to generate TX-RESET ldi XL, LOW(TX_STATUS) ldi XH, HIGH(TX_STATUS) ; load tx0_status ld temp0, X cpi temp0, 255 breq TXD0_RESET ; ************************************************************** LOAD_DATA_FROM_CHART: ldi YL, LOW(CLOCK) ldi YH, HIGH(CLOCK) clr temp2 add YL, temp0 adc YH, temp2 ; load data from clock chart ld temp1, Y SEND_TX: ; count tx0_status inc temp0 st X, temp0 ; send byte ldi temp1, 0b01010101 out UDR0, temp1 ; check - all channels sent cpi temp0, 1 brge LAST_BYTE reti LAST_BYTE: ; generate tx0 reset if byte sent ser temp0 st X, temp0 reti ; ------------------------------------------------------------------ TXD0_RESET: ; tx --> off - set to 0 clr temp0 out UCSR0B, temp0 out PORTE, temp0 ; clear TOV0 flag in temp0, TIFR ori temp0, 0b00000001 out TIFR, temp0 ; reset counter clr temp0 out TCNT0, temp0 ; enable timer0_ovf interrupt ldi temp0, (1<<TOIE0) out TIMSK, temp0 reti ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ Ich hoffe irgend jemand kann mir sagen, wo ich hier schief denke, oder was hier schief geht - denn irgendwie klammere ich mich noch an die Simulation im Studio, wo es ja passt. Vorab schon mal danke! MfG Nicky
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.