RTV forum PL | NewsGroups PL

Jak wysyłać stringi do LCD w AVRGCC przykład procedury dla char a[20]

Moje boje z AVRGCC.

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wysyłać stringi do LCD w AVRGCC przykład procedury dla char a[20]

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... Wink))
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... Wink))
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... Wink))
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. Smile 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. Smile 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 Wink)) 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 Wink)) 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 Wink)))

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... Wink))

Ty potrzebujesz kursu C Smile
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 Smile
Polecam klasyke Kernigham & Ritchie.

A tak usilowalem nie dac sie zdemaskowac... Wink))
Co do ksiazki to trzymam za jezyk, ale jak po przeczytaniu spisu tresci
nie bede madrzejszy to zaskarze... Wink)) 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 Smile
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... Wink))
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 Smile
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. Smile 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 Smile

To juz wiem, musze wiecej odrdzewiacza popijac Wink)) W paszczalu
stosunkowo rzadko uzywa sie wskaznikow w porownaniu do C, przynajmniej
afair, ale zasady te same Wink
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. Smile BTW:

http://www.ucalgary.ca/~bgwong/n869.pdf

Pozdrawiam
Piotr Wyderski

Goto page 1, 2, 3  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wysyłać stringi do LCD w AVRGCC przykład procedury dla char a[20]

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map