Atmega8 USART [LÖST]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
John
Inlägg: 62
Blev medlem: 12 juli 2005, 20:24:47
Ort: Göteborg

Atmega8 USART [LÖST]

Inlägg av John »

Sitter och försöker få igång seriell kommunikation (RS232) mellan en atmega8 och PC.
Mellan atmegan och PC:n sitter en MAX232.
Kör hyperterminalen på PC:n för att ta emot inkommande data.
Tyvärr blir det ingen som helst reaktion i hyperterminalen när jag försöker skicka data från atmegan.
Jag har mätt signalerna på MAX232:ans pinnar och de verkar vara bra, +-9V på RS232-sidan och 0/5V på uC-sidan.
Har även kontrollmätt seriekabeln efter avbrott, och testat serieporten mot en annan seriell enhet.
Hög och låg hastighet har provats (115200/2400 bps).
Nu kan jag inte komma på något mer som kan felsökas. Har ni några bra tips?


Nedan visas koden som används för initera atmegans USART och skicka data.

Kod: Markera allt

#define USART_BAUD 115200ul
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)
#define F_CPU 8000000

void USART_vInit(void){


	// Set baud rate
	UBRRH = (uint8_t)(USART_UBBR_VALUE>>8);
	UBRRL = (uint8_t)USART_UBBR_VALUE;

	// Set frame format to 8 data bits, no parity, 1 stop bit
	UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

	// Enable receiver and transmitter
	UCSRB = (1<<RXEN)|(1<<TXEN); 
	
}


void USART_vSendByte(uint8_t u8Data){

	// Wait if a byte is being transmitted
	while((UCSRA&(1<<UDRE)) == 0);

	UDR = u8Data;	// Transmit data
}
[/code]
Senast redigerad av John 18 april 2007, 21:32:01, redigerad totalt 1 gång.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Har du en hyffsat snabb multimeter så ska det gå att se när nollorna kommer. Gör ett program som skickar 0x0F relativt långsamt, då borde du kunna se att spänningen varierar mellan +/-9V.
Själv har jag aldrig gillat hyperterminalen. Är du säker på att du gjort rätt inställningar gällande baudrate och antalt bitar/stoppbitar? Har du stängt av flödesreglering?

Edit: Pröva en hårdvaruloopback på datorns serieport och även på atmegan.
Mindmapper
Inlägg: 7122
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Inlägg av Mindmapper »

Du säger att du mätt signalerna. Jag skulle snarare vilja säga att du mätt spänningarna. Vad du skulle behöva mäta är just signalerna.
Kommer det ut 1'or ¨0'or från mega8?
Kommer det ut 1'or ¨0'or från MAX232?
Är du säker på att du skickar dom vidare till rätt pinne på PC,n.
Skicka ut data långsamt så kan du se på multimeter.
John
Inlägg: 62
Blev medlem: 12 juli 2005, 20:24:47
Ort: Göteborg

Inlägg av John »

Har nu provat att bygla TX- och RX-pinnarna både PC:ns serieport och på RS232-sidan av MAX232:an. När jag byglade på PC-sidan så kom alla tecken tillbaka till hyperterminalen precis som de bör.

För att testa atmegan gjorde jag ett litet program som växelvis skickar två olika tecken, beroende på vilket tecken som tas emot så tänds eller släcks en lysdiod. Detta funkar utmärkt.

Mindmapper: Har mätt på in/utgångarna med oscilloskop, hur ska jag göra för att mäta signalerna?

Kopplingen är trippelkollad. Har kopplat enligt nedan:

atmega TxD pin 31 --> max232 pin 13 --> dsub9 pin 3
atmega RxD pin 30 --> max232 pin 14 --> dsub9 pin 2
(Det är en 32pins tqfp-atmega)

I mina senaste tester så visar hyperterminalen tecken, tyvärr felaktiga, om man ställer in PC:n på lägre mottagningshastighet än atmegans sändhastighet.
Antar att det är dags för ett allvarligt försök att mäta upp de faktiska bittiderna.

/John
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Är fusebitarna rätt satta för kristallen? Låter som riming fel och fusebitarna är en vanlig miss.

