Zegar wykonałem na mikrokontrolerze PIC12F1840 i rejestrach szeregowych sterujących diodami. Poszczególne kolumny diod wyświetlają cyfry. Całość jest taktowana eksperymentalnie kwarcem 16MHz zamiast 32kHz. Schemat poniżej.
Płytka wykonana chałupniczo, jak najszybciej i bez pomyślunku niestety bo wypadałoby dodać parę rzeczy.
Program zegara jest bardzo prosty, konfiguracja IO i peryferiów mikrokontrolera została graficznie wykonana w MCC a reszta napisana przez mnie. Poniżej zawartość pliku main.c Nawet nie chciało mi sie konfigurować sprzętowego SPI do sterowania rejestrem więc zbitbangowałem go funkcją podobną do shiftOut z arduino. W godzinach od 21-7 rano zegar świeci około 10% mocy z jaką świeci w ciągu dnia. Brzydko to jest dość napisane ale mój czas jest zbyt cenny żeby marnować go na poprawianie głupiego zegarka
#include "mcc_generated_files/mcc.h"
char setting = 0;
char ms = 0;
char s = 0;
char m = 0;
char h = 0;
char b1, b2;
void shiftOut(char val)
{
for (char i = 0; i < 8; i++) {
LATA0 = !!(val & (1 << (7 - i)));
SCK_SetHigh();
SCK_SetLow();
}
}
void shift(char byte1, char byte2){
nSS_SetLow();
shiftOut(byte1);
shiftOut(byte2);
nSS_SetHigh();
}
void checkTime(){
if(ms > 9){ ms = 0; s++;}
if(s > 59){ s = 0; m++; }
if(m > 59){ m = 0; h++; }
if(h > 23){ h = 0; m = 0; s = 0; ms = 0;}
}
void timer0interrupt(){
ms++;
checkTime();
}
void delay(unsigned int mss){
while(mss > 1){
__delay_ms(1);
mss--;
}
}
void prepareBuffer(){
char h10, h1, m10, m1;
h10 = h / 10;
h1 = h % 10;
m10 = m /10;
m1 = m % 10;
if(m10 & (1<<0)) b2 = b2 | (1<<0); else b2 &= ~(1<<0);
if(m10 & (1<<1)) b2 = b2 | (1<<1); else b2 &= ~(1<<1);
if(m10 & (1<<2)) b2 = b2 | (1<<2); else b2 &= ~(1<<2);
if(m1 & (1<<0)) b2 = b2 | (1<<3); else b2 &= ~(1<<3);
if(m1 & (1<<1)) b2 = b2 | (1<<4); else b2 &= ~(1<<4);
if(m1 & (1<<2)) b2 = b2 | (1<<5); else b2 &= ~(1<<5);
if(m1 & (1<<3)) b2 = b2 | (1<<6); else b2 &= ~(1<<6);
if(h10 & (1<<0)) b1 = b1 | (1<<0); else b1 &= ~(1<<0);
if(h10 & (1<<1)) b1 = b1 | (1<<1); else b1 &= ~(1<<1);
if(h1 & (1<<0)) b1 = b1 | (1<<2); else b1 &= ~(1<<2);
if(h1 & (1<<1)) b1 = b1 | (1<<3); else b1 &= ~(1<<3);
if(h1 & (1<<2)) b1 = b1 | (1<<4); else b1 &= ~(1<<4);
if(h1 & (1<<3)) b1 = b1 | (1<<5); else b1 &= ~(1<<5);
}
void buttonHandler(){
if(BUTTON_GetValue() == 0){
unsigned int cnt = 0;
while(BUTTON_GetValue() == 0){
__delay_ms(1);
cnt++;
if(cnt > 3500){
shift(0xFF, 0xFF);
}
}
if(cnt > 3500){
if(setting == 1) setting = 0; else setting = 1;
} else
if(cnt < 1500 && cnt > 100){
INTERRUPT_GlobalInterruptDisable();
prepareBuffer();
shift(b2, b1);
delay(10);
if(setting == 0){
s = 0;
ms = 0;
h++;
if(h > 23) h = 0;
} else {
s = 0;
ms = 0;
m++;
if(m > 59) m = 0;
}
prepareBuffer();
shift(b2, b1);
delay(200);
INTERRUPT_GlobalInterruptEnable();
}
}
}
void main(void)
{
SYSTEM_Initialize();
TMR1_SetInterruptHandler(&timer0interrupt);
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
while (1)
{
prepareBuffer();
if(s % 2 == 1) b2 = b2 | (1<<7); else b2 &= ~(1<<7);
if(setting == 1) b1 &= ~(1<<7); else b1 |= (1<<7);
if(setting == 0) b1 &= ~(1<<6); else b1 |= (1<<6);
if(h < 7 || h > 21){
b2 &= ~(1<<7);
if(s % 2 == 1) b1 &= ~(1<<7); else b1 |= (1<<7);
}
buttonHandler();
if(h < 7 || h > 21){
shift(0x00,0x00);
__delay_us(90);
shift(b2, b1);
__delay_us(10);
shift(0x00,0x00);
} else {
shift(b2, b1);
}
}
}
Brak komentarzy:
Prześlij komentarz