Frage zu Software Uart mit TimerOverflow Interrupt
von
am 25.11.2011 um 14:03 (1517 Hits)
habe den timer auf 600Hz warte jetzt mit einem flag die halbe bitzeit dennoch kommt nur müll raus... was mach ich falsch ?
mfg FugitivusCode:#include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> #include <util/delay.h> #include "init.h" #include "lcd.h" //SoftUART PINS #define RXPIN 2 #define RXINT INT0 #define UARTDDR DDRD #define UARTPIN PIND #define UARTPORT PORTD #define T0REL 152 char iOut[20]; unsigned char bitFlag = 0; unsigned char bitCnt = 0; unsigned char udr = 0; void cfgInt0(void) { MCUCR |= (1<<ISC01); //INT0 falling edge GICR |= (1<<INT0); //INT0 interrupt enable } void cfgTimer0(void) { TCNT0 = T0REL; TCCR0 |= (1<<CS02); //TIMSK |=(1<<TOIE0); } void cfgSoftUart(void) { UARTDDR &=~ (1<<RXPIN); //RX Pin als Input UARTPORT &=~ (1<<RXPIN); //RX Pin auf 0 cfgInt0(); //Software Uart Interrupt cfgTimer0(); //Software Uart Timer } int main(void) { cfgPorts(); cfgSoftUart(); cfgLcd(LCD_ON_CURSOR_OFF); lcdCls(); enableInterrupts(); _delay_ms(200); lcdPrint("Software Uart",1,1); while(1) { itoa(udr,iOut,10); lcdPrint(" ",1,3); lcdPrint(iOut,1,3); itoa(udr,iOut,2); lcdPrint(iOut,5,3); _delay_ms(1000); } return 0; } ISR(INT0_vect) { GICR &=~ (1<<INT0); TCNT0 = T0REL; TIMSK |=(1<<TOIE0); } ISR(TIMER0_OVF_vect) { TCNT0 = T0REL; if(bitFlag == 0) { bitFlag = 1; }else { bitFlag = 0; if(!(PIND & (1 << PD2))) { udr &=~ (1<<bitCnt++); }else { udr |= (1<<bitCnt++); } if(bitCnt == 7) { bitCnt = 0; TIMSK &=~(1<<TOIE0); GIMSK |= (1<<INT0); } } }