Chyba při komunikaci USART a Mega8 - příjem nesmyslů

Zdravim vsechny, nevite nahodou nekdo cim by mohlo byt ze me nefunguje komunikace USART na procesoru mega8? Mam tam externi krystal 16MHz, kterej me funguje urcite dobre. Zkousel jsem snad vsechno nastaveni, menit paritu, stop bity, baud rate, ty rychlosti jsem zkousel od 600 do 14400 a na zadne to nejede spravne. Chova se to tak, ze to vzdy prijima spatne znaky. Proste nesmysly. Aji pri samotnym prijmu. Zde prikladam program kde by to melo vypsat znak kterej tam poslu. Zkousel jsem u double speed, u ktere vychazi pri rychlostu 2400 nejmensi chyba (ubrr = 832).

Z jakykoli rady budu moc vdecnej. Diky moc

#include <avr\io.h> // hlavièkový soubor pro použitý mikrokontrolér
#include <inttypes.h>

#define FOSC 16000000UL

#define BAUD 2400
#define MYUBRR FOSC/8/BAUD-1

//#define MYUBRR 832

void USART_Init( unsigned int ubrr);
unsigned char USART_Receive( void );
void USART_Transmit( unsigned char data );

int main(void)
{

USART_Init(MYUBRR);

unsigned char i;
while(1) {
i = USART_Receive();
USART_Transmit(i);
}

}

/**************************************************************************/
unsigned char USART_Receive( void )
{
/
Wait for data to be received /
while ( !(UCSRA & (1<<RXC)) )
;
/
Get and return received data from buffer */
return UDR;
}

/***************************************************************************/

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer /
while ( !( UCSRA & (1<<UDRE)) )
;
/
Put data into buffer, sends the data /
UDR = data;
}
/
**************************************************************************/

void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

UCSRB = (1<<TXEN)|(1<<RXEN);

UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

UCSRA = (1<<U2X);

}
/***************************************************************************/

:arrow_right: administrator: přejmenováno z "CHYBA při komunikacu USART a mega8"

Muj program pro RS232 pouziva interni krystal 8 Mhz, pri zaslani pismen od a do g rosviti prislusnou LED a posle ten samy znak do hyperterminalu.

pouzivam ATmega8 a Max232.

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

#define USART_BAUDRATE 2400
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

volatile unsigned char LED1;
int main (void)
{  
	DDRC=0xff;
    LED1=0x00;

   UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry
   UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes

   UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
   UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register

   UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC)
   sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed
   for (;;) // Loop forever
   {
         // Do nothing - echoing is handled by the ISR instead of in the main loop
   }   
}

ISR(USART_RXC_vect)
{
   char ReceivedByte;

   ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"
   	if (ReceivedByte==0x61) LED1=LED1^0b00000001;
	if (ReceivedByte==0x62) LED1=LED1^0b00000010;
	if (ReceivedByte==0x63) LED1=LED1^0b00000100;
	if (ReceivedByte==0x64) LED1=LED1^0b00001000;
	if (ReceivedByte==0x65) LED1=LED1^0b00010000;
	if (ReceivedByte==0x66) LED1=LED1^0b00100000;
    PORTC=LED1;
	UDR = ReceivedByte;// Echo back the received byte back to the computer

}

Doufam, ze to pomuze

Diky, ale nastaveni mam prakticky stejne. Akorat tam nemam preruseni a to by problem resit nemelo. Ja kdyz vysilam radu znaku tak me v terminalu nikdy neprijdou ty co jsem poslal ale shluk nejakych nesmyslnych znaku.

Tak je evidentne nastavena ina prenosova rychlost, alebo iny pocet bitov vo vysielanom slove. Pomen trochu Bd v PC, kym sa nestrafis a tak sa dozvies vo co gou, ked to uz nejde z nastavenia. Nemas nahodou zapnuty delic zakladnej frekvencie vo fuses? Od novoty byda nastaveny. Spomal prijimaciu Bd 8x a ak budes chytat co co ocakavas, nastav si poriadne poistky.

Dolezita kontrolna otazka Prevodnik funguje korektne ? gnd prepojena ???

Jaktoze je nastavena jina prenosova rychlost? podle vzorce pro vypocet rychlosti 2400: FOSC/8/BAUD-1 = 16 000 000 / 8 / BAUD -1 = 832,33

Tzn. chyba minimalni a 832 tam nastavuju a v terminalu mam Baud rate nastaveny na 2400. A velikost slova je nastaveny na 8 bit.

A delic zakladni frekvence je co? screen Fuses je zde:

Diiky

GND mam pripojenou a Prevodnik, ktery? podle me by vsechno melo fungovat dobre. Na tomto atmelu vyuzivam vic periferii a vsechno zatim funguje az na tohle bez problemu.

Diky za odpoved

Sorry, v tomto som Ta poplietol s ATmega88 :slight_smile:

Je to parameter CKDIV8.
atmega88_fuses.PNG

:slight_smile: nevadi. Ale fakt uz z toho zacinam byt zoufalej…zkousel jsem snad jakykoliv nastaveni i proste vsechno mozny a nejede to. Presne tenhle (i dalsi) programky jsem zkousel i na mega16 a tam me to taky nejelo. A zkousel jsem to cist primo z COMky na desce a i pres prevodnik RS232/USB a naprosto stejnej vysledek. Zkousel jsem to i zapojit do sebe (Rx na Tx v PC) a to me v terminalu fungovalo.

