CCS C ve PIC16F877A. "D" ve "B" Portu Hakkında.

Başlatan Melih1802, 09 Haziran 2014, 14:07:26

Melih1802

Proteusta bir devre kurdum. Devremde "D" portunu Buton girişi olarak tanımladım. Çıkış olarakta "B" portunu tanımladım.

Proteus similasyonunda hiç bir işlem yapmadan "D" ve "B" portlarımdan giriş ve çıkış aldım.
YazıIlmda bir eksikliğim yada Uygun olmayan port seçimi yaptım.

Önerilerinizi alabilirmiyim.





#include "C:\Users\melih\Desktop\test1\main.h"
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);

  set_tris_d(0x00);   // Burada hata yapmışım. Tanımlama aslında Şöyle olacaktı set_tris_d(0b11111111);
  set_tris_b(0x00);
    output_b(0x00);
     
while(1)
{
if ((input(pin_d1)==1)&(input(pin_d0)==1))
output_high(pin_b0);
else
output_low(pin_b0);
{
if (input(pin_d2)==1)
output_high(pin_b1);
else
output_low(pin_b1);
}
}
}

Salih

set_tris_d(0x00);


Bunu yazmakla, PortD'yi çıkış yapmışsınız. Çıkış olunca bazı pinler rastgele 1 olmuş.
PortD'yi giriş tanımlayın. O zaman Pull-Down dirençleri pinleri sıfıra çeker.

Melih1802

@salih   Tam ben hatamı fark etmiş yazımı düzeltirken sen yazmışsın. Port kullanımımda bir sıkıntı varmıdır. Bu port seçimi uygunmudur.

Salih

Alıntı yapılan: Melih1802 - 09 Haziran 2014, 14:56:09
@salih   Tam ben hatamı fark etmiş yazımı düzeltirken sen yazmışsın. Port kullanımımda bir sıkıntı varmıdır. Bu port seçimi uygunmudur.

PortB'yi giriş olarak kullanırsan, dahili pull-up dirençlerini kullanmış olursun.
Genellikle böyle tercih edilir. PortD'yi çıkış olarak kullanabilirsin.

Melih1802

Programda çalışan bir satırım var.
Amacım "d2" Tuşuna basıldığında "b1 ve b2" çıkışlarınında aynı anda çıkış vermesini istiyorum.  Nasıl yapabilirim.

if (input(pin_d2)==1)
output_high(pin_b1);
else
output_low(pin_b1);

Kabil ATICI

 if (input(pin_d2)==1)
{
output_high(pin_b1);
output_high(pin_b2);
{
else
{
output_low(pin_b1);
output_low(pin_b2);
}

buraya istdiğin gibi ekle
ambar7

Melih1802

Alıntı yapılan: ambar7 - 09 Haziran 2014, 16:57:13
if (input(pin_d2)==1)
{
output_high(pin_b1);
output_high(pin_b2);
{
else
{
output_low(pin_b1);
output_low(pin_b2);
}

buraya istdiğin gibi ekle


Bunu yapmıştım fakat "else" komutunda hata verdi. Yine yaptım yine hata verdi.




Kabil ATICI

#7
Pardon
if (input(pin_d2)==1)
{
output_high(pin_b1);
output_high(pin_b2);
}
else
{
output_low(pin_b1);
output_low(pin_b2);
}

açılan parantez mutlaka kapatılmalı... Bu süslü parantezleri yapmak için ALTGR ile kullanmam gerekiyor bazen elim kayıyor.

Yani hata else'nin değil parantezlerin. else sadece üstüne alınmış... Yada else'nin üstüne kalmış...
ambar7

Melih1802

"d" portundan bir butona bas / bırak yaptığımda buton sanki hala basılıymış gibi aktif durumda kalıyor.
Altta "o" anın ekran alıntısı ve kodlarım var.






#include "C:\Users\melih\Desktop\test1\main.h"
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);

  set_tris_d(0b11111111);//
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
     
while(1)

{
if ((input(pin_d0)==1)&(input(pin_d1)==1))
{
output_high(pin_b0);
output_high(pin_b7);
}
else
{
output_low(pin_b0);
output_low(pin_b7);
}

if (input(pin_d2)==1)
{
output_high(pin_b1);
output_high(pin_b7);
}
  else
{
output_low(pin_b1);
output_low(pin_b7);
}

if (input(pin_d3)==1)
{
output_high(pin_b2);
output_high(pin_b7);
}
else
{
output_low(pin_b2);
output_low(pin_b7);
}

if (input(pin_d4)==1)
{
output_high(pin_b3);
output_high(pin_b7);
}
else
{
output_low(pin_b3);
output_low(pin_b7);
}
if (input(pin_d5)==1)
{
output_high(pin_b4);
output_high(pin_b7);
}
else
{
output_low(pin_b4);
output_low(pin_b7);
}

if (input(pin_d6)==1)
{
output_high(pin_b5);
output_high(pin_b7);
}
else
{
output_low(pin_b5);
output_low(pin_b7);
}

if (input(pin_d7)==1)
{
output_high(pin_b6);
output_high(pin_b7);
}
else
{
output_low(pin_b6);
output_low(pin_b7);
}
}
}

Kabil ATICI

R25 ve R26 üzerinde bağlantıda sorun var. Bir kontrol edin.
Bu arada elemanlarınız özellikle dirençler dijital olarak atanmış durumda değil mi?

Buton bağlantınız konusunda;
buton Vcc+10k+buton+GND bağlantısı ile yapın ve işlemci ucuna 10k+buton noktasından alın.
ambar7

Melih1802

#10
R25 ve R26 "OR" kapısı olarak çalıştığından bir tanesini kısa devre bırakmıştım bilerek.

Şemayı dediğin gibi düzenledim. Butonları "0" a eşitledim.
if (input(pin_d2)==0)

Yinede bir buton' a bas bırak yaptığımda az önceki hata oluyor. Bu sorun bir Proteus sorunu olabilirmi. Similasyonda CPU:%79 oluyor.




Kodların düzenlenmiş hali;

#include "C:\Users\melih\Desktop\test1\main.h"
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);

  set_tris_d(0b11111111);//
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
     
while(1)

{
if ((input(pin_d0)==0)&(input(pin_d1)==0))
{
output_high(pin_b0);
output_high(pin_b7);
}
else
{
output_low(pin_b0);
output_low(pin_b7);
}

if (input(pin_d2)==0)
{
output_high(pin_b1);
output_high(pin_b7);
}
  else
{
output_low(pin_b1);
output_low(pin_b7);
}

if (input(pin_d3)==0)
{
output_high(pin_b2);
output_high(pin_b7);
}
else
{
output_low(pin_b2);
output_low(pin_b7);
}

if (input(pin_d4)==0)
{
output_high(pin_b3);
output_high(pin_b7);
}
else
{
output_low(pin_b3);
output_low(pin_b7);
}
if (input(pin_d5)==0)
{
output_high(pin_b4);
output_high(pin_b7);
}
else
{
output_low(pin_b4);
output_low(pin_b7);
}

if (input(pin_d6)==0)
{
output_high(pin_b5);
output_high(pin_b7);
}
else
{
output_low(pin_b5);
output_low(pin_b7);
}

if (input(pin_d7)==0)
{
output_high(pin_b6);
output_high(pin_b7);
}
else
{
output_low(pin_b6);
output_low(pin_b7);
}
}
}

