Goto page 1, 2, 3 Next
Milosz Skowyra
Guest
Fri Apr 23, 2004 8:02 pm
Ehlo.
Siedze i oblatuje sie w subj. Nie powiem, rezultaty calkiem znosne, ale
poleglem w pewnym miejscu, mianowicie stringi.
Chcialbym napisac sobie procedurke wysylajaca stringa na LCD.
I teraz nie bardzo wiem jak to zrobic, bo w GCC chyba nie ma takiego
typu zmiennej, co prawda po glowie mi sie kolacze ze string 19 znakowy
to nic innego jak np. char a[20] zakonczony zerem. Rzuccie jakims
przykladem jak przekazac do procedurki stringa... bo jak nie...

))
Na powaznie, poprosze krotki przyklad (najlepiej dzialajacy) typu:
char lcd_send_string (char a[20])
{
for (unsigned char f=1;f<strlen(a);f++)
lcd_send_ascii(a[f]);
return(0);
}
int main (void)
lcd_send_string ('Hello world');
PS. A propo's ostatniej dyskusji o promowaniu char-a do 16 bitowego
integera. Odpowiedz jest w dokumentacji.
========================================================
7.3.21 Why does the compiler compile an 8-bit operation that uses
bitwise oper-ators
into a 16-bit operation in assembly?
Bitwise operations in Standard C will automatically promote their
operands to an int,
which is (by default) 16 bits in avr-gcc.
To work around this use typecasts on the operands, including literals,
to declare that
the values are to be 8 bit operands.
This may be especially important when clearing a bit:
var &= mask; /* wrong way!
The bitwise not operator ( . ) will also promote the value in mask to
an int. To keep
it an 8-bit value, typecast before the not operator:
var &= (unsigned char)mask;
========================================================
PS2. Pewnie o stringach tez jest... ale cos nie moge znalezc... ghrrr. Z
gory dzieki.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Arek Karas
Guest
Fri Apr 23, 2004 8:17 pm
Quote:
Siedze i oblatuje sie w subj. Nie powiem, rezultaty calkiem znosne, ale
poleglem w pewnym miejscu, mianowicie stringi.
Chcialbym napisac sobie procedurke wysylajaca stringa na LCD.
I teraz nie bardzo wiem jak to zrobic, bo w GCC chyba nie ma takiego
typu zmiennej, co prawda po glowie mi sie kolacze ze string 19 znakowy
to nic innego jak np. char a[20] zakonczony zerem. Rzuccie jakims
przykladem jak przekazac do procedurki stringa... bo jak nie...

))
Na powaznie, poprosze krotki przyklad (najlepiej dzialajacy) typu:
char moj_tekst1[] = "pierwszy tekst";
char moj_tekst1[] = "drugi tekst";
void LCD_Print(char *data)
{
while(*data)
{
lcd_send_ascii(*data++);
}
}
i teraz:
LCD_Print(moj_tekst1);
LCD_Print(moj_tekst2);
albo
LCD_Print("kolejny napis");
Tylko mala uwaga - kazdy taki string zajmuje pamiec RAM, zatem jak masz ich
duzo to moze Ci zabraknac RAM-u.
Rozwiazaniem jest umieszczenie tekstow we flashu i wyswietlanie ich stamtad,
ale nie wiem jak to zrobic w GCC(na codzien pracuje w IAR-C dla AVR), chyba
cos z memory_attribute, musisz poszukac w dokumentacji GCC.
No i polecam dobra ksiazke o ANSI C.
Pozdr
AK
Adam Dybkowski
Guest
Fri Apr 23, 2004 8:23 pm
Milosz Skowyra wrote:
Quote:
przykladem jak przekazac do procedurki stringa... bo jak nie...

))
Na powaznie, poprosze krotki przyklad (najlepiej dzialajacy) typu:
char lcd_send_string (char a[20])
{
for (unsigned char f=1;f<strlen(a);f++)
lcd_send_ascii(a[f]);
return(0);
}
Podstawy, podstawy.

I nie ma znaczenia, czy w avr-gcc czy inszy proc:
void lcd_send_string (char *txt)
{
while (*txt)
lcd_send_ascii (*txt++);
}
Sposób użycia:
lcd_send_string ("ABCD");
A wracając do avr-gcc to poczytaj sobie o umieszczaniu stringów w
pamięci programu, normalnie trafiają do pamięci danych i szybko się ona
może skończyć.
Ja używam w avr-gcc standardowego mechanizmu printf (RTFM: funkcja
fdevopen) i to jest najwygodniejsze rozwiązanie pod słońcem. Jedyna wada
to powiększenie kodu programu o kilka KB. A stringi w kodzie bardzo
łatwo się używa:
printf_P (PSTR ("test = %d\r\n"), test);
--
Adam Dybkowski
adybkows@amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows/
Milosz Skowyra
Guest
Fri Apr 23, 2004 8:36 pm
Adam Dybkowski wrote:
Quote:
Podstawy, podstawy.

I nie ma znaczenia, czy w avr-gcc czy inszy proc:
Jasne. Odpowiem wszystkim na raz zeby nie odpisywac kazdemu. Z C a w
zasadzie CPP mialem kontakt krotki na uczelni gdzies na 2 roku. Potem
odkupilem licencje na Keila i mniej wiecej w tym samym czasie przestalem
zajmowac sie rodzinka '51. Ale wzielo mnie na C bo chwilowo obijam sie w
domku no i trzeba bylo ruszyc do przodu. Po ksiazke uderze w
poniedzialek, bo w tym tygodniu mialem jeszcze troszke zajec. Co zas do
samego jezyka wysokiego poziomu, to jestem mile zaskoczony. Do tej pory
potrafilem pisac programy po 8-12 KB w czystym asm-ie. Co prawda
komentarze zajmowaly 20x wiecej niz program, ale bylem zadowolony i po
powrocie do czegos po roku dawalem sobie rade bez problemu. Ale widze ze
bylem w bledzie

)) Z drugiej strony podpatruje jak soboe GCC radzi w
przenoszeniu pewnych rzeczy z C na asm-a. I czasem czlowiek mile sie
zaskoczy a czasem odwrotnie ;-)
Quote:
A wracając do avr-gcc to poczytaj sobie o umieszczaniu stringów w
pamięci programu, normalnie trafiają do pamięci danych i szybko się ona
może skończyć.
To juz wiem. Na razie musze poczytac o podstawach, formatach, uniach,
strukturach. Co prawda zaciekle pisalem w Paszczalu i Delphi, ale oprocz
algorytmu niewiele sie zgadza

)) A czytanie manuala do GCC no coz...
jak ma sie braki w podstawach...
Quote:
Ja używam w avr-gcc standardowego mechanizmu printf (RTFM: funkcja
fdevopen) i to jest najwygodniejsze rozwiązanie pod słońcem. Jedyna wada
to powiększenie kodu programu o kilka KB. A stringi w kodzie bardzo
łatwo się używa:
printf_P (PSTR ("test = %d\r\n"), test);
Tez sie kiedys tego dowiem

)))
Dzieki wszystkim, milej nocki ;-)
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
J.F.
Guest
Fri Apr 23, 2004 9:18 pm
On Fri, 23 Apr 2004 23:02:30 +0200, Milosz Skowyra wrote:
Quote:
Chcialbym napisac sobie procedurke wysylajaca stringa na LCD.
I teraz nie bardzo wiem jak to zrobic, bo w GCC chyba nie ma takiego
typu zmiennej, co prawda po glowie mi sie kolacze ze string 19 znakowy
to nic innego jak np. char a[20] zakonczony zerem. Rzuccie jakims
przykladem jak przekazac do procedurki stringa... bo jak nie...

))
Ty potrzebujesz kursu C
Polecam klasyke Kernigham & Ritchie.
Quote:
int main (void)
lcd_send_string ('Hello world');
int main (void)
{
lcd_send_string ("Hello world");
}
zwroc uwage na ' i "
J.
Milosz Skowyra
Guest
Fri Apr 23, 2004 9:30 pm
"J.F." wrote:
Quote:
Ty potrzebujesz kursu C
Polecam klasyke Kernigham & Ritchie.
A tak usilowalem nie dac sie zdemaskowac...

))
Co do ksiazki to trzymam za jezyk, ale jak po przeczytaniu spisu tresci
nie bede madrzejszy to zaskarze...

)) wydawnictwo ;-)
Milej nocki.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Adam Dybkowski
Guest
Fri Apr 23, 2004 9:33 pm
J.F. wrote:
Quote:
Ty potrzebujesz kursu C
Polecam klasyke Kernigham & Ritchie.
Zdecydowanie _nie_ - taka klasyka nadaje sie dzisiaj tylko do muzeum.
Tylko ANSI C sie liczy. A potem rozszerzenia C99.
--
Adam Dybkowski
adybkows@amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows/
Milosz Skowyra
Guest
Fri Apr 23, 2004 9:36 pm
"Darek R." wrote:
Quote:
Problem był wtedy tego typu, że mimo jawnych typecastów kompilator i tak
sobie promował na inta niestety.
No to sie troche rozminalem.
Ja mialem inny problem. Mianowicie przy PORTA &= _BV(7) czy PORTA |=
0X80 kompilator wykonywal SBI.
Dwie linijki nizej robilem PORTA &= ~_BV(7). Wtedy kompilator tlumaczyl
mniej wiecej tak:
in r16,porta
ldi r17,0x7F
and r16,r17
out porta,r16
Ale jak podalem jawnie PORTA &= 0x7F to tlumaczyl "poprawnie" na CBI.
Pomoglo zapisanie jako PORTA &= (unsigned char) ~_BV(7).
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Darek R.
Guest
Fri Apr 23, 2004 9:56 pm
Milosz Skowyra napisał:
Quote:
PS. A propo's ostatniej dyskusji o promowaniu char-a do 16 bitowego
integera. Odpowiedz jest w dokumentacji.
========================================================
7.3.21 Why does the compiler compile an 8-bit operation that uses
bitwise oper-ators
into a 16-bit operation in assembly?
Bitwise operations in Standard C will automatically promote their
operands to an int,
which is (by default) 16 bits in avr-gcc.
To work around this use typecasts on the operands, including literals,
to declare that
the values are to be 8 bit operands.
This may be especially important when clearing a bit:
var &= mask; /* wrong way!
The bitwise not operator ( . ) will also promote the value in mask to
an int. To keep
it an 8-bit value, typecast before the not operator:
var &= (unsigned char)mask;
========================================================
Problem był wtedy tego typu, że mimo jawnych typecastów kompilator i tak
sobie promował na inta niestety.
Na temat stringów nic nie piszę, bo już Ci inni dobrze odpowiedzieli
--
Pozdrowienia
Dariusz Rzońca
Jacek R. Radzikowski
Guest
Fri Apr 23, 2004 10:13 pm
Milosz Skowyra <mewashek@wp.pl> wrote:
Quote:
Ehlo.
Siedze i oblatuje sie w subj. Nie powiem, rezultaty calkiem znosne, ale
poleglem w pewnym miejscu, mianowicie stringi.
Chcialbym napisac sobie procedurke wysylajaca stringa na LCD.
I teraz nie bardzo wiem jak to zrobic, bo w GCC chyba nie ma takiego
typu zmiennej, co prawda po glowie mi sie kolacze ze string 19 znakowy
to nic innego jak np. char a[20] zakonczony zerem. Rzuccie jakims
Nie tylko w gcc, ale w taka jest postac zapisu stringow w pamieci w jezyku C.
Quote:
przykladem jak przekazac do procedurki stringa... bo jak nie...

))
Na powaznie, poprosze krotki przyklad (najlepiej dzialajacy) typu:
char lcd_send_string (char a[20])
Jesli nie zamierzesz zwracac wyniki, mozesz zadeklarowac jako
void. a ma byc wskaznikiem albo tablica, rozmiary podawac nie potrzeba
(nie wolno? nie mam k&r pod reka)
Deklaracja po uwzglednieniu tych uwacg moze wygladac tak:
void lcd_send_string (char *a)
Quote:
{
for (unsigned char f=1;f<strlen(a);f++)
W C tablice sa indeksowane od 0, nie od 1
Quote:
lcd_send_ascii(a[f]);
return(0);
}
Cala procedurka po porawkach moze wygladac nastepujaco:
void lcd_send_string (char *a)
{
int i;
for(i=0;a[i]!=0;i++)
lcd_send_ascii(a[i]);
}
Albo, bardziej w stylu C:
void lcd_send_string (char *a)
{
while(*a)
lcd_send_ascii(*a++);
}
A tak poza tym to zanim zaczniesz czytac gcc-faq polecam jakas
ksiazke o podstawach C. Faq jest dla zaawansowanych uzytkownikow,
ktorzy chca poznac "smaczki" gcc, a nie uczyc sie programowania
od podstaw.
Piotr Wyderski
Guest
Sat Apr 24, 2004 12:17 am
Milosz Skowyra wrote:
Quote:
Chcialbym napisac sobie procedurke wysylajaca stringa na LCD.
I teraz nie bardzo wiem jak to zrobic, bo w GCC chyba nie ma takiego
typu zmiennej
W C++ jest std::string, ale to nie ta klasa wagowa. :-)
Quote:
Rzuccie jakims przykladem jak przekazac do procedurki stringa...
void procedurka(const char* const ten_string) {
}
:-)
Quote:
PS2. Pewnie o stringach tez jest... ale cos nie moge znalezc...
I nie znajdziesz, w C _nie ma_ stringow.
Pozdrawiam
Piotr Wyderski
J.F.
Guest
Sat Apr 24, 2004 10:54 am
On Sat, 24 Apr 2004 00:33:18 +0200, Adam Dybkowski wrote:
Quote:
J.F. wrote:
Ty potrzebujesz kursu C
Polecam klasyke Kernigham & Ritchie.
Zdecydowanie _nie_ - taka klasyka nadaje sie dzisiaj tylko do muzeum.
Tylko ANSI C sie liczy. A potem rozszerzenia C99.
Nowsze wydania chyba juz opisuja ANSI. A w razie czego roznice sa
niewielkie, a czesci wspolnej sporo.
Jak jest ze stringami i wskazniki to sie dowie :-)
J.
Piotr Wyderski
Guest
Sat Apr 24, 2004 11:58 am
Adam Dybkowski wrote:
Quote:
Zdecydowanie _nie_ - taka klasyka nadaje sie dzisiaj tylko do muzeum.
Zdecydowanie popieram, to antyk wprowadzajacy
wiecej zamieszania, niz wyjasniajacy.
Quote:
Tylko ANSI C sie liczy. A potem rozszerzenia C99.
C99 to nie jest rozszerzenie, tylko wlasnie _standard_,
ISO/ANSI C99.

I jego wlasnie nalezy sie trzymac.
No, jesli zamierza sie pozostac przy C... Do programowania
niskopoziomowego znacznie lepiej nadaje sie jednak C++,
m.in. dzieki:
a) przestrzeniom nazw (w koncu brak konfliktow nazw
obiektow zadeklarowanych w roznych jednostkach
translacji!);
b) metaprogramowaniu, pozwalajacemu na automatyczne
i dokladne dopasowanie struktury obiektu do _konkretnej_
potrzeby, a nie zmuszajacy do uzywania ogolnego
rozwiazania w kazdym przypadku;
c) mozliwosci tworzenia aliasow przestrzeni nazw, co
umozliwia bezproblemowa wymiane modulow
dostarczajacych tego samego interfejsu, lecz
(znacznie) rozniacych sie implementacja.
Pozdrawiam
Piotr Wyderski
Milosz Skowyra
Guest
Sat Apr 24, 2004 1:58 pm
"J.F." wrote:
Quote:
Nowsze wydania chyba juz opisuja ANSI. A w razie czego roznice sa
niewielkie, a czesci wspolnej sporo.
Jak jest ze stringami i wskazniki to sie dowie
To juz wiem, musze wiecej odrdzewiacza popijac

)) W paszczalu
stosunkowo rzadko uzywa sie wskaznikow w porownaniu do C, przynajmniej
afair, ale zasady te same
Wlasnie boleje nad brakiem typu boolean ;-((( Ale znalazlem posrednie
rozwiazanie.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Piotr Wyderski
Guest
Sat Apr 24, 2004 2:26 pm
Milosz Skowyra wrote:
Quote:
Wlasnie boleje nad brakiem typu boolean ;-((( Ale znalazlem posrednie
rozwiazanie.
W C99 jest typ boole'owski i nazywa sie _Bool. Zaleca
sie jednak uzyc naglowka <stdbool.h>, co daje znane
z C++ slowa kluczowe bool, true i false. Sprawdz, czy
Twoj kompilator moze pracowac w trybie C99. Jesli
nie -- wyrzuc go i uzyj takiego, ktory potrafi.

BTW:
http://www.ucalgary.ca/~bgwong/n869.pdf
Pozdrawiam
Piotr Wyderski
Goto page 1, 2, 3 Next