RTV forum PL | NewsGroups PL

Funkcja uart_putchar_hex w AVR-GCC analogiczna do printf('%02X') - jak napisać?

uart i hex

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Funkcja uart_putchar_hex w AVR-GCC analogiczna do printf('%02X') - jak napisać?

Goto page 1, 2  Next

ogi
Guest

Mon Dec 27, 2004 12:02 pm   



Jak napisać w AVR-GCC funkcje działającą identycznie jak: printf("%02X", n);
??
Wywołanie wyglądało by np. tak: uart_putchar_hex(n);

Adam Dybkowski
Guest

Mon Dec 27, 2004 8:21 pm   



ogi wrote:

Quote:
Jak napisać w AVR-GCC funkcje działającą identycznie jak: printf("%02X", n);
??
Wywołanie wyglądało by np. tak: uart_putchar_hex(n);

1. Pomyśl jak zamienić bajt na 2 znaki hex:
- rozdziel na starszą ((n >> 4) & 0x0f) i młodszą połówkę (n & 0x0f)
- mając dwie liczby z zakresu 0..15 przekształć każdą z nich
na znak szestnastkowy
2. Wyślij te znaki funkcją typu uart_putchar (ch)

A dlaczego nie chcesz normalnie użyć printf, wcześniej się doczepiając
do jego mechanizmu wywołaniem fdevopen?

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

ogi
Guest

Tue Dec 28, 2004 8:44 am   



Użytkownik "Adam Dybkowski" <adybkows123@amwaw.edu.pl> napisał w wiadomości
news:cqpr2c$d9g$1@nemesis.news.tpi.pl...
Quote:
ogi wrote:

Jak napisać w AVR-GCC funkcje działającą identycznie jak: printf("%02X",
n);
??
Wywołanie wyglądało by np. tak: uart_putchar_hex(n);

1. Pomyśl jak zamienić bajt na 2 znaki hex:
- rozdziel na starszą ((n >> 4) & 0x0f) i młodszą połówkę (n & 0x0f)
- mając dwie liczby z zakresu 0..15 przekształć każdą z nich
na znak szestnastkowy
2. Wyślij te znaki funkcją typu uart_putchar (ch)

A dlaczego nie chcesz normalnie użyć printf, wcześniej się doczepiając
do jego mechanizmu wywołaniem fdevopen?

bo nie umiem


ogi
Guest

Tue Dec 28, 2004 8:52 am   



Użytkownik "Adam Dybkowski" <adybkows123@amwaw.edu.pl> napisał w wiadomości
news:cqpr2c$d9g$1@nemesis.news.tpi.pl...
Quote:
ogi wrote:

Jak napisać w AVR-GCC funkcje działającą identycznie jak: printf("%02X",
n);
??
Wywołanie wyglądało by np. tak: uart_putchar_hex(n);

1. Pomyśl jak zamienić bajt na 2 znaki hex:
- rozdziel na starszą ((n >> 4) & 0x0f) i młodszą połówkę (n & 0x0f)
- mając dwie liczby z zakresu 0..15 przekształć każdą z nich
na znak szestnastkowy
2. Wyślij te znaki funkcją typu uart_putchar (ch)

Tyle, że mi chodzi o takie coś, żeby z np. 26 zrobić 1A (?), a potem
wystawić znakowo 1 i A.

Waldemar Krzok
Guest

Tue Dec 28, 2004 10:03 am   



Quote:
Jak napisać w AVR-GCC funkcje działającą identycznie jak: printf("%02X",

n);

??
Wywołanie wyglądało by np. tak: uart_putchar_hex(n);

1. Pomyśl jak zamienić bajt na 2 znaki hex:
- rozdziel na starszą ((n >> 4) & 0x0f) i młodszą połówkę (n & 0x0f)
- mając dwie liczby z zakresu 0..15 przekształć każdą z nich
na znak szestnastkowy
2. Wyślij te znaki funkcją typu uart_putchar (ch)


Tyle, że mi chodzi o takie coś, żeby z np. 26 zrobić 1A (?),
a co chcesz "robić" ? Przecież wewnętrznie i tak już jest.


Quote:
a potem wystawić znakowo 1 i A.

uchar a, b;

a = 0x26; // na przykład
b = a & 0x0F;
uart_putchar( b + (b < 10) ? '0' : 'A' );
b = (a & 0xF0) >> 4;
uart_putchar( b + (b < 10) ? '0' : 'A' );


ok?

Waldek

Zbych
Guest

Tue Dec 28, 2004 1:10 pm   



Waldemar Krzok wrote:

Quote:
b = (a & 0xF0) >> 4;

To maskowanie (a & 0xF0) jest zbędne. Wystarczy b=a>>4;

> uart_putchar( b + (b < 10) ? '0' : 'A' );

Waldemar Krzok
Guest

Tue Dec 28, 2004 1:56 pm   



Zbych wrote:
Quote:
Waldemar Krzok wrote:

b = (a & 0xF0) >> 4;


To maskowanie (a & 0xF0) jest zbędne. Wystarczy b=a>>4;

