Sida 1 av 1

Atmega8 USART [LÖST]

Postat: 1 april 2007, 15:26:49
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]

Postat: 1 april 2007, 16:25:21
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.

Postat: 1 april 2007, 16:35:37
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.

Postat: 1 april 2007, 19:53:05
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

Postat: 1 april 2007, 20:00:57
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).

Postat: 1 april 2007, 20:04:46
av thepirateboy
Har du verkligen kopplat rätt. Har du inte kopplat ihop RXD-RXD och TXD-TXD?

Postat: 1 april 2007, 20:07:03
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?

Postat: 1 april 2007, 20:53:16
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

Postat: 1 april 2007, 23:33:41
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.

Postat: 2 april 2007, 10:14:56
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.

Postat: 2 april 2007, 10:54:34
av BEEP

Postat: 2 april 2007, 13:14:11
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.

Postat: 2 april 2007, 13:28:17
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.

Postat: 4 april 2007, 20:54:37
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.

Postat: 18 april 2007, 21:31:42
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.