AVR seriell kommunikation

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
swirve
Inlägg: 398
Blev medlem: 13 mars 2007, 21:58:25
Ort: Norrköping

AVR seriell kommunikation

Inlägg av swirve »

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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: AVR seriell kommunikation

Inlägg av johano »

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
swirve
Inlägg: 398
Blev medlem: 13 mars 2007, 21:58:25
Ort: Norrköping

Re: AVR seriell kommunikation

Inlägg av swirve »

Kör extern 16MHz kristall. Alltså jag får ju kommunikation, men nånstans förvrängs den.
Virror
Inlägg: 1025
Blev medlem: 28 april 2004, 11:03:14
Ort: Göteborg
Kontakt:

Re: AVR seriell kommunikation

Inlägg av Virror »

Har du rätt baud och dom andra inställningarna? Dubbel och trippel kolla : p
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: AVR seriell kommunikation

Inlägg av stekern »

16 MHz är ju inte optimalt för seriell kommunikation, så det är inte omöjligt att det är där det spökar
swirve
Inlägg: 398
Blev medlem: 13 mars 2007, 21:58:25
Ort: Norrköping

Re: AVR seriell kommunikation

Inlägg av swirve »

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...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: AVR seriell kommunikation

Inlägg av sodjan »

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.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Re: AVR seriell kommunikation

Inlägg av björn »

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:

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;
}
Skulle kanske även vara buspiraten som är fel konfigurerad men det vet jag inget om :)
swirve
Inlägg: 398
Blev medlem: 13 mars 2007, 21:58:25
Ort: Norrköping

Re: AVR seriell kommunikation

Inlägg av swirve »

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.

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; 
	}
}
Matlab:

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.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: AVR seriell kommunikation

Inlägg av Swech »

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
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: AVR seriell kommunikation

Inlägg av stekern »

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.
swirve
Inlägg: 398
Blev medlem: 13 mars 2007, 21:58:25
Ort: Norrköping

Re: AVR seriell kommunikation

Inlägg av swirve »

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.
Skriv svar