pierwsze początki z winavr

Mar 31, 2012 10 Replies

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; }


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

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'.

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

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

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

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.

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.

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.

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required