pierwsze początki z winavr

Witam, zaczynam zabawę z avrstudio4 , znalazlem na elektrodzie program obsługi lcd i mam kłopot. Potrafię wyświetlić tekst, ale jak wyświetlić zmienną a ? Listing poniżej:

------------------------------------------------------------------------------------- #include <avr/io.h>

#include <util/delay.h>

#include <string.h>

//Tu należy zdefiniować piny , używane do sterowania wyśw. LCD //Sygnał R/W podpięty na stałe do GND #define RSPIN PC1 //numer bitu dla linii RS #define EPIN PC0 #define D4PIN PB0 #define D5PIN PD7 #define D6PIN PD6 #define D7PIN PD5

#define RSPORT PORTC //port do którego podłączono linię RS #define EPORT PORTC #define D4PORT PORTB #define D5PORT PORTD #define D6PORT PORTD #define D7PORT PORTD

#define RSDDR DDRC //port konfiguracyjny linii RS #define EDDR DDRC #define D4DDR DDRB #define D5DDR DDRD #define D6DDR DDRD #define D7DDR DDRD //koniec definicji pinów LCD

//Takie sobie uproszczenia ;) #define SET_D4 D4PORT|=(1<<D4PIN) #define SET_D5 D5PORT|=(1<<D5PIN) #define SET_D6 D6PORT|=(1<<D6PIN) #define SET_D7 D7PORT|=(1<<D7PIN)

#define CLR_D4 D4PORT&=~(1<<D4PIN) #define CLR_D5 D5PORT&=~(1<<D5PIN) #define CLR_D6 D6PORT&=~(1<<D6PIN) #define CLR_D7 D7PORT&=~(1<<D7PIN)

#define SET_E EPORT|=(1<<EPIN) #define CLR_E EPORT&=~(1<<EPIN) #define SET_RS RSPORT|=(1<<RSPIN) #define CLR_RS RSPORT&=~(1<<RSPIN) #define CLRDISP 0x01 #define HOMEDISP 0x02 //koniec uproszczeń

void LCDresetdata(void) //wyzeruj szynę danych LCD { CLR_D4; CLR_D5; CLR_D6; CLR_D7; } void LCDwrite(char d) //zapis bajtu do LCD { LCDresetdata(); if(d & 0x10){SET_D4;} if(d & 0x20){SET_D5;} if(d & 0x40){SET_D6;} if(d & 0x80){SET_D7;} SET_E;CLR_E; LCDresetdata(); if(d & 0x01){SET_D4;} if(d & 0x02){SET_D5;} if(d & 0x04){SET_D6;} if(d & 0x08){SET_D7;} SET_E;CLR_E; _delay_ms(2); } void LCDconfigIO(void) //wszystkie piny do których podłączony jest LCD jako wyjście { RSDDR|=(1<<RSPIN);EDDR|=(1<<EPIN);D4DDR|=(1<<D4PIN); D5DDR|=(1<<D5PIN);D6DDR|=(1<<D6PIN);D7DDR|=(1<<D7PIN); } void LCDcmd(char d) //Wyślij komendę do LCD { CLR_RS; LCDwrite(d); } void LCDchr(char d) //Wyślij 1 znak do LCD { SET_RS; LCDwrite(d); } void LCDinit(void) //inicjalizacja LCD { LCDconfigIO(); CLR_RS; CLR_E; _delay_ms(20); CLR_D7; CLR_D6; SET_D4; SET_D5; unsigned char i; for(i=0;i<3;i++) {SET_E;CLR_E;_delay_ms(5);} CLR_D4; SET_E; CLR_E; _delay_ms(5); LCDcmd(0x28); //function set - interface=4 bit,line=2,font=5x7 LCDcmd(0x0c); //display ctrl - display on LCDcmd(0x06); //entry mode set - increment LCDcmd(0x01); //clear display

} //wyczyść wyśw. void LCDcls(void) {LCDcmd(CLRDISP);} //ustaw kursor na pozycji 0,0 void LCDhome(void) {LCDcmd(HOMEDISP);} //wyślij tekst z RAM na wyśw. void LCDtext(char *txt) {while(*txt) {LCDchr(*txt++);}} //umieść kursor na pozycji x,y - brak kontroli dla x i y void LCDxy(char x,char y) { unsigned char com=0x80; com|=(x|(y<<6)); LCDcmd(com); }

// program główny int main(void) {

