Kmitání obvodu

Problémy s návrhem, konstrukcí, zapojením, realizací elektronických zařízení

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

Kmitání obvodu

#1 Příspěvek od Nikeed12 »

Zdravím, navrhl jsem si takový jednoduchý obvod s AVRkem a mám problém s tím, že když naprogramuji procesor aby reagoval na stisk tlačítka (JUM1, JUM2) tak vystupy které chci pomocí tlačítka sepnou začnou kmitat (T1-T3). Přitom si myslím že jsem udělal vše proto aby se obvod nerozkmital (SMD kondíky 100 nF na vstupu i výstupu 7805 a nejblíže k napájení AVRka a 2 elektrolyty na vstupu 220uF a výstupu 100uF 7805ky).

Když se rukou přiblížím k obvodu tak se mění frekvence kmitání výstupu a když prstem jak kdyby zkratuji vstup napájení (svorkovnice K1) tak kmitání přestane, zkoušel jsem na svorkovnici dát kondík 1000uF ale problém přetrvává.
Nevíte kde by mohl být problém ?
(jinak součástky které mají nezapojené vývody jsou spojené polygonem k zemi)
Přílohy
Výstřižek.PNG
(73.32 KiB) Staženo 87 x

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#2 Příspěvek od ZdenekHQ »

Hledat na DPS bez schematu zapojení je opravdu zážitek.

Přidej na 5V nějakou zátěž, aby přes stabilizátor teklo alespoň 5mA (třeba ledka plus odpor, nějakej náznak tam vidím)

Definuj rozepnutý stav tlačítek nějakým odporem.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

#3 Příspěvek od Nikeed12 »

na tom zapojení nic není, je to v podstatě jen attiny25 s posílenými 3 vystupy pomocí tranzistoru a 2 tlačítka....
Jinak jsem našel problém v tom, že nějak nefunguje interní pull-up rezistor přitom v programu ho mám zaplý, s externím pull-upem to funguje...

DDRB = 0b111100; //PB3,4,7 vystupní, PB0,1 vstupní
PORTB = 0b000011; // pull-up na PB0,1

jinak zde je schéma, já vím je to prasácky nakreslené, ale to není tématem diskutování :)
Přílohy
Výstřižek1.PNG
(35.14 KiB) Staženo 127 x

Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 02:00
Bydliště: Praha

#4 Příspěvek od WLAB »

Tipnul bych si, ze kdyz ridis ty tranzitory, prepisujes na portu B i ty spodni bity, co ridi (v rezimu vstupu) pull-upy a vypinas je....
de omnibus dubitandum est

Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

#5 Příspěvek od Nikeed12 »

Typl sis správně, díky :) je to lepší , ale stejně ta ledka trošičku svítí a když prstem zkratuji piny tlačítka tak se rozsvěcuje více :( , ještě nejaké nápady nebo budu muset použít externí pull-up ? (čemuž bych se rád vyhnul)

if (bit_is_clear(PINB,0))
{
PORTB=0b001011;
}
else
{
PORTB=0;
}

jinak na bázi tranzistoru je odpor o hodnotě 4K7

Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 02:00
Bydliště: Praha

#6 Příspěvek od WLAB »

Ledka? Ta co je ve schematu? Ta by snad mela svitit furt, ne? Leda by odpor u ni byl nejak moc veliky a prilozenim prstu se snizil....

Co ma delat ten usek programu? Furt tam vypinas pull-upy (PORTB=0).
PortB se neda ovladat po bitech? Pak je jedina rozumna vec delat read-modify-write operace...

tj. neco ve smyslu>


PORTB = (PORTB & ~mask) | mask;

kde mask je promenna s bitovou maskou bitu, ktery se ma zapnout, nebo 0 pokud se zapnout nema.
de omnibus dubitandum est

Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

#7 Příspěvek od Nikeed12 »

No jasné, já jsem ale kus cipa :D když byl vystup seplý tak jsem měl pull-up zaplé, ale jak jsem je vypínal tak jsem vypl i pull-up, díky moc :) už to funguje jak má.

jinak LEDku jsem měl zapojenou na výstup tranzistoru, to jsem nezmínil omlouvám se :oops:

Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

#8 Příspěvek od Nikeed12 »

Ještě bych potřeboval (pro vás jistě drobnost) a abych nemusel zakládat nové téma tak to napíšu sem.

Mám proměnnou int a a potřeboval bych,aby se ta hodnota uložila do eeprom paměni a po vypnutí a zapnutí napájení opět načetla do proměnné , hledal jsem ale vubec tomu nerozumím tak kdyby byl někdo ochotný mi pomoci tak bych mu byl vděčný :oops:

(MCU attiny25)

V datasheetu jsem našel tohle, ale nevím jak to použít a jestli to vůbec je to co potřebuji:

Kód: Vybrat vše

unsigned char EEPROM_read(unsigned char ucAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE))
;
/* Set up address register */
EEAR = ucAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}

Kód: Vybrat vše

void EEPROM_write(unsigned char ucAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE))
;
/* Set Programming mode */
EECR = (0<<EEPM1)|(0<<EEPM0);
/* Set up address and data registers */
EEAR = ucAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}

Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 02:00
Bydliště: Praha

#9 Příspěvek od WLAB »

Pouzit by to melo jit. Moc se mi ale nelibi, ze zapisova funkce zapisuje bez toho, aby se podivala jestli uz tam ta hodnota nahodou neni zapsana.... Akorat ten int musis ulozit jako dva chary...

Pokud bys pouzival treba codevision kompilator, tak ten ma pametovou tridu eeprom (coz je asi jedine jeho pozitivum) a nemusi se nic resit. zalohovaci promenna se tam vytvori nejak takto:
eeprom int backup_xyz;


Abys do te eepromky nezapisoval zbytecne, musis nejak vhodne detekovat blizici se vypnuti a data zapsat.
de omnibus dubitandum est

Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

#10 Příspěvek od Nikeed12 »

už si tu s tím 4 hodiny hraju ale bez úspěchu, splácal jsem tohle, nejspíše to je úplná blbost, ale nemůžu najít žádný návod kterému bych rozuměl...
Jak tu proměnnou int uložím jako 2x char ? zjistil jsem že tu proměnou mužu mít i v charu, takže tím by se to zjednodušilo pokud se nemýlím.
jinak používám winavr překladač.

Potřebuji tu promněnou zapisovat při každé její zmněně, takže jsem to přiřadil k tlačítku, které bude zmáčknuto max 3x za den.
Vím že to je hodně lidem proti srtsi, ale hodně by mi pomohlo kdyby mi někdo ten kod napsal, protože ze slovního popisu to asi nikdy nedám dohromady :?

Kód: Vybrat vše

int main()
{ 

 DDRB =  0b111100; 
 PORTB = 0b000011;
 
char a=0;
char k;

 k= EEPROM_read(0);
 if (k!=0xff)
 {
  EEPROM_write(a,a);
 }

 for(;;)
 { 

  if (bit_is_clear(PINB,0))
   {
     EEPROM_write(a,a);
   }
}
}

Uživatelský avatar
stanleyv
Příspěvky: 123
Registrován: 21 led 2007, 01:00
Bydliště: Trnava

#11 Příspěvek od stanleyv »

A kde sa ti mení to a, lebo inak nevidím zmysel tam stále do EPROMky zapisovať 0.....

EDIT: Ak by sa ti to a menilo niekde v kóde, ktorý tu nie je, tak potom nemôžeš mať aj adresu aj dáta ako a, pretože ti to bude ukladať stále na iné miesto v EPROMke. Adresu daj buď surovo 0, alebo si zvoľ premennú (napr: eadr=0 )a uprav zápis na EEPROM_write(eadr,a);

Uživatelský avatar
Nikeed12
Příspěvky: 45
Registrován: 11 zář 2014, 02:00

#12 Příspěvek od Nikeed12 »

Mám už nějaký program kde se promněná a mění, jen mi přišlo zbytečné zde vypisovat celý program, když to co mám napsané funguje podle mých představ, jediné co potřebuji je ten zápis a čtení z EEPROM.
S tou adresou jsem to taky zkoušel, vyzkoušel jsem snad uplně všechno. Pro uplnost zde dávám program co zatím mám, i když si myslím že to není duležité k tomu v čem potřebuji poradit :)
¨
Jinak podle mě je problém s tím, že nevím jak poprvé do eeprom zapsat tu promněnou, respektive jak při programování flash paměti naprogramuji i eeprom tak, aby proměnná a=0 ?

Kód: Vybrat vše

#define F_CPU 1000000UL
#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/interrupt.h>
#include <avr/eeprom.h>

#define barva1 0b000111 //r
#define barva2 0b001011 //g
#define barva3 0b010011 //b

#define barva4 0b010111 //r+b
#define barva5 0b011011 //b+g
#define barva6 0b001111 //g+r
#define barva7 0b011111 //white
#define cas 250


void EEPROM_write(unsigned char ucAddress, unsigned char ucData) 
{ 
/* Wait for completion of previous write */ 
while(EECR & (1<<EEPE)) 
; 
/* Set Programming mode */ 
EECR = (0<<EEPM1)|(0<<EEPM0); 
/* Set up address and data registers */ 
EEAR = ucAddress; 
EEDR = ucData; 
/* Write logical one to EEMPE */ 
EECR |= (1<<EEMPE); 
/* Start eeprom write by setting EEPE */ 
EECR |= (1<<EEPE); 
}




unsigned char EEPROM_read(unsigned char ucAddress) 
{ 
/* Wait for completion of previous write */ 
while(EECR & (1<<EEPE)) 
; 
/* Set up address register */ 
EEAR = ucAddress; 
/* Start eeprom read by writing EERE */ 
EECR |= (1<<EERE); 
/* Return data from data register */ 
return EEDR; 
} 



void red (void)
{
PORTB=barva1;

 }

 void green(void)
{
PORTB=barva2;

 }

  void blue(void)
{
PORTB=barva3;

 }
void purple (void)
{
PORTB=barva4;

 }

 void yellow (void)
{
PORTB=barva5;

 }

  void cyan(void)
{
PORTB=barva6;

 }
 void white (void)
{
PORTB=barva7;

 }


int main()
{ 

 DDRB =  0b111100; 
 PORTB = 0b000011;
 
char a=0;
int k;


 k= EEPROM_read(0);

 if (k==0xff)
 {
EEPROM_write(0,a);
 }

 for(;;)
 { 

if (bit_is_clear(PINB,0))
{

EEPROM_write(0,a);

if (a==0)
  {
   red();
   a=1;
   _delay_ms(cas);
  }

 else  if (a==1)
  {
   green();
   a=2;
   _delay_ms(cas);
  }

  else if (a==2)
  {
   blue();
   a=3;
   _delay_ms(cas);
  }

    else if (a==3)
  {
   purple();
   a=4;
   _delay_ms(cas);
  }

     else if (a==4)
  {
   yellow();
   a=5;
   _delay_ms(cas);
  }

     else if (a==5)
  {
   cyan();
   a=6;
   _delay_ms(cas);
  }

     else if (a==6)
  {
   white();
   a=7;
   _delay_ms(cas);
  }

     else if (a==7)
  {
   PORTB=0b000011;
   a=0;
   _delay_ms(cas);
  }
  
  
}

}
}

Odpovědět

Zpět na „Řešení problémů s různými konstrukcemi“