Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.00 KB | None | 0 0
  1. // CONFIG
  2. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
  3. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  4. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT enabled)
  5. #pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
  6. #pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
  7. #pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  8. #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  9. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <pic16f877a.h>
  14.  
  15. unsigned short tempPortB;       //pouze pro nacitani PORTB, pri interrupt-on-change
  16. unsigned int pocet_FS = 0;      //celkovy pocet impulsu FS na 360 stupnu
  17. unsigned int aktualni_FS = 0;   //aktualni pocet impulsu
  18. unsigned int maximum_FS = 0;    //pocet impulsu, kde je namereno maximalni napeti
  19. unsigned int maximum_U = 0;     //maximalni napeti
  20. unsigned int aktualni_U = 0;
  21.  
  22. /*
  23.  * variable krok
  24.  *  udava ve kterem kroku se program prave nachazi
  25.  *
  26.  * 0. natoceni do vychozi polohy
  27.  * 1. obeh o 360 stupnu a pocitani FS
  28.  * 2. natoceni do vychozi polohy
  29.  * 3. mereni maxima
  30.  * 4. cesta do maxima
  31.  * 5. antena je v maximu - cekani na stisk tlacitka
  32.  */
  33. int krok = 0;
  34.  
  35. void Start(){
  36.     INTEDG = INTF = RBIF = krok = 0;
  37.     GIE = INTE = 1;
  38.    
  39.     //zapnuti motoru
  40.     TRISB3 = 0;
  41.     RB3 = 1;
  42.    
  43.     //pockani na zmereni celkoveho poctu impulsu
  44.     while(krok!=2);
  45. }
  46. void Delay(unsigned int count)  // Zhruba ?eká ?as v ms
  47. {
  48.   int i;
  49.   while(count--) for(i=0;i!=0xA3;i++);
  50. }
  51. void PockejTlacitko(){
  52.     RB3 = 0;
  53.     GIE = 0;
  54.     INTF = RBIF = 0;
  55.     int count;          //cas v ms
  56.    
  57.     while(1){
  58.         if(RB4!=1){
  59.             GIE = INTE = RBIE = 1;
  60.             return;
  61.         }
  62.     }
  63. //    while(1){
  64. //        count = 6;
  65. //        while(count-- && RB4!=1){
  66. //            Delay(200);
  67. //            if(count==1)
  68. //            {
  69. //                GIE = 1;
  70. //                return;
  71. //            }                
  72. //        }
  73. //    }
  74. }
  75.  
  76. void MereniMaxima(){
  77.     ADCON0bits.ADON = 1;
  78.     ADCON0bits.GO = 1;
  79.     Delay(1);               //cekani na nabiti kondenzatoru
  80.     while(ADCON0bits.GO);   //cekani na dokonceni prevodu
  81.     ADIF = 0;
  82.     ADCON0bits.ADON = 0;
  83.    
  84.     aktualni_U = (ADRESH<<8)|ADRESL;
  85.     if(aktualni_U > maximum_U){
  86.         maximum_U = aktualni_U;
  87.         maximum_FS = aktualni_FS;
  88.     }
  89.     return;
  90. }
  91. void NajetiDoVychoziPolohy(){
  92.     if(RB0==0){          //pokud jiz jsme ve vychozi poloze
  93.         krok=3;
  94.         ADCON0 = 0x01;
  95.         ADCON1 = 0b10001110;
  96.         //ADCS0 = ADCS1 = ADCS2 = 1;          /////////////////////////////////////
  97.         ADFM = 1;
  98.         aktualni_FS = 0;
  99.         //zapnuti motoru
  100.         RB3 = 1;
  101.         RBIF = 0;
  102.         RBIE = 1;
  103.     }
  104.     else{
  105.         RB3=1;
  106.         //while(RB0!=0);
  107.     }
  108.     return;
  109. }
  110. void NajetiDoMaxima(){
  111.     if(aktualni_FS == 120){
  112.         RB3=0;
  113.         RBIE = RBIF = 0;
  114.         krok = 5;
  115.     }
  116.     return;
  117. }
  118. void PreruseniS0(){
  119.     if(krok==0){
  120.         krok=1;
  121.         RBIF = 0;
  122.         RBIE = 1;
  123.     }
  124.     else if(krok==1){
  125.         krok=2;
  126.         RBIF = 0;
  127.         RBIE = 0;        
  128.         RB3 = 0;
  129.         pocet_FS = aktualni_FS;
  130.     }
  131.     else if(krok==2){
  132.         krok = 3;
  133.         ADCON1 = ADCON0 = 0;
  134.         ADCON1 = 0b10001110;
  135.         //ADCS0 = ADCS1 = ADCS2 = 1;          /////////////////////////////////////
  136.         ADFM = 1;
  137.         ADON = 1;
  138.         ADIE = 0;
  139.         aktualni_FS = 0;
  140.         //zapnuti motoru
  141.         RB3 = 1;
  142.         RBIF = 0;
  143.         RBIE = 1;
  144.     }
  145.     else if(krok==3){
  146.         krok = 4;
  147.         aktualni_FS = 0;
  148.         ADCON1 = ADCON0 = 0;
  149.     }
  150.     return;
  151. }
  152. void interrupt ISR(){
  153. //    if(ADIF==1){
  154. //        ADIF = 0;
  155. //    }
  156. //    else
  157.     if(INTF==1){
  158.         INTF = RBIF = 0;
  159.         PreruseniS0();
  160.     }
  161.     else if(RBIF==1){
  162.         tempPortB = PORTB;      //read portB
  163.         RBIF = 0;
  164.         if(RB5){
  165.             aktualni_FS++;      //pocitani impulsu FS
  166.             if(krok==3){        //cteni z AD prevodniku a ukladani
  167.                 MereniMaxima();
  168.             }
  169.             else if(krok==4){   //if aktualni_FS == maximum_FS -> STOP
  170.                 NajetiDoMaxima();
  171.             }
  172.         }
  173.     }
  174.     TMR0IF = RBIF = INTF = 0;
  175.     GIE = 1;
  176.     return;
  177. }
  178. int main(int argc, char** argv) {
  179.     Start();  
  180.     while(1){
  181.         PockejTlacitko();
  182.         aktualni_FS = maximum_FS = maximum_U = aktualni_U = 0;
  183.         NajetiDoVychoziPolohy();
  184.         while(krok!=5);
  185.         //TODO reset
  186.         INTF = RBIF = RBIE = 0;
  187.         krok = 2;
  188.     }
  189.    
  190.     return (EXIT_SUCCESS);
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement