Digitrónové hodiny s rádiom
Moderátori: psichac, Moderátori
Digitrónové hodiny s rádiom
Zdravím,
Plánujem postaviť tieto digitrónové hodiny http://elbastl.sweb.cz/hodiny.htm spolu s rádiom. Na rádio by som chcel použiť modul TEA5767. Chcel by som poradiť aké AVR mám použiť s tým že aj rádio aj hodiny by som riadil jedným procesorom. A rád by som tam možnosť zobrazenia frekvencie naladenej stanice na digitrónoch. Poraďte mi prosím vás nakoľko je možnosť zobrazenia frekvencie na digitrónoch reálna a čo by som na to zhruba potreboval. Ďakujem
Plánujem postaviť tieto digitrónové hodiny http://elbastl.sweb.cz/hodiny.htm spolu s rádiom. Na rádio by som chcel použiť modul TEA5767. Chcel by som poradiť aké AVR mám použiť s tým že aj rádio aj hodiny by som riadil jedným procesorom. A rád by som tam možnosť zobrazenia frekvencie naladenej stanice na digitrónoch. Poraďte mi prosím vás nakoľko je možnosť zobrazenia frekvencie na digitrónoch reálna a čo by som na to zhruba potreboval. Ďakujem
0
Re: Digitrónové hodiny s rádiom
najlepsie taky mcu, kt ma hw i2c modul, napr atmega8 ti bude urcite stacit aj na hodiny aj radio, naladena frekvencia a ine data sa priamo vycitavaju z toho FM modulu cez i2c, takze to nebude problem, len je otazka, ci si potrebujes pamatat nastaveny cas aj po vypnuti napajania /no zrejme hej/
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
Re: Digitrónové hodiny s rádiom
tak si tam este prilep obvod realneho casu, napr DS1307, ten tiez komuniukuje cez i2c
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
Re: Digitrónové hodiny s rádiom
Zdravím,
skúšal som spraviť jednoduchý program na nastavenie a prečítanie času z DS1307. Čas som chcel vypísať na port ale to nefunguje všade je log. 0. Neviete kde je problém ? V programovaní AVR som len začiatočník takže možno to bude len nejaká amatérska chyba. Ďakujem
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "i2c_master.h"
#include "lcd.h"
int main(void){
DDRD=0x0F;
unsigned char hour;
// inicializacia i2c rozhrania
i2c_init();
i2c_start(0x02,I2C_WRITE); //zapis hodín
i2c_write(0x04);
i2c_stop();
i2c_start(0x02,I2C_READ);//hodiny
hour = i2c_read_nAck();
i2c_stop();
PORTD=hour; //výpis hodín na port
}
skúšal som spraviť jednoduchý program na nastavenie a prečítanie času z DS1307. Čas som chcel vypísať na port ale to nefunguje všade je log. 0. Neviete kde je problém ? V programovaní AVR som len začiatočník takže možno to bude len nejaká amatérska chyba. Ďakujem
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "i2c_master.h"
#include "lcd.h"
int main(void){
DDRD=0x0F;
unsigned char hour;
// inicializacia i2c rozhrania
i2c_init();
i2c_start(0x02,I2C_WRITE); //zapis hodín
i2c_write(0x04);
i2c_stop();
i2c_start(0x02,I2C_READ);//hodiny
hour = i2c_read_nAck();
i2c_stop();
PORTD=hour; //výpis hodín na port
}
0
Re: Digitrónové hodiny s rádiom
Mohol by mi niekto vysvetliť ako je to presne s tými adresami ? V datasheete DS1307 sú vypísané adresy na ktorých nájdem sekundy, minúty.... (00h....06h). Ale nemusím ešte pred čítaním určiť adresu celého zariadenia (DS1307) z ktorého chcem čítať ?
0
Re: Digitrónové hodiny s rádiom
No podla DS1307 datasheetu ma tento obvod slave adresu 1101000 (http://datasheets.maximintegrated.com/en/ds/DS1307.pdf - strana 12) a ked pozriem do tvojho kodu tak (predpokladam) ze v prikaze i2c_start je prvy parameter adresa zariadenia.
0
Re: Digitrónové hodiny s rádiom
Áno prvý parameter má byť adresa zariadenia ja som tam dal už adresu registra hodín. Čiže malo by to byť
i2c_start(0xD0,I2C_WRITE);
ale neviem kam mám dať adresu registra na hodiny keď do i2c_write(); majú ísť už konkrétne dáta.
i2c_start(0xD0,I2C_WRITE);
ale neviem kam mám dať adresu registra na hodiny keď do i2c_write(); majú ísť už konkrétne dáta.
0
Re: Digitrónové hodiny s rádiom
No čítam ale aj tak som z toho trochu debil. Spravil som toto a nejde
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "i2c_master.h"
int main(void){
DDRD=0xF;
unsigned char hour;
i2c_init();
i2c_start(0xD0,I2C_WRITE); //adresa DS1307
i2c_write(0x02); // adresa registra hodín
i2c_write(0x05); // dáta ktoré zapisujem
i2c_stop();
//čitanie podľa strany 13
i2c_init();
i2c_start(0xD0,I2C_WRITE);
i2c_write(0x02);
i2c_start(0xD0,I2C_READ);
hour=i2c_read_nAck();
i2c_stop();
PORTD=hour;
}
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "i2c_master.h"
int main(void){
DDRD=0xF;
unsigned char hour;
i2c_init();
i2c_start(0xD0,I2C_WRITE); //adresa DS1307
i2c_write(0x02); // adresa registra hodín
i2c_write(0x05); // dáta ktoré zapisujem
i2c_stop();
//čitanie podľa strany 13
i2c_init();
i2c_start(0xD0,I2C_WRITE);
i2c_write(0x02);
i2c_start(0xD0,I2C_READ);
hour=i2c_read_nAck();
i2c_stop();
PORTD=hour;
}
0
- Tribec Zacks
- Pokročilý člen
- Príspevky: 709
- Dátum registrácie: 26 Jún 2010, 00:00
- Bydlisko: Levice / Cork IRL
- Vek: 41
- Kontaktovať používateľa:
Re: Digitrónové hodiny s rádiom
zdar shaft, mrkni na tento kus primitivneho kodu, mas tam aj komentar, ak kuknes spolu s tym timing diagram i2c bude to hned jasne
http://svetelektro.com/modules.php?name ... 21#p550924
http://svetelektro.com/modules.php?name ... 21#p550924
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
Re: Digitrónové hodiny s rádiom
Takže môj program zatiaľ vyzerá takto len neviem ako dať jednotlivé funkcie dokopy aby to fungovalo a čo dať do cyklov. Ten výpis na digitróny tiež neviem či je správne. Vedeli by ste nejako poradiť ?
Kód: Vybrať všetko
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_SCL 100000
#define I2C_READ 1
#define I2C_WRITE 0
unsigned char hour,min;
//.....................................................//
//...................I2C komunikacia...................//
//.....................................................//
void I2C_START (unsigned char address, unsigned char dir)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
TWDR = address | dir;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
}
void I2C_STOP()
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void i2c_write(unsigned char data)
{
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
}
unsigned char i2c_read_nAck()
{
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
return TWDR;
}
unsigned char i2c_read_Ack()
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
while(!(TWCR & (1<<TWINT))){}
return TWDR;
}
//..............................................//
//..............získavanie času.................//
//..............................................//
void time ()
{
while (1)
{
// minúty
I2C_START(0xD0,I2C_WRITE);
i2c_write(0x01);
I2C_START(0xD0,I2C_READ);
min=i2c_read_nAck();
I2C_STOP();
//hodiny
I2C_START(0xD0,I2C_WRITE);
i2c_write(0x02);
I2C_START(0xD0,I2C_READ);
hour=i2c_read_nAck();
I2C_STOP();
_delay_ms(1000);
}
}
//...........................................//
//...............nastavenie času.............//
//...........................................//
void settime ()
{
while (1)
{
if (PIND & (1<<PD4) )
{
I2C_START(0xD0,I2C_WRITE); //ak stalčím tlačitko pričítajú sa minúty
i2c_write(0x01);
i2c_write(++min);
I2C_STOP();
}
if (PIND & (1<<PD5))
{
I2C_START(0xD0,I2C_WRITE); // ak stlačím tlačitko pričítajú sa hodiny
i2c_write(0x02);
i2c_write(++hour);
I2C_STOP();
}
}
}
//...........................................//
//..........výpis času na digitróny..........//
//...........................................//
void showtime ()
{
while (1)
{
PORTB=0x01; //anóda desiatok hodín
PORTD=(hour>>5);
_delay_ms(10);
PORTB=0x02; //anóda hodín
PORTD=hour;
_delay_ms(10);
PORTB=0b00000100; //anóda desiatok minút
PORTD=(min>>4);
_delay_ms(10);
PORTB=0b00001000; //anóda minút
PORTD=min;
_delay_ms(10);
}
}
//........................................//
//.......hlavný program nedokončený.......//
//........................................//
int main(){
//frekvencia SCL
TWSR = 0;
TWBR = ((F_CPU/F_SCL)-16)/2;
DDRD=0x0F;
DDRB=0x0F;
time();
return 0;
}
0
- Tribec Zacks
- Pokročilý člen
- Príspevky: 709
- Dátum registrácie: 26 Jún 2010, 00:00
- Bydlisko: Levice / Cork IRL
- Vek: 41
- Kontaktovať používateľa:
Re: Digitrónové hodiny s rádiom
no parada, este ti to teda dokoncit
ledky podla tvojej schemy rozblikas nasledovne:
na resete daj hlavne pullup na Vcc, tlacitka prehod na PD0-1, 74141 prehod na PD4-7, sout z rtc prived na int0,
rtc nakonfiguruj aby generoval 1hz square wave, v isr na int0/main loop, podla toho spravis pocitadlo na sekundy, minuty a hodiny. urobis dalsie isr na timer, povedzme 1/60s v ktorom budes striedavo selektovat minuty,desiatky,hodiny,desiatky a podla toho aj synchronizujes to co pojde na vystup / vstup 74141.
hadam napovie ako na podobne zapojenie
digitrony ale niesu ledky a toto asi nebude najstastnejsi sposob ako ich ovladat, najskor budes potrebovat nejaky buffer co ti bude drzat rovnaku hodnotu na vystpe pre digitron a obnovi sa az ked sa zmeni cislo, nie ako to co som ti opisal, to sa obnovuje 60x za sekundu.
ledky podla tvojej schemy rozblikas nasledovne:
na resete daj hlavne pullup na Vcc, tlacitka prehod na PD0-1, 74141 prehod na PD4-7, sout z rtc prived na int0,
rtc nakonfiguruj aby generoval 1hz square wave, v isr na int0/main loop, podla toho spravis pocitadlo na sekundy, minuty a hodiny. urobis dalsie isr na timer, povedzme 1/60s v ktorom budes striedavo selektovat minuty,desiatky,hodiny,desiatky a podla toho aj synchronizujes to co pojde na vystup / vstup 74141.
hadam napovie ako na podobne zapojenie
digitrony ale niesu ledky a toto asi nebude najstastnejsi sposob ako ich ovladat, najskor budes potrebovat nejaky buffer co ti bude drzat rovnaku hodnotu na vystpe pre digitron a obnovi sa az ked sa zmeni cislo, nie ako to co som ti opisal, to sa obnovuje 60x za sekundu.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
Re: Digitrónové hodiny s rádiom
No najnovšie som to spravil takto :
1. Do modulu rádia sa zapíše predvolená frekvencia
2. Stále beží nekonečný cyklus ktorý zobrazuje čas na digitónoch (tie delay asi z toho cyklu vyhodím ešte neviem)
3. Prerušenie od TIMER1 každých 8 sekúnd číta čas z RTC
4. Prerušenie od TIMER0 každú 0,5 sekundu kontroluje či nie sú stlačené tlačidlá s ktorými pripočítam hodiny alebo minúty.
- ladenie frakvencie ešte nemám premyslené či cez enkoder alebo potenciometer (A/D prevodnik)
- mám problém v simulácií mi pri pričítaní času napr. keď mám 19 minút a pričítam minútu tak mi nenastaví 20 minút ale 110 alebo keď mám 9 hodín a pričítam tak mi neskočí 10 ale 010. Neviem či to má ten DS1307 s skutočnosti v sebe definované že pri 19 skočí na 20 a nie na 110 alebo to mám napísať do programu
1. Do modulu rádia sa zapíše predvolená frekvencia
2. Stále beží nekonečný cyklus ktorý zobrazuje čas na digitónoch (tie delay asi z toho cyklu vyhodím ešte neviem)
3. Prerušenie od TIMER1 každých 8 sekúnd číta čas z RTC
4. Prerušenie od TIMER0 každú 0,5 sekundu kontroluje či nie sú stlačené tlačidlá s ktorými pripočítam hodiny alebo minúty.
- ladenie frakvencie ešte nemám premyslené či cez enkoder alebo potenciometer (A/D prevodnik)
- mám problém v simulácií mi pri pričítaní času napr. keď mám 19 minút a pričítam minútu tak mi nenastaví 20 minút ale 110 alebo keď mám 9 hodín a pričítam tak mi neskočí 10 ale 010. Neviem či to má ten DS1307 s skutočnosti v sebe definované že pri 19 skočí na 20 a nie na 110 alebo to mám napísať do programu
Kód: Vybrať všetko
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_SCL 100000
#define I2C_READ 1
#define I2C_WRITE 0
volatile short freqshow;
volatile unsigned char i, hour,min, adc;
unsigned char freqH, freqL, freq14bit, bajt1, bajt2, bajt3, bajt4, bajt5;
float freq;
//.....................................................//
//...................I2C komunikacia...................//
//.....................................................//
void I2C_START (unsigned char address, unsigned char dir)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
TWDR = address | dir;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
}
void I2C_STOP()
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void i2c_write(unsigned char data)
{
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
}
unsigned char i2c_read_nAck()
{
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))){}
return TWDR;
}
unsigned char i2c_read_Ack()
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
while(!(TWCR & (1<<TWINT))){}
return TWDR;
}
//...........................................//
//..........výpis času na digitróny..........//
//...........................................//
void showtime ()
{
while (1)
{
PORTB=0x01; //anóda desiatok hodín
PORTD=(hour>>4);
_delay_ms(50);
PORTB=0x02; //anóda hodín
PORTD=hour;
_delay_ms(50);
PORTB=0b00000100; //anóda desiatok minút
PORTD=(min>>4);
_delay_ms(50);
PORTB=0b00001000; //anóda minút
PORTD=min;
_delay_ms(50);
}
}
//..........................................//
//...................rádio..................//
//..........................................//
void radio()
{
freq=96.6;
freq14bit = 4 * (freq * 1000000 + 225000)/32768;
freqH = freq14bit / 256 ;
freqL = freq14bit & 0xFF;
bajt1 = freqH;
bajt2 = freqL;
bajt3 = 0b10110000;
bajt4 = 0b00010000;
bajt5 = 0b00000000;
I2C_START(0x60,I2C_WRITE);
i2c_write(bajt1);
i2c_write(bajt2);
i2c_write(bajt3);
i2c_write(bajt4);
i2c_write(bajt5);
I2C_STOP();
}
//.......................................//
//......čítanie času prerušenie..........//
//.......................................//
ISR(TIMER1_OVF_vect)
{
//minuty
I2C_START(0xD0,I2C_WRITE);
i2c_write(0x01);
I2C_START(0xD0,I2C_READ);
min=i2c_read_nAck();
I2C_STOP();
//hodiny
I2C_START(0xD0,I2C_WRITE);
i2c_write(0x02);
I2C_START(0xD0,I2C_READ);
hour=i2c_read_nAck();
I2C_STOP();
}
//..........................................//
//........nastavenie času prerušnie.........//
//..........................................//
ISR(TIMER0_OVF_vect)
{
if (i==15)
{
if ((PINC & (1<<PC0))==0)
{
I2C_START(0xD0,I2C_WRITE); //ak stalčím tlačitko pričítajú sa minúty
i2c_write(0x01);
i2c_write(++min);
I2C_STOP();
}
if (((PINC & (1<<PC1))==0))
{
I2C_START(0xD0,I2C_WRITE); // ak stlačím tlačitko pričítajú sa hodiny
i2c_write(0x02);
i2c_write(++hour);
I2C_STOP();
}
i=0;
}
i++;
}
//..........................................//
//..............hlavný program..............//
//..........................................//
int main(){
//frekvencia SCL
TWSR = 0;
TWBR = ((F_CPU/F_SCL)-16)/2;
radio();
DDRC&=~(1<<PC0)|(1<<PC1); //vstupy tlačítok
PORTC|=(1<<PC0)|(1<<PC1); //vstupy tlač. na log.1
DDRD=0x0F; //katódy
DDRB=0x0F; //anódy
// TIMER1 čítanie času
TCCR1B |= (1 << CS12)|(1<<CS10); //preddelička 1024
TIMSK |= (1 << TOIE1); // prerušenie pri pretečení TCNT1
//TIMER0 nastavenie času
TCCR0|=(1<<CS02)|(1<<CS00); //predelička 1024
TIMSK|=(1<<TOIE0); // prerušenie pri pretečení TCNT0
sei(); // povol globalne prerušenia
showtime();
while(1);// nekonečná slučka
return 0;
}
0
Re: Digitrónové hodiny s rádiom
2. Ten delay vo funkcii showtime () kludne zatial nechaj.
3. Sprav to ako ti poradil Tribec s vyuzitim externeho prerusenia a 1hz square wave, usetris tym Timer1.
4. Timer0 zrychli a v preruseni mozes aj multiplexovat anody... Bod 2. a funkcia showtime() tym padom vypadne, z hladiska programu to ale bude "cistejsie". Tlacita ti pri takto pomalom skenovani niekedy nemusia reagovat na kratke stlacenia a casom ta to bude otravovat. Ak pouzijes rychlejsi Timer0, mozno budes musiet mysliet aj na debounce tlacitok, lebo na nich nemas kondiky.
- tie nastavenia z 19 na 20 minut som nepochopil, asi zle vyhodnocujes udaje z registrov alebo do nich zle zapisujes. Teraz sa mi v tom nechce sťúrať, no DS1307 funguje spravne, z 19 minut ide na 20, z 23:59 ide na 00:00 a taktiez robi korekciu pre priestupny rok. Posuvanie casu o hodinu do predu a o hodinu do zadu si musis poriesit sam. Nasiel som na to na internete peknu funkciu od jedneho cecha, ak bude zaujem mozem ju niekde vyhrabat...
//EDIT: BTW pri prepinani anod najskor vymaz co mas na PORTD, az potom zmen anodu na PORTB a nasledne zapis hodnotu na PORTD. Inak ti budu desiatky hodin presvicovat do hodin, hodiny do desiatok minut, a tie zas do minut.
3. Sprav to ako ti poradil Tribec s vyuzitim externeho prerusenia a 1hz square wave, usetris tym Timer1.
4. Timer0 zrychli a v preruseni mozes aj multiplexovat anody... Bod 2. a funkcia showtime() tym padom vypadne, z hladiska programu to ale bude "cistejsie". Tlacita ti pri takto pomalom skenovani niekedy nemusia reagovat na kratke stlacenia a casom ta to bude otravovat. Ak pouzijes rychlejsi Timer0, mozno budes musiet mysliet aj na debounce tlacitok, lebo na nich nemas kondiky.
- tie nastavenia z 19 na 20 minut som nepochopil, asi zle vyhodnocujes udaje z registrov alebo do nich zle zapisujes. Teraz sa mi v tom nechce sťúrať, no DS1307 funguje spravne, z 19 minut ide na 20, z 23:59 ide na 00:00 a taktiez robi korekciu pre priestupny rok. Posuvanie casu o hodinu do predu a o hodinu do zadu si musis poriesit sam. Nasiel som na to na internete peknu funkciu od jedneho cecha, ak bude zaujem mozem ju niekde vyhrabat...
//EDIT: BTW pri prepinani anod najskor vymaz co mas na PORTD, az potom zmen anodu na PORTB a nasledne zapis hodnotu na PORTD. Inak ti budu desiatky hodin presvicovat do hodin, hodiny do desiatok minut, a tie zas do minut.
0
Naposledy upravil/-a xpert v 28 Dec 2014, 02:35, upravené celkom 1 krát.
Re: Digitrónové hodiny s rádiom
K čemu tam potřebujete DS1307 ? Zamyslete se lépe nad využitím timeru 2 v tom AVRku.
0
Re: Digitrónové hodiny s rádiom
Jedna z poziadaviek je, aby hodiny bezali aj pri vypadku napajania.
0
Re: Digitrónové hodiny s rádiom
A procesor neumí běhat z baterky s užitím lowpower režimů? Nebo ty jsou tam podle tebe k čemu?
//Zkusím v pondělí vzít AVRko na power analyser, změříme si, co to žere...
//Zkusím v pondělí vzít AVRko na power analyser, změříme si, co to žere...
0
Re: Digitrónové hodiny s rádiom
Da sa. Len si treba polozit otazku ci sa tomu oplati venovat cas a peniaze, ked DS1307 so vsetkym stoji na EBAY 0.75€ a DS3231 s teplotne kompenzovanym oscilatorom cca 1€
// nemusis nic analyzovat, je to pouzitelne, to ale neznamena ze aj vyhodnejsie/lepsie. Orientacne hodnoty su aj v DS
// nemusis nic analyzovat, je to pouzitelne, to ale neznamena ze aj vyhodnejsie/lepsie. Orientacne hodnoty su aj v DS
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 34 Odpovedí
- 2987 Zobrazení
-
Posledný príspevok od používateľa pablox