Zbernica i2c: FM rádio: Rozdiel medzi revíziami
Zo stránky SensorWiki
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 == | ||
Š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 == | ||
==='''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:
- Parallax FM Radio Module (product page)
- Dokumentácia
- Ukážkový program v Basicu
- Mitchell Kahn: Programming the i2c interface. Dr. Dobb's Journal, June 1992.
- 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.
- 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.