Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // CONFIG
- #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
- #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
- #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT enabled)
- #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
- #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)
- #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
- #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
- #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
- #include <stdio.h>
- #include <stdlib.h>
- #include <pic16f877a.h>
- unsigned short tempPortB; //pouze pro nacitani PORTB, pri interrupt-on-change
- unsigned int pocet_FS = 0; //celkovy pocet impulsu FS na 360 stupnu
- unsigned int aktualni_FS = 0; //aktualni pocet impulsu
- unsigned int maximum_FS = 0; //pocet impulsu, kde je namereno maximalni napeti
- unsigned int maximum_U = 0; //maximalni napeti
- unsigned int aktualni_U = 0;
- /*
- * variable krok
- * udava ve kterem kroku se program prave nachazi
- *
- * 0. natoceni do vychozi polohy
- * 1. obeh o 360 stupnu a pocitani FS
- * 2. natoceni do vychozi polohy
- * 3. mereni maxima
- * 4. cesta do maxima
- * 5. antena je v maximu - cekani na stisk tlacitka
- */
- int krok = 0;
- void Start(){
- INTEDG = INTF = RBIF = krok = 0;
- GIE = INTE = 1;
- //zapnuti motoru
- TRISB3 = 0;
- RB3 = 1;
- //pockani na zmereni celkoveho poctu impulsu
- while(krok!=2);
- }
- void Delay(unsigned int count) // Zhruba ?eká ?as v ms
- {
- int i;
- while(count--) for(i=0;i!=0xA3;i++);
- }
- void PockejTlacitko(){
- RB3 = 0;
- GIE = 0;
- INTF = RBIF = 0;
- int count; //cas v ms
- while(1){
- if(RB4!=1){
- GIE = INTE = RBIE = 1;
- return;
- }
- }
- // while(1){
- // count = 6;
- // while(count-- && RB4!=1){
- // Delay(200);
- // if(count==1)
- // {
- // GIE = 1;
- // return;
- // }
- // }
- // }
- }
- void MereniMaxima(){
- ADCON0bits.ADON = 1;
- ADCON0bits.GO = 1;
- Delay(1); //cekani na nabiti kondenzatoru
- while(ADCON0bits.GO); //cekani na dokonceni prevodu
- ADIF = 0;
- ADCON0bits.ADON = 0;
- aktualni_U = (ADRESH<<8)|ADRESL;
- if(aktualni_U > maximum_U){
- maximum_U = aktualni_U;
- maximum_FS = aktualni_FS;
- }
- return;
- }
- void NajetiDoVychoziPolohy(){
- if(RB0==0){ //pokud jiz jsme ve vychozi poloze
- krok=3;
- ADCON0 = 0x01;
- ADCON1 = 0b10001110;
- //ADCS0 = ADCS1 = ADCS2 = 1; /////////////////////////////////////
- ADFM = 1;
- aktualni_FS = 0;
- //zapnuti motoru
- RB3 = 1;
- RBIF = 0;
- RBIE = 1;
- }
- else{
- RB3=1;
- //while(RB0!=0);
- }
- return;
- }
- void NajetiDoMaxima(){
- if(aktualni_FS == 120){
- RB3=0;
- RBIE = RBIF = 0;
- krok = 5;
- }
- return;
- }
- void PreruseniS0(){
- if(krok==0){
- krok=1;
- RBIF = 0;
- RBIE = 1;
- }
- else if(krok==1){
- krok=2;
- RBIF = 0;
- RBIE = 0;
- RB3 = 0;
- pocet_FS = aktualni_FS;
- }
- else if(krok==2){
- krok = 3;
- ADCON1 = ADCON0 = 0;
- ADCON1 = 0b10001110;
- //ADCS0 = ADCS1 = ADCS2 = 1; /////////////////////////////////////
- ADFM = 1;
- ADON = 1;
- ADIE = 0;
- aktualni_FS = 0;
- //zapnuti motoru
- RB3 = 1;
- RBIF = 0;
- RBIE = 1;
- }
- else if(krok==3){
- krok = 4;
- aktualni_FS = 0;
- ADCON1 = ADCON0 = 0;
- }
- return;
- }
- void interrupt ISR(){
- // if(ADIF==1){
- // ADIF = 0;
- // }
- // else
- if(INTF==1){
- INTF = RBIF = 0;
- PreruseniS0();
- }
- else if(RBIF==1){
- tempPortB = PORTB; //read portB
- RBIF = 0;
- if(RB5){
- aktualni_FS++; //pocitani impulsu FS
- if(krok==3){ //cteni z AD prevodniku a ukladani
- MereniMaxima();
- }
- else if(krok==4){ //if aktualni_FS == maximum_FS -> STOP
- NajetiDoMaxima();
- }
- }
- }
- TMR0IF = RBIF = INTF = 0;
- GIE = 1;
- return;
- }
- int main(int argc, char** argv) {
- Start();
- while(1){
- PockejTlacitko();
- aktualni_FS = maximum_FS = maximum_U = aktualni_U = 0;
- NajetiDoVychoziPolohy();
- while(krok!=5);
- //TODO reset
- INTF = RBIF = RBIE = 0;
- krok = 2;
- }
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement