Zbernica i2c: FM rádio: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 40: | Riadok 40: | ||
'''Rozloženie pinov modulu''' | '''Rozloženie pinov modulu''' | ||
[[Súbor: | [[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. | ::::::::::::::::'''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 z 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.
- 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);}
}