merhaba değerli hocalarım, sevgili arkadaşlarım. öncelikle yeni yıl herkesin gönlünce, güzel, sağlıklı, mutlu ve üzüntünün olmayacağı bir yıl olsun.
benim uğraşıp çözemediğim bir sorunum var. yardımcı olacağınız için teşekkür ederim.
istediğim tam olarak şu ;
pic16f628 ile dahili osilatörü kullanarak 1 buton tanımlayıp 1 kere basıldığında 15 dk sayacak 1. ledi 2 sn çalıştırıp söndürüp tekrar 15 dk sayacak
2. basımda da bu değer 30 dk olacak işlem aynı olacak 3. de ise 1 saat işlemler yine aynı olacak. yani 1 butonla 3 ledi belirlediğim zamanlarda 2 sn çalıştırıp durdurmak
ben bir şeyler yazdım ama sonuca varamadım. yardım ederseniz çok sevinirim.
pic 16f628a olacak düzeltiyorum kusura bakmayın
Noktalı virgülü yanlış yere koymuşsun o yüzden çalışmıyor programın, düzelt çalışacak.
Dördüncü basımda ne olacak?
Hangi led hangi konumda olduğunu
anlamamız gerekecek mi?
4. basımda ilk konuma geri dönecek yani sıfırlanacak 15 dk yı tekrar sayacak süre dolduğunda 2 sn led yanacak sonra tekrar 15 dk sayacak. 2. basımda 30 dk sayacak 2. ledi yakacak 2 sn sonra led sönecek.
(https://s9.postimg.cc/oxru5zzy3/Ads_z.png) (https://postimg.cc/image/oxru5zzy3/)
Merhaba,
Şemayı görünce aklıma geldi.İlk basışta 1.led 15 dakika sonra 2 saniye on sonradan off olacak,ilk basışı algılamak için kullanılmayan pinlerden biri şaseye çekilip sanal bir buton gibi iş görmeli ki ikinci basışta ikinci basış olduğu anlaşılsın.
merhaba hocam.
çalışmalarımı söylediğiniz durumlara göz önünde bulundurarak devam ettireceğim çok sağolun.
Daha iyisi her zaman yazılabilir. Şimdilik idare edin.
// @2017 mehmet (2017 Ocak 03)
// GNU GPL v.3.0
// https://www.gnu.org/licenses/gpl-3.0.en.html
#include <xc.h>
#include <stdint.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RA5/MCLR pin function select (RA5/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOD Reset enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = ON // Data Code Protection bit (Data memory code protected)
#pragma config CP = ON // Code Protection bits (Program memory code protection off)
//#define _XTAL_FREQ 4000000
#define BUTON PORTAbits.RA0
#define LED1 PORTBbits.RB0
#define LED2 PORTBbits.RB1
#define LED3 PORTBbits.RB2
#define MOD1 PORTBbits.RB3
#define MOD2 PORTBbits.RB4
#define MOD3 PORTBbits.RB5
#define ALARM1 15
#define ALARM2 30
#define ALARM3 60
volatile uint8_t sayac1;
volatile uint8_t sayac2;
volatile uint8_t saniye;
volatile uint16_t dakika;
/*
*/
void initMCU(void)
{
PORTA = 0x00;
PORTB = 0x00;
CMCON = 0x07;
TRISA = 0xFF;
TRISB = 0x00;
}
/*
Interrupt Handler
*/
void interrupt ISR(void)
{
//http://eng-serve.com/pic/pic_timer.html
// Timer1 Interrupt - Freq = 10.00 Hz - Period = 0.100000 seconds
if (PIR1bits.TMR1IF == 1) // timer 1 interrupt flag
{
if (sayac1++ > 9)
{
sayac1 = 0;
sayac2 = 1;
}
if (sayac2 == 1)
{
if (saniye++ > 59)
{
if (dakika++ > 1140)//24*60
{
saniye = 0;
dakika = 0;
}
saniye = 0;
}
sayac2 = 0;
}
PIR1bits.TMR1IF = 0; // interrupt must be cleared by software
PIE1bits.TMR1IE = 1; // reenable the interrupt
TMR1H = 158; // preset for timer1 MSB register
TMR1L = 80; // preset for timer1 LSB register //88
}
}
/*
*/
void timerInit(void)
{
//http://eng-serve.com/pic/pic_timer.html
//Timer1 Registers Prescaler= 4 - TMR1 Preset = 40536 - Freq = 10.00 Hz - Period = 0.100000 seconds
T1CONbits.T1CKPS1 = 1; // bits 5-4 Prescaler Rate Select bits
T1CONbits.T1CKPS0 = 0; // bit 4
T1CONbits.T1OSCEN = 1; // bit 3 Timer1 Oscillator Enable Control bit 1 = on
T1CONbits.nT1SYNC = 1; // bit 2 Timer1 External Clock Input Synchronization Control bit...1 = Do not synchronize external clock input
T1CONbits.TMR1CS = 0; // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4)
T1CONbits.TMR1ON = 1; // bit 0 enables timer
TMR1H = 158; // preset for timer1 MSB register
TMR1L = 80; // preset for timer1 LSB register //88
// Interrupt Registers
INTCON = 0; // clear the interrpt control register
INTCONbits.TMR0IE = 0; // bit5 TMR0 Overflow Interrupt Enable bit...0 = Disables the TMR0 interrupt
PIR1bits.TMR1IF = 0; // clear timer1 interupt flag TMR1IF
PIE1bits.TMR1IE = 1; // enable Timer1 interrupts
INTCONbits.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
INTCONbits.GIE = 1; // bit7 global interrupt enable
INTCONbits.PEIE = 1; // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts
}
/*
* ~1,04ms
*/
void mbDelay_ms(uint16_t d)
{
const uint16_t a = 83;
uint16_t i = a;
do{
do
{
NOP();
}while(--i);
i = a;
}while(--d);
}
/*
*/
void main(void)
{
uint8_t secim = 0; //gerekirse 1 den başlatılır. Ancak case 0 iptal edilir, secim > 2 olarak değiştirilir.
initMCU();
timerInit();
mbDelay_ms(500);
while (1)
{
if (BUTON == 1)
{
mbDelay_ms(20);
if (BUTON == 1)
{
if (++secim > 3)
{
secim = 0;
}
while (BUTON) //Butondan el çekince zaman baslayacak
{
saniye = 0;
dakika = 0;
}
}
}
switch (secim)
{
case 0://kapalı
MOD1 = 0;
MOD2 = 0;
MOD3 = 0;
break;
case 1:
MOD1 = 1;
MOD2 = 0;
MOD3 = 0;
if (dakika >= ALARM1)
{
saniye = 0;
dakika = 0;
LED1 = 1;
LED2 = 0;
LED3 = 0;
mbDelay_ms(2000);
LED1 = 0;
LED2 = 0;
LED3 = 0;
}
break;
case 2:
MOD1 = 0;
MOD2 = 1;
MOD3 = 0;
if (dakika >= ALARM2)
{
saniye = 0;
dakika = 0;
LED1 = 0;
LED2 = 1;
LED3 = 0;
mbDelay_ms(2000);
LED1 = 0;
LED2 = 0;
LED3 = 0;
}
break;
case 3:
MOD1 = 0;
MOD2 = 0;
MOD3 = 1;
if (dakika >= ALARM3)
{
saniye = 0;
dakika = 0;
LED1 = 0;
LED2 = 0;
LED3 = 1;
mbDelay_ms(2000);
LED1 = 0;
LED2 = 0;
LED3 = 0;
}
break;
default:
break;
}
}
}
@mehmet çok teşekkür ederim hocam emekleriniz ve yardımlarınız için çok sağolun.
Aslında bu yapı ters olmadı mı? Bir çıkış ve
üç anahtar olması gerekmez miydi?
Motor bir tane. Konum üç tane...
@mehmet 3 tane led koyacağız hocam alt alta durum ledleri 1. led on sa eğer 15 dk da olduğunu anlaycağız 2. led 30 dk yı belirticek 3. led te 60 dk yı
O halde Led1 den motor çıkışı alın. Mod
çıkışları da konum ledleriniz olsun.
675 pinleri de yeterli bu iş için...
@mehmet şimdi bakacağım hocam ledleri mod olarak kullanacağız evet.