Ceas electronic - șah

Ceas electronic - șah


Ceas electronic de șah. Cea mai simplă versiune a unui astfel de ceas este pur și simplu două cronometre intermitente.

Materialul articolului poate fi util pentru cei care încep să-l stăpânească pe CodeVisionAVR.

Indiferent cât de mare este Internetul, cu toate acestea, scheme simple și interesante nu sunt atât de ușor de găsit.

De exemplu, tipul de ceasuri de șah, Google si nu am intalnit un astfel de sistem, și, de fapt, o astfel de schemă de la MC, este ușor.

Definiție: "Ceas de șah" se referă la un ceas cu două dispozitive de afișare a timpului conectate una la cealaltă, astfel încât numai unul dintre ele să poată funcționa în același timp.

Permiteți-mi să vă dau un simplu exemplu de un astfel de ceas de șah (de fapt, un prototip al unui cronometru. În loc temporizatorul. Și chiar o versiune simplificată, fără caracteristici suplimentare, dar acest lucru este fixable :)) codul sursă inclus).

Funcții: Controlul este simplu, în timp ce apăsați KH-1 trece prin primul cronometru, în timp ce apăsați KH-3 trece prin butonul cronometru două KH-2 (reset) la zero scorul de citire.

Dacă utilizați comutatorul P2K sau un flip-flop obișnuit în comanda de sincronizare. acest lucru va corespunde aproximativ funcționalității dorite a circuitului.

În acest proiect, principal este de a folosi două cronometre, dacă se dorește, numărul lor poate fi crescută, care pot fi utile pentru alte circuite, de exemplu, a crea un proiect în partea de sus CodeVisionAVR sale.

Mai întâi alegem MC și frecvența.

Ceas electronic - șah

conectați ecranul LCD la PORTB

Ceas electronic - șah

iar portul PORTD face controlul butoanelor de pe intrare cu o tragere a rezistențelor interne la +.

Ceas electronic - șah


Cel mai interesant lucru este să configurați cronometrul pe numărul exact de secunde.

Cum se face acest lucru, sunt foarte lucid la timp, au ajutat informațiile de pe site-ul my-avr.at.ua.

În parametrii temporizatorului, selectați Timer 1, Valoarea ceasului 7,813 kHz, Întrerupeți: Comparați o potrivire, Comp. A = 1e85 (acest lucru înseamnă pur și simplu că va fi tactat cu o frecvență de 1 secundă)
valoarea ceasului
Întrerupeți pe comparație Un meci - o întrerupere a coincidenței cu registrul A

Ceas electronic - șah


Aici ne oprim puțin. Care este numărul ăsta? De ce ați decis să luați acest număr special?

Deci, pentru a calcula corect frecvența temporizatorului, trebuie să deschideți un calculator de proiectare. Numărul 1e85 (este în cel de-al 16-lea număr de sistem) = 7813 în a 10-a s / h. Din aceasta rezultă că 7813 (frecvența întreruperii = 1 Hz) * 5 (sec) = 39065 și o traducem într-un cv 16, atunci obținem 9899, ​​iată numărul pe care l-am pus în Comp. A și cronometrul nostru va funcționa cu o frecvență de 0,2 Hz, care este de 1 dată în 5 secunde.
Generați codul și salvați-l.

În codul temporizatorului: (TIM1_COMPA)
Trebuie să introduceți următoarele rânduri de cod în mijloc:
TCNT1H = 0;
TCNT1L = 0;
Pentru funcționarea corectă a timerului, aceste registre sunt atribuite 0.
Aici este codul sursă în cele din urmă.

void principal (void)
<
// Declarați aici variabilele locale

// Factor de divizare a Crystal Oscilator: 1
#pragma optsize-
CLKPR = 0x80;
CLKPR = 0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize +
# endif
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTD = 0x1C;
DDRD = 0x00;

TCCR1A = 0x00;
TCCR1B = 0x05;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH ​​= 0x1E;
OCR1AL = 0x85;
OCR1BH = 0x00;
OCR1BL = 0x00;
TIMSK = 0x40;
USICR = 0x00;
ACSR = 0x80;
lcd_init (16);
#asm ("sei")

în timp ce (1)
<
lcd_gotoxy (0,0); // Afișați locația
lcd_putchar (oră_A / 10 + 0x30);
lcd_putchar (oră_A% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (min_A / 10 + 0x30);
lcd_putchar (min_A% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (sec_A / 10 + 0x30);
lcd_putchar (sec_A% 10 + 0x30);
dacă (PIND.2 == 0) // afișați pe ecran starea primului cronometru
lcd_putsf (" altfel
<
lcd_putsf (" >;
lcd_gotoxy (0,1); // Afișați locația
dacă (PIND.4 == 0) // afișați pe ecran starea celui de-al doilea cronometru
lcd_putsf ("start2>");
altfel
<
lcd_putsf ("payza>");
>;
lcd_putchar (oră_B / 10 + 0x30);
lcd_putchar (oră_B% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (min_B / 10 + 0x30);
lcd_putchar (min_B% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (sec_B / 10 + 0x30);
lcd_putchar (sec_B% 10 + 0x30);

dacă (sec_A == 60) ; // Condiții de lucru secunde
dacă (min_A == 60) ; // Condiții de lucru în minute
dacă (oră_A == 96) ; // Starea ceasului în format de 4 zile

dacă (sec_B == 60) ; // Condiții de lucru secunde
dacă (min_B == 60) ; // Condiții de lucru în minute
dacă (oră_B == 96) ; // Starea ceasului în format de 4 zile

#pragma optsize-
CLKPR = 0x80;
CLKPR = 0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize +
# endif
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTD = 0x1C;
DDRD = 0x00;

TCCR1A = 0x00;
TCCR1B = 0x05;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH ​​= 0x1E;
OCR1AL = 0x85;
OCR1BH = 0x00;
OCR1BL = 0x00;
TIMSK = 0x40;
USICR = 0x00;
ACSR = 0x80;
lcd_init (16);
#asm ("sei")

în timp ce (1)
<
lcd_gotoxy (0,0); // Afișați locația
lcd_putchar (oră_A / 10 + 0x30);
lcd_putchar (oră_A% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (min_A / 10 + 0x30);
lcd_putchar (min_A% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (sec_A / 10 + 0x30);
lcd_putchar (sec_A% 10 + 0x30);
dacă (PIND.2 == 0) // afișați pe ecran starea primului cronometru
lcd_putsf (" altfel
<
lcd_putsf (" hour_AA = 0, min_AA = 0, sec_AA = 0; // reinițializați ora curentă
>;
lcd_gotoxy (0,1); //
lcd_putchar (oră_AA / 10 + 0x30);
lcd_putchar (oră_AA% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (min_AA / 10 + 0x30);
lcd_putchar (min_AA% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (sec_AA / 10 + 0x30);
lcd_putchar (sec_AA% 10 + 0x30);

lcd_gotoxy (0,2); //
dacă (PIND.4 == 0) // afișați pe ecran starea celui de-al doilea cronometru
lcd_putsf ("start2>");
altfel
<
lcd_putsf ("payza>");
or_BB = 0, min_BB = 0, sec_BB = 0; // reinițializați ora curentă
>;
lcd_putchar (oră_B / 10 + 0x30);
lcd_putchar (oră_B% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (min_B / 10 + 0x30);
lcd_putchar (min_B% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (sec_B / 10 + 0x30);
lcd_putchar (sec_B% 10 + 0x30);

lcd_gotoxy (8,3); // ora curentă
lcd_putchar (ora_BB / 10 + 0x30);
lcd_putchar (ora_BB% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (min_BB / 10 + 0x30);
lcd_putchar (min_BB% 10 + 0x30);
lcd_putchar (':');
lcd_putchar (sec_BB / 10 + 0x30);
lcd_putchar (sec_BB% 10 + 0x30);

dacă (PIND.3 == 0) oră_A = 0, min_A = 0, sec_A = 0; // reinițializați ora
hour_AA = 0, min_AA = 0, sec_AA = 0; // reinițializați curentul
or_B = 0, min_B = 0, sec_B = 0; // reinițializați ora
or_BB = 0, min_BB = 0, sec_BB = 0; // reinițializați curentul
>;

dacă (sec_A == 60) ; // Condiții de lucru secunde
dacă (min_A == 60) ; // Condiții de lucru în minute
dacă (oră_A == 96) ; // Starea ceasului în format de 4 zile

dacă (sec_AA == 60) ; // Condiții de lucru secunde
dacă (min_AA == 60) ; // Condiții de lucru în minute
dacă (ora_AA == 24) ; // Starea de funcționare a ceasului

dacă (sec_B == 60) ; // Condiții de lucru secunde
dacă (min_B == 60) ; // Condiții de lucru în minute
dacă (oră_B == 96) ; // Starea orelor în format de 4 zile

Articole similare