Pokušavam napravit štopericu koja će se pokrenut/zaustaviti na pritisak buttona i vrijeme prikazivat na LCD-u. Dodao sam još jedan button koji je aktivan dok štoperica radi (pokušava radit) i svaki pritisak na taj button se counter povećava za 1 (pokušava se povećavat za 1) i stanje se također prikazuje na LCD-u.
Dakle ispis na LCD bi trebao izgledat ovako nekako:
TIME: 00:00:00 - min:sec:ms
HITS: 00 -broj pritisaka na hits button dok štoperica radi
Uglavnom to je ideja ali normalno meni to baš ne radi tako . Što se HITS countera tiće on mi izbroji malo više “hitseva” od jednog ali time se planiram pozabavit kasnije. Najviše me muči što štoperica ne radi ni približno realnom vremenu. Za računanje vremena koristim timer0. Gledao sam u datasheet i mislim da sam dobro poštelao registre za sve što mi treba (interrupt enable, prescaler itd.) Uglavnom ja sam sebi htio poštelat da se interrupt dogodi svakih 1ms i kad uđe u interrupt rutinu poveća brojač za 1. Deset puta tako i trebao bi dobit 1 stotinku. Sve to divno i bajno zvuči u mojoj glavi ali kad pokrenem simulaciju toga u proteusu ne dobijem ni približno realno vrijeme. Kad istu konfiguraciju timera koristim za paljenje i gašenje LED-ice radi odlično ali čim ubacim LCD sve se uspori. Iz toga sam zaključio da ga LCD kolje ali od tuda ni makac. Blejim već 2 dana u jedno te isti kod i stojim na mjestu.
Pls help
Compiler: mikroC
Simulator: Proteus
PIC: pic16f887
Code: Select all
//LCD connections
sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC3_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at TRISC2_bit;
sbit LCD_EN_Direction at TRISC3_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
// all variables
unsigned t_1ms;
unsigned char fr1, fr2, sec1, sec2, min1, min2;
unsigned char hits1, hits2;
void interrupt() { // Interrupt routine
if (TMR0IF_bit) { // TMROIF_bit > interrupt flag bit
t_1ms++; // Increment counter every 1 ms
TMR0IF_bit = 0; // clear TMR0IF_bit > Set flag back to "0"
TMR0 = 0x8; // Set initial value on TMR0 register (0x8 = 00001000);
}
}
Init_LCD() {
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_cmd(_LCD_TURN_ON); // Turn LCD ON
Lcd_out(1,1,"Time: 00:00:00"); // Show start values on LCD
Lcd_out(2,1,"Hits: 00");
}
Init_timer0() {
OPTION_REG = 0x82; // Assign prescaler to TRM0 1:8 and disable PORTB Pull-up Enable bit
TMR0 = 0x8; // Timer0 initial value (8 > 00001000) 256-250+2
INTCON = 0xA0; // Enable TMRO interrupt
t_1ms = 0; // Set counter to zero
}
start() {
do {
if (Button(&PORTD, 1, 1, 1)) { // if Stop button is pressed
t_1ms = 0; // Reset counter to zero
sec1 = sec2 =48; // Reset all variables to ASCII 48 - char "0"
min1 = min2 = 48;
hits1 = hits2 =48;
break;
}
if (Button(&PORTD, 2, 1, 1)) { // if Hit button is pressed
hits1++; // increment hits1 variable
if (hits1 > 57) { // if hits1 greater then ASCII 57 - char "9"
hits2++; // increment hits2 variable
hits1 = 48; // Reset hits1 varible back to zero
}
Lcd_chr(2,16,hits1); // Show number of hits on LCD
Lcd_chr(2,15,hits2);
}
if (t_1ms >= 10) { // are varible t_1ms greater or equal to 1000 (1ms * 1000 = 1s)
PORTB = ~PORTB; // Toggle PORTB every 10ms - TEST!!!
fr1++;
if (fr1 > 57) {
fr2++;
fr1=48;
if (fr2 > 57) {
sec1++;
fr2=48;
if(sec1 > 57) {
sec2++;
sec1=48;
if (sec2 > 53) {
min1++;
sec2=48;
if (min1 > 57) {
min2++;
min1=48;
if (min2 > 53) {
min2=48;
}
}
}
}
}
}
t_1ms = 0; // Reset t_1ms variable back to zero
Lcd_Chr(1,16, fr1); // show fr1 on LCD
Lcd_Chr(1,15, fr2); // show fr2 on LCD
Lcd_Chr(1,13, sec1); // show sec1 on LCD
Lcd_Chr(1,12, sec2); // show sec2 on LCD
Lcd_Chr(1,10, min1); // show min1 on LCD
Lcd_Chr(1,9, min2); // show min2 on LCD
}
}while(1);
}
void main() {
Init_LCD(); // initialize LCD
Init_timer0(); // initialize timer
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISB = 0; // Set all pins of PORTB as output
PORTB = 0xFF; // Initialize PORTB
TRISD = 0xFF; // Set all pins of PORTD as input
fr1 = fr2 = 48; // Set all variables to ASCII 48 - char "0" to show on LCD
sec1 = sec2 = 48;
min1 = min2 = 48;
hits1 = hits2 = 48;
do {
if (Button(&PORTD, 0, 1, 1)) { // if Start button is pressed
t_1ms = 0; // Set t_1ms to start counting from zero
Lcd_chr(2,16,hits1); // show hits1 on LCD
Lcd_chr(2,15,hits2); // show hits2 on LCD
Lcd_Chr(1,16, fr1); // show fr1 on LCD
Lcd_Chr(1,15, fr2); // show fr2 on LCD
Lcd_Chr(1,13, sec1); // show sec1 on LCD
Lcd_Chr(1,12, sec2); // show sec2 on LCD
Lcd_Chr(1,10, min1); // show min1 on LCD
Lcd_Chr(1,9, min2); // show min2 on LCD
start(); // call start() function
}
} while(1);
}