16F676 dijital io ?

Başlatan erkan614, 11 Haziran 2020, 15:30:46

erkan614

resinde görüldüğü üzere Ra0 Ra1 Ra2 girişlerim tam djital değil
 konfigurasyonumda neler yapmalıyım?

'****************************************************************
#CONFIG
      __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF  & _CP_ON
#ENDCONFIG
'****************************************************************
DEFINE OSC 4
define OSCCAL_1K 1
'****************************************************************
PORTA=0
PORTC=0
INTCON=0
OPTION_REG=0
CMCON=7             ' Comparator Off
ADCON0=%10000000     'ADC oFF
ADCON0=%10000000     'ADC oFF
ANSEL =%00000000    'AN2 seçildi Kalan io
TRISA=%00011111     'RA5 Out all İn
TRISC=%00001001
'****************************************************************
BT1 VAR PORTA.3
BT2 VAR PORTC.3
In1 var porta.0
In2 var porta.1
In3 var porta.2
In4 var portc.0
Out VAR PORTA.5
Red VAR PORTC.2
Green VAR PORTC.1
L15 VAR PORTC.4
L30 VAR PORTC.5
L60 VAR PORTA.4
TM VAR WORD
ZM var word
tm=0
ZM=0

BASLA:
    PORTA=0
    PORTC=0
    iF BT1=0 THEN high Out  
    iF BT2=0 THEN high red
    iF in1=1 THEN high green
    iF in2=1 THEN high l15
    iF in3=1 THEN high l30
    iF in4=1 THEN high l60
goto basla
END

Maxim

protonda şöyle bir komut var
picbasic karşılığı aklıma gelmedi

Alıntı yapılan: undefinedDeclare All_Digital= true

efsanepoldem

#2
A

mehmet

"in" kısımlarının yapısını butonlar
gibi yaparsanız sıkıntı kalmaz sanırım.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

erkan614

Alıntı yapılan: mehmet - 11 Haziran 2020, 16:47:43"in" kısımlarının yapısını butonlar
gibi yaparsanız sıkıntı kalmaz sanırım.
Donanım izin vermiyor ne yazik ki

mehmet

#5
Basic bilmiyorum. Ancak bu şekilde
istediğiniz gibi. TRISA 'ya dikkat edin.

// PIC16F676 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTRCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/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      // RA3/MCLR pin function select (RA3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON      // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = ON          // Code Protection bit (Program Memory code protection is enabled)
#pragma config CPD = ON        // Data Code Protection bit (Data memory code protection is enabled)

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

#include <xc.h>

#define BT1    PORTAbits.RA3
#define BT1    PORTCbits.RC3

#define IN1    PORTAbits.RA0
#define IN2    PORTAbits.RA1
#define IN3    PORTAbits.RA2
#define IN4    PORTCbits.RC0

#define OUT    PORTAbits.RA5
#define RED    PORTCbits.RC2
#define GREEN  PORTCbits.RC1
#define L15    PORTCbits.RC4
#define L30    PORTCbits.RC5
#define L60    PORTAbits.RA4

/*TM VAR WORD
ZM var word
tm=0
ZM=0*/

/*
 * 
 */
void mcuInit(void) 
{
    CMCON      = 0x07;
    INTCON      = 0x00;
    OPTION_REG  = 0x00;
    ADCON0      = 0b10000000; 
    ANSEL      = 0b00000000;
    PORTA      = 0x00;
    PORTC      = 0x00;
    TRISA      = 0b00001111; 
    TRISC      = 0b00001001;
}

/*
 * 
 */
void main(void) 
{
    mcuInit();

    while (1) 
    {

    }
}
//

IN1 'i ben kapadım.

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

ete

#6
Pic16F676 işlemcide A portu öncelikle default olarak Comparatör pini olarak açılır.
Birinci aşamda komparatörün devre dışı bırakılması gerekir. Komutu CMCON=7 olup bu programda verilmiş.
Komparatör özelliği kapatıldığınd ikinci aşamda A portu ADC pinlerine döner.Port digital pinler olarak kullanabilmek için ADC özelliğininde kapatılması gerekir. Bu işi de işlemcide ANSEL registeri yapıyor ve ANSEL=%00000000 şeklinde bir değer verilmesi ile bu işlemde yapılmış oluyor.

