piątek, 24 marca 2017

Zegar binarny




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