pic ile role kontrolünde yardım

Başlatan yargicim, 29 Temmuz 2017, 16:16:24

yargicim

Öncelikle herkese merhaba bir haftadır araştırmama rağmen içinden çıkamadığım bir projeu hakkında yardımlarınızı bekliyorum
PIC16F877 ile bir devre yapmaya çalışıyorum 13 butonum var ve 13 adet rolem her buton bir roleye hitap edecek rolelerin bir kısmı butona basıp bıraktığında sürekli çekili kalacak taki bir dahaki sefer basana kadar. bir kısmı ise çek bırak şeklinde çalışacak.
eke devremin şeklini ekledim.
1. sorum bu devrenin programını ccs c ile mi yazmak kolay yoksa assmbly ile mi NOT: her ikisinde de acemiyim, çok kötüyüm.
2. sorum ise roleler çektirdikten sonra çekili kalması için ve diğer role çek bırak yaptığında sonraki rolelerin etkilenmemesi için hangi komutu kullanmam gerekiyor.
NOT:  bu proje kesinlikle okul için veya ticari amaçlı değil tamamen hobi amaçlıdır.
yardımlarınızı bekliyorum .



mehmet

http://www.mehmetbilgi.net.tr/?q=node/6

Hazır yapılmışı var...
Yardımı olur umarım. MPLAB XC8 ile yazıldı.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

yargicim

Öncelikle ilginizden dolayı teşekkür ederim.
nette çok aramama rağmen bulamamıştım.
Hemen xc8'i indirip deneyeceğim sonucu bildiririm.

yargicim

#3
mehmet hocam dediğiniz şekilde indirdim kurdum fakat dün geceden beri uğraşıyorum xc8 programını hiç bilmediğim için bir arpa boyu kadar bile yol alamadım. O kodları derleyemedim.
siz derledi iseniz her buton bas on bırak off olarak mı çalışıyor bilgi verebilirmisiniz ?
eğer öyle çalışı yor ise benim istediğim butonların 7 adedi basınca led yanacak tekrar basınca sönecek, 6 adedi basınca led yanacak bırakınca sönecek şeklinde olmasını istiyorum. kendi uğraşımla yada netten bulduklarımı birleştirince 6 adet ledi basınca yanıp bırakınca sönecek şekilde ayarladım fakat 7 adedi beceremedim.
yazdığım kodu aşağıya ekledim kontrol ederseniz sevinirim bundan sonrasını nasıl devam etmem gerekli. Yada nerelerde hatam var.

#include "C:\Users\XDOS\Desktop\pic c denemesi\main.h"
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(b)
#use fast_io(d)
//#byte portb=6
#byte portc=7
#byte portd=8

int giris;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
set_tris_a(0xff);
set_tris_b(0xff);
set_tris_c(0x00);
set_tris_d(0x00);
output_c(0x00);
//output_c(0x00);
output_d(0x00);
basla:
giris=input_a();
//giris=giris&0x0b00111111;
portd=giris;
goto basla;
}

umarım olmuştur.

mehmet

Benim yaptığım 16 buton ile 16 çıkışı kontrol etmek. Herhangi bir
butona basınca ilgili çıkışta değşim oluyor ve butona tekrar
basana kadar o şekilde kalıyor.
RA4 open-collector tipinde çıkış olduğu için pull-up direnci
kullanmak gerekli.

Bir de genel değişenleri işaretli tanımlamışım. Onları da işaretsize
çevirseniz sıkıntı yok.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

aliveli

kullanilan  program dip switch icin.
buton kullanilacaksa her buton icin if ile kontrol edilip cikis yapilacak pinin toggle edilmesi gerekiyor

yargicim

