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

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

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

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

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ł

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