LCDinit(); while(1) { unsigned char a=4; _delay_ms(300); LCDxy(0,0); LCDtext("ff"); _delay_ms(300); LCDcls(); } return 0; }

Reply to
janek
Loading thread data ...

Użytkownik "janek" <to_nie snipped-for-privacy@wp.pl napisał w wiadomości news:jl6e18$301$ snipped-for-privacy@news.icm.edu.pl...

Poczytaj o instrukcji itoa{...). A tak wogóle to zacznij od jakiegoś kursu C dla AVR albo kup dobrąą książkę.

PP

Reply to
Piotrek_P

Piotrek_P snipped-for-privacy@op.pl napisał(a):

Dokładnie, bo problem nie jest związany ani z AVR Studio ani z LCD. Tak na szybko, jeśli zmienna ma wartość od 0 do 9, to można zrezygnować z itoa i do zmiennej dodać '0'.

Reply to
Grzegorz Niemirowski

W dniu 2012-03-31 10:08, janek pisze:

Nie pamiętam już avrgcc ale w gcc dla arma używam sprintf aby zapisać zmienną do łańcucha tekstowego:

sprintf(cOutBuff,"%u",usHighVoltSignal );

gdzie char cOutBuff[40]; unsigned short usHighVoltSignal;

Można tę wartość poprzedzić od razu tekstem:

sprintf(cOutBuff,"%s","HI=");sprintf(cOutBuff+strlen(cOutBuff),"%u",usHighVoltSignal );

W cOutBuff będzie teraz przykładowo tekst: Hi=1234 Tak jak pisałem avrgcc nie pamiętam ale chyba powinno dać radę użyć LCDtext(cOutBuff) aby wysłać tekst do LCD. cOutBuff powinny być zinterpretowane jako wskaźnik do początku łańcucha a OIDP dopuszcza się użycie LCDtext(*text).

Reply to
Mario

sprintf(cOutBuff,"%s","HI=");sprintf(cOutBuff+strlen(cOutBuff),"%u",usHighVoltSignal

Nie znam avrgcc, ale nie wystarczy

sprintf(cOutBuff,"HI=%u",usHighVoltSignal);

??

Oprócz tego trzeba uważać, bo coponiektóre kompilatory ładują kompletne biblioteki (też float), jak się używa *printf i z programiku 500 bytów robi się krowa z 20k i więcej. Wtedy czasem warto zrobić własną konwersję lub korzystać z itoa lub podobnych funkcji.

Waldek

Reply to
Waldemar Krzok

Użytkownik "Mario" snipped-for-privacy@w.pl napisał w wiadomości news:jl7061$215$ snipped-for-privacy@mx1.internetia.pl...

Kolega janek prosił o pomoc w sprawie AVR. ARMy to inna bajka. Używanie instrukcji sprintf(...) w przypadku AVR jest marnowaniem zasobów procesora. Na ARMie można sobie lekką ręką korzystać z sprinf(...).

PP

Reply to
Piotrek_P

W dniu 2012-03-31 15:36, Piotrek_P pisze:

Nie ma zmiłuj. Albo itoa albo sprintf. Chyba, że jakaś własna konwersja do bcd i dodawanie 0x30.

Reply to
Mario

W sumie to już nie pamiętam czemu tak napisałem :) Inaczej jakoś mi nie wychodziło, a to były moje początki z ARM. No i tak już zostało.

Reply to
Mario

W dniu 2012-03-31 15:36, Piotrek_P pisze:

Funkcja jest w bibliotece. Nie wiadomo na ile ten procesor jest zajęty, że nie można go obciążać. Nie ma zmiłuj. Albo itoa albo sprintf. Chyba, że jakaś własna konwersja do bcd i dodawanie 0x30 do każdej cyfry.

Reply to
Mario

Czasem jest właśnie to lepsze. Jak już pisałem, miałem do czynienia z jakimś poj... kompilatorem, który na dzień dobry dołączał kompletną (!) bibliotekę zmiennoprzecinkową, jak tylko miało się sprintf, choćby z samym integerem. Chyba nawet nie użyłem itoa tylko zrobiłem konwersję piechty (% 10 i / 10) i wpisywałem od razu na odpowiednie pozycje w stringu.

Waldek

Reply to
Waldemar Krzok

sprintf to zły nawyk, używaj snprintf.

Reply to
Adam Wysocki

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.