Hjälp med interrupt i mikroc.
Postat: 17 april 2006, 23:02:08
Hej
Jag har börjat experimentera i mikroc. Jag vet att många förespråkar asm för noviser som mig. Men jag var otålig. Jag har blinkat lite ledar och lekt med lcd-display och det har gått fint.
Nu har jag dock stött på problem. Jag skulle vilja göra en enkel klocka. För att åstadkomma det vill jag använda timern och interrupt.
Min uppkoppling verkar ok tycker jag. Processorn kör och jag får ut text på displayen. Dock får jag inga interrupts på timern.
Koden är som följer:
/*
* Project name:
LCDClock
* Copyright:
(c) Daniel Carlsson, 2006.
* Description:
Simple program to learn how to write to 16x2 character display and how to
implement a hardware timer with interrupt.
* Test configuration:
MCU: PIC16F628A
Oscillator: XT, 04.0000 MHz
Ext. Modules: -
SW: mikroC v5.0
* Wiring :
D7 - port.7
D6 - port.6
D5 - port.5
D4 - port.4
E - port.3
RS - port.2
*/
short unsigned hh = 0;
short unsigned mi = 0;
short unsigned ss = 0;
/*
Writes the time in the HH:MM:SS format to an initiated LCD. Row and col
values dertermins the placement on the display.
*/
void WriteTimeToLCD(short unsigned row, short unsigned col,short unsigned hh,
short unsigned mi, short unsigned ss)
{
char tmp[4];
// Write hours to display
ShortToStr(hh, tmp);
if (hh < 10)
tmp[2] = '0';
Lcd_Chr(row, col, tmp[2]);
Lcd_Chr(row, col + 1, tmp[3]);
Lcd_Chr(row, col + 2, ':');
//Write minutes to display
ShortToStr(mi, tmp);
if (mi < 10)
tmp[2] = '0';
Lcd_Chr(row, col + 3, tmp[2]);
Lcd_Chr(row, col + 4, tmp[3]);
Lcd_Chr(row, col + 5, ':');
//Write seconds to display
ShortToStr(ss, tmp);
if (ss < 10)
tmp[2] = '0';
Lcd_Chr(row, col + 6, tmp[2]);
Lcd_Chr(row, col + 7, tmp[3]);
}
//Handels interrupt from TMR0
void interrupt(void) {
TMR0 = 96;
ss ++;
if (ss = 60)
ss = 0;
}
void main() {
OPTION_REG = 0x84; // Assign prescaler to TMR0
TMR0 = 96;
INTCON.T0IE = 1; // Enable TMRO interrupt
TRISB = 0; // PORTB is output
Delay_ms(1000);
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Cmd(Lcd_CLEAR); // Clear display
while (1) {
WriteTimeToLCD(1, 5, hh, mi, ss);
}
}
Det som händer då man kör koden är att man får en utskrift 00:00:00 på displayen vilket är korrekt. Dock hade jag förväntat mig att siffrorna för sekund skulle ändras. Intervallet för interrupt är inte en sekund det är jag medveten om men problemet är att jag får ingen interrupt alls.
Tar tacksamt emot en hjälpande hand.
/Daniel
Jag har börjat experimentera i mikroc. Jag vet att många förespråkar asm för noviser som mig. Men jag var otålig. Jag har blinkat lite ledar och lekt med lcd-display och det har gått fint.
Nu har jag dock stött på problem. Jag skulle vilja göra en enkel klocka. För att åstadkomma det vill jag använda timern och interrupt.
Min uppkoppling verkar ok tycker jag. Processorn kör och jag får ut text på displayen. Dock får jag inga interrupts på timern.
Koden är som följer:
/*
* Project name:
LCDClock
* Copyright:
(c) Daniel Carlsson, 2006.
* Description:
Simple program to learn how to write to 16x2 character display and how to
implement a hardware timer with interrupt.
* Test configuration:
MCU: PIC16F628A
Oscillator: XT, 04.0000 MHz
Ext. Modules: -
SW: mikroC v5.0
* Wiring :
D7 - port.7
D6 - port.6
D5 - port.5
D4 - port.4
E - port.3
RS - port.2
*/
short unsigned hh = 0;
short unsigned mi = 0;
short unsigned ss = 0;
/*
Writes the time in the HH:MM:SS format to an initiated LCD. Row and col
values dertermins the placement on the display.
*/
void WriteTimeToLCD(short unsigned row, short unsigned col,short unsigned hh,
short unsigned mi, short unsigned ss)
{
char tmp[4];
// Write hours to display
ShortToStr(hh, tmp);
if (hh < 10)
tmp[2] = '0';
Lcd_Chr(row, col, tmp[2]);
Lcd_Chr(row, col + 1, tmp[3]);
Lcd_Chr(row, col + 2, ':');
//Write minutes to display
ShortToStr(mi, tmp);
if (mi < 10)
tmp[2] = '0';
Lcd_Chr(row, col + 3, tmp[2]);
Lcd_Chr(row, col + 4, tmp[3]);
Lcd_Chr(row, col + 5, ':');
//Write seconds to display
ShortToStr(ss, tmp);
if (ss < 10)
tmp[2] = '0';
Lcd_Chr(row, col + 6, tmp[2]);
Lcd_Chr(row, col + 7, tmp[3]);
}
//Handels interrupt from TMR0
void interrupt(void) {
TMR0 = 96;
ss ++;
if (ss = 60)
ss = 0;
}
void main() {
OPTION_REG = 0x84; // Assign prescaler to TMR0
TMR0 = 96;
INTCON.T0IE = 1; // Enable TMRO interrupt
TRISB = 0; // PORTB is output
Delay_ms(1000);
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Cmd(Lcd_CLEAR); // Clear display
while (1) {
WriteTimeToLCD(1, 5, hh, mi, ss);
}
}
Det som händer då man kör koden är att man får en utskrift 00:00:00 på displayen vilket är korrekt. Dock hade jag förväntat mig att siffrorna för sekund skulle ändras. Intervallet för interrupt är inte en sekund det är jag medveten om men problemet är att jag får ingen interrupt alls.
Tar tacksamt emot en hjälpande hand.
/Daniel