Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
YellowJacket
Pokročilý člen
Pokročilý člen
Príspevky: 503
Dátum registrácie: 05 Feb 2012, 11:58
Bydlisko: Hrinova
Vek: 33

Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa YellowJacket » 05 Sep 2020, 09:39

Caute,
snazim sa rozchodit komunikaciu atmegy8 s GSM modulom, kde komunikacia bezi iba na frekvencii 115200. Frekvenciu atmegy som nastavil v poistkach na internych 8MHz ( lfuse = 0xE4 ; hfuse = 0xD1 ). UBBR mi vyssiel podla datasheetu strana 155 na hodnotu 3. Pre istotu som hodnotu ale nechal vypocitat v programe kodom:

Kód: Vybrať všetko

ubrr = F_CPU / 16 / baudrate - 1;
V programe skusam iba zasielat znak v sekundovom intervale ale v pc terminale chodi nieco uplne ine, ako ma. Podotykam, ze ak znizim baud rate na 9600 v terminali aj v programe, tak komunikacia funguje, chybu v zapojeni, zle nastavenej frekvencii a zlom procesore preto vylucme. Co moze byt podla vas problem? Je to prilis vysoka prenosova rychlost pri pouziti interneho oscilatora 8MHz? Cital som nieco o nastavovani registra OSCCAL, ak sa pouziva interny oscilator, avsak kedze komunikacia na nizsej rychlosti funguje, neriesil som to ( nikdy som ho nenastavoval, takze neviem, ci to je nutne ). Zdrojak:

Kód: Vybrať všetko

void uartInit( unsigned int baudrate )
{

    unsigned int ubrr;
    ubrr = F_CPU / 16 / baudrate - 1;  /* F_CPU mam v Makefile nastavene na 8000000UL */

    UBRRH = (unsigned char) ( ubrr >> 8 );
    UBRRL = (unsigned char) ubrr;
 
    UCSRB = ( 1 << RXEN ) | ( 1 << TXEN );
    UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ0 ) | ( 1 << UCSZ1) ;
 
}

void uartTransmit( unsigned char data )
{
    while ( ( UCSRA & ( 1 << UDRE ) ) == 0x00 )
        ;
 
    UDR = data;
}

void delay( char sec )
{
    int i, j;

    for ( i = 0; i < sec; i++ )
        for ( j = 0; j < 10; j++ )
            _delay_ms( 100 );
}

int main( void )
{
    uartInit( 115200 );
    while( 1 )
    {
        uartTransmit( 'A' );
        delay( 1 );
    }
    return 0; 
}
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa Tribec Zacks » 05 Sep 2020, 11:04

pri 8MHz a 115200 baudrate ti vychadza odchylka v rychlosti komunikacie 8.5% pri uart sampling divideri U2Xn=0 a 3.5% pri U2Xn=1, to je zjavne vela. Nemalo by to byt vyse 2%, nove microchipacke datasheety dokonca uvadzaju 0.5%. pozri tabulky v datasheete.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
YellowJacket
Pokročilý člen
Pokročilý člen
Príspevky: 503
Dátum registrácie: 05 Feb 2012, 11:58
Bydlisko: Hrinova
Vek: 33

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa YellowJacket » 05 Sep 2020, 11:48

Ano, tu tabulku som pozeral, ale netusim, co je to U2Xn. S komunikaciou casto nepracujem a ak aj ano, vacsinou na ovela nizsich prenosovych rychlostiach. 8.5% chyba je dost, to ano, ale aby ani raz neprisiel spravny bajt?
Chcel som sa vyhnut pouzitiu krystalu, aby to bolo co najjednoduchsie, ale bez neho sa asi nemozem spolahnut na bezchybnu komunikaciu, vsak? Najlepsie vysledky s 0% error vychadzaju pri tych menej standardnych frekvenciach, napr 14.7456 MHz. Znamena to, ze pouzitie tohto krystalu jez hladiska prenosu kvalitnejsie, ako pri pouziti 20 MHz krystalu?
Este ak ta mozem poprosit, bit U2X v registri UCSRA vlastne rozhoduje o zdvojnasobeni prenosovej rychlosti, ale iba pri pouziti asynchronnej komunikacie, musim okrem toho este nieco nastavit/zmenit? Dakujem za nasmerovanie.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa peterple » 05 Sep 2020, 12:05

Tribec Zacks má pravdu, chyba je moc veľká. Keď si uvedomíš že prenášaš 10bitov v rámci a UARTy vzorkujú okolo stredu bitu tak to nemôže trafiť ani náhodou. Riešením je kryštál. Ja používam iba tie "divné" frekvencie teda 14,... 7,... 3,6....
Druhá cesta je nastaviť na protistrane rovnakú baud rate ako vysiela ten AVR. Ak je to usb to serial prevodník a PC tak to zoberie skoro akúkoľvek baudovú rýchlosť. Bežne tak logujem z arduina (16MHz) rýchlosťou 2Mbit/s
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa Tribec Zacks » 05 Sep 2020, 13:56

