Advertisement
Guest User

Untitled

a guest
Oct 24th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.76 KB | None | 0 0
  1. /*
  2.  Zadani: regulujte hlasitost radia a hlasitost zobrazujte na ledkach
  3.          PS. trochu jsem posteloval radio stanici na Radio Beat, coz tento obvod asi nezachyti
  4.              kazdopadne lze slyset sumeni
  5.          Spousta kodu je preddefinovaneho Panem Olivkou
  6.  */
  7.  
  8. #include <mbed.h>
  9.  
  10. #include "i2c-lib.h"
  11. #include "si4735-lib.h"
  12.  
  13. //************************************************************************
  14.  
  15. // Direction of I2C communication
  16. #define R   0b00000001
  17. #define W   0b00000000
  18.  
  19. Serial pc( USBTX, USBRX );
  20.  
  21. ////////////////////////////////////////
  22. // VLASTNI DEKLARACE - ZBYTEK PREDNASTAVENY
  23. ////////////////////////////////////////
  24. DigitalIn but9( PTC9 ); // Leve tlacitko pro snizovani VOLUME
  25. DigitalIn but10( PTC10 ); // prave tlacitko pro zvysovani VOLUME
  26.  
  27. bool but9Pressed = false; // pomocne prommene aby tlacitko nemohlo byt drzeno
  28. bool but10Pressed = false;
  29.  
  30. int actualVolume = 30; // nastaveni aktualniho volume
  31. int setVolumeRange = 5; // skok jakym se ma pricitat volume, MAX je 63
  32. uint8_t ack = 0;
  33. ////////////////////////////////////////
  34. ////////////////////////////////////////
  35.  
  36. #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
  37.  
  38. void setVolume(int vol){ // krome radku ack |= I2C_Output(vol); je cela f-ce preddefinovana v dokumentaci
  39.                          // hlavne ty adresy 0x12, 0x00, apod..
  40.  
  41.     I2C_Start();
  42.  
  43.     ack |= I2C_Output( SI4735_address | W );
  44.     ack |= I2C_Output( 0x12 );
  45.     ack |= I2C_Output( 0x00 );
  46.     ack |= I2C_Output( 0x40 );
  47.     ack |= I2C_Output( 0x00 );
  48.     ack |= I2C_Output( 0x00 );
  49.     ack |= I2C_Output(vol);
  50.  
  51.     I2C_Stop();
  52.     wait_ms(100);
  53.  
  54.     return;
  55.  
  56. }
  57.  
  58. void setLeds(int vol){
  59.  
  60.     I2C_Start();
  61.  
  62.     ack = I2C_Output( 0b01000000 | 0b00001110 | W ); //prvnĂ­ ÄŤĂ­slo nevim co je,
  63.     // 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
  64.  
  65.     if ( ack != 0 )
  66.         pc.printf("Nastala chyba v komunikaci\n");
  67.  
  68.     // podle toho jaky je nastaveny Volume tak rozsvit patricne ledky
  69.     if (vol <= 8){
  70.         I2C_Output( 0b000000001); // 0 - nesviti, 1 - sviti
  71.     }
  72.     if (vol > 8 && vol <= 16){
  73.         I2C_Output( 0b000000011);
  74.     }
  75.     if (vol > 16 && vol <= 24){
  76.         I2C_Output( 0b000000111);
  77.     }
  78.     if (vol > 24 && vol <= 32){
  79.         I2C_Output( 0b000001111);
  80.     }
  81.     if (vol > 32 && vol <= 40){
  82.         I2C_Output( 0b000011111);
  83.     }
  84.     if (vol > 40 && vol <= 48){
  85.         I2C_Output( 0b000111111);
  86.     }
  87.     if (vol > 48 && vol <= 56){
  88.         I2C_Output( 0b001111111);
  89.     }
  90.     if (vol > 56){
  91.         I2C_Output( 0b111111111);
  92.     }
  93.  
  94.     I2C_Stop();
  95.  
  96. }
  97.  
  98. int main( void )
  99. {
  100.     uint8_t S1, S2, RSSI, SNR, MULT, CAP;
  101.  
  102.     I2C_Init();
  103.  
  104.     pc.baud( 115200 );
  105.     pc.printf( "K64F-KIT ready...\r\n" );
  106.  
  107.     // communication with 8 bit expander PCF8574
  108.  
  109.     // start communication
  110.     I2C_Start();
  111.  
  112.     // PCF8574 addressing
  113.     // The address is composed from 3 parts!
  114.     //ack = I2C_Output( HWADR_PCF8574 | A012 | W );
  115.     //ack = I2C_Output( 0b01000000 | 0b00001110 | W );
  116.  
  117.     // Check ack! Return value must be 0!
  118.     // ....
  119.  
  120.     if ( ack != 0 )
  121.         pc.printf("Nastala chyba v komunikaci\n");
  122.  
  123.     //I2C_Output( 0b010101010);
  124.     //ack = I2C_Output( 0b0000001 );
  125.     // selected LEDs should light
  126.  
  127.     // stop communication
  128.     I2C_Stop();
  129.  
  130.     if ( ( ack = SI4735_Init() ) != 0 )
  131.     {
  132.         pc.printf( "Initialization of SI4735 finish with error (%d)\r\n", ack );
  133.         return 0;
  134.     }
  135.     else
  136.         pc.printf( "SI4735 initialized.\r\n" );
  137.        
  138.     pc.printf( "\nTunig of radio station...\r\n" );
  139.    
  140.     // Required frequency in MHz * 100
  141.     int freq = 9050; // Radiozurnal
  142.  
  143.     // Tuning of radio station
  144.     I2C_Start();
  145.     ack |= I2C_Output( SI4735_address | W );
  146.     ack |= I2C_Output( 0x20 );          // FM_TUNE_FREQ
  147.     ack |= I2C_Output( 0x00 );          // ARG1
  148.     ack |= I2C_Output( freq >> 8 );     // ARG2 - FreqHi
  149.     ack |= I2C_Output( freq & 0xff );   // ARG3 - FreqLo
  150.     ack |= I2C_Output( 0x00 );          // ARG4
  151.     I2C_Stop();
  152.     // Check ack!
  153.     // if...
  154.    
  155.     // Tuning process inside SI4735
  156.     wait_ms( 100 );
  157.     printf( "... station tuned.\r\n\n" );
  158.    
  159.     // Example of reading of tuned frequency
  160.     I2C_Start();
  161.     ack |= I2C_Output( SI4735_address | W );
  162.     ack |= I2C_Output( 0x22 );          // FM_TUNE_STATUS
  163.     ack |= I2C_Output( 0x00 );          // ARG1
  164.     // repeated start
  165.     I2C_Start();
  166.     // change direction of communication
  167.     ack |= I2C_Output( SI4735_address | R );
  168.     // read data
  169.     S1 = I2C_Input();
  170.     I2C_Ack();
  171.     S2 = I2C_Input();
  172.     I2C_Ack();
  173.     freq = (int) I2C_Input() << 8;
  174.     I2C_Ack();
  175.     freq |= I2C_Input();
  176.     I2C_Ack();
  177.     RSSI = I2C_Input();
  178.     I2C_Ack();
  179.     SNR = I2C_Input();
  180.     I2C_Ack();
  181.     MULT = I2C_Input();
  182.     I2C_Ack();
  183.     CAP = I2C_Input();
  184.     I2C_NAck();
  185.     I2C_Stop();
  186.  
  187.  
  188.     // Az tady je cela f-ce Main preddefinovana!!
  189.     /////////////////////////////////////////////////////////
  190.     // Tady zacina vlastni kod, ale pouze WHILE
  191.     while(true){
  192.  
  193.         if (!but9 && !but9Pressed){ // klasika - zkontroluj zda-li bylo stiskle tlacitko
  194.             if (actualVolume > 0) // kontroly jestli nebyla presahnuta hodnota
  195.                 actualVolume -= setVolumeRange; // jinak sniz VOLUME
  196.             if (actualVolume < 0) // pro jistotu kdyby byla presahnuta tak ji nastav na defaultni
  197.                 actualVolume = 0;
  198.             but9Pressed = true; // pomocna promenna aby tlacitko nemohlo byt drzeno
  199.         }
  200.         if (but9) but9Pressed = false;
  201.  
  202.         if (!but10 && !but10Pressed){ // to same akorat pri zvysovani hlasitosti
  203.             if (actualVolume < 63)
  204.                 actualVolume += setVolumeRange;
  205.             if (actualVolume > 63)
  206.                 actualVolume = 63;
  207.             but10Pressed = true;
  208.         }
  209.         if (but10) but10Pressed = false;
  210.  
  211.         // po skonceni vsech kontrol tlacitek zavolej f-ce ktere provedou zmeny,
  212.         // tj. zvys/sniz hlasitost, pripadne ukaz to na ledkach
  213.         setVolume( actualVolume );
  214.         setLeds( actualVolume );
  215.  
  216.     }
  217.  
  218.     if ( ack != 0 )
  219.         printf( "Communication error!\r\n" );
  220.     else
  221.         printf( "Current tuned frequency: %d.%dMHz\r\n", freq / 100, freq % 100 );
  222.  
  223.     return 0;
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement