Atmega32 UART
Moderátor: Moderátoři
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ší.
- JirkaRCK
- Příspěvky: 248
- Registrován: 25 dub 2010, 00:00
- Bydliště: Olomouc/Brno
- Kontaktovat uživatele:
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 odeslaniKó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 :-)