Kmitání obvodu
Moderátor: Moderátoři
Kmitání obvodu
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 148 x
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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.
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[?]
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 207 x
if (bit_is_clear(PINB,0))
{
PORTB=0b001011;
}
else
{
PORTB=0;
}
jinak na bázi tranzistoru je odpor o hodnotě 4K7
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.
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ý
(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);
}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.
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);
}
}
}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);
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);
}
}
}
}