Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Zadani: regulujte hlasitost radia a hlasitost zobrazujte na ledkach
- PS. trochu jsem posteloval radio stanici na Radio Beat, coz tento obvod asi nezachyti
- kazdopadne lze slyset sumeni
- Spousta kodu je preddefinovaneho Panem Olivkou
- */
- #include <mbed.h>
- #include "i2c-lib.h"
- #include "si4735-lib.h"
- //************************************************************************
- // Direction of I2C communication
- #define R 0b00000001
- #define W 0b00000000
- Serial pc( USBTX, USBRX );
- ////////////////////////////////////////
- // VLASTNI DEKLARACE - ZBYTEK PREDNASTAVENY
- ////////////////////////////////////////
- DigitalIn but9( PTC9 ); // Leve tlacitko pro snizovani VOLUME
- DigitalIn but10( PTC10 ); // prave tlacitko pro zvysovani VOLUME
- bool but9Pressed = false; // pomocne prommene aby tlacitko nemohlo byt drzeno
- bool but10Pressed = false;
- int actualVolume = 30; // nastaveni aktualniho volume
- int setVolumeRange = 5; // skok jakym se ma pricitat volume, MAX je 63
- uint8_t ack = 0;
- ////////////////////////////////////////
- ////////////////////////////////////////
- #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
- void setVolume(int vol){ // krome radku ack |= I2C_Output(vol); je cela f-ce preddefinovana v dokumentaci
- // hlavne ty adresy 0x12, 0x00, apod..
- I2C_Start();
- ack |= I2C_Output( SI4735_address | W );
- ack |= I2C_Output( 0x12 );
- ack |= I2C_Output( 0x00 );
- ack |= I2C_Output( 0x40 );
- ack |= I2C_Output( 0x00 );
- ack |= I2C_Output( 0x00 );
- ack |= I2C_Output(vol);
- I2C_Stop();
- wait_ms(100);
- return;
- }
- void setLeds(int vol){
- I2C_Start();
- ack = I2C_Output( 0b01000000 | 0b00001110 | W ); //prvnĂ ÄŤĂslo nevim co je,
- // druhé je na takove čudličky male co tam jsou a když jsou všechny dole tak to jsou ty 3 jedničky 00001110 a pak W je zápis
- if ( ack != 0 )
- pc.printf("Nastala chyba v komunikaci\n");
- // podle toho jaky je nastaveny Volume tak rozsvit patricne ledky
- if (vol <= 8){
- I2C_Output( 0b000000001); // 0 - nesviti, 1 - sviti
- }
- if (vol > 8 && vol <= 16){
- I2C_Output( 0b000000011);
- }
- if (vol > 16 && vol <= 24){
- I2C_Output( 0b000000111);
- }
- if (vol > 24 && vol <= 32){
- I2C_Output( 0b000001111);
- }
- if (vol > 32 && vol <= 40){
- I2C_Output( 0b000011111);
- }
- if (vol > 40 && vol <= 48){
- I2C_Output( 0b000111111);
- }
- if (vol > 48 && vol <= 56){
- I2C_Output( 0b001111111);
- }
- if (vol > 56){
- I2C_Output( 0b111111111);
- }
- I2C_Stop();
- }
- int main( void )
- {
- uint8_t S1, S2, RSSI, SNR, MULT, CAP;
- I2C_Init();
- pc.baud( 115200 );
- pc.printf( "K64F-KIT ready...\r\n" );
- // communication with 8 bit expander PCF8574
- // start communication
- I2C_Start();
- // PCF8574 addressing
- // The address is composed from 3 parts!
- //ack = I2C_Output( HWADR_PCF8574 | A012 | W );
- //ack = I2C_Output( 0b01000000 | 0b00001110 | W );
- // Check ack! Return value must be 0!
- // ....
- if ( ack != 0 )
- pc.printf("Nastala chyba v komunikaci\n");
- //I2C_Output( 0b010101010);
- //ack = I2C_Output( 0b0000001 );
- // selected LEDs should light
- // stop communication
- I2C_Stop();
- if ( ( ack = SI4735_Init() ) != 0 )
- {
- pc.printf( "Initialization of SI4735 finish with error (%d)\r\n", ack );
- return 0;
- }
- else
- pc.printf( "SI4735 initialized.\r\n" );
- pc.printf( "\nTunig of radio station...\r\n" );
- // Required frequency in MHz * 100
- int freq = 9050; // Radiozurnal
- // Tuning of radio station
- I2C_Start();
- ack |= I2C_Output( SI4735_address | W );
- ack |= I2C_Output( 0x20 ); // FM_TUNE_FREQ
- ack |= I2C_Output( 0x00 ); // ARG1
- ack |= I2C_Output( freq >> 8 ); // ARG2 - FreqHi
- ack |= I2C_Output( freq & 0xff ); // ARG3 - FreqLo
- ack |= I2C_Output( 0x00 ); // ARG4
- I2C_Stop();
- // Check ack!
- // if...
- // Tuning process inside SI4735
- wait_ms( 100 );
- printf( "... station tuned.\r\n\n" );
- // Example of reading of tuned frequency
- I2C_Start();
- ack |= I2C_Output( SI4735_address | W );
- ack |= I2C_Output( 0x22 ); // FM_TUNE_STATUS
- ack |= I2C_Output( 0x00 ); // ARG1
- // repeated start
- I2C_Start();
- // change direction of communication
- ack |= I2C_Output( SI4735_address | R );
- // read data
- S1 = I2C_Input();
- I2C_Ack();
- S2 = I2C_Input();
- I2C_Ack();
- freq = (int) I2C_Input() << 8;
- I2C_Ack();
- freq |= I2C_Input();
- I2C_Ack();
- RSSI = I2C_Input();
- I2C_Ack();
- SNR = I2C_Input();
- I2C_Ack();
- MULT = I2C_Input();
- I2C_Ack();
- CAP = I2C_Input();
- I2C_NAck();
- I2C_Stop();
- // Az tady je cela f-ce Main preddefinovana!!
- /////////////////////////////////////////////////////////
- // Tady zacina vlastni kod, ale pouze WHILE
- while(true){
- if (!but9 && !but9Pressed){ // klasika - zkontroluj zda-li bylo stiskle tlacitko
- if (actualVolume > 0) // kontroly jestli nebyla presahnuta hodnota
- actualVolume -= setVolumeRange; // jinak sniz VOLUME
- if (actualVolume < 0) // pro jistotu kdyby byla presahnuta tak ji nastav na defaultni
- actualVolume = 0;
- but9Pressed = true; // pomocna promenna aby tlacitko nemohlo byt drzeno
- }
- if (but9) but9Pressed = false;
- if (!but10 && !but10Pressed){ // to same akorat pri zvysovani hlasitosti
- if (actualVolume < 63)
- actualVolume += setVolumeRange;
- if (actualVolume > 63)
- actualVolume = 63;
- but10Pressed = true;
- }
- if (but10) but10Pressed = false;
- // po skonceni vsech kontrol tlacitek zavolej f-ce ktere provedou zmeny,
- // tj. zvys/sniz hlasitost, pripadne ukaz to na ledkach
- setVolume( actualVolume );
- setLeds( actualVolume );
- }
- if ( ack != 0 )
- printf( "Communication error!\r\n" );
- else
- printf( "Current tuned frequency: %d.%dMHz\r\n", freq / 100, freq % 100 );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement