Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Časový spínač ATMEGA 8

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
radoslavsky



Založen: Mar 10, 2014
Příspěvky: 3

PříspěvekZaslal: po březen 10 2014, 18:38    Předmět: Časový spínač ATMEGA 8 Citovat

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();
}
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po březen 10 2014, 19:14    Předmět: Citovat

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)Wink 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)Wink jen 1x krát, potom ta smyčka zabere zhruba tu jednu sekundu.

Příklad:
kód:

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
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po březen 10 2014, 19:31    Předmět: Citovat

Sepnuti uděláš porovnání aktuálního "času" oproti "předvolbě"

kód:

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)
  }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po březen 10 2014, 19:49    Předmět: Citovat

Další věc je správná struktura celého programu:

kód:
// 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
    //
  }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radoslavsky



Založen: Mar 10, 2014
Příspěvky: 3

PříspěvekZaslal: út březen 11 2014, 10:55    Předmět: Citovat

Děkuji moc, teď už to nejspíš jen něják pospojovat dohromady Sad Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
radoslavsky



Založen: Mar 10, 2014
Příspěvky: 3

PříspěvekZaslal: út březen 11 2014, 11:14    Předmět: Citovat

Pokusil jsem se to dát něják dohromady, ale pořád nevím, už jsem z toho vyřízenej.

kód:

// 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
}


Sad Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: út březen 11 2014, 20:35    Předmět: Citovat

Mrkni např. tady: http://www.sallyx.org/sally/c/c04.php
Spíše jsem myslel něco takového:

kód:

// 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]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Standa33



Založen: Nov 07, 2009
Příspěvky: 295

PříspěvekZaslal: čt březen 13 2014, 10:07    Předmět: Citovat

Zkusil jsem něco naprogramovat, není to sice v micro C, ale mělo by to jít upravit.


Timer.zip
 Komentář:

Stáhnout
 Soubor:  Timer.zip
 Velikost:  104.52 kB
 Staženo:  98 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.20 sekund