mesaj birleştirme:: 10 Haziran 2014, 00:55:17

2. output' ları kaldırınca program kusursuz çalışmaya başladı. 2. output' larmı programı kasıyordu. Bunun başka bir yolu var mı' dır.

Kabil ATICI

Dirençleriniz özellik olarak dijital mi?
Analog kaldıysa işlemcinin yükünü artırıyor. (bilgisayarın) simülasyon yavaşlatır. Siz bir iş yaptırırsınız sonrasında simülasyon yavaşladığı için işlemi yapması zaman alır. Fare sağ buton tıkladığınızda ,"Edit Properties" öğesini seçin, "Edit Component" diyalog  penceresinden "Model Type" öğesini "Digital" olarak ayarlayın. Bunu tüm dirençlere uygulayın.
ambar7

Melih1802

Haklıymışsın.

Tüm dirençleri DIGITAL olarak yeniden tanımladım.
Şimdi çok daha iyi oldu. Bir eğitim seti almaktan kaçıyordum ama sanırım bir tane edinmem lazım.

Her butona basınca yanan led biraz titrek sanırım bu similasyondan gelen bir hatadır.

Kabil ATICI

Pic İşlemci üzerinde çalışma frekansını belirlediniz değil mi? Devreye kristal bile takmadan sadece saat frekansı ataması yaparak çalıştırabilirsiniz.
ambar7

Melih1802

#14
Evet hem derleyici' de hem' de Proteusta 4.000.000 Hz olarak tanımladım. Aslında çok zevkli. Öğrenmeye ve anlamaya başlıyorum.
PLC programladığım için temel mantık aynı gibi. PLC de bazı komutlar için uzun uzun satırlar yazmak zorundasınız.

Örn: Aynı anda 2 tuş birden basılmışsa ver her 2 tuştanda el çekilinceye kadar tuş takımı bloke etmek için 20 tuşu biribirinle karşılaştırıyordum. 20 tuş için bu sayfalar sürüyordu. Sanırım CCS C de bu 1-2 satırda bitebilecek bir şey olacak.

Öğrendiklerimi bir yere not ediyorum. Umarım bir gün benimde bu konuda faydam dokunur.

mesaj birleştirme:: 10 Haziran 2014, 23:51:20

#define  Bu komutu kısaltılmasını istediğimiz bir komut için kullanıyoruz. Burada kısaltma sınırı nedir.

Örn: Böyle bir komut grubum var.

if (input(pin_d2)==0)
{
output_high(pin_b1);
output_high(pin_b7);
}
  else
{
output_low(pin_b1);
output_low(pin_b7);
}

Bu grubun içersinden " output_high(pin_b1); " Bunu kısaltabiliyorum.


Peki bunu kısaltabilirmiyim " output_high(pin_b1); " komple satırı.
#define outb1 output_high(pin_b1); olabilirmi.


Yada bu iş nasıl yapılır. Kurallar, sınırlar ve olasılıklar nedir.