YellowJacket napísal:Najlepsie vysledky s 0% error vychadzaju pri tych menej standardnych frekvenciach, napr 14.7456 MHz. Znamena to, ze pouzitie tohto krystalu jez hladiska prenosu kvalitnejsie, ako pri pouziti 20 MHz krystalu?
Ano.
YellowJacket napísal:Este ak ta mozem poprosit, bit U2X v registri UCSRA vlastne rozhoduje o zdvojnasobeni prenosovej rychlosti, ale iba pri pouziti asynchronnej komunikacie, musim okrem toho este nieco nastavit/zmenit? Dakujem za nasmerovanie.
Nejde o zdvojnasobenie prenosovej rychlost, ide o 8 vs 16 (typicky pre uarty) samplov na bit.
Uart je asynchronny a preto ma start bit, receiver v tom momente zacne vzorkobvat Rx signal a podla vnutorneho pocitadla len vyhodnoti kedy zobrat vzorku pre ten ktory bit. ked aj mas nejaku odchyklu v Tx a Rx zariadeniach, tak podla sirky pulzov na uarte si mozes dovolit nejaku odchylku, ale ta chyba sa ti akumuluje od start bitu az po stop bit (a to neratame sum, kvalita Tx/Rx, napajanie atd)

pri 20Mhz to vypada na 1.7% co je podla este starych atmelacky DS ok, ale s GSM modulom budes vymienat cele packety, tak tam radsej daj krystal taky aky ma byt. hlavne nemaj predstavu ze 20mhz krystal je nejaky standardny a 14.x uz je nestandardny :-) pre teba je to neokruhle cislo, pre tu elektroniku vo vnutri az velmi okruhle na delenie casovani tak ako potrebujes.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
Mek
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1271
Dátum registrácie: 15 Okt 2015, 20:49
Bydlisko: Žilina
Vek: 37
Kontaktovať používateľa:

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa Mek » 05 Sep 2020, 14:52

Ked som sa davnejsie tiez bavil s UART komunikaciou, tak na interny oscilator mi to neslo, a s krystalom tej istej frekvencie uz ano. Tipujem, ze tomu internemu oscilatoru lieta frekvencia kade-tade, preto to robilo problemy. Dalej som to nestudoval, pokracoval som s krystalom a bolo.
0
... byvaly spravca Hospudky u amplionu, Martinekk-ov brat. Nemam vystudovane elektro, je to len moje hobby. Povolanim som SW inzinier.
Moja databaza suciastok: ELPARTS
Moj velky elektro projekt: MEGA TRANSISTOR CLOCK

Používateľov profilový obrázok
YellowJacket
Pokročilý člen
Pokročilý člen
Príspevky: 503
Dátum registrácie: 05 Feb 2012, 11:58
Bydlisko: Hrinova
Vek: 33

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa YellowJacket » 05 Sep 2020, 16:35

peterple napísal:Druhá cesta je nastaviť na protistrane rovnakú baud rate ako vysiela ten AVR. Ak je to usb to serial prevodník a PC tak to zoberie skoro akúkoľvek baudovú rýchlosť.
Teraz to len testujem na PC, nech mam istotu spravnej komunikacie, ale potom to bude atmega8 vs GSM modul, ten ma fixne nastavenu prenosovu rychlost.
Tribec Zacks napísal:hlavne nemaj predstavu ze 20mhz krystal je nejaky standardny a 14.x uz je nestandardny
Ano, napisal som to neprofesionalne a hlavne som ratal, ze cim viac frekvencie, tym lepsie. Zjavne to tak nie je :)

@Mek: taktiez idem radsej na istotu, vyskusam krystal 14.7456 MHz a uvidi sa. Ono to mozno nie je tym internym oscilatorom, ale tou chybou, ktora je uvadzana v datsheete pri konkretnych frekvenciach, no a nizsiu frekvenciu ako 8MHz som uz pouzit nemohol pri prenosovej rychlosti 115200.

Dakujem vam vsetkym za rady a hlavne za vysvetlenie.
0

Sahasrar
Stály člen
Stály člen
Príspevky: 233
Dátum registrácie: 16 Máj 2015, 00:05
Bydlisko: TN

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa Sahasrar » 05 Sep 2020, 21:14

Skusal si si iba loopback? Myslím tým spojenie Rx/Tx na strane Atmegy a vypis hodnoty na niakom LCD... Mne osobne sa stavalo, že vedenie od procesoru po PC malo isty odpor, pripadne rušenie a taktiež mi to pri vyššej frekvencii blblo
0

Používateľov profilový obrázok
YellowJacket
Pokročilý člen
Pokročilý člen
Príspevky: 503
Dátum registrácie: 05 Feb 2012, 11:58
Bydlisko: Hrinova
Vek: 33

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa YellowJacket » 06 Sep 2020, 06:36

Neskusal som. Ale pouzivam kabel k pc, prevodnik usb na ttl, a ked ho iba prepojim miesto atmegy na gsm modul, tak to funguje. Kupim krystal a dam vediet, ci tam bol problem.
0

Používateľov profilový obrázok
YellowJacket
Pokročilý člen
Pokročilý člen
Príspevky: 503
Dátum registrácie: 05 Feb 2012, 11:58
Bydlisko: Hrinova
Vek: 33

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa YellowJacket » 16 Sep 2020, 17:12

Aktualizacia:
Skusil som krystal, 11.0592 MHz, prenos uz funguje korektne. Dakujem za rady.
0

Sahasrar
Stály člen
Stály člen
Príspevky: 233
Dátum registrácie: 16 Máj 2015, 00:05
Bydlisko: TN

Re: Atmega8 UART nefunkcny prenos pri vyssej frekvencii

Príspevok od používateľa Sahasrar » 16 Sep 2020, 21:18

Pozeral si si nastavenia toho prevodnika teda virtualnej seriovky v PC? Niekedy aj tam byva problem ked je nesulad medzi mikrokontrolerom prevodnikom a softwerom v PC
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok