ATmega644: 16-bitová proměnná spojením dvou 8-bitových prom.

Dobrý den,

rád bych poprosil o pomoc, řeším takovou věc na ATmega644.

Kdy pomocí UARTU přijmu dva bajty např.

char a=0x09 , b=0x0E;

A potřebuji je dostat do 16-bitové proměnné

unsigned int c=0x090E;

Omlouvám se jestli je můj dotaz stupidní, ale nemohu na to přijít.

Děkuji.

:arrow_right: administrator: přejmenováno z "ATmega644 16-bitová proměnná"

C = ( A << 8 ) | B

Dycky mě udiví jak je to jednoduchy a jak já su pitomé.

Děkuji mnohokrát.

Ja su taky pitome, nastesti existuje google.
pomohla otazka “2 byte to 1 word avr” prvni odkaz

Pokud se jedná o USART - z vlastní zkušenosti doporučuju pro přenos používat ASCII znaků - převod za pomoci funkce itoa a na druhé straně zpět funkcí atoi (můžou se jmenovat trochu jinak - záleží na překladači) zas tolik nezabere. Hlavní výhoda je v možnosti použití řídících znaků - typicky 0x0D jako konec zprávy.

Ahoj,

rád bych měl ještě jednu otázku. Teď je to ohledně floatu.

Přijmu 4 bajty např.

0x3F7650FA ; // ty jsou už ve formátu float tzn. 0,90

,ale pokud je uložím takhle:

float value = 0x3F7650FA; // tak hodnota value je šílený číslo

Jak mám teda převést hex hodnotu na float.

Děkuji.

No jednoduše tak ji uložíš zase do proměnné typu float.
Záleží taky , co pak s ní chceš dělat dál.

Osobně ale doporučuju, pokud nepotřebuješ pracovat s deseti místy za desetinnou čárkou tak se proměnným typu float úplně vyhnout.
Výsledek prostě vynásobit 100 (pro dvě desetiná čísla), případně 1000(pro tři) a pak v případě potřeby tím samým číslem vydělit.

Jo to je dobé plán, ale nějak nevím jak.
To byla právě ta otázka jak to uložit do floatu, aby to bral jako zápis čísla 0.9 a né 10646… atd.

A rád bych se tomu floatu vyhnul, ale bohužel to nejde. Prostě přijímám 4 Bajty z černé krabičky, které reprezentují 1float proměnnou a já jí akorát chci zobrazit, žádné jiné operace.

Co takhle

unsigned long v = 0x3F7650FA;
float f = * (float *) &v;

Tak sem to nějak vyřešil, bylo na AVR Freaks:

char recv] = {0xFA, 0x50, 0x76,0x3F};

float fnum = * (float*) &recv[0];

dtostrf(fnum, 2, 2, prac_buff);

v pac_buff je uloženo číslo 0,96.

To kuto, díky.
Jestli to dobře chápu, tak je to vpodstatě to samé?
Ach jo škoda, že ty pointery pořád ještě pořádně nechápu.

Ano, je to to samé.Vždy tam máš ukazatel na počáteční adresu části paměti o velikosti 4 byte ať už je deklarovaná jakkoli - float, či long, nebo pole čtyř bytů: char recv] = {0xFA, 0x50, 0x76,0x3F};
Jenom tam máš ještě použitou funkci (dtostrf) která ti převede to číslo do ASCII znaků, abys je mohl zobrazit - proto jsem se ptal co s tím chceš vlastně dělat.

A navíc to jde i zjednodušit- pokud máš tedy nějaký RX (přijímací) buffer UARTU - pojmenovaný třeba UartRxBuffer[20]

float fnum = * (float*) &UartRxBuffer?] ; Místo otazníku si samozřejmě dej číslo, kde ti v té zprávě přijaté přes UART ta hodnota začíná.

Ono by vůbec bylo lepší, kdybys nás hned detailněji seznámil s tím, co vlastně děláš, leze to z tebe jak z chlupaté deky :smiley: .

Měls začít tím: Z černé krabičky přijímám pomocí UARTU data(různé datové typy) rozsekané do jednotlivých bytů a chci je zobrazit. :slight_smile:

Lou díky za vysvětlení, přesně tak jak si to vysvětlil.
Tak to je s tím mojím vehementem :slight_smile:

Příště budu s informaci přesnější.

Teď už snad vím všechno, tak to nějak dorazím. Díky všem za pomoc.

Z dalšího textu vyplývá, že jsou přijaty jako ascii string.

Potom je snad lepší přenášet hodnoty v lidsky srozumitelném tvaru “0.96”.
Pokud ovšem formát není pevně daný nějakým zařízením z kterého pouze přijímáme.

[code]void uart_puts_float(float x)
{
char temp[8];

uart_puts(dtostrf(x, 2, 2, temp));
}
//--------------------------------------------

int main(void)
{
uart_init();

// vyslání čísla float;
float fnum = 0.96;
uart_puts_float(fnum); // pošle string “0.96”

// zpracování přijatého čísla
char recv[8] = “0.96”; // přijatý string
fnum = atof(recv); // převede na float

[/code]

Ad 1: souhasím, ale
Ad 2: o to tu právě jde, že v tomto případě vysílání asi nijak neovlivní :slight_smile: