Advertisement
Guest User

i2c_fm

a guest
Oct 10th, 2014
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.10 KB | None | 0 0
  1. // ***********************************************************************
  2. //
  3. // Demo program pro vyuku predmetu APPS (09/2014)
  4. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  5. //
  6. // Priklad pouzit vyvojoveho nastroje AVR-KIT:
  7. // Ovladani zarizeni na sbernici
  8. //
  9. // ***********************************************************************
  10.  
  11. // nejprve hlavickovy soubor AVR-KITu
  12. #include "../avrkit/avrkit.h"
  13. #include "i2c-lib.h"
  14. #include "si4735-lib.h"
  15.  
  16. #include <stdio.h>
  17. #include <avr/io.h>
  18.  
  19. // Funkce pro ovladani sbernice I2C, kopie z i2c-lib.h
  20.  
  21. // inicializace sbernice
  22. void I2C_Init( void );
  23.  
  24. // oznameni zacatku komunikace
  25. void I2C_Start( void );
  26.  
  27. // oznameni ukonceni komunikace
  28. void I2C_Stop( void );
  29.  
  30. // odeslani potvrzovaci bitu ACK
  31. void I2C_Ack( void );
  32.  
  33. // odeslani potvrzovaciho bitu NACK
  34. void I2C_NAck( void );
  35.  
  36. // prijem potvrzovaciho bitu
  37. char I2C_getACK( void );
  38.  
  39. // odeslani 8 bitove hodnoty, vraci ACK
  40. char I2C_Vystup( unsigned char value );
  41.  
  42. // precteni 8 bitove hodnoty
  43. unsigned char I2C_Vstup( void );
  44.  
  45. //************************************************************************
  46.  
  47. struct stav_radia {
  48.     char S1, S2, RSSI, SNR, MULT, CAP;
  49.     int FREQ;
  50. };
  51.  
  52. typedef struct stav_radia stav_radia;
  53.  
  54. #define W   0b00000000
  55. #define R   0b00000001
  56. #define EXPANDER 0b01001110
  57.  
  58. char set_volume(char volume)
  59. {
  60.     char ack = 0;
  61.    
  62.     I2C_Start();
  63.    
  64.     ack |= I2C_Vystup( SI4735_address);
  65.     ack |= I2C_Vystup( 0x12 ); //set property
  66.     ack |= I2C_Vystup( 0x00 ); //set property
  67.     ack |= I2C_Vystup( 0x40 ); //set property
  68.     ack |= I2C_Vystup( 0x00 ); //set property
  69.     ack |= I2C_Vystup( 0x00 ); //set property
  70.     ack |= I2C_Vystup( volume ); //set property
  71.    
  72.     I2C_Stop();
  73.    
  74.     return ack;
  75. }
  76. char svit_mesicku(char port)
  77. {
  78.     char ack = 0;
  79.    
  80.     I2C_Start();
  81.    
  82.     // adresovani registru PCF8574
  83.     // adresa se sklada ze 3 casti!
  84.     ack = I2C_Vystup(EXPANDER);
  85.     // kontrola ack, navratova hodnota musi byt 0!
  86.     // ....
  87.     // zapis 8 bitu do registru
  88.     ack |= I2C_Vystup( port );
  89.     // nyni sviti pozadovane LED
  90.  
  91.     // konec komunikace
  92.     I2C_Stop();
  93.    
  94.     return ack;
  95. }
  96. char nalad_stanici(int frekvence)
  97. {
  98.     char ack = 0;
  99.    
  100.     I2C_Start();
  101.     ack |= I2C_Vystup( SI4735_address);
  102.     ack |= I2C_Vystup( 0x20 );          // FM_TUNE_FREQ
  103.     ack |= I2C_Vystup( 0x00 );          // ARG1
  104.     ack |= I2C_Vystup( frekvence >> 8 );        // ARG2 - FreqHi   00000000 00011000
  105.     ack |= I2C_Vystup( frekvence & 0xff );  // ARG3 - FreqLo
  106.     ack |= I2C_Vystup( 0x00 );          // ARG4
  107.     I2C_Stop();
  108.    
  109.     return ack;
  110. }
  111. char precti_stav_radia(stav_radia * stav)
  112. {
  113.     char ack = 0;
  114.    
  115.     // Priklad cteni frekcence aktualne naladene stanice
  116.     I2C_Start();
  117.     ack |= I2C_Vystup( SI4735_address);
  118.     ack |= I2C_Vystup( 0x22 );          // FM_TUNE_STATUS
  119.     ack |= I2C_Vystup( 0x00 );          // ARG1
  120.     // opakovany start
  121.     I2C_Start();
  122.     // zmena smeru komunikace
  123.     ack |= I2C_Vystup( SI4735_address | R );
  124.     // cteni dat
  125.     stav->S1 = I2C_Vstup();
  126.     I2C_Ack();
  127.     stav->S2 = I2C_Vstup();
  128.     I2C_Ack();
  129.     stav->FREQ = (int) I2C_Vstup() << 8;
  130.     I2C_Ack();
  131.     stav->FREQ |= I2C_Vstup();
  132.     I2C_Ack();
  133.     stav->RSSI = I2C_Vstup();
  134.     I2C_Ack();
  135.     stav->SNR = I2C_Vstup();
  136.     I2C_Ack();
  137.     stav->MULT = I2C_Vstup();
  138.     I2C_Ack();
  139.     stav->CAP = I2C_Vstup();
  140.     I2C_NAck();
  141.     I2C_Stop();
  142.    
  143.     return ack;
  144. }
  145. char vyhledej_stanici(char nahoru)
  146. {
  147.     char ack = 0;
  148.    
  149.     I2C_Start();
  150.    
  151.     ack |= I2C_Vystup( SI4735_address);
  152.     ack |= I2C_Vystup( 0x21 ); //set property
  153.     ack |= I2C_Vystup( 0b00001000); //set property
  154.    
  155.     I2C_Stop();
  156.    
  157.     return ack;
  158. }
  159.  
  160. #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
  161. int main( void )
  162. {
  163.     char ack = 0;
  164.  
  165.     // inicializace prostredi
  166.     avrkit_init();
  167.     I2C_Init();
  168.  
  169.     // komunikace s 8 bitovym expanderem
  170.     /*
  171.     // zacatek komunikace
  172.     I2C_Start();
  173.    
  174.     // adresovani registru PCF8574
  175.     // adresa se sklada ze 3 casti!
  176.     ack = I2C_Vystup( HWADDR_PCF8574 | A012 | R_or_W );
  177.     // kontrola ack, navratova hodnota musi byt 0!
  178.     // ....
  179.     // zapis 8 bitu do registru
  180.     I2C_Vystup( libovolne_8_bitove_cislo )
  181.     // nyni sviti pozadovane LED
  182.  
  183.     // konec komunikace
  184.     I2C_Stop();
  185.     */
  186.    
  187.     if ( ( ack = SI4735_Init() ) != 0 )
  188.     {
  189.         printf("Chyba (%d) inicializace obvodu SI4735\n", ack );
  190.         return 0;
  191.     }
  192.     else
  193.         printf( "Obvod SI4735 inicializovan.\n" );
  194.        
  195.     printf( "\nLadeni stanice...\n" );
  196.    
  197.     // Pozadovana frekvence * 100
  198.     int freq = 10140;
  199.     // Priklad ladeni stanice
  200.     nalad_stanici(freq);
  201.     // kontrola ack!
  202.     // if...
  203.    
  204.     // probiha ladeni...
  205.     delay_ms( 100 );
  206.    
  207.     if (ack != 0)
  208.     {
  209.         printf("stanice nebyla naladena\n");
  210.     }
  211.     else printf( "...stanice naladena.\n\n" );
  212.  
  213.     stav_radia stav;
  214.     ack = precti_stav_radia(&stav);
  215.  
  216.     if ( ack != 0 )
  217.         printf( "Nastala chyba v komunikaci\n" );
  218.     else
  219.         printf( "Aktualne naladena fm je: %d.%dMHz\n", stav.FREQ / 100, stav.FREQ % 100 );
  220.    
  221.     signed char volume = 10;
  222.     char led = 1;
  223.     svit_mesicku(volume);
  224.        
  225.     while (1)
  226.     {
  227.         if (~read_butt() & 0b10000000)
  228.         {
  229.             volume += 10;
  230.            
  231.             if (volume > 63)
  232.             {
  233.                 volume = 63;
  234.             }
  235.            
  236.             if (set_volume(volume) != 0)
  237.             {
  238.                 printf("neco je spatne\n");
  239.             }
  240.             else printf("neco je dobre\n");
  241.            
  242.             led <<= 1;
  243.             svit_mesicku(led);
  244.            
  245.             stav_radia stav;
  246.             precti_stav_radia(&stav);
  247.            
  248.             printf("RSSI: %d, SNR: %d, MULT: %d, CAP: %d", stav.RSSI, stav.SNR, stav.MULT, stav.CAP);
  249.            
  250.             delay_ms(200);
  251.         }
  252.        
  253.         if (~read_butt() & 0b01000000)
  254.         {
  255.             volume -= 10;
  256.            
  257.             if (volume < 0)
  258.             {
  259.                 volume = 0;
  260.             }
  261.            
  262.             if (set_volume(volume) != 0)
  263.             {
  264.                 printf("neco je spatne\n");
  265.             }
  266.             else printf("neco je dobre\n");
  267.            
  268.             led >>= 1;
  269.             led |= (1 << 7);
  270.             svit_mesicku(led);
  271.            
  272.             delay_ms(200);
  273.         }
  274.        
  275.         if (~read_butt() & 0b00100000)
  276.         {
  277.             nalad_stanici(1);
  278.            
  279.             delay_ms(200);
  280.            
  281.             stav_radia stav;
  282.             precti_stav_radia(&stav);
  283.            
  284.             printf( "Aktualne naladena fm je: %d.%dMHz\n", stav.FREQ / 100, stav.FREQ % 100 );
  285.         }
  286.        
  287.         if (~read_butt() & 0b00010000)
  288.         {
  289.             nalad_stanici(0);
  290.            
  291.             delay_ms(200);
  292.            
  293.             stav_radia stav;
  294.             precti_stav_radia(&stav);
  295.            
  296.             printf( "Aktualne naladena fm je: %d.%dMHz\n", stav.FREQ / 100, stav.FREQ % 100 );
  297.         }
  298.     }
  299.  
  300.     return 0;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement