Stránka 1 z 1
Časový spínač ATMEGA 8
Napsal: 10 bře 2014, 18:38
od radoslavsky
Dobrý den, už si opravdu nevím rady, dostal jsem za úkol vytvořit Časový spínač s displejem. Už mám vše vytvořeno, vytvořený plošný spoj, součástky jsou už také zakomponované. Problém je v tom, že nejsem moc dobrý v programování. Program jsem rozběhl přes simulátor Proteus, ale už nevím jak dál. Vytvořil jsem pouze hodiny, které sice běží, ale nepřesunou se na další minutu, ale začnou od znovu ( první problém ) , druhý problém je, že až spínač dosáhne hodnoty, která je stanovena " na tvrdo" tak se má sepnout a na displeji se má zobrazit nápis " SEPNUTO" ( druhý problém ) , už nevím jak dál. Byl bych rád, kdyby se na to někdo mrknul, nabízím i finanční odměnu . JE TO PSÁNO V PROGRAMU MICRO C for AVR.
// 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();
}
}
Napsal: 10 bře 2014, 19:14
od frpr666
Koukám na tvůj kód, je třeba si uvědomit, že uC pořád zpracovává instrukce, a když ho zabrzdíš pasivním čekáním (delay_ms(1000);) tak ti v tu dobu nebude provádět tvůj kód.
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
}
Napsal: 10 bře 2014, 19:31
od frpr666
Sepnuti uděláš porovnání aktuálního "času" oproti "předvolbě"
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)
}
}
Napsal: 10 bře 2014, 19:49
od frpr666
Další věc je správná struktura celého programu:
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
//
}
}
Napsal: 11 bře 2014, 10:55
od radoslavsky
Děkuji moc, teď už to nejspíš jen něják pospojovat dohromady

Napsal: 11 bře 2014, 11:14
od radoslavsky
Pokusil jsem se to dát něják dohromady, ale pořád nevím, už jsem z toho vyřízenej.
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
}

Napsal: 11 bře 2014, 20:35
od frpr666
Mrkni např. tady:
http://www.sallyx.org/sally/c/c04.php
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]
Napsal: 13 bře 2014, 10:07
od Standa33
Zkusil jsem něco naprogramovat, není to sice v micro C, ale mělo by to jít upravit.