Digitrónové hodiny s rádiom

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 21 Okt 2014, 21:49

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
0

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa Kado » 21 Okt 2014, 22:01

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

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 22 Okt 2014, 07:45

Ano to pamätanie času by bolo dobré.
0

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa Kado » 22 Okt 2014, 19:15

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

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 24 Dec 2014, 12:09

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

}
Prílohy
i2c.png
0

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 25 Dec 2014, 21:05

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

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa dan21 » 25 Dec 2014, 21:17

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

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 25 Dec 2014, 21:25

Á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.
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa dan21 » 25 Dec 2014, 21:27

No citaj ten datasheet od strany 10 :-)
0

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 25 Dec 2014, 22:26

No čítam ale aj tak som z toho trochu debil. Spravil som toto a nejde :D

#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

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
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

Príspevok od používateľa Tribec Zacks » 25 Dec 2014, 22:55

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
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 25 Dec 2014, 23:44

Díky ide to moc si mi pomohol :)
0

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 26 Dec 2014, 12:25

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;
}
Prílohy
nenašiel som digitrón tak som použil ledky
nenašiel som digitrón tak som použil ledky
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
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

Príspevok od používateľa Tribec Zacks » 27 Dec 2014, 12:13

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.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

shaft
Stály člen
Stály člen
Príspevky: 234
Dátum registrácie: 19 Mar 2013, 17:49
Bydlisko: Trnava
Vek: 28

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa shaft » 28 Dec 2014, 01:23

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

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

xpert
Stály člen
Stály člen
Príspevky: 112
Dátum registrácie: 28 Dec 2014, 01:24
Bydlisko: okres NZ

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa xpert » 28 Dec 2014, 02:07

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.
0
Naposledy upravil/-a xpert v 28 Dec 2014, 02:35, upravené celkom 1 krát.

Hinsi
Pokročilý člen
Pokročilý člen
Príspevky: 510
Dátum registrácie: 15 Sep 2014, 15:56

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa Hinsi » 28 Dec 2014, 02:33

K čemu tam potřebujete DS1307 ? Zamyslete se lépe nad využitím timeru 2 v tom AVRku.
0

xpert
Stály člen
Stály člen
Príspevky: 112
Dátum registrácie: 28 Dec 2014, 01:24
Bydlisko: okres NZ

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa xpert » 28 Dec 2014, 02:38

Jedna z poziadaviek je, aby hodiny bezali aj pri vypadku napajania.
0

Hinsi
Pokročilý člen
Pokročilý člen
Príspevky: 510
Dátum registrácie: 15 Sep 2014, 15:56

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa Hinsi » 28 Dec 2014, 02:42

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...
0

xpert
Stály člen
Stály člen
Príspevky: 112
Dátum registrácie: 28 Dec 2014, 01:24
Bydlisko: okres NZ

Re: Digitrónové hodiny s rádiom

Príspevok od používateľa xpert » 28 Dec 2014, 02:53

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
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok