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í 

Atmega8 - časem řízené přepínání pinů
Jdi na stránku 1, 2  Další
 
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
bastlir40



Založen: Aug 27, 2010
Příspěvky: 463
Bydliště: Příbram

PříspěvekZaslal: út duben 15 2014, 14:27    Předmět: Atmega8 - časem řízené přepínání pinů Citovat

Zdravím. Mohl by mi prosím Vás někdo poradit, jak upravím v tomto programu : http://www.daqq.eu/?p=283 změnu logiky na DDRB piny PB1, PB2 a PB3 tak, aby se po čtyřech hodinách měnil jejich stav z 11111101 na 11111011 a pak 11110111 ? Potřebuji aby tento stav se takto pravidelně měnil.
Předem děkuji za každou pomoc a ochotu.

_________________
Zdraví vás Mirek

www.mojeelektro.xf.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út duben 15 2014, 15:22    Předmět: Citovat

V tom programu (i zapojení) je PORTB jako vstupní. Asi nerozumím dotazu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bastlir40



Založen: Aug 27, 2010
Příspěvky: 463
Bydliště: Příbram

PříspěvekZaslal: út duben 15 2014, 15:59    Předmět: Citovat

Já mám program upravený tak, že PORTB = 0b11110001; a DDRB potřebuji měnit hodnoty na PIN1 až PIN3 na 011, 101 a 110 po 4 hodinách. Spínám s nimi tranzistory PNP
_________________
Zdraví vás Mirek

www.mojeelektro.xf.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nekmil



Založen: Mar 06, 2005
Příspěvky: 787
Bydliště: Havířov

PříspěvekZaslal: út duben 15 2014, 17:33    Předmět: Citovat

DDRB (Data_Direction_Register_B) slouží k nastavování směru portu nikoliv k posílání nějakých hodnot na piny.
V "hrůzostrašném" jazyku "C" Ti neporadím, jsou tu jiní. Very Happy

DDRB=b00000000 - všechny piny portu B nastaveny jako vstupy
DDRB=b11111111 - všechny piny portu B nastaveny jako výstupy

podle schématu máš na PB3 tlačítko tak tam "nemůžeš" nic posílat


Naposledy upravil nekmil dne út duben 15 2014, 17:59, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
CAMaFo



Založen: Jan 07, 2013
Příspěvky: 51

PříspěvekZaslal: út duben 15 2014, 17:36    Předmět: Citovat

Mirku,řešení bude několik.První co mne napadá je,že bych si zvolil globállní proměnnou typu byte,kterou bych při změně hodin inkrementoval (od 0 do 2).Následně bych podle tý proměnný natavoval to co je třeba.Až by byla proměnná 2 (0,1,2) a mělo dojít k inkrementaci,tak bych ji vynuloval a tak pořád dokola.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bastlir40



Založen: Aug 27, 2010
Příspěvky: 463
Bydliště: Příbram

PříspěvekZaslal: út duben 15 2014, 18:19    Předmět: Citovat

Zde je celé schéma s programem:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <stdio.h>

#define _s_A 0
#define _s_B 1
#define _s_C 2
#define _s_D 3
#define _s_E 4
#define _s_F 5
#define _s_G 6
#define _s_dot 7

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_D) | _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;
}

volatile unsigned char prescale=0;
volatile unsigned char sec=0;
volatile unsigned char min_1=0;
volatile unsigned char min_10=0;
volatile unsigned char hour_1=0;
volatile unsigned char hour_10=0;
volatile unsigned char show_t=0;

ISR(TIMER1_OVF_vect)
{
if(++prescale == 255){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 = 0xFB;
PORTD = (segs[min_1]);
break;
case 1: //show 10 minutes
PORTC = 0xF7;
PORTD = (segs[min_10]);
break;
case 2: //show hours
PORTC = 0xEF;
PORTD = (segs[hour_1]) |_BV(_s_dot);
break;
case 3: //show 10hours
PORTC = 0xDF;
PORTD = (segs[hour_10]);
break;
default:
show_t = 0;
break;
}
return;
}

#define B1() (bit_is_clear(PINB,4))
#define B2() (bit_is_clear(PINB,5))
#define B_WAIT 300

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

int main(void)
{

TIMSK = 0x04;
TCCR1B = 0x01;

PORTD = 0xff;
DDRD = 0xff;
PORTC = 0x00;
DDRC = 0xff;
PORTB = 0xf1;
DDRB = 0xfd;


sei();
while(1)
{
if(B1())
{
wait(_ms(B_WAIT));
min_1++;
sec=0;
}
if(B2())
{
wait(_ms(B_WAIT));
hour_1++;
sec=0;
}
}
}



schema.png
 Komentář:

Stáhnout
 Soubor:  schema.png
 Velikost:  25.44 kB
 Staženo:  87 krát


_________________
Zdraví vás Mirek

www.mojeelektro.xf.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nekmil



Založen: Mar 06, 2005
Příspěvky: 787
Bydliště: Havířov

PříspěvekZaslal: út duben 15 2014, 18:38    Předmět: Citovat

DDRB = 0xfd - špatně