Takze to shrnu na hromadu aby se dalo dale pracovat.
Mas ATMega8 s externim krystalem.
Pripojil si to pres FT232 s USB a komunikace nefunguje… To FT232 se prodava jako SSOP28 to sis to zapajel sam nebo mas pripravek na SSOP28 na DIL28???
Ja jsem komunikaci delal pres MAX232 a tam je nutno spravne zapojit vsechny kondenzatory (myslim ze 1uF) davat pozor kde je + a -)
Tobe nefungoval ani tento Max232?
Pro komunikaci uC s PC je totiz potreba pouzit MAX232 pro prevod napetovych urovni (mam pocit ze PC pracuje s 12V a uC s 5V)
Jinak muzu poslat schema zapojeni jak jsem to mel s tim MAX232, klidne i fotku na nepajivem poli.
Jinak zakladni zapojeni je zde: coolcircuit.com/circuit/rs232_driver/max232.gif

Zkousel jsem to pripojit primo na COM v PC ( nemam ho vyvedenej ale na desce COM mam takze jsem tam pripojil Rx, Tx a GND primo na piny). to byl jeden zpusob a druhej pres uz hotovy prevodnik ( je to presne tady ten serialgear.com/1-Port-Serial … 2-1MB.html ), tam jsem taky zapojil jen Rx, Tx a GND a v obou pripadech me to vyhazuje stejny kraviny.

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Hmm, tak to urcite nebude fungovat, je mozne ze uz nefunguji ani piny 2 a 3 RX a TD na uC, protoze byli odpaleny primym pripojenim.
uC nelze s PC pripojit primo, musis pouzit MAX232 (cca 20kc v GME) pro prevod urovni.
Funguje to s obema porty PC jak RS232 tak s USB/RS232 prevodnikem ale pouze pres MAX232. Tak to objednej a pro jistotu i ATMega8, pokud nemas nahradni.
MAX232: gme.cz/cz/max232cpe-p433-100.html
A nezapomen nakoupit i prislusne kondenzatory, pokud nemas.

Nemusi tomu tak bejt, kdysi sem taky mel pripojenej sice PIC ale taky 5v logiku primo na seriovej, mel sem tam jenom R 470 , a fungovalo to dlouho , na novejsim PC uz to nejde , nepodere 5v logiku , nemusi bejt zniceny (ale muzou), tak vyskousej, pripoj na TX ledku a hot si vysilani 0xAA do smycky po 100mS a mela by blikat, a RX dej PullUp a R 1K na gnd a brnkej o RX , led nastavi preruseni od primu dat

Samozrejme mas pravdu, ze uC muze jeste fungovat, sam jsem se nekolikrat divil, kolik toho moje prvni Mega prezila :slight_smile: Az jednou neprezila 230V. Jenom doufam, ze Logrus uz to konecne rozstreli.

No neodpalil jsem to :slight_smile: to jsem si jistej :slight_smile: jednak jsem to pripojil pres odpor (nevim ted jakej presne ale byl v kilech ) a jednak se me to chova uplne stejne jak pred tim testem…

ked to prepojis ccez kilovy odpor ma pochybnost ize to stiahne netie pod rozhodovaciu uroven… nahod tam prevodnik stym maom a potom sa ozvi.

Ak poiuzijes priamo cip FT232 to mozes priamo spojit s uP.

Cip FT232 nelze primo pouzit do nepajiveho pole, kup ten Max232 :slight_smile:
Pro cip FT232 by si musel koupit jeste napr USB B konektor a kabel USBA a USBB, zatimco kdyz poridis MAX232 tak uz muzes pouzit ten USB/RS232 kabel co uz mas.

Vyzkoušej loop na obou stranách. Na PC jsi psal, že ti chodí, tak připoj maxe a spoj mu RX-TX (musí mít vlastní napájení +5V). Musí se to chovat jako loop přímo na PC.
Pak na MCU. Spoj mu RX-TX. Vytvoř přerušení RXC. Odešli znak, v přerušení by se měl přijmout, porovnej ho s odeslaným a třeba si rozsviť ledku.

Pokud budou oba loopy chodit, spoj RX maxe s TX mcu a TX maxe s RX mcu. Chodily-li loopy, musí chodit i loopback vytvořený programově v mcu (v přerušení RXC přijatý znak pošli zpět). Pokud ne, může to být jen různou rychlostí.

Kdybys to nerozjel, hoď nám sem blokový schéma propojení.

Zkusim teda toho MAXe a pak dam vedet. Ale nemelo by to jet i bez toho??? znam spoustu lidi co jim to frcelo i bez MAXe…

Ale ved ide… do haja :slight_smile: Priame prepojenie HW UARTU na procesore s HW RS232 NIKDY nemoze ist v poriadku. Uz len kvoli vzajomnej inverzii signalov.

Pozri si konecne (VELMI PEKNE TA PROSIM) specifikaciu RS232 napriklad na hw.servri,

Hlavne napatove urovne signalov. Ako moze procesor alebo jeho cast na normalne fungovat, ked pri napajani 5V nan mozes priviest priamo skoro +12V a -12V? Velmi podobna logika je pripojit UART procesora priamo do 230V zasuvky pre komunikaciu cez napajaciu sustavu. :slight_smile:

Je to normalny predpoklad? Procesor snad neodisiel, lebo ta RS232 z dovodov vlastnej ochrany nie je schopna dodat prilis velky prud ale i tak je to viac ako nebezpecne.

A uz vobec nehovorim o tom, ze RS232 ma UPLNE OPACNU logiku signalov UARTu ako je priamo na procesore. Bez invertorov Ti to jednoducho NEPOJDE. To by inak vysvetlovalo prijem tych nezmyslov. Takze v konecnom dosledku pre Teba predsalen dobra sprava.