Hi !
Ich versuche Krampfhaft einen Software UART zu Basteln...
Er soll erstmal nur Empfangen können.
Mein Ansatz ist nicht der beste, ich dachte irgendwie das müsste so funktionieren aber scheinbar habe ich einen mega falschen Ansatz....
ich verwende 16Mhz, habe meinen Timer auf 300Hz gestellt, da ich erst mal mit 300 Baud am testen binn...
wo ist hier der Fehler in Meinem Ansatz ?
Code:
#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 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)
{
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 (!(PIND & (1 << PD2)))
{
udr &=~ (1<<bitCnt++);
}else
{
udr |= (1<<bitCnt++);
}
if(bitCnt == 7)
{
bitCnt = 0;
TIMSK &=~(1<<TOIE0);
GIMSK |= (1<<INT0);
}
}
Mir ist auch bewusst das ich momentan das Startbit mit einlese, ich sende mir eine 85(weil binär 01010101) bekomme aber immer eine 255.
Ich währe hier für jede Hilfe Dankbar!
Mfg Fugitivus
Lesezeichen