Ö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 .
(https://s17.postimg.cc/8bc51f5h7/deneme_resmi.jpg) (https://postimg.cc/image/8bc51f5h7/)
http://www.mehmetbilgi.net.tr/?q=node/6
Hazır yapılmışı var...
Yardımı olur umarım. MPLAB XC8 ile yazıldı.
Öncelikle ilginizden dolayı teşekkür ederim.
nette çok aramama rağmen bulamamıştım.
Hemen xc8'i indirip deneyeceğim sonucu bildiririm.
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.
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.
kullanilan program dip switch icin.
buton kullanilacaksa her buton icin if ile kontrol edilip cikis yapilacak pinin toggle edilmesi gerekiyor
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
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);
}
}
"Türkçe Yazım Kuralları" na dikkat ediniz....
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.
@necati;
mesajınıza kod eklerken "KOD" butonunu
kullanınız. Buna göre mesajınızı yeniden
düzenleyiniz.
#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
}}
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.
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 ?
Ö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.
Merhaba,
Evet konu şimdi daha kolay hale geldi.Hele de kamu yararına olduğuna göre ben de bildiğim kadarı ile katkıda bulunmak isterim.
Aklıma yine bir soru geldi.Orijinal butonlar dış ortamlarda problem çıkarttığına göre siz kendi butonlarınızı nasıl muhafaza edeceksiz.Orijinaller sert şartlara göre tasarlanmış olmasına rağmen sizin elektronik minik butonlar nasıl iş görecek ? Ayrıca her butondan geçen akım çok önemlidir.
röle seçiminde bilinmesi gereken bir parametredir.
Çok daha önemli bir konu da YASAL durumdur.Şartları kabul edilmiş ve de onaylanmış bir itfaiye aracı üzerinde tadilat yapmak büyük sorumluluk getirir ve problem anında size sorun olur.Bu sizi yıldırmasın ama durum budur.Siz yine projenize amatörce devam edin ben de elimden geldiğince en iyisi olacak şekilde tasarlayacağım ama uygulama işini ben bilemem.Konu her ne kadar basit gibi görünse de uygulamada çok değişik olasılıklar çıkacaktır.İtfaiye araçları çok özel ekipmanlar ve de değişik malzemeler kullanan bir araçtır.Tüm spesifikasyonlarını bilmek gerekir.
Konu bence enteresan olup takipteyim.
İlginizden dolayı teşekkür ederim şu an araç üzerinde kullanılan malzemeler çok basi ve koly arıza yapabilen parçalar ben ise su geçirmez kutu içerisine koymayı ve yüzeyinde tuşların önüne özel yüzey kullanmayı düşünüyorum kart ve role kısmını ben halladebilirim yalnızca programda takıldım yardımcı olursanız çok sevineceğim
RAHMAN VE RAHİM OLAN ALLAH'ın adıyla başlarım.
Bahsettiğin şey için pic kullanmana gerek yok tek butonla start stop yapmak için impuls roleler var. bunları kullanabilirsin. Basıldığı sürece calışması için de zaten rolenin bobin uçlarına seri buton bağlaman yeterli.
Birileri bizi hobicilerin zihnisinir pro'c'elerinden korusun.
Çoğumuz kullandığınız yangın hortumunun,
başıboş bırakıldığı durumda
ancak çizgi filmlerde yılan gibi dans edeceğini zannederiz,
halbuki basınç altındaki yangın hortumunu başka yere yönlendirmek için
3-5 adam yetmeyebilir dahi.
Şimdi ben yangın görüp,
bakkaldan yarım litre şişe su alıp, söndürmeye koşsam,
sizin şuanki durumunuza denk gelir.
Yanlışı görüpte uyarmamak, o yanlışa ortak olmak demektir.
valla bu kadar ciddi bir konuda böyle amatör bir çalışma hata olur
bu iş oyuncak değilki?
zelio akıllı röle ile yapın o işi
hiç saçmalamaz, taş gibi çalışır.
http://www.schneider-electric.com.tr/tr/product-range/531-zelio-ak-ll--role/
Bende Zelio akıllı role kullanilmasi taraftarıyım.
Ayrıca butonlar için sizin bir kutu yapmanıza gerek yoktur.
Su, toz , darbe geçirmeyen hem kutu hemde butonlar mevcud. DaHa çok vinç kumandalarında kullanılır. Kablo olarak da silikon spiral kablo takılır. Örneklerin olduğu görsellere aşağıdaki linke tıklayarak ulaşabilirsiniz.
https://www.google.com.tr/search?q=vinc+buton+kutusu&client=ms-android-samsung&prmd=ivn&source=lnms&tbm=isch&sa=X&ved=0ahUKEwif8-HXysTVAhWFYVAKHZFcCgwQ_AUICSgB&biw=360&bih=560