EDIT: Vid 115200 får du för stort fel, 7,8% vilket inte funkar. Men 2400 borde bli bra (0,2% fel).
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Har du verkligen kopplat rätt. Har du inte kopplat ihop RXD-RXD och TXD-TXD?
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

John skrev:Har nu provat att bygla TX- och RX-pinnarna både PC:ns serieport och på RS232-sidan av MAX232:an. När jag byglade på PC-sidan så kom alla tecken tillbaka till hyperterminalen precis som de bör.

/John
Och när du byglade på "andra" sidan av MAX?
John
Inlägg: 62
Blev medlem: 12 juli 2005, 20:24:47
Ort: Göteborg

Inlägg av John »

>thepirateboy: Jag har kopplat enligt dettaschema men har bytt plats på pin 2 och 3 i dsub-kontakten.

>björn: Använder Ponyprog för att programmera och har satt fusebitarna så här:
Bild

Har testat med ett program som blinkar med en lysdiod en gång per sekund så jag är ganska säker att fuse-bitarna är rätt.

Nu har jag även testat att bygla MAX232 på TTL-sidan och skicka från PC:n och det funkar utmärkt.
Så då borde problemet vara lokaliserat till atmegan. Får ta och gräva mig djupare i databladet så jag får igång det med låg hastighet.
Blir till att byta till 7.372MHz kristall sen.

/John
Mindmapper
Inlägg: 7122
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Inlägg av Mindmapper »

John skrev: Mindmapper: Har mätt på in/utgångarna med oscilloskop, hur ska jag göra för att mäta signalerna?
Bra att du är på rätt spår, du löser säkert timeing bekymren snart.
Du har mätt alldeles rätt, varför du inte fick några signaler första gången vet jag ej.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Förklara det där med att du bytt RXD/TXD mot schemat. Varför?

Schemat ser fel ut. Förutsatt att man försöker koppla DSUB:en rakt in i PC:n och inte har någon korsad kabel eller dylikt emellan. På en 9-pol DSUB RS232 DTE (d.v.s en PC) så ligger sändande signal på pin 3 och mottagande på pin 2.

Så enligt min mening är det rätt att skifta dom, men ville bara kolla så attt det är däför du bytt dom och inte för att t.ex köra med en 25-polig DSUB.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Inlägg av BEEP »

John
Inlägg: 62
Blev medlem: 12 juli 2005, 20:24:47
Ort: Göteborg

Inlägg av John »

vfr: Skiftade pin2 och 3 för att schemat såg fel ut, bra att det är fler som tycker det.
Använder en rak 9 pins kabel.

Edit:
Kan man mäta med oscilloskopet om processorn använder kristallen? Har gjort detta på PIC-processorer med 4MHz kristall, men atmegan går nu på 8MHz och det verkar vara på gränsen av vad mitt oscilloskop klarar så det är svårt att se om kristallen svänger ordentligt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Kan man mäta med oscilloskopet om processorn använder kristallen?

Mät på någon annan pinne (inte direkt på kristallen) som du låter
programmet toggla med en känd frekvens.
Mr M
Inlägg: 165
Blev medlem: 20 januari 2006, 21:35:14

Inlägg av Mr M »

Gör en loop i AVRen som skickar ut 0xAA hela tiden. Mät signalen med oscilloskopet och kontrollera bittiden så den är 1/baudrate.
John
Inlägg: 62
Blev medlem: 12 juli 2005, 20:24:47
Ort: Göteborg

Inlägg av John »

Nu har jag löst problemet!
Tack Mr M och alla andra som kommit med goda råd. Det gjorde susen att skicka ut 0xAA (fast jag fick bättre bild på oscilloskopet med 0x55).
Det visade sig att kommunikationen bara gick i 300bps. Detta p.g.a. att när initieringsrutinen skrev till UCSRC så skrev den även till UBRRH som tillsammans med UBRRL bestämmer baudrate.

Lösningen var att nolla UBRRH efter det att skrivningen till UCSRC var klar.

Tror inte att man ska behöva göra så här, men nu funkar det så jag är helnöjd.
Skriv svar