Časový spínač ATMEGA 8

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
radoslavsky
Příspěvky: 3
Registrován: 10 bře 2014, 00:00

Časový spínač ATMEGA 8

#1 Příspěvek 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();
}
}
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#2 Příspěvek 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
}
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#3 Příspěvek 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)
  }
}
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#4 Příspěvek 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
    //
  }
}
Uživatelský avatar
radoslavsky
Příspěvky: 3
Registrován: 10 bře 2014, 00:00

#5 Příspěvek od radoslavsky »

Děkuji moc, teď už to nejspíš jen něják pospojovat dohromady :( :D
Uživatelský avatar
radoslavsky
Příspěvky: 3
Registrován: 10 bře 2014, 00:00

#6 Příspěvek 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
}


:( :(
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#7 Příspěvek 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]
Uživatelský avatar
Standa33
Příspěvky: 298
Registrován: 07 lis 2009, 00:00

#8 Příspěvek od Standa33 »

Zkusil jsem něco naprogramovat, není to sice v micro C, ale mělo by to jít upravit.
Přílohy
Timer.zip
(104.52 KiB) Staženo 147 x
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“