Próba képpen, hogy mégis láss egy egyszerű meghajtást kiszedtem a nagy kijelzős DCF órámból egy modult, és egy szem magába, minden felesleges dolog nélkül vezéreltem PIC-el. 18LF4520-as PIC-et használtam, mert kb 20-szor gyorsabb programozni (időben kevesebb ideig írja az ICD2).
Íme a kapcsolás melyet megépítettem:
(Kattints a képre a nagyobb változathoz)
#include <18F4520.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
int characters[17] = {
/* 0 */ 0b00111111,
/* 1 */ 0b00000110,
/* 2 */ 0b01011011,
/* 3 */ 0b01001111,
/* 4 */ 0b01100110,
/* 5 */ 0b01101101,
/* 6 */ 0b01111101,
/* 7 */ 0b00000111,
/* 8 */ 0b01111111,
/* 9 */ 0b01101111,
};
int disp[2] = {7,0}; //kijelző aktuális adat tömkelege
int act_disp = 0; //kijelző aktuális pozíciója
//===========================================================================
#int_TIMER2
void TIMER2_isr() {
//===========================================================================
int data;
output_d(0xFF); //kikapcsoljuk előbb a kijelzőt
data = characters[disp[act_disp]]; //kiszedjük a karakter adatot
data = 0xFF-data; //invertáljuk
output_c(act_disp+1); //kirakjuk az "oszlop" címet
output_d(data); //kirakjuk az adatot
act_disp++; //következő digit
if(act_disp>1) act_disp = 0; //ha utsó digit
}
//===========================================================================
void init() {
//===========================================================================
setup_timer_2(T2_DIV_BY_16,120,16); //6ms körül
enable_interrupts( INT_TIMER2 );
enable_interrupts( GLOBAL );
output_d(0xFF); //kikapcs mindent
output_c(0x00);
}
//===========================================================================
void main() {
//===========================================================================
int i;
init();
for(;;) {
disable_interrupts(INT_TIMER2); //nehogy frissítls közben írjuk a tömböt
//látható felfelé számlálás
i++;
if(i>99) i = 0;
disp[0] = i/10;
disp[1] = i%10;
enable_interrupts(INT_TIMER2);
delay_ms(100);
}
}
A fenti kódot CCS-C ben írtam, megpróbáltam felkommentezni elég érthetően...
A lényeg, hogy a timer frissít. Ezt érdemes megtartani nagyobb projekteknél is, mivel lehet több utasítás idejű rutin is, ami hogyha a fő LOOP-ban fut, akkor megakaszthatja a frissítést.
Íme videók a működéséről.
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!