AVR seriell kommunikation
AVR seriell kommunikation
Jag har lite problem som jag hoppas ni kan hjälpa mig med. Jag ska prata seriellt mellan AVR (Atmega16) och min dator, i detta fall i MATLAB. Jag använder en "Bus Pirate" som transparent USB-seriell konverterare (FTDI-krets som sköter det ).
Problemet jag har är att jag får fel tecken. Jag ger lite exempel:
Skickar jag 0 får jag 255.
1 får jag 253
1 får jag 251
...
125 får jag 125
127 får jag 127
128 får jag 255
129 får jag 253
o.s.v.
Och när jag säger skickar så är det att jag skickar från AVR till datorn. Till saken hör att jag har för något år sen pratat seriellt mellan AVR och Matlab och då funkade det hur bra som helst, men då var det på en dator med riktig port och en MAX232-krets. Detta är mycket irriterande och jag kan bara inte komma på var jag har gjort fel. Det är ju en högst simpel sak tycker jag.
Problemet jag har är att jag får fel tecken. Jag ger lite exempel:
Skickar jag 0 får jag 255.
1 får jag 253
1 får jag 251
...
125 får jag 125
127 får jag 127
128 får jag 255
129 får jag 253
o.s.v.
Och när jag säger skickar så är det att jag skickar från AVR till datorn. Till saken hör att jag har för något år sen pratat seriellt mellan AVR och Matlab och då funkade det hur bra som helst, men då var det på en dator med riktig port och en MAX232-krets. Detta är mycket irriterande och jag kan bara inte komma på var jag har gjort fel. Det är ju en högst simpel sak tycker jag.
Re: AVR seriell kommunikation
Hur är avren klockad?
Vanligt fel är att köra med den in yggda oscillatorn vilken
inte är tillräckligt noggrann för seriell kommunikation
/johan
Vanligt fel är att köra med den in yggda oscillatorn vilken
inte är tillräckligt noggrann för seriell kommunikation
/johan
Re: AVR seriell kommunikation
Kör extern 16MHz kristall. Alltså jag får ju kommunikation, men nånstans förvrängs den.
Re: AVR seriell kommunikation
Har du rätt baud och dom andra inställningarna? Dubbel och trippel kolla : p
Re: AVR seriell kommunikation
16 MHz är ju inte optimalt för seriell kommunikation, så det är inte omöjligt att det är där det spökar
Re: AVR seriell kommunikation
Ja alltså så långt jag kan komma är allting inställt rätt. 9600 bps 8n1. På vilket sätt är 16MHz inte bra? Men eftersom jag får överföring, så måste ju de tekniska sakerna vara korrekta? Känns som det är fel på nånting annat...
Re: AVR seriell kommunikation
Felkopplat, felkonfigurerat eller båda delarna.
Ingendera säger du inte så mycket om, så det
är väl bara för dig att felsöka. Eller göra en riktig
beskrvning av hur det hela är uppsatt.
Ingendera säger du inte så mycket om, så det
är väl bara för dig att felsöka. Eller göra en riktig
beskrvning av hur det hela är uppsatt.
Re: AVR seriell kommunikation
16 MHz och 9600 bps bör funka, ger ett fel på 0,2% och det brukar inte ge problem.
Du kan jämföra vad du sätter dina register till mot nedan:
Skulle kanske även vara buspiraten som är fel konfigurerad men det vet jag inget om 
Du kan jämföra vad du sätter dina register till mot nedan:
Kod: Markera allt
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0,2%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x67; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}

Re: AVR seriell kommunikation
Ja nånstans är det ju fel såklart. Men när jag inte rett ut det nu efter mycket testande hit och dit var tanken att någon kanske hade en idé om vad som var fel som jag inte tänkt på.
Det är kopplat på enklast möjliga vis. RX(BP) till TX(AVR) och TX(BP) till RX(AVR) och GND-GND.
Koden simplast möjlig. Bouncar skickad byte. I Matlab är det simpla kommandon.
Matlab:
Och det känns ju som att felet inte ligger hos AVR:en utan snarare hos BusPirate eller Matlab.
Det är kopplat på enklast möjliga vis. RX(BP) till TX(AVR) och TX(BP) till RX(AVR) och GND-GND.
Koden simplast möjlig. Bouncar skickad byte. I Matlab är det simpla kommandon.
Kod: Markera allt
int main(void) {
unsigned char ReceivedByte;
UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = 103;
for (;;)
{
while ((UCSRA & (1 << RXC)) == 0) {
};
ReceivedByte = UDR;
while ((UCSRA & (1 << UDRE)) == 0) {
};
UDR = ReceivedByte;
}
}
Kod: Markera allt
s1 = serial('COM4', 'BaudRate', 9600, 'InputBufferSize',1);
fopen(s1)
fwrite(s1,data)
fread(s1,1)
Och det känns ju som att felet inte ligger hos AVR:en utan snarare hos BusPirate eller Matlab.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: AVR seriell kommunikation
om du kör mot hyperterminal eller liknande - hur blir det då?
Inbyggd RC osc fungerar med RS232, kan behöva kalibreras med kalibreringsvärdet.
16Mhz extern xtal är inga problem alls att få att funka med RS232.
Swech
Inbyggd RC osc fungerar med RS232, kan behöva kalibreras med kalibreringsvärdet.
16Mhz extern xtal är inga problem alls att få att funka med RS232.
Swech
Re: AVR seriell kommunikation
I 9600bps är det inga problem nej, men i andra hastigheter kan det bli problem beroende på hur känslig/nogrann den andra sidan är.
Re: AVR seriell kommunikation
Felet framgår ju dessutom i databladet. Så det är ju bra att ta ett värde med lågt fel.
Nästa steg blir nog att testa i skolan där det finns stationära datorer med com-port.
Nästa steg blir nog att testa i skolan där det finns stationära datorer med com-port.