tek buton 3 çıkış

Başlatan snansrin, 02 Ocak 2018, 17:33:38

snansrin

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.

snansrin

pic 16f628a olacak düzeltiyorum kusura bakmayın

Melih1802

Noktalı virgülü yanlış yere koymuşsun o yüzden çalışmıyor programın, düzelt çalışacak.

mehmet

Dördüncü basımda ne olacak?
Hangi led hangi konumda olduğunu
anlamamız gerekecek mi?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

snansrin

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.

snansrin


kudretuzuner

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.
Amatör

snansrin

merhaba hocam.
çalışmalarımı söylediğiniz durumlara göz önünde bulundurarak devam ettireceğim çok sağolun.

mehmet

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;
        }
    }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

snansrin

@mehmet  çok teşekkür ederim hocam emekleriniz ve yardımlarınız için çok sağolun.

mehmet

Aslında bu yapı ters olmadı mı? Bir çıkış ve
üç anahtar olması gerekmez miydi?

Motor bir tane. Konum üç tane...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

snansrin

@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ı

mehmet

O halde Led1 den motor çıkışı alın. Mod
çıkışları da konum ledleriniz olsun.

675 pinleri de yeterli bu iş için...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

snansrin

@mehmet şimdi bakacağım hocam ledleri mod olarak kullanacağız evet.