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);
}
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.
tam olarak anlayamadım artan değişkeni resetlemeyi silmem mi gerekiyor sadece 1200 ve 12000 sayıları doğru mudur ?
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;
}
}
//--------------------------------------------------------------------------
Attığınız kodu compile edemedim hata veriyor hangi ide ile yaptınız acaba ?
MPLABX XC8
Hangi sürüm saçlarım döküldü şu proje yüzünden compile olmuyor :D
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.