Operácie

Zbernica i2c: FM rádio: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
Balogh (diskusia | príspevky)
Bez shrnutí editace
 
(9 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 1: Riadok 1:


== Zbernica I2C - FM rádio ==
== Zbernica I2C - FM rádio ==
Vypracovali:
      Bc. Alexander Boráros
      Bc. Ladislav Gál


Študijný odbor:  Aplikovaná mechatronika
*Vypracovali:
Ročník:          2.Ing
:::::'''Bc. Alexander Boráros'''
:::::'''Bc. Ladislav Gál'''
 
*Študijný odbor:  '''Aplikovaná mechatronika'''
 
*Ročník:          '''2.Ing'''


== Zadanie ==
== Zadanie ==
  1. Pripojte k procesoru modul FM rádia Parallax #27984. Ovládanie modulu a zobrazovanie staníc riešte pomocou LCD modulu s tlačítkami.
 
 
==='''J. Zbernica i2c:  FM Rádio'''===
 
Pripojte k procesoru modul FM rádia Parallax #27984. Ovládanie modulu a zobrazovanie staníc
riešte pomocou LCD modulu s tlačítkami.
 
[[Obrázok:Parallax_FM_Radio.jpg]]
 
'''Literatúra:'''
* [http://www.parallax.com/StoreSearchResults/tabid/768/txtSearch/27984/List/0/SortField/4/ProductID/749/Default.aspx Parallax FM Radio Module] (product page)
* [http://www.parallax.com/portals/0/downloads/docs/prod/audiovis/27984-FM-RadioReceiver-v1.0.pdf Dokumentácia]
* [http://www.parallax.com/portals/0/downloads/docs/prod/audiovis/ParallaxFMRadio-bs2.zip Ukážkový program v Basicu]
* Mitchell Kahn: ''[http://ap.urpi.fei.stuba.sk/mmp/doc/prog_i2c.pdf Programming the i2c interface].'' Dr. Dobb's Journal, June 1992.
* [http://www.nongnu.org/avr-libc/user-manual/group__twi__demo.html Example using the two-wire interface (TWI)]. AVRlibc demo projects.
 
 
== Modul FM rádia ==
Modul Parallax #27984 používa stereo FM tuner čip RDA5807SS. Tento modul môžeme jednoduchým spôsobom ovládať pomocou mikrokontroléra a prijímať tak lokálne FM rádiové stanice. Pomocou vstavaného jack-konektora vieme jednoducho vytvoriť vlastné prenosné rádio.
 
[[Súbor:Parallax FM modul.jpg]]
 
::'''Obr. 1: Parallax #27984 FM modul'''
 
 
'''Funkcie FM modulu'''
 
*Možnosť pripojiť zariadenie k vstavenému 3.5mm minijack konektoru
*Podpora frekvencií v rozsahu 76 - 108 MHz
*Nie je nutné použitie externej antény
*Ovládanie mikrokontrolérom pomocou I2C zbernice
 
 
'''Základné špecifikácie'''
 
*Napájanie 2.7 - 5.5 DCV pri 25 mA
*Typ zbernice: I2C
*Pracovná teplota: 0 - 50 °C
*Rozmery: 1.78 x 1.65 x 0.87 cm
 
'''Rozloženie pinov modulu'''
 
[[Súbor:piny2.jpg]]
[[Súbor:piny.jpg]]
 
::::::::::'''Obr. 2: Rozloženie pinov FM modul'''
 
 
== Riešenie ==
 
Modul používa stereo tuner čip RDA5807SS. Programujeme priamo tento čip pomocou I2C rozhrania prostredníctvom pinov SDA a SCL.
Prenos začína START bitom, po ňom nasledujú príkazové a dátové bajty. Každý bajt je ukončený ACK (alebo NACK) bitom. Prenos končí STOP bitom.
Príkazový bajt obsahuje 7-bitovú adresu zariadenia a bit označujúci operáciu (Zápis/Čítanie). Bit ACK (alebo NACK) je vždy vyslaný prijímačom. Počas zápisu sú dátové bajty vyslané z mikrokontroléra a pri čítaní sú prijímané z čipu FM prijímača.
FM modul vyšle ACK bit po každom prijatom bajte, po dokončení programovania mikrokontrolér vyšle STOP bit. Podrobné časové diagramy operácie zápisu a čítania sú na obrázkoch nižšie.
 
[[Súbor:operacia zapis.jpg]]
::::::::::::::::'''Obr. 3: Časový diagram zápisu'''
 
[[Súbor:operacia citanie.jpg]]
::::::::::::::::'''Obr. 4: Časový diagram čítania'''
 
 
 
'''Schéma zapojenia modulu'''
 
[[Súbor:zapojenie.jpg]]
::::::'''Obr. 5: Schéma zapojenia modulu'''
 
 
 
Čip obsahuje 16-bitové riadiace registre. Ak chceme posielať 16-bitov cez 8-bitovú I2C zbernicu, potrebujeme dáta odoslať na dva krát. Najprv posielame horných 8 bitov, následne spodných 8 bitov.
Bity jednotlivých riadiacich registrov sme nastavili podľa rozpisu registrov v datasheete ([http://www.parallax.com/portals/0/downloads/docs/prod/audiovis/27984-FM-RadioReceiver-v1.0.pdf Parallax Fm modul datasheet]) na základe požadovaných funkcií. Príkazy na nastavenie riadiacich registrov musia nasledovať bezprostredne po sebe, pričom nie je možné nastavovať iba niektorý register, len všetky naraz.
 
Na komunikáciu cez zbernicu I2C sme použili knižnice dostupné na internete ([http://homepage.hispeed.ch/peterfleury/avr-software.html stránka AVR-Software]), v ktorej sú definované všetky potrebné funkcie.
 
 
== Zdrojový kód ==
 
Pri riešení sme potrebovali pripojiť k projektu nasledovné súbory: [[lcd.c]],[[lcd.h]],[[i2cmaster.h]],[[twimaster.c]],[[projekt_fmradio.c]]
 
Zdrojový kód programu:
<source lang="c">
#include <avr/interrupt.h> 
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <util/twi.h>
#include <stdio.h>
 
#include "lcd.h"
 
#include "i2cmaster.h"
 
FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE); // Printf pre LCD
 
 
int main(void)
{
 
unsigned int CHAN=0b11001110, DATA; // Predvolena frekvencia radio EXPRES
 
unsigned char VOLUME=0b0011,DATAH,DATAL, TUNE=0b010000, BUTTONS;
 
lcdInit4();                   
stdout = &mystdout;          // Odteraz funguje printf();             
 
 
i2c_init();
 
for(;;){
 
BUTTONS=ReadButtons();
if(BUTTONS&0x01 && VOLUME<0b1111 && !(BUTTONS&0x04) && !( BUTTONS&0x08)) // Test tlacidla 1.
{
VOLUME++;
}
 
if(BUTTONS&0x02 && VOLUME>0) //Test tlacidla 2.
{
VOLUME--;
}
 
if(BUTTONS&0x04 && CHAN<210) // Test tlacidla 3. a dosiahnutia max. frekvencie
{
if(BUTTONS&0x01&& CHAN<201)         // Uz nemoze pripocitat 1 Mhz, len menej
CHAN+=10; // Pripocita frerkvenciu po 1 MHZ-och
else
CHAN++; // Pripocita frekvenciu po 0.1 MHZ-och
TUNE=0b010000; // Poziadavka na zmenu frekvencie /1-aktivna
}
 
 
 
if(BUTTONS&0x08 && CHAN>9) // Test tlacidla 4. (znizovanie frekv.)
{
if(BUTTONS&0x01)         // Zniz. po 1 MHz
CHAN-=10;
else
CHAN--; // Zniz. po 0.1 MHz
TUNE=0b010000; // Poziadavka na zmenu frekvencie /1-aktivna
}
 
 
DATA=TUNE+CHAN*0b1000000; // Vypocet 16 bitoveho riadiaceho slova
DATAH=DATA/256; // Rozdelenie - horne bity(8)
DATAL=DATA%256; // Rozdelenie - dolne bity(8)
 
i2c_start_wait(0b00100000+I2C_WRITE);         // HLAVICKA PRENOSOVEHO RAMCA
// (nastavenie adresy a typu operacie)
        i2c_write(0b11000000);                    // Zapis data na adresu 02- Horny Byte               
        i2c_write(0b00000001);            // Zapis data na adresu 02- Dolny Byte
 
i2c_write(DATAH/*0b00110011*/);                        // Zapis data na adresu 03- Horny Byte                 
        i2c_write(DATAL/*0b10010000*/);              // Zapis data na adresu 03- Dolny Byte
i2c_write(0b00000000);                                // Zapis data na adresu 04- Horny Byte                     
        i2c_write(0b00000000);                        // Zapis data na adresu 04- Dolny Byte
i2c_write(0b10001000);                                // Zapis data na adresu 05- Horny Byte                 
        i2c_write(0b10100000+VOLUME);                        // Zapis data na adresu 05- Dolny Byte
i2c_write(0b00000100);                                // Zapis data na adresu 0A- Horny Byte                 
        i2c_write(0b00000000);                        // Zapis data na adresu 0A- Dolny Byte
i2c_write(0b00000000);                                // Zapis data na adresu 0B- Horny Byte                   
        i2c_write(0b00000000);                        // Zapis data na adresu 0B- Dolny Byte
 
i2c_stop(); // Ukoncenie prenosoveho ramca
lcdControlWrite(0x02); // Kurzor na zaciatok DISP
 
printf("%d.%dMHz  ",(870+CHAN)/10,(870+CHAN)%10); // Vypis frekvencie
lcdControlWrite(0xC0); // Druhy riadok
printf("Vol=%d  ",((int)VOLUME*100)/0b1111); // Vypis hlasitosti
 
 
  TUNE=0b000000; // Zastavenie poziadavky na zmenu frekvencie
  _delay_ms(500);}
}
</source>
 
 
 
== Popis funkcií - Zhodnotenie ==
 
[[Súbor:foto1.jpg]]
:::'''Obr. 6: Funkčné zariadenie'''
 
Zaradenie funguje nasledovne: Po pripojení napájacieho napätia sa zariadenie automaticky nastaví na frekvenciu rádia Expres (107.6 Mhz) a nastaví sa hlasitosť na úroveň 20%. Toto predvolené nastavenie je možné zmeniť v programe pri časti definovania premenných.
<source lang="c">
unsigned int CHAN=0b11001110, DATA;         // Predvolena frekvencia radio EXPRES
 
unsigned char VOLUME=0b0011,DATAH,DATAL, TUNE=0b010000, BUTTONS;
</source>
 
 
Frekvencia sa ukladá do premennej CHAN, prepočet požadovanej frekvencie je možný nasledovným spôsobom:
 
'''CHAN (DEC) = (Požadovaná frekvencia - 87) / 0.1'''
Výsledok je nutné ešte upraviť do binárneho tvaru.
 
Hlasitosť nastavujeme pomocou štyroch bitov, pričom
'''VOLUME=0b1111''' zodpovedá 100%, a '''VOLUME=0b0000''' zodpovedá 0% hlasitosti.
 
Tlačidlom 1 zvyšujeme a tlačidlom 2 znižujeme hlasitosť. Jedno stlačenie tlačidla vyvolá zmenu hlasitosti o 6-7 %.
 
Tlačidlom 3 zvyšujeme a tlačidlom 4 znižujeme frekvenciu. Jedno stlačenie tlačidla vyvolá zmenu frekvencie o 0.1 MHz. Ak chceme meniť frekvenciu rýchlejšie, kombináciou tlačidla 1 a tlačidla 3 resp. 4 docielime zmenu frekvencie o 1 MHz.
 
[[Súbor:foto2.jpg]]
::::::'''Obr. 7: Zapojenie modulu'''
 
Video o funkčnom zariadení nájdete [http://www.youtube.com/watch?v=Jxizsv4vEFI&feature=youtu.be tu].
 
 
[[Category:I2C]][[Category:DVPS]][[Category:AVR]][[Category:MMP]]

Aktuálna revízia z 13:39, 15. marec 2016

Zbernica I2C - FM rádio

  • Vypracovali:
Bc. Alexander Boráros
Bc. Ladislav Gál
  • Študijný odbor: Aplikovaná mechatronika
  • Ročník: 2.Ing

Zadanie

J. Zbernica i2c: FM Rádio

Pripojte k procesoru modul FM rádia Parallax #27984. Ovládanie modulu a zobrazovanie staníc riešte pomocou LCD modulu s tlačítkami.

Literatúra:


Modul FM rádia

Modul Parallax #27984 používa stereo FM tuner čip RDA5807SS. Tento modul môžeme jednoduchým spôsobom ovládať pomocou mikrokontroléra a prijímať tak lokálne FM rádiové stanice. Pomocou vstavaného jack-konektora vieme jednoducho vytvoriť vlastné prenosné rádio.

Obr. 1: Parallax #27984 FM modul


Funkcie FM modulu

  • Možnosť pripojiť zariadenie k vstavenému 3.5mm minijack konektoru
  • Podpora frekvencií v rozsahu 76 - 108 MHz
  • Nie je nutné použitie externej antény
  • Ovládanie mikrokontrolérom pomocou I2C zbernice


Základné špecifikácie

  • Napájanie 2.7 - 5.5 DCV pri 25 mA
  • Typ zbernice: I2C
  • Pracovná teplota: 0 - 50 °C
  • Rozmery: 1.78 x 1.65 x 0.87 cm

Rozloženie pinov modulu

Obr. 2: Rozloženie pinov FM modul


Riešenie

Modul používa stereo tuner čip RDA5807SS. Programujeme priamo tento čip pomocou I2C rozhrania prostredníctvom pinov SDA a SCL. Prenos začína START bitom, po ňom nasledujú príkazové a dátové bajty. Každý bajt je ukončený ACK (alebo NACK) bitom. Prenos končí STOP bitom. Príkazový bajt obsahuje 7-bitovú adresu zariadenia a bit označujúci operáciu (Zápis/Čítanie). Bit ACK (alebo NACK) je vždy vyslaný prijímačom. Počas zápisu sú dátové bajty vyslané z mikrokontroléra a pri čítaní sú prijímané z čipu FM prijímača. FM modul vyšle ACK bit po každom prijatom bajte, po dokončení programovania mikrokontrolér vyšle STOP bit. Podrobné časové diagramy operácie zápisu a čítania sú na obrázkoch nižšie.

Obr. 3: Časový diagram zápisu

Obr. 4: Časový diagram čítania


Schéma zapojenia modulu

Obr. 5: Schéma zapojenia modulu


Čip obsahuje 16-bitové riadiace registre. Ak chceme posielať 16-bitov cez 8-bitovú I2C zbernicu, potrebujeme dáta odoslať na dva krát. Najprv posielame horných 8 bitov, následne spodných 8 bitov. Bity jednotlivých riadiacich registrov sme nastavili podľa rozpisu registrov v datasheete (Parallax Fm modul datasheet) na základe požadovaných funkcií. Príkazy na nastavenie riadiacich registrov musia nasledovať bezprostredne po sebe, pričom nie je možné nastavovať iba niektorý register, len všetky naraz.

Na komunikáciu cez zbernicu I2C sme použili knižnice dostupné na internete (stránka AVR-Software), v ktorej sú definované všetky potrebné funkcie.


Zdrojový kód

Pri riešení sme potrebovali pripojiť k projektu nasledovné súbory: lcd.c,lcd.h,i2cmaster.h,twimaster.c,projekt_fmradio.c

Zdrojový kód programu:

#include <avr/interrupt.h>  
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <util/twi.h>
#include <stdio.h>

#include "lcd.h"

#include "i2cmaster.h"

FILE mystdout = FDEV_SETUP_STREAM(lcdDataWrite, NULL, _FDEV_SETUP_WRITE);	// Printf pre LCD


int main(void)
{

 unsigned int CHAN=0b11001110, DATA;						// Predvolena frekvencia radio EXPRES

unsigned char VOLUME=0b0011,DATAH,DATAL, TUNE=0b010000, BUTTONS;

 lcdInit4();  	                   
stdout = &mystdout;           							// Odteraz funguje printf();              


i2c_init();

for(;;){

 BUTTONS=ReadButtons();
if(BUTTONS&0x01 && VOLUME<0b1111 && !(BUTTONS&0x04) && !( BUTTONS&0x08)) 	// Test tlacidla 1.
{
VOLUME++;
}

if(BUTTONS&0x02 && VOLUME>0) 							//Test tlacidla 2.
{
VOLUME--;
}

if(BUTTONS&0x04 && CHAN<210)							// Test tlacidla 3. a dosiahnutia max. frekvencie
{
if(BUTTONS&0x01&& CHAN<201) 						        // Uz nemoze pripocitat 1 Mhz, len menej
CHAN+=10; 									// Pripocita frerkvenciu po 1 MHZ-och
else
CHAN++;										// Pripocita frekvenciu po 0.1 MHZ-och
TUNE=0b010000;									// Poziadavka na zmenu frekvencie /1-aktivna
}



if(BUTTONS&0x08 && CHAN>9) 							// Test tlacidla 4. (znizovanie frekv.)
{
if(BUTTONS&0x01)							        // Zniz. po 1 MHz
CHAN-=10;
else
CHAN--;										// Zniz. po 0.1 MHz
TUNE=0b010000; 									// Poziadavka na zmenu frekvencie /1-aktivna
}


DATA=TUNE+CHAN*0b1000000; 							// Vypocet 16 bitoveho riadiaceho slova
DATAH=DATA/256;									// Rozdelenie - horne bity(8)
DATAL=DATA%256;									// Rozdelenie - dolne bity(8)

i2c_start_wait(0b00100000+I2C_WRITE);					        // HLAVICKA PRENOSOVEHO RAMCA 
										// (nastavenie adresy a typu operacie)
        i2c_write(0b11000000);            				        // Zapis data na adresu 02- Horny Byte                
        i2c_write(0b00000001);            					// Zapis data na adresu 02- Dolny Byte 

	i2c_write(DATAH/*0b00110011*/);                			        // Zapis data na adresu 03- Horny Byte                   
        i2c_write(DATAL/*0b10010000*/);               				// Zapis data na adresu 03- Dolny Byte 
				
	i2c_write(0b00000000);                        			        // Zapis data na adresu 04- Horny Byte                       
        i2c_write(0b00000000);                        				// Zapis data na adresu 04- Dolny Byte 
		
	i2c_write(0b10001000);                        			        // Zapis data na adresu 05- Horny Byte                  
        i2c_write(0b10100000+VOLUME);                        			// Zapis data na adresu 05- Dolny Byte
		
	i2c_write(0b00000100);                        			        // Zapis data na adresu 0A- Horny Byte                  
        i2c_write(0b00000000);                        				// Zapis data na adresu 0A- Dolny Byte
		
	i2c_write(0b00000000);                        			        // Zapis data na adresu 0B- Horny Byte                     
        i2c_write(0b00000000);                        				// Zapis data na adresu 0B- Dolny Byte

i2c_stop(); 									// Ukoncenie prenosoveho ramca
 lcdControlWrite(0x02);								// Kurzor na zaciatok DISP

printf("%d.%dMHz  ",(870+CHAN)/10,(870+CHAN)%10);				// Vypis frekvencie
lcdControlWrite(0xC0);								// Druhy riadok
printf("Vol=%d   ",((int)VOLUME*100)/0b1111);					// Vypis hlasitosti
   

   TUNE=0b000000;								// Zastavenie poziadavky na zmenu frekvencie
   _delay_ms(500);}
 
}


Popis funkcií - Zhodnotenie

Obr. 6: Funkčné zariadenie

Zaradenie funguje nasledovne: Po pripojení napájacieho napätia sa zariadenie automaticky nastaví na frekvenciu rádia Expres (107.6 Mhz) a nastaví sa hlasitosť na úroveň 20%. Toto predvolené nastavenie je možné zmeniť v programe pri časti definovania premenných.

unsigned int CHAN=0b11001110, DATA;					        // Predvolena frekvencia radio EXPRES

unsigned char VOLUME=0b0011,DATAH,DATAL, TUNE=0b010000, BUTTONS;


Frekvencia sa ukladá do premennej CHAN, prepočet požadovanej frekvencie je možný nasledovným spôsobom:

CHAN (DEC) = (Požadovaná frekvencia - 87) / 0.1 Výsledok je nutné ešte upraviť do binárneho tvaru.

Hlasitosť nastavujeme pomocou štyroch bitov, pričom VOLUME=0b1111 zodpovedá 100%, a VOLUME=0b0000 zodpovedá 0% hlasitosti.

Tlačidlom 1 zvyšujeme a tlačidlom 2 znižujeme hlasitosť. Jedno stlačenie tlačidla vyvolá zmenu hlasitosti o 6-7 %.

Tlačidlom 3 zvyšujeme a tlačidlom 4 znižujeme frekvenciu. Jedno stlačenie tlačidla vyvolá zmenu frekvencie o 0.1 MHz. Ak chceme meniť frekvenciu rýchlejšie, kombináciou tlačidla 1 a tlačidla 3 resp. 4 docielime zmenu frekvencie o 1 MHz.

Obr. 7: Zapojenie modulu

Video o funkčnom zariadení nájdete tu.