Časový spínač ATMEGA 8
Moderátor: Moderátoři
- radoslavsky
- Příspěvky: 3
- Registrován: 10 bře 2014, 00:00
Časový spínač ATMEGA 8
// LCD module connections
sbit LCD_RS at PORTA2_bit;
sbit LCD_EN at PORTD6_bit;
sbit LCD_D4 at PORTC4_bit;
sbit LCD_D5 at PORTC5_bit;
sbit LCD_D6 at PORTC6_bit;
sbit LCD_D7 at PORTC7_bit;
sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDD6_bit;
sbit LCD_D4_Direction at DDC4_bit;
sbit LCD_D5_Direction at DDC5_bit;
sbit LCD_D6_Direction at DDC6_bit;
sbit LCD_D7_Direction at DDC7_bit;
// End LCD module connections
char *m = "00";
char *hod = "00";
char *sec = "00";
char a;
char b;
char i; // Loop variable
void sekunda() { // Function used for text moving
for (a=0;a<60;a++) {
ByteToStr(a, sec);
Lcd_Out(1,12,":");
Lcd_Out(1,13,sec);
delay_ms(1000);} // You can change the moving speed here
}
void main(){
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,"cas:"); // Write text in first row
Lcd_Out(1,6,hod);
Lcd_Out(2,1,"sep:");
Lcd_Out(2,6,"00: 1: 00");
for (b=0;b<60;b++){
ByteToStr(b, m);
Lcd_Out(1,8,":");
Lcd_Out(1,9,m);
sekunda();
}
}
Nebudu tě zatěžovat poznatkem, co je přerušení od časovače. Možná pro tvůj školní projekt bude stačit ono pasivní čekání.
Pokud použiješ v hlavní smyčce pasivním čekání (delay_ms(1000);) jen 1x krát, potom ta smyčka zabere zhruba tu jednu sekundu.
Příklad:
Kód: Vybrat vše
unsigned char cSecond;
unsigned char cMinute;
unsigned char cHour;
{
delay_ms(1000); // pasivni cekani 1s
CSecond++;
if (cSecond>=60)
{
cSecond=0;
cMinute++;
if (cMinute>=60)
{
cMinute=0;
cHour++;
if (cHour>=24)
{
cHour=0;
}
}
}
// cSecond - roste 0..59
// cMinute - roste 0..59
// cHour - roste 0..24
}
Kód: Vybrat vše
typedf struct
{
unsigned char cSecond;
unsigned char cMinute;
unsigned char cHour;
} predvolba_t;
predvolba_t Predvolba;
unsigned char Spinac;
{
// init
// mimo hlavni smycku
Predvolba.cSecond = 0;
Predvolba.cMinute = 0;
Predvolba.cHour = 12; // sepne ve 12:00
Spinac = 0;
}
{
// uvnitr hlavni smycky
if (cHour>=Predvolba.cHour)
&& (cMinute>=Predvolba.cMinute)
&& (cSecond>=Predvolba.cSecond)
{
Spinac = 0x01;
}
if (Spinac!=0)
{
PORTB |= 0x01; // nahodi PORTB(0)
}
else
{
PORTB &= ~0x01; // shodi PORTB(0)
}
}Kód: Vybrat vše
// struktura celého programu pro školní projekt
void main (void)
{
// init
{
// init část, tady píšu kód který se provede jenom 1x při startu uC
}
// loop
while(1)
{
// loop část, provádí se pořád dokola...
delay_ms(1000); // pasivni čekani 1s, použito jen 1x v celé hlavní smyčce.
//
// tady píšu kód který se provede 1x za vteřinu
//
// většina kódu je umístěna právě zde
//
}
}- radoslavsky
- Příspěvky: 3
- Registrován: 10 bře 2014, 00:00
- radoslavsky
- Příspěvky: 3
- Registrován: 10 bře 2014, 00:00
Kód: Vybrat vše
// struktura celého programu pro školní projekt
void main (void)
typedf struct
{
unsigned char cSecond;
unsigned char cMinute;
unsigned char cHour;
predvolba_t;
Predvolba;
}
predvolba_t Predvolba;
unsigned char Spinac;
// init
// mimo hlavni smycku
Predvolba.cSecond = 0;
Predvolba.cMinute = 0;
Predvolba.cHour = 12; // sepne ve 12:00
Spinac = 0;
// loop
while(1)
{
if (cHour>=Predvolba.cHour)
&& (cMinute>=Predvolba.cMinute)
&& (cSecond>=Predvolba.cSecond)
{
Spinac = 0x01;
}
if (Spinac!=0)
{
PORTB |= 0x01; // nahodi PORTB(0)
}
else
{
PORTB &= ~0x01; // shodi PORTB(0)
}
}
unsigned char cSecond;
unsigned char cMinute;
unsigned char cHour;
{
delay_ms(1000); // pasivni cekani 1s
CSecond++;
if (cSecond>=60)
{
cSecond=0;
cMinute++;
if (cMinute>=60)
{
cMinute=0;
cHour++;
if (cHour>=24)
{
cHour=0;
}
}
}
// cSecond - roste 0..59
// cMinute - roste 0..59
// cHour - roste 0..24
}
Spíše jsem myslel něco takového:
Kód: Vybrat vše
// file: skolni_program.c
// stav: neodzkouseno
// tady jsou většinou všechny #include
// tady jsou většinou všechny typedef
typedef struct
{
unsigned char cSecond;
unsigned char cMinute;
unsigned char cHour;
} predvolba_t;
// tady jsou většinou všechny statické proměnné
unsigned char cSecond;
unsigned char cMinute;
unsigned char cHour;
predvolba_t Predvolba;
unsigned char Spinac;
// tady většinou začíná běžet kód programu
void main (void)
{
{
// init
// mimo hlavni smycku
Predvolba.cSecond = 0;
Predvolba.cMinute = 0;
Predvolba.cHour = 12; // sepne ve 12:00
Spinac = 0;
}
// loop
while(1)
{
// loop část, provádí se pořád dokola...
delay_ms(1000); // pasivni čekani 1s, použito jen 1x v celé hlavní smyčce.
//
// tady píšu kód který se provede 1x za vteřinu
//
// většina kódu je umístěna právě zde
//
cSecond++;
if (cSecond>=60)
{
cSecond=0;
cMinute++;
if (cMinute>=60)
{
cMinute=0;
cHour++;
if (cHour>=24)
{
cHour=0;
}
}
}
// cSecond - roste 0..59
// cMinute - roste 0..59
// cHour - roste 0..24
// uvnitr hlavni smycky
if ((cHour>=Predvolba.cHour)
&& (cMinute>=Predvolba.cMinute)
&& (cSecond>=Predvolba.cSecond))
{
Spinac = 0x01;
}
if (Spinac!=0)
{
PORTB |= 0x01; // nahodi PORTB(0)
}
else
{
PORTB &= ~0x01; // shodi PORTB(0)
}
} // while
} // main
// EOF
Nahozeni a shosení bitu portu B musíš udělat samostatně podle svého kompilátoru[/code]