Operácie

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

Z SensorWiki

Riadok 40: Riadok 40:
 
'''Rozloženie pinov modulu'''
 
'''Rozloženie pinov modulu'''
  
[[Súbor:Piny FM modul.jpg]]
+
[[Súbor:piny2.jpg]]
 
[[Súbor:piny.jpg]]
 
[[Súbor:piny.jpg]]
  
Riadok 57: Riadok 57:
  
 
[[Súbor:operacia citanie.jpg]]
 
[[Súbor:operacia citanie.jpg]]
::::::::::::::::'''Obr. 3: Časový diagram čítania'''
+
::::::::::::::::'''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ť len 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>

Verzia zo dňa a času 13:16, 15. január 2013

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.

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

Piny2.jpg 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.

Operacia zapis.jpg

Obr. 3: Časový diagram zápisu

Operacia citanie.jpg

Obr. 4: Časový diagram čítania


Schéma zapojenia modulu

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 (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);}
 
}