DDRB = 0x0E - b00001110
PB1, PB2, PB3 nastaveno jako výstupy, zbytek jako vstupy.

No a pak už můžeš posílat nějaká data na PB1, PB2, PB3.

To schéma jsi měl ukázat hned. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
bastlir40



Založen: Aug 27, 2010
Příspěvky: 463
Bydliště: Příbram

PříspěvekZaslal: út duben 15 2014, 19:08    Předmět: Citovat

NEKMIL: 0xfd je dobře. Asi si to pleteš s PIC. Tam je to opačně. Když to nastavím jak píšeš, nefunguje to.
_________________
Zdraví vás Mirek

www.mojeelektro.xf.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út duben 15 2014, 19:55    Předmět: Citovat

citace:
Já mám program upravený tak, že PORTB = 0b11110001; a DDRB potřebuji měnit hodnoty na PIN1 až PIN3 na 011, 101 a 110 po 4 hodinách.


Máš ty registry prohozené. DDRx řídí směr, PORTx pak co je na výstupu. Je-li v registru DDRx bit nastaven, je pak příslušný pin portu nastaven jako výstupní. V tvém případě to je 0b00001110, tj 0x0e. Registr PORTx v případě že je příslušný pin nastaven jako výstupní, řídí hodnotu na výstupu. V případě že je nastaven jako vstupní, pak řídí zda je na příslušný pin připojen pull-up.

Rozšíření programu při prvním "nástřelu":

kód:

...
volatile unsigned char hour_4=0;
...

if(min_10>5)
{
  min_10=0;hour_1++;
  hour_4++;
  switch(hour_4 & 0b1100)
  {
    case 0b0100:
      PORTB = 0b11111011; 
      break;
    case 0b1000:
      PORTB = 0b11110111;
      break;
    case 0b1100:
      PORTB = 0b11111101;
      hour_4 = 0;
      break;
  }
};

...

// a na zacatku pri inicilaizaci
PORTB = 0b11111101;


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



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: st duben 16 2014, 7:37    Předmět: Citovat

Ovládání výstupu pomocí registru DDRB se používá u sběrnic, např i2c.
Je to obdoba výstupu s otevřeným kolektorem.
Tady to nemá smysl. Lépe je použít normálně PORTB.

Vyložená chyba je, že piny na kterých jsou tlačítka jsou nastavené jako výstupy (DDRB 4,5 = 1).

Zkus dát do main() toto
kód:
unsigned char hour=0, hour_old=0, hour_count=0;

   hour = 10 * hour_10 + hour_1;

   if(((hour % 4) == 0) && (hour != hour_old)) // změna hodin na hodnotu dělitelnou 4
   {
      hour_count++;
      if(hour_count >= 3) {hour_count = 0;}
      hour_old = hour;

      if(hour_count == 0) DDRB = 0b11001011; //PB1=0 PB2=1 PB3=0
      if(hour_count == 1) DDRB = 0b11000111; 
      if(hour_count == 2) DDRB = 0b11001111;
   }


Edit:
Doplněno "0b" u binárních čísel.


Naposledy upravil AB1 dne st duben 16 2014, 11:54, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: st duben 16 2014, 9:14    Předmět: Citovat

citace:

if(hour_count == 0) DDRB = 11001011; //PB1=0 PB2=1 PB3=0
if(hour_count == 1) DDRB = 11000111;
if(hour_count == 2) DDRB = 11001111;


Místo DDRB má být PORTB ne ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bastlir40



Založen: Aug 27, 2010
Příspěvky: 463
Bydliště: Příbram

PříspěvekZaslal: st duben 16 2014, 11:13    Předmět: Citovat

Pánové děkuju za pomoc ale pokaždé to na mně vychrlí hromadu chyb a už opravdu nevím jak dál. Cry
_________________
Zdraví vás Mirek

www.mojeelektro.xf.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: st duben 16 2014, 11:29    Předmět: Citovat

FHonza:
Funguje to tak, že např když DDRB1=1 pak na PB1 je 0.
Když DDRB1=0, pak PB1 je odpojený.
Asi spoléhá na to, že tranzistor s bází v luftě bude zavřený.

Ptal se jak měnit DDRB každé 4 hodiny.
Předpokládám, že si to předělá sám na normální zápis do PORTB.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: st duben 16 2014, 12:05    Předmět: Citovat

AB1:
U případu DDRx = 0 pak záleží jestli je připojen pull-up. Po resetu bude pin ve stavu vysoké impedance. Ale pak je v programu někde PORTB = 0xf1, takže některé budou, některé ne. Ale určitě se shodnem že takhle se výstupy neovládají Smile (...kromě I²C)


bastlir40:
jaké myslíš chyby ? V překladu ? Čím program překládáš ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bastlir40



Založen: Aug 27, 2010
Příspěvky: 463
Bydliště: Příbram

PříspěvekZaslal: st duben 16 2014, 12:08    Předmět: Citovat

Ano, v překladu. Nemyslel jsem tím že je děláte vy ostatní. Používám AVR Studio 6.
_________________
Zdraví vás Mirek

www.mojeelektro.xf.cz
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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.24 sekund