mehmet hocam genel değişkenlerden kastınız nedir  :-[ ben o kadar uzman değilim !!! nasıl yapıldığını bilmiyorum maalesef.
sayın aliveli bey önce mehmet hocamın dediğini yapayım başaramazsam sizin dediğinizi yaparım ikisi ile birlikte uğraşınca çorba olan kafam hepten allak bullak oluyor umarım kızmazsınız

mehmet

Bunlar söylediğim şekilde çalışıyor...

/*
 * File:   main.c
 * Author: mbmb
 *
 * Created on 11 Temmuz 2015 Cumartesi, 20:15
 * 16 giriş ve 16 çıkış ile ayrı ayrı kontrol
 * her giriş ve her çıkış bağımsız olarak çalışmaktadır.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// PIC16F877A Configuration Bit Settings
// 'C' source line config statements

#include <xc.h>

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

// 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 BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = ON          // Flash Program Memory Code Protection bit (All program memory code-protected)

#define _XTAL_FREQ              4000000L //4MHz harici kristal

#define BASILI_BUTON_MAX        16
uint8_t basiliButon[BASILI_BUTON_MAX] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
uint8_t basiliButonSon[BASILI_BUTON_MAX] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

//Butonlar ve ledlerin portları
#define LED0                PORTCbits.RC0
#define LED1                PORTCbits.RC1
#define LED2                PORTCbits.RC2
#define LED3                PORTCbits.RC3
#define LED4                PORTCbits.RC4
#define LED5                PORTCbits.RC5
#define LED6                PORTCbits.RC6
#define LED7                PORTCbits.RC7
#define LED8                PORTAbits.RA0
#define LED9                PORTAbits.RA1
#define LED10               PORTAbits.RA2
#define LED11               PORTAbits.RA3
//#define LED12               PORTAbits.RA5//PORTAbits.RA4   normalde RA4 ancak open collector oldugu için RE2 yaptım
#define LED12               PORTAbits.RA5 //PORTAbits.RA4   normalde RA4 ancak open collector oldugu için RE2 yaptım
#define LED13               PORTEbits.RE0
#define LED14               PORTEbits.RE1
#define LED15               PORTEbits.RE2

#define BUTON0              PORTBbits.RB0
#define BUTON1              PORTBbits.RB1
#define BUTON2              PORTBbits.RB2
#define BUTON3              PORTBbits.RB3
#define BUTON4              PORTBbits.RB4
#define BUTON5              PORTBbits.RB5
#define BUTON6              PORTBbits.RB6
#define BUTON7              PORTBbits.RB7
#define BUTON8              PORTDbits.RD0
#define BUTON9              PORTDbits.RD1
#define BUTON10             PORTDbits.RD2
#define BUTON11             PORTDbits.RD3
#define BUTON12             PORTDbits.RD4
#define BUTON13             PORTDbits.RD5
#define BUTON14             PORTDbits.RD6
#define BUTON15             PORTDbits.RD7

uint8_t val;
uint8_t val2;
uint8_t buttonState;
uint8_t lightMode = 0;

/*
 * Mcu başlangıç ayarları
 */
static void mcuInit(void)
{
    PORTA = 0x00;
    TRISA = 0x00;

    PORTB = 0x00;
    TRISB = 0xFF;

    PORTC = 0x00;
    TRISC = 0x00;

    PORTD = 0x00;
    TRISD = 0xFF;

    PORTE = 0x00;
    TRISE = 0x00;

    ADCON1bits.PCFG = 0b0110;
    CMCONbits.CM = 0b111;

}

/*
 *  Timer0 için ön hazırlık.
 *  http://eng-serve.com/pic/pic_timer.html
 *  Bu sitede oluşturulan kodlar ile küçük düzenlemeler yapılmaktadır...
 */
void timerInit(void)
{
    //Timer0 Registers Prescaler= 4 - TMR0 Preset = 6 - Freq = 1000.00 Hz - Period = 0.001000 seconds
    OPTION_REGbits.T0CS = 0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    OPTION_REGbits.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    OPTION_REGbits.PSA = 0; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
    OPTION_REGbits.PS2 = 0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 1;
    TMR0 = 6; // preset for timer register

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

/*
 * Çıkış olarak tanımlanan portlara gereken değerler veriliyor...
 */
void ledYak(void)
{
    LED0 = basiliButon[0];
    LED1 = basiliButon[1];
    LED2 = basiliButon[2];
    LED3 = basiliButon[3];
    LED4 = basiliButon[4];
    LED5 = basiliButon[5];
    LED6 = basiliButon[6];
    LED7 = basiliButon[7];

    LED8 = basiliButon[8];
    LED9 = basiliButon[9];
    LED10 = basiliButon[10];
    LED11 = basiliButon[11];
    LED12 = basiliButon[12];
    LED13 = basiliButon[13];
    LED14 = basiliButon[14];
    LED15 = basiliButon[15];
}

/*
 * Basılan buton var mı?
 */
void butonOku(uint8_t sonButon)
{
    lightMode = basiliButon[sonButon];
    buttonState = basiliButonSon[sonButon];

    switch(sonButon)
    {
        case 0:
            val = BUTON0;
            break;
        case 1:
            val = BUTON1;
            break;
        case 2:
            val = BUTON2;
            break;
        case 3:
            val = BUTON3;
            break;
        case 4:
            val = BUTON4;
            break;
        case 5:
            val = BUTON5;
            break;
        case 6:
            val = BUTON6;
            break;
        case 7:
            val = BUTON7;
            break;
        case 8:
            val = BUTON8;
            break;
        case 9:
            val = BUTON9;
            break;
        case 10:
            val = BUTON10;
            break;
        case 11:
            val = BUTON11;
            break;
        case 12:
            val = BUTON12;
            break;
        case 13:
            val = BUTON13;
            break;
        case 14:
            val = BUTON14;
            break;
        case 15:
            val = BUTON15;
            break;
    }

    __delay_ms(10); //10ms sonra yeniden okunması debounce içindir.

    switch(sonButon)
    {
        case 0:
            val2 = BUTON0;
            break;
        case 1:
            val2 = BUTON1;
            break;
        case 2:
            val2 = BUTON2;
            break;
        case 3:
            val2 = BUTON3;
            break;
        case 4:
            val2 = BUTON4;
            break;
        case 5:
            val2 = BUTON5;
            break;
        case 6:
            val2 = BUTON6;
            break;
        case 7:
            val2 = BUTON7;
            break;
        case 8:
            val2 = BUTON8;
            break;
        case 9:
            val2 = BUTON9;
            break;
        case 10:
            val2 = BUTON10;
            break;
        case 11:
            val2 = BUTON11;
            break;
        case 12:
            val2 = BUTON12;
            break;
        case 13:
            val2 = BUTON13;
            break;
        case 14:
            val2 = BUTON14;
            break;
        case 15:
            val2 = BUTON15;
            break;
    }

    if(val == val2)
    {
        if(val != buttonState)
        {
            if(val == 0)
            {
                if(lightMode == 0)
                {
                    lightMode = 1;
                }
                else
                {
                    lightMode = 0;
                }
            }
        }
        buttonState = val;
        basiliButon[sonButon] = lightMode;
        basiliButonSon[sonButon] = buttonState;
    }
}

/*
 * Interrupt Handler
 * Timer0 kesme oluşturduğunca çalışacak kodlar..
 */
void interrupt ISR(void)
{
    // Timer0 Interrupt - Freq = 1000.00 Hz - Period = 0.001000 seconds
    if(INTCONbits.TMR0IF == 1) // timer 0 interrupt flag
    {
        ledYak();

        INTCONbits.TMR0IF = 0; // clear the flag
        INTCONbits.TMR0IE = 1; // reenable the interrupt
        TMR0 = 6; // reset the timer preset count
    }

}

/*
 * Ana Fonksiyon...
 */
void main(void)
{
    mcuInit();
    timerInit();

    while(1)
    {
        butonOku(0);
        butonOku(1);
        butonOku(2);
        butonOku(3);
        butonOku(4);
        butonOku(5);
        butonOku(6);
        butonOku(7);

        butonOku(8);
        butonOku(9);
        butonOku(10);
        butonOku(11);
        butonOku(12);
        butonOku(13);
        butonOku(14);
        butonOku(15);
    }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mehmet

"Türkçe Yazım Kuralları" na dikkat ediniz....
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

yargicim

#9
sayın Necati bey cevabınız için teşekkür ederim istediğim gibi olmuş, bir sorum olacaktı?
d0 yanık iken a5' e basınca d0'ı söndürüp d5'i yakıyor yada a6 basılınca bir önceki led sönüyor. Bunun önüne nasıl geçebilirim.
şöyle mesela d0, d5, d8 çıkışları aktif iken a3 e basıldığında diğerlerini söndürmeyecek bastığım her buton açık kalacak.
Bu dediğim mesele için nasıl bir kod eklemem gerekiyor.

mehmet

@necati;
mesajınıza kod eklerken "KOD" butonunu
kullanınız. Buna göre mesajınızı yeniden
düzenleyiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

necati

#include <16F877.h>//
#FUSES   NOWDT,XT,NOPUT,PROTECT,BROWNOUT,NOLVP

#use delay(clock=4000000)//

#Byte Port_A = 0x05           
#Byte Port_B = 0x06           
#Byte Port_C = 0x07
#Byte Port_D = 0x08
#Byte Port_E = 0x09
/***entegreterbiyecisi@yahoo.com***/ //define lcd
#use    fast_io     (a)
#use    fast_io     (b)
#use    fast_io     (c)
#use    fast_io     (d)
#use    fast_io     (e)
/////////////////////////////////////////////////
int1 a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0;

int1 b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0;
//////////////////////////////////////////////////
void main(){
             
       setup_adc_ports(no_analogs);
       set_tris_a(0b11111111);     
       set_tris_b(0b11111111);
       set_tris_c(0b00000000);
       set_tris_d(0b00000000);
       set_tris_e(0b11111111);
       port_b_pullups(0b11111111);
       Port_C = 0;
       Port_D = 0;
       output_bit(PIN_c3,0);
       delay_ms(20);       
/////////////////////////////////////////////////////
While(true){
if(!input(pin_b0)){output_bit(PIN_c0,1);}else{output_bit(PIN_c0,0);}//on of

 
 
   
 
if((!input(pin_a0))&&(a0==0)){output_bit(PIN_d0,1);a0=1;delay_ms(1000);}//on
if((!input(pin_a0))&&(a0==1)){output_bit(PIN_d0,0);a0=0;delay_ms(1000);}//off

if((!input(pin_a1))&&(a1==0)){output_bit(PIN_d1,1);a0=1;delay_ms(1000);}//on
if((!input(pin_a1))&&(a1==1)){output_bit(PIN_d1,0);a0=0;delay_ms(1000);}//off

if((!input(pin_a2))&&(a2==0)){output_bit(PIN_d2,1);a0=1;delay_ms(1000);}//on
if((!input(pin_a2))&&(a2==1)){output_bit(PIN_d2,0);a0=0;delay_ms(1000);}//off

if((!input(pin_a3))&&(a3==0)){output_bit(PIN_d3,1);a0=1;delay_ms(1000);}//on
if((!input(pin_a3))&&(a3==1)){output_bit(PIN_d3,0);a0=0;delay_ms(1000);}//off

if((!input(pin_a4))&&(a4==0)){output_bit(PIN_d4,1);a0=1;delay_ms(1000);}//on
if((!input(pin_a4))&&(a4==1)){output_bit(PIN_d4,0);a0=0;delay_ms(1000);}//off

if((!input(pin_e0))&&(a5==0)){output_bit(PIN_d5,1);a0=1;delay_ms(1000);}//on
if((!input(pin_e0))&&(a5==1)){output_bit(PIN_d5,0);a0=0;delay_ms(1000);}//off

if((!input(pin_e1))&&(a6==0)){output_bit(PIN_d6,1);a0=1;delay_ms(1000);}//on
if((!input(pin_e1))&&(a6==1)){output_bit(PIN_d6,0);a0=0;delay_ms(1000);}//off

if((!input(pin_e2))&&(a7==0)){output_bit(PIN_d7,1);a0=1;delay_ms(1000);}//on
if((!input(pin_e2))&&(a7==1)){output_bit(PIN_d7,0);a0=0;delay_ms(1000);}//off


}}
[email]entegreterbiyecisi@yahoo.com[/email]

yargicim

sayın Necati bey cevabınız için teşekkür ederim istediğim gibi olmuş, bir sorum olacaktı?
d0 yanık iken a5' e basınca d0'ı söndürüp d5'i yakıyor yada a6 basılınca bir önceki led sönüyor. Bunun önüne nasıl geçebilirim.
şöyle mesela d0, d5, d8 çıkışları aktif iken a3 e basıldığında diğerlerini söndürmeyecek bastığım her buton açık kalacak.
Bu dediğim mesele için nasıl bir kod eklemem gerekiyor.

kudretuzuner

Merhaba,
Bu yazıyı takip etmekteyim.Anlayamadığım bir durum var.PIC'in çalışması için bir senaryo yazılır ve sabitlenir.Yani ne yapılması isteniyorsa bir akış diyagramı ile (algoritma ile)hazırlanır ve program yazılır.Ben istenen işlerin ne olduğunu tam anlayamadım.O yansın bu sönsün o yanıkken bu niye sönüyor gibi sorular algoritmanın sağlıklı olmadığını gösteriyor.Bilmem yanılıyor muyum ?

Amatör

yargicim

Öncelikle tüm ilgilenen ve takip eden ustalarıma teşekkür ediyorum.
Ben Bursa İtfaiyesinde bakım bölümünde çalışıyorum.
İtfaiye araçlarının su pompalarında normal buton bulunmakta ve
bu butonlar su ve toz aldıkları için zamanla olay yerinde pompayı devreye geçirmekte ve diğer işlemleri yapmakta problem çıkartmaktadır. Ben de bu sorunun önüne geçmek için bir tuş paneli hazırlayıp kutu içerisine koymayı düşünüyorum. panelin üzerinde 13 adet buton bulunmakta bunların bir kısmı sürekli aktif iken bir kısmı da on of olarak çalışmakta. şöyle ki dış aydınlatmayı çalıştıran butona basıldığı zaman dış aydınlatmalar yanacak tekrar basınca sönecek bu esnada pompa gaz arttırma tuşu ise butona basılı olduğu sürece aktif kalacak bırakınca pasif duruma geçecek butonlardan 6 adedi basılı kaldığı sürece aktif bırakınca pasif olacak 7 adedi ise her basıldığı zaman aktif tekrar basıldığında pasif olacak. Umarım derdimi anlatabilmişimdir.
Not PIC çıkışında transistör ve role kullanmayı düşünüyorum.