Pic16f877 Zamanlayıcı

Başlatan oplynior, 28 Mayıs 2022, 03:21:27

oplynior

Merhaba arkadaşlar proteusta pic16f877 ile zamanlayıcı kodlamaya çalışıyorum ama bir türlü çalıştıramadım 1 dakika çalışıp 10 dakika duran ve bu süreç sürekli devam etmesi gerekiyor elimde bir kod var ama bir türlü çalıştıramadım yardımlarınızı bekliyorum

#include <16f877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,NOCPD,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT

#use fast_io(b)

int sayi=0;
int fan_acik = 0;  // eger fan calisiyorsa 1, duruyorsa 0.

#int_timer0
void timer0_kesmasi()
{
  set_timer0(60);  // her 50ms kesme olusuyor (?)
  sayi++;
  
  if(fan_acik == 0) // FAN DURUYOR
  {
    if(sayi == 12000)  // yani bize 1200 tane kesme gerek 1dk icin
    {
      output_high(pin_b0);  // fani aciyoruz
      sayi=0; // artan degiskeni resetliyoruz
    }
  }
  
  else // FAN CALISIYOR
  {
    if(sayi == 1200)  // yani bize 12000 tane kesme gerek 10dk icin
    {
      output_b(0x00);  // fani durduruyoruz
      sayi=0; // artan degiskeni resetliyoruz
    }
  }
}


void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_b(0x00);
   output_b(0x00);
   
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
   set_timer0(60);
   
   enable_interrupts(INT_timer0);
   enable_interrupts(GLOBAL);
   
   while(true);

}

mehmet

Bir turunuz
1200 + 12000 = 13200
olacak. 11 dakika sonra "sayi"
değişkenini sıfırlamalsınız.
Siz her koşul sonunda
sıfırladığınız için çalışmıyor.

oplynior

tam olarak anlayamadım artan değişkeni resetlemeyi silmem mi gerekiyor sadece 1200 ve 12000 sayıları doğru mudur ?

mehmet

#3
Tam dakika kritik ise sayacX değişkenleri
ile bir miktar oynayabilirsiniz.

/*
 * File:   main.c
 * Author: Mehmet
 *
 * Created on 29 Mayıs 2022 Pazar, 12:40
 */


// PIC16F877 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config CP = ALL         // FLASH Program Memory Code Protection bits (0000h to 1FFFh code protected)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = ON         // Data EE Memory Code Protection (Data EEPROM memory code-protected)
#pragma config WRT = OFF        // FLASH Program Memory Write Enable (Unprotected program memory may not be written to by EECON control)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ          4000000

#define FAN                 PORTDbits.RD0
#define FAN_TRIS            TRISDbits.TRISD0

/*
 * 
 */
void mcuHazirla(void)
{
    PORTA = 0x00;
    PORTB = 0x00;
    PORTC = 0x00;
    PORTD = 0x00;
    PORTE = 0x00;

    ADCON1bits.PCFG = 0b0110; //Tüm pinler dijital

    TRISA = 0x00;
    TRISB = 0x00;
    TRISC = 0x00;
    TRISD = 0x00;
    TRISE = 0x00;

    FAN_TRIS = 0b0; //Fan pini çıkış
}

/*
 * 
 */
void kesmeHazirla(void)
{
    //http://eng-serve.com/pic/pic_timer.html
    //Timer0 Registers Prescaler= 8 - TMR0 Preset = 131 - Freq = 1000.00 Hz - Period = 0.001000 seconds
    OPTION_REGbits.T0CS = 0b0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    OPTION_REGbits.T0SE = 0b0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    OPTION_REGbits.PSA = 0b0; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
    OPTION_REGbits.PS2 = 0b0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    OPTION_REGbits.PS1 = 0b1;
    OPTION_REGbits.PS0 = 0b0;
    TMR0 = 131; // preset for timer register

    // Interrupt Registers
    INTCON = 0x00; // clear the interrpt control register
    INTCONbits.TMR0IE = 0b1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
    INTCONbits.TMR0IF = 0b0; // bit2 clear timer 0 interrupt flag
    INTCONbits.GIE = 0b1; // bit7 global interrupt enable
}

/*
 * 
 */
void main(void)
{
    mcuHazirla();
    kesmeHazirla();

    FAN = 0b1;

    while(1)
    {
        
    }
}

/*
 * 
 */
void interrupt ISR(void)
{
    static uint8_t  sayac0, sayac1, sayac2;

    INTCONbits.GIE = 0b0;
    // Timer0 Interrupt - Freq = 1000.00 Hz - Period = 0.001000 seconds
    if(INTCONbits.TMR0IF == 0b1) // timer 0 interrupt flag
    {
        if(FAN == 0b1)
        {
            if(sayac0++ >= 15)
            {
                if(sayac1++ >= 200)
                {
                    if(sayac2++ >= 17)
                    {
                        FAN = 0b0;
                        sayac2 = 0;
                    }
                    sayac1 = 0;
                }
                sayac0 = 0;
            }
        }
        else if(FAN == 0b0)
        {
            if(sayac0++ >= 15)
            {
                if(sayac1++ >= 200)
                {
                    if(sayac2++ >= 180)
                    {
                        FAN = 0b1;
                        sayac2 = 0;
                    }
                    sayac1 = 0;
                }
                sayac0 = 0;
            }
        }

        INTCONbits.TMR0IF = 0b0; // clear the flag
        INTCONbits.TMR0IE = 0b1; // reenable the interrupt
        TMR0 = 131; // reset the timer preset count
        
        INTCONbits.GIE = 0b1;
    }
}
//--------------------------------------------------------------------------

oplynior

Attığınız kodu compile edemedim hata veriyor hangi ide ile yaptınız acaba ?

mehmet


oplynior

Hangi sürüm saçlarım döküldü şu proje yüzünden compile olmuyor :D

oplynior

Kod çalışıyor bu konuyu sonradan okuyacak arkadaşlar için compile etmek için xc8 global options sekmesinde c 90 seçildiği zaman kod compile oluyor ve çalışıyor mehmet hocama teşekkür ederim.