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.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

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;
    }
}
//--------------------------------------------------------------------------
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

oplynior

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

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

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.