Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.23 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. // email:petr.olivka@vsb.cz
  6. //
  7. // Priklad pouzit vyvojoveho nastroje AVR-KIT:
  8. // Ovladani zarizeni na sbernici
  9. //
  10. // ***********************************************************************
  11.  
  12. // nejprve hlavickovy soubor AVR-KITu
  13. #include "../avrkit/avrkit.h"
  14. #include "i2c-lib.h"
  15. #include "si4735-lib.h"
  16.  
  17. #include <stdio.h>
  18. #include <avr/io.h>
  19.  
  20. // Funkce pro ovladani sbernice I2C, kopie z i2c-lib.h
  21.  
  22. // inicializace sbernice
  23. void I2C_Init( void );
  24.  
  25. // oznameni zacatku komunikace
  26. void I2C_Start( void );
  27.  
  28. // oznameni ukonceni komunikace
  29. void I2C_Stop( void );
  30.  
  31. // odeslani potvrzovaci bitu ACK
  32. void I2C_Ack( void );
  33.  
  34. // odeslani potvrzovaciho bitu NACK
  35. void I2C_NAck( void );
  36.  
  37. // prijem potvrzovaciho bitu
  38. char I2C_getACK( void );
  39.  
  40. // odeslani 8 bitove hodnoty, vraci ACK
  41. char I2C_Vystup( unsigned char value );
  42.  
  43. // precteni 8 bitove hodnoty
  44. unsigned char I2C_Vstup( void );
  45.  
  46. //************************************************************************
  47.  
  48. #define R   0b00000001
  49. #define W   0b00000000
  50. #define PCF8574 0b01001110
  51.  
  52. #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
  53. int main( void )
  54. {
  55.     char S1, S2, RSSI, SNR, MULT, CAP;
  56.     char ack = 0;
  57.  
  58.     // inicializace prostredi
  59.     avrkit_init();
  60.     I2C_Init();
  61.  
  62.     printf( "AVR-KIT ready...\n\n" );
  63. /*
  64.     // komunikace s 8 bitovym expanderem
  65.     // zacatek komunikace
  66.     I2C_Start();
  67.     // adresovani registru PCF8574
  68.     // adresa se sklada ze 3 casti!
  69.     ack = I2C_Vystup( PFC8574 | W);
  70.     // kontrola ack, navratova hodnota musi byt 0!
  71.     if(ack){
  72.         printf("Chyba inicializace");
  73.         return 0;
  74.     }
  75.     // zapis 8 bitu do registru
  76.     I2C_Vystup(0b00101010);
  77.     // nyni sviti pozadovane LED
  78.     // konec komunikace
  79.     I2C_Stop();
  80.     I2C_Start();
  81.     ack = I2C_Vystup( PFC8574 | R);
  82.     if(ack){
  83.         printf("Chyba inicializace");
  84.         return 0;
  85.     }
  86.     printf("Zapsana hodnota %d",I2C_Vstup());
  87.     I2C_Stop();
  88. */
  89.    
  90.     if ( ( ack = SI4735_Init() ) != 0 )
  91.     {
  92.         printf( "Chyba (%d) inicializace obvodu SI4735\n", ack );
  93.         return 0;
  94.     }
  95.     else
  96.         printf( "Obvod SI4735 inicializovan.\n" );
  97.        
  98.     printf( "\nLadeni stanice...\n" );
  99.     int freq = 9370;
  100.     int hlasitost = 30;
  101.     I2C_Start();
  102.     ack |= I2C_Vystup( SI4735_address | W );
  103.     ack |= I2C_Vystup( 0x20 );          // FM_TUNE_FREQ
  104.     ack |= I2C_Vystup( 0x00 );          // ARG1
  105.     ack |= I2C_Vystup( freq >> 8 );     // ARG2 - FreqHi
  106.     ack |= I2C_Vystup( freq & 0xff );   // ARG3 - FreqLo
  107.     ack |= I2C_Vystup( 0x00 );          // ARG4
  108.     I2C_Stop();
  109.     while(1){
  110.         if(~read_butt()&0b00010000){
  111.             freq-=5;
  112.             I2C_Start();
  113.             ack |= I2C_Vystup( SI4735_address | W );
  114.             ack |= I2C_Vystup( 0x20 );          // FM_TUNE_FREQ
  115.             ack |= I2C_Vystup( 0x00 );          // ARG1
  116.             ack |= I2C_Vystup( freq >> 8 );     // ARG2 - FreqHi
  117.             ack |= I2C_Vystup( freq & 0xff );   // ARG3 - FreqLo
  118.             ack |= I2C_Vystup( 0x00 );          // ARG4
  119.             I2C_Stop();
  120.             }
  121.         if(~read_butt()&0b00100000){
  122.             freq+=5;
  123.             I2C_Start();
  124.             ack |= I2C_Vystup( SI4735_address | W );
  125.             ack |= I2C_Vystup( 0x20 );          // FM_TUNE_FREQ
  126.             ack |= I2C_Vystup( 0x00 );          // ARG1
  127.             ack |= I2C_Vystup( freq >> 8 );     // ARG2 - FreqHi
  128.             ack |= I2C_Vystup( freq & 0xff );   // ARG3 - FreqLo
  129.             ack |= I2C_Vystup( 0x00 );          // ARG4
  130.             I2C_Stop();}
  131.         if(read_butt()&0b01000000){
  132.             hlasitost-=2;
  133.             I2C_Start();
  134.             ack |= I2C_Vystup(SI4735_address | W);
  135.             ack |= I2C_Vystup(0x12);
  136.             ack |= I2C_Vystup(0x00);
  137.             ack |= I2C_Vystup(0x40);
  138.             ack |= I2C_Vystup(0x00);
  139.             ack |= I2C_Vystup(0x00);
  140.             ack |= I2C_Vystup(hlasitost);
  141.             I2C_Stop();
  142.         }
  143.         if(read_butt()&0b10000000){
  144.             hlasitost+=2;
  145.             I2C_Start();
  146.             ack |= I2C_Vystup(SI4735_address | W);
  147.             ack |= I2C_Vystup(0x12);
  148.             ack |= I2C_Vystup(0x00);
  149.             ack |= I2C_Vystup(0x40);
  150.             ack |= I2C_Vystup(0x00);
  151.             ack |= I2C_Vystup(0x00);
  152.             ack |= I2C_Vystup(hlasitost);
  153.             I2C_Stop();
  154.         }
  155.         printf("Frekvence: %d Hlasitost=%d\n",freq,hlasitost);
  156.        
  157.     }
  158.     // Pozadovana frekvence * 100
  159.     /*
  160.     // Priklad ladeni stanice
  161.     I2C_Start();
  162.     ack |= I2C_Vystup( SI4735_address | W );
  163.     ack |= I2C_Vystup( 0x20 );          // FM_TUNE_FREQ
  164.     ack |= I2C_Vystup( 0x00 );          // ARG1
  165.     ack |= I2C_Vystup( freq >> 8 );     // ARG2 - FreqHi
  166.     ack |= I2C_Vystup( freq & 0xff );   // ARG3 - FreqLo
  167.     ack |= I2C_Vystup( 0x00 );          // ARG4
  168.     I2C_Stop();
  169.     // kontrola ack!
  170.     // if...
  171.     /*
  172.     // probiha ladeni...
  173.     delay_ms( 100 );
  174.     printf( "...stanice naladena.\n\n" );
  175.    
  176.     // Priklad cteni frekcence aktualne naladene stanice
  177.     I2C_Start();
  178.     ack |= I2C_Vystup( SI4735_address | W );
  179.     ack |= I2C_Vystup( 0x22 );          // FM_TUNE_STATUS
  180.     ack |= I2C_Vystup( 0x00 );          // ARG1
  181.     // opakovany start
  182.     I2C_Start();
  183.     // zmena smeru komunikace
  184.     ack |= I2C_Vystup( SI4735_address | R );
  185.     // cteni dat
  186.     S1 = I2C_Vstup();
  187.     I2C_Ack();
  188.     S2 = I2C_Vstup();
  189.     I2C_Ack();
  190.     freq = (int) I2C_Vstup() << 8;
  191.     I2C_Ack();
  192.     freq |= I2C_Vstup();
  193.     I2C_Ack();
  194.     RSSI = I2C_Vstup();
  195.     I2C_Ack();
  196.     SNR = I2C_Vstup();
  197.     I2C_Ack();
  198.     MULT = I2C_Vstup();
  199.     I2C_Ack();
  200.     CAP = I2C_Vstup();
  201.     I2C_NAck();
  202.     I2C_Stop();
  203.  
  204.     if ( ack != 0 )
  205.         printf( "Nastala chyba v komunikaci\n" );
  206.     else
  207.         printf( "Aktualne naladena frekvence je: %d.%dMHz\n", freq / 100, freq % 100 );
  208. */
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement