Gustav |
Nové stránky BETA
Hlavní nabídka
Technika & Bastlení
Média
Reklama Google

PDF Tisk Email
-
Napsal uĹživatel Michal, OK1WMR   
Čtvrtek, 04 Březen 2010 18:30
Toto zapojení využívá k ?ízení hodin mikroprocesor od firmy Atmel - ATmega8. Originální realizace na Daqq.eu. Celé zapojení je pom?rn? jednoduché, ale je t?eba naprogramovat mikroprocesor. Zp?sob? jak toho úsp?šn? dosáhnout je mnoho.  Pokud nechce stav?t n?co složitého, jeden jednoduchý programátor je zde. My jsme si pak na kroužku postavili tento do USB. Všechny sou?ástky jsou vývodové a pod mikroprocesor jsme zatím dali rad?ji patici pro snažší manipulaci s mikroprocesorem.
..
.
Toto zapojení jsme pojali jako motiva?ní, postavit si n?co praktického s využitím mikroprocesoru. Celé hodiny jsou tvo?eny dv?ma DPS, které jsou na sebe navzájem kolmé. V míst? kontaktu desek jsou sletovány pájecí plošky a tím je zaru?en p?enost signálu pro displej. Ihned po zapojení na napájení by se na hodinách m?l objevit ?as 00:00 a již hodiny b?ží (pokud máte samoz?ejm? správn? zapojení a naprogramován mikroprocesor). Aktuální ?as nastavíte pomocí tla?ítek SW1 (minuty) a SW2 (hodiny). Celé hodiny je pak možné zabudovat do krabi?ky a lze je napájet 9V baterií nebo lépe adaptérem ze sít? (spot?eba 100mA). Displej jsme použili CA56-21SRWA (2), na které máme i nakreslený plošný spoj. Mikroprocesor je ATmega8 - 16PU v pouzdru DIL28.


Schéma:
schema
.
Plošný spoj:
pcb
Plošky p?ipravené k pájení - spojení dvou DPS
.
Eagle 5.7: SCH a BRD
Program: hodiny.c, hodiny.hex (.hex se nahrává do mikroprocesoru, m?žete prohlížet v editoru txt) p?vodní zdroj Daqq.eu

Deska byla vyrobena metodou nažehlením tonneru.

Seznam sou?ástek:
R1-R8 - 330R
R9-R11 - 10K
C1,C2 - 22p
C3 - 100nF
C4, C5 - 100uF/16V
IC1 - 7805 (TO220)
IC4 - ATmega8-16PU (DIL28) + patice pro DIL28
D1 - LED displej CA56-21SRWA
Q1 - krystal 14.7456 MHz - HC49
SW1, SW2 - mikrotla?ítka s delším hmatníkem


Program v jazyce C

Untitled
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <stdio.h>
    
#define _s_A  2
#define _s_B  0
#define _s_C  6
#define _s_D  4
#define _s_E  3
#define _s_F  1
#define _s_G  7
#define _s_dot 5

const unsigned char segs[] =
{
    _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F),    //0
    _BV(_s_B) | _BV(_s_C),    //1
    _BV(_s_A) | _BV(_s_B) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G),    //2
    _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_G),  //3
    _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),    //4
    _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_F) | _BV(_s_G), //5
    _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //6
    _BV(_s_A) | _BV(_s_B) | _BV(_s_C), //7
    _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),//8
    _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),//9
   
    _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),    //A
    _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),    //B
    _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //C
    _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //D
    _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //E
    _BV(_s_A) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G) //F

};
  
#define _ms(n) (17*n)

void wait(unsigned int a)    //basic wait
{                           
    volatile unsigned int b,c;
    for(b=0;b!= a; b++)for(c=0;c!= 50;c++);
    return;
}
   
unsigned char prescale=0;
unsigned char sec=0;
unsigned char min_1=0;
unsigned char min_10=0;
unsigned char hour_1=0;
unsigned char hour_10=0;
unsigned char show_t=0;
   
   ISR(TIMER1_OVF_vect)
{
    if(++prescale == 225){prescale = 0;sec++;};
    if(sec>59){min_1++;sec=0;};
    if(min_1>9){min_1=0;min_10++;};
    if(min_10>5){min_10=0;hour_1++;};
    if(hour_1>9){hour_1=0;hour_10++;};
    if(hour_10>1 && hour_1>3){hour_1=0;hour_10=0;};
   
    if(++show_t==4) show_t=0;
    switch(show_t)
    {
        case 0:    //show minutes
            PORTC = 0x04;
            PORTD = (~segs[min_1]);
            break;
        case 1:    //show 10 minutes
            PORTC = 0x08;
            PORTD = (~segs[min_10]);
            break;
        case 2:    //show hours
            PORTC = 0x10;
            PORTD = (~segs[hour_1]) & ~_BV(_s_dot);
            break;
        case 3:    //show 10hours
            PORTC = 0x20;
            PORTD = (~segs[hour_10]);
            break;
        default:
            show_t = 0;
            break;
    }   
    return;
}
  
#define B1() (bit_is_clear(PINB,3))
#define B2() (bit_is_clear(PINB,4))
#define B_WAIT 300

#define nop() asm volatile ("nop;")

int main(void)
{

    TIMSK = 0x04;
    TCCR1B = 0x01;

    DDRD = 0xFF;
    DDRC = 0x3F;
    DDRB = 0x00;
    PORTB = 0xFF;
   
    sei();
    while(1)
    {
        if(B1())
        {
            wait(_ms(B_WAIT));
            min_1++;
            sec=0;
        }
        if(B2())
        {
            wait(_ms(B_WAIT));
            hour_1++;
            sec=0;
        }
    }
}
 


.
.
.
.
.
.
.
.
.
.
.
.
.

New layer...
New layer...
New layer...
 
Poslední aktualizace
 5 January 2016, 07:01 
Webkamera
Webkamera na Blatenském vrchu
Change language
Sociální sít?
Náhodné foto
Podporují nás