Atmega32 UART

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
jim_h
Příspěvky: 10
Registrován: 14 lis 2016, 00:00

#16 Příspěvek od jim_h »

Díky oběma.

Zatím jsem to zkusil jak psal Atlan, sice jsem se trošku bál, že se mi to stejně nebude přiřazovat do správných proměnných, ale funguje to bezvadně.

To JirkaRCK:
Ten řetězec bude asi do budoucna lepší, ale zatím jsem si na to netroufl. Musím se trošku více podívat na ty konverze a posílání řetězce a pak zase rozebrání. Jak jsem psal, zatím si tím začínám hrát. Měl jsem program, kde se proměnné mění od 0 do 255 s krokem po 10, takže jsem si mohl vybrat číslo, které se tam určitě neobjeví, ale v reálu bych musel použít tu první metodu nebo ten rozklad, kterej se přiznám asi moc nechápu. Možná kdyby jsi měl chvilku a ještě my to lehce osvětlil. I když asi stejně bude lepší naučit se složit ty proměnné do řetězce a pak to zase rozložit, to bude asi více univerzálnější.
Uživatelský avatar
JirkaRCK
Příspěvky: 248
Registrován: 25 dub 2010, 00:00
Bydliště: Olomouc/Brno
Kontaktovat uživatele:

#17 Příspěvek od JirkaRCK »

Kód: Vybrat vše

/**** Vysilaci cast ****/

cisloA=25;   //promenna A, kterou budeme posilat
cisloB=43;   //promenna B, kterou budeme take posilat

//Zde poslu promennou cisloA

//cisloA posunu o 4 bity, tim 4 nizsi zahodim a 4 vyssi posunu na pozici nizsich
//K vysledku operatorem OR pridam hlavicku 0x10 v hexa - 0b00010000 binarne
//Touto hlavickou si znacim, ze ve ctyrech zbyvajicich bitech je prenasena
//Vyznamnejsi cast promenne A. Vysledny byte odeslu.
UDR = ((cisloA >> 4)|(0b00010000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani

//cisloA ma operatorem AND vynulovany 4 vyznamejsi bity, v prave ctverici zbydou mene vyznamne
//4 bity, ktere jsme pred tim neodeslali. Nasledne jim operatorem OR opet
//pridam hlavicku. Pro nizsi bity jsem si zvolil 0x20, tedy 0b00100000
//Opet odeslu UARTem vysledek
UDR = ((cisloA & 0b00001111))|(0b00100000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani

//Pro cisloB by to vypadalo uplne stejne, jen bych mu zvolil jine hlavicky. Treba 0x30 pro vyssi pulku
//a 0x40 pro nizsi pulku:
UDR = ((cisloB >> 4)|(0b00110000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani
UDR = ((cisloB      & 0b00001111))|(0b01000000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani


Kód: Vybrat vše

/**** Prijimaci cast ****/

while (! (UCSRA & (1 << RXC))); // Prijmeme prvni byte
RXbyte = UDR;

// S RXbyte provedeme operaci AND s cislem 0xF0. Tim zahodime data (nizsi ctverici) a ziskame (vyssi ctverici) hlavicku.
// Tu nasledne porovname s cislem 0x10 - pokud se mu rovna, prisel nam vyznamejsi byte promenne cisloA a ten ulozime
// do promenne docasna (posunem o 4 bity vlevo se zbavime hlavicky a dostaneme ctverici dat tam, kam patri)
if((RXbyte & 0b11110000) == 0b00010000){
    docasna = (RXbyte << 4);
    while (! (UCSRA & (1 << RXC))); // Prijmeme druhy byte
    RXbyte = UDR; // Nyni mame v promenne RXbyte druhy byte komunikace, ktery nam protistrana zaslala

    // S RXbyte provedeme operaci AND s cislem 0xF0, cimz opet odfiltrujeme data a ziskame hlavicku. Tu nasledne porovname
    // s cislem 0x20 - pokud se mu rovna, prisel nam byte s nizsi casti promenne cisloA a my se muzeme radovat a slozit vysledek.
    if((RXbyte & 0b11110000) == 0b00100000){
        cisloA = (docasna | (RXbyte & 0x0F)); // cisloA je rovno docasne co obsahuje vyssi bity promenne a 4 nuly slozene ORem s nizsi
                                               // casti RXbyte, ktera obsahuje naopak 4 nuly a nizsi bity. AND nas zbavuje hlavicky
                                               // - vyssi bity co k datum nepatri nahrazuje nulama
        docasna = 0;                           // docasnou po sobe radeji nastavime na nulu, aby nas pozdeji nenapalila
    }

    //ELSE - pokud prvni byte je vyssi cast cisloA, ale druhy byte neni nizsi cast, ale neco jineho - Napriklad doslo k chybe komunikace.   
    else{
        docasna = 0;                           // Vynulujeme po sobe docasnou a promennou cisloA nechame byt. Cekame na novy RX byte.
    }
}  // Konec vnejsiho ifu - toho co ceka na prvni prijaty byte

// Prijem promenne cisloB je naprosto totozny, jen neukladame do cisloA, ale do cisloB, a v obou ifech upravime prislusne hlavicky.
// Dle prikladu TX nahradime v tomto pripade 0x10 za 0x30 a 0x20 za 0x40.
// Zamerne kombinuji hexa a bin zapis cisel. Hexa jsou prehlednejsi, ale nejsem si jisty, zda je znas, tak jen, abych je dostal do povedomi
// a pripadne te donutil k vzajemne konverzi :-)
Uživatelský avatar
jim_h
Příspěvky: 10
Registrován: 14 lis 2016, 00:00

#18 Příspěvek od jim_h »

Super návod, teď už to chápu úplně. Je to určitě lepší způsob než jsem zkoušel, jelikož jsem posílal jeden byte jako identifikátor a pak jsem doufal, že odchytím následující tři po sobě jdoucí bajty, takže jsem neměl žádnou kontrolu, navíc ten identifikátor, jak jsi psal, znemožňuje použít celej rozsah. S tímto řešením mám větší kontrolu, že přichází chtěná proměnná a navíc není problém s rozsahem a dá se to rozšířit na větší čísla. Tahle když to vidím, tak mi to přijde i jednoduché, ale sám bych to nedal. Ještě jednou díky za napsání kodu.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“