fuckt. Ale wygląda ładniej Wink No i coniektóre kompilatory (nie wiem,
czy GCC nie jest takim świnią) propagują MSB przy shifcie i już masz
kłopot. Z moją wersją zresztą też, więc lepiej:
b = (a >> 4) & 0x0F;

Waldek

Zbych
Guest

Tue Dec 28, 2004 2:31 pm   



Waldemar Krzok wrote:

Quote:
fuckt. Ale wygląda ładniej Wink No i coniektóre kompilatory (nie wiem,
czy GCC nie jest takim świnią) propagują MSB przy shifcie i już masz
kłopot.

MSB ? chodzi ci o najstarszy bit w bajcie ? Jeśli masz liczbę bez znaku
to na najstarszy bit zawsze jest wpisywane 0, a jeśli ze znakiem to
powielany jest bit znaku. W przykładzie który dałeś masz liczbę bez
znaku więc zapis "b=a>>4;" jest w pełni wystarczający.

Krzysztof Rudnik
Guest

Tue Dec 28, 2004 2:44 pm   



Użytkownik "Waldemar Krzok" <waldemar.krzok@charite.de> napisał w wiadomości
news:41D1660C.1010509@charite.de...
Quote:


Zbych wrote:
Waldemar Krzok wrote:

b = (a & 0xF0) >> 4;


To maskowanie (a & 0xF0) jest zbędne. Wystarczy b=a>>4;

fuckt. Ale wygląda ładniej Wink No i coniektóre kompilatory (nie wiem,
czy GCC nie jest takim świnią) propagują MSB przy shifcie i już masz
kłopot. Z moją wersją zresztą też, więc lepiej:
b = (a >> 4) & 0x0F;

Propagacja MSB chyba zalezy od signed/unsigned a nie od kompilatora.

Krzysiek Rudnik

Waldemar Krzok
Guest

Tue Dec 28, 2004 2:51 pm   



Quote:
fuckt. Ale wygląda ładniej Wink No i coniektóre kompilatory (nie wiem,
czy GCC nie jest takim świnią) propagują MSB przy shifcie i już masz
kłopot.


MSB ? chodzi ci o najstarszy bit w bajcie ? Jeśli masz liczbę bez znaku
to na najstarszy bit zawsze jest wpisywane 0, a jeśli ze znakiem to
powielany jest bit znaku. W przykładzie który dałeś masz liczbę bez
znaku więc zapis "b=a>>4;" jest w pełni wystarczający.

teoretycznie masz rację, ale już kiedyś dostałem kurwicy jąder, bo
kompilator o tym nie wiedział Wink Strzyżonego pan bóg strzyże...

Waldek

Waldemar Krzok
Guest

Tue Dec 28, 2004 2:58 pm   



Quote:
Propagacja MSB chyba zalezy od signed/unsigned a nie od kompilatora.

tak być powinno. Ale jak już pisałem, miałem kiedyś kompilator, który
uparł się, że bedzie robił shifta na signed, choć wsio było unsigned. No
i miałem problem, a koledzy nauczyli się trochę polskiej łaciny.

Waldek

J.F.
Guest

Tue Dec 28, 2004 4:17 pm   



On Tue, 28 Dec 2004 14:10:02 +0100, Zbych wrote:
Quote:
Waldemar Krzok wrote:
b = (a & 0xF0) >> 4;

To maskowanie (a & 0xF0) jest zbędne. Wystarczy b=a>>4;

Uwazaj, bo jak swierdzi ze typ jest "signed", to moze
czasem z przodu dopelnic 1111

J.

Zbych
Guest

Tue Dec 28, 2004 5:33 pm   



J.F. wrote:

Quote:
Uwazaj, bo jak swierdzi ze typ jest "signed", to moze
czasem z przodu dopelnic 1111

Wytłumacz mi jak kompilator zmienną typu unsigned char może potraktować
jako liczbę ze znakiem.

J.F.
Guest

Tue Dec 28, 2004 6:18 pm   



On Tue, 28 Dec 2004 18:33:36 +0100, Zbych wrote:
Quote:
J.F. wrote:
Uwazaj, bo jak swierdzi ze typ jest "signed", to moze
czasem z przodu dopelnic 1111

Wytłumacz mi jak kompilator zmienną typu unsigned char może potraktować
jako liczbę ze znakiem.

Mozesz zapomniec dopusac unsigned.
Moze miec blad.
Albo upierdliwie realizowac standard - byl tu jakis przyklad
jak to GCC konwertowal na 16 bit ..

J.

Marcin Stanisz
Guest

Tue Dec 28, 2004 8:45 pm   



On Tue, 28 Dec 2004 15:31:14 +0100, Zbych wrote:

Quote:
MSB ? chodzi ci o najstarszy bit w bajcie ? Jeśli masz liczbę bez znaku
to na najstarszy bit zawsze jest wpisywane 0, a jeśli ze znakiem to
^^^^^^^^^^^^^^^^^^^^^^^

To co, unsigned char ma zakres 0...127??

Pozdrawiam
--
Marcin Stanisz

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

Goto page 1, 2  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Funkcja uart_putchar_hex w AVR-GCC analogiczna do printf('%02X') - jak napisać?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map