Geriye ilgili pinlerin Digital giriş olarak ayarlanması gerekir ki oda TRISA=%00011111  şeklinde yapılmış. Bu durumda program tarafında bir sorun olmaması gerekir. Sorun Isis şemasında bana kalırsa.
Dirençler Analog yerine Digital seçilmiş yada ayarlanmış ise bu tür hatalar çıkabiliyor. Bence şemayı kontrol edip olması gerektiği gibi elemanları ayarlayın veya yeni baştan bir şema çizin.
Programın yanında simulasyon dosyasınıda koysaydınız daha net konuşabilirdik.
Bu arada yeni farkettiğim bir kusur daha var. Oda giriş pinleri için dahili PULLUP dirençlerini aktif etmişsiniz. OPTION_REG=0 komutu bunu yapıyor. Bunda bir kusur yok ama aynı giriş pinlerini PULL_DOWN yani GND ye çekerek kullanınca orada bir çakışma yada olumsuz durum oluşuyor.
Bir yandan dahili dirençler pini HIGH yapmaya uğraşırken haricen bağladığınız Pull-Down dirençleride LOW yapmaya çalışıyorlar. Asıl hatanız budur.!!!!!!!
Size tavsiyem bir devrede buton yada switch kullanıyorsanız bu pinleri daima PULLUP olarak kullanın. Hatta işlemciye eklenen dahili pullup dirençleri sırf bu amaçla yerleştirilmiş olup sisteminiz pulluplı kullanırsanız hem boşuna birde dışarıdan direnç bağlamak zorunda kalmaz ve melzemeden tasarruf etmiş olursunuz hemde devreniz sadeleşir hata imkanı daha aza düşmüş olur.
BU şemayı pullup li sisteme çevirmek için anahtar pinlerindeki pulldown dirençlerini kaldırın ve programa OPTION_REG.7=0 komutunu ekleyin.
Programa bir bakarsanız buton yada switch pinlerinide yanlış kontrol ettiğinizi görebilirsiniz.
Devre şemanıza göre anahtar kapandığında bağlı olduğu pine HIGH verilir. Anahtar açınca pulldown direnci nedeni ile bağlı olduğu pinde LOW görülmesi gerekir.
Ama siz iF BT1=0 THEN high Out  şeklindeki komut ile ilgili pin LOW ise git şu işi yap demişsiniz. BU durumda programınız anahtarların açık olma durumlarını yakalamaya çalışıyor. Buda yanlış olan bir şey.
Bana kalırsa programın anahtar kontrol kısmına dokunmayın ve şemanızı pullup lı sistem çevirin. Anahtar kapanınca ilgili pine LOW verilmiş olsun.
Doğru program şöyle olmalı;
#CONFIG
      __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF  & _CP_ON
#ENDCONFIG
'****************************************************************
DEFINE OSC 4
define OSCCAL_1K 1
'****************************************************************
PORTA=0
PORTC=0
INTCON=0
OPTION_REG.7=0
CMCON=7             ' Comparator Off
'ADCON0=%10000000     'ADC oFF
'ADCON0=%10000000     'ADC oFF
ANSEL =%00000000    'AN2 seçildi Kalan io
TRISA=%00011111     'RA5 Out all İn
TRISC=%00001001
'****************************************************************
BT1 VAR PORTA.3
BT2 VAR PORTC.3
In1 var porta.0
In2 var porta.1
In3 var porta.2
In4 var portc.0
Out VAR PORTA.5
Red VAR PORTC.2
Green VAR PORTC.1
L15 VAR PORTC.4
L30 VAR PORTC.5
L60 VAR PORTA.4
TM VAR WORD
ZM var word
tm=0
ZM=0
pause 200

BASLA:
    PORTA=0
    PORTC=0
    iF BT1=0 THEN high Out  
    iF BT2=0 THEN high red
    iF in1=0 THEN high green
    iF in2=0 THEN high l15
    iF in3=0 THEN high l30
    iF in4=0 THEN high l60
goto basla
END
Bu kodun doğru çalışması içinde PORTA.3 pinine, PORTC.0 ve PORTC.3 pinlerine birer pullup direnci bağlanmalıdır. Diğer giriş pinleri dahili pullup direnci ile çalışacaktır.


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

erkan614

Option_reg=%10000000
Yaptım is halloldu
Teşekkürler herkese