Timer, Codevision i AT90S2313

May 09, 2005 5 Replies

Witam, napisa³em sobie taki programi jak poni¿ej. Jest to prosty timerek, jednym przyciskiem startujê, drugim zatrzymujê. Ale mam problem z wy¶wietlaniem. Wynik na LCD mi migocze. Tzn. Migocz± czêsci setne sekundy oraz sekundy. Nie wiem jak to zrobiæ. Wygl±da to strasznie nieelegancko (niedo¶æ ¿e miga, to i wy¶wietla siê s³abiej, ni¿ np. zwyk³y napis lub wynik po zatrzymaniu stoperka). Czekam na Wasze porady :-) Pozdrawiam Piotrek



A o to kod. Chip type : AT90S2313 Clock frequency : 4,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 #include <90s2313.h>



#include <stdio.h>



// Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h>



int a; //sekundy int b=0; int min=0; int ms=0; int pom=0; int pom1=0; int p1,p2,p3; char display_buffer[5]; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Reinitialize Timer 0 value TCNT0=0x06; // Place your code here b=b+1; if (b==250) { ms=0; b=0; a=a+1; if (a==60) { a=0; min=min+1; }



} }



void main(void) { PORTB=0x00; DDRB=0x00;



PORTD=0x00; DDRD=0x00;



TCCR0=0x03; TCNT0=0x06;



TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1H=0x00; OCR1L=0x00;



GIMSK=0x00; MCUCR=0x00;



TIMSK=0x02;



ACSR=0x80;



lcd_init(16);



#asm("sei")



while (1) { DDRD.0=0; PORTD.0=1;



DDRD.1=0; PORTD.1=1; if (PIND.1==0) { pom=0; pom1=1;



}

if (PIND.0==0) { a=0; b=0; ms=0; min=0; pom=1; } else { if (pom==1) { lcd_clear(); sprintf(display_buffer,"%i %i %i",min, a, b*4); lcd_clear(); lcd_puts(display_buffer);



} else { if (pom1==0) { lcd_clear(); lcd_putsf("Czekam..."); } if (pom1==1) { p1=min; p2=a; p3=ms; lcd_clear(); sprintf(display_buffer,"%i %i %i",p1, p2, b*4); lcd_clear(); lcd_puts(display_buffer); while (PIND.0==1) {} }



} }; } }



Wystarczy że będziesz obliczał w paięci, a wyświetlał wynik tylko co 50-60ms, szybciej i tak oko nie zauważy.

U¿ytkownik "uC PC" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...

wy¶wietlaniem.

OK. Dziêki. Faktycznie, chyba ciut za szybko wysy³a³em dane do wy¶wietlacza. A jeszcze takie jedno pytanko odno¶nie Codevision. U¿ywaj±c LCD2*16 jak przej¶æ do drugiej linii ??? Bo co¶ takiego nie dzia³a :( ... lcd_clear(); sprintf(display_buffer,"%i %i %i",p1, p2, b*4); lcd_gotoxy(0,1); putsf("Napis"); ...

Pozdrawiam Piotrek

Powinno być lcd_putsf("Napis");

Powinno być lcd_putsf("Napis");

U¿ytkownik "Rafa³ Szulc" <rafszul@acd_o2.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@dial-1684.elblag.dialog.net.pl...

No tak, ¼le napisa³em tutaj. W programie mia³em lcd_putsf("Napis"); no i w³a¶nie nie dzia³a³o. Z regu³y zaczernia³o ca³y ekranik (czyli a¿ dwie linie :-), czasmi tylko jedn± (pierwsz±) a druga zostawa³a czysta ). Pozdrawiam Piotrek

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required