Operácie

Zbernica i2c: FM rádio

Zo stránky SensorWiki

Verzia z 13:50, 15. január 2013, ktorú vytvoril StudentDVPS (diskusia | príspevky)

Zbernica I2C - FM rádio

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

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.


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ť len 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í

Obr. 6: Funkčné zariadenie

Zaradenie funguje nasledovne: Po pripojení napájacieho napätia sa zariadenie automaticky nastaví na frekvenciu rádia Epxres (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