XC8 Yeni başlayanlar için basit sorular

Başlatan Extreme, 02 Mart 2015, 15:50:54

Extreme

Merhaba arkadaşlar çok kısıtlı zamanım olduğu için basit bir soru sormak zorundayım.


int adc = 1020; ( bu rakam 0 ile 1023 arası değişecek)
unsigned char send1
unsigned char send2

şimdi benim bu sayıyı 4.25 (0.00 ile 5.00) arasında değişecek şekilde ayırıp
virgülden önceyi send1 , virgülden sonrayı send2 değişkenine aktarmak istiyorum
Ayrıca değişken tanımlaması gerekiyorsa tanımlananabilir

direkt olarak Çözüm odaklı cevap verirseniz çok memnun olurum.


Emin Aydın EROĞLU

float deger;
deger=adc*0,00488; // 0-1023 arasında okuduğun adc değerini gerilime çevirir.
deger*=100; // degeri 100 ile çarpıp tam sayı haline gitirir.
send1=(int)(deger/100);  // degerin 1. hanesini sen1' e atar.
send2= deger % 100; degerin 100e bölümünden kalanı send2 ye atar. Yani virgülsen sonrasını send2 ye atar.

Extreme

Nokta atışı hocam teşekkürler.

apsis

#3
ben burada port yönlendirmeleriyle ilgili birşey göremedim!.
pardon arkadaşlar başka yere bu yorumu yazacaktım yanlışıkla buraya yazdım. bunu silebilirsiniz.
"Makineye Beyin" MEKATRONİK

Extreme

#4
Mikrodenetleyici: 18F4620
Analog olarak AN0,AN1 VE AN3 tanımlamak istiyorum.
Diğerleri Dijital olmak zorunda.

ADCON1 =  ? ;



yardımcı olursanız çok mutlu olurum

Emin Aydın EROĞLU


Extreme

Alıntı yapılan: Emin Aydın EROĞLU - 02 Mart 2015, 18:01:37
ADCON1=0x0B olacak


iş yoğunluğundan biraz affaladım galiba.
kağıtda aynısı yazıyor. niyeyse tabloya daldım.

teşekkürler hocam.

Extreme

#7
Uzun uzun anlatıp kafa karıştırmak istemiyorum.

Bir sinyalin gerilimini(RA0) başka bir bacağa gelen kare dalga sinyaliyle okumak zorundayım(RA2)

Yardımcı olursanız sevinirim aşağıdaki kodlar çalışmıyor.
(Kodların daha yalın olması acısından sadece lcd panelle seri haberleşme olan kısmı çıkardım)

Not: RA2 ye gelen kare dalga sinyali asla 1 görmüyor. Bu kare sinyali örneğin RC0 a alırsam çalışıor.

#include <pic18f4620.h>
#include <pic18.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "18F_Config_40_v10.h"

unsigned char sample=16;

int veri=0;
float adc_1kanal_1digit=0;
float adc_1kanal_2digit=0;
float deger=0;
float degerold=0;
bit squarewave=0;
bit squarewave2=0;

void main(void)
{
    TRISA = 0b00001111;
    TRISB = 0b00000000;
    TRISC = 0b10000000;
    TRISD = 0b00000000;
    TRISE = 0b00000000;

    ADCON1 = 0x0B; 
    CMCON = 0x07;   //deactivate comparator module
    INTCON2bits.RBPU=1; //portb pull-ups disabled.

    ADCON0bits.CHS3=0;  //AN0 seçildi
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS0=0;

    ADCON2bits.ACQT2=1;
    ADCON2bits.ACQT1=1;
    ADCON2bits.ACQT0=1;

    ADCON2bits.ADCS2=0;  //fosc/32 seçildi.
    ADCON2bits.ADCS1=1;
    ADCON2bits.ADCS0=0;

    ADCON2bits.ADFM=1;  //sa?a yaslama

    ADCON0bits.ADON=1;  //adc modülü aktif.

    LATA=0x00;
    LATB=0x00;
    LATC=0x00;
    LATD=0x00;
    LATE=0x00;

    //SERIAL COMMUNICATION SETTINGS
    SPBRG=64;
    TXSTA=0b00100010;
    RCSTA=0b10010000;
    RCIF=0;
    RCIE=0;

    //TIMER1 SETTINGS
    PIE1=0b00000001;    //Only Enables timer1 overflow interrupt
    PIR1bits.TMR1IF=0;  // TMR1 register did not overflow
    INTCON=0b11000000;  // Enables all unmasked interrupts
    T1CON=0b00000000;

    TMR1ON=1;  //TIMER1 ACTIVATE
    TMR1 = 64765;

    squarewave=1;
    
    while(1)
    {
        __delay_us(1);
        __delay_us(1);
        __delay_us(1);
        __delay_us(1);
    }

}

void AdcOperation(void)
{
    if(squarewave==0){goto adcstep2;}
    else if(PORTAbits.RA2==0){squarewave=0;goto adcfinished;}
    else{goto adcfinished;}
    adcstep2:
    if(PORTAbits.RA2==1)
    {
    ADCON0bits.CHS3=0;  //AN0 seçildi
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS0=0;

    ADCON0bits.GO=1;
    while(ADCON0bits.nDONE);
    veri=(ADRESH<<8)+ADRESL;

    degerold=veri*0.00488758; // 0-1023 aras?nda okudu?un adc de?erini gerilime çevirir.
    deger=deger+degerold;
    sample--;
    if(sample==0)
    {
        deger=deger/16;
        deger*=100; // degeri 100 ile çarp?p tam say? haline gitirir.
        L1_SendData2=(int)(deger/100);  // degerin 1. hanesini sen1' e atar.
        L1_SendData3=(int) deger % 100; // degerin 100e bölümünden kalan? send2 ye atar. Yani virgülsen sonras?n? send2 ye atar.
        deger=0;
        degerold=0;
        sample=16;
        squarewave=1;
    }
    }
    adcfinished:
    __delay_us(1);
}

void interrupt isr(void)
{
  if (PIR1bits.TMR1IF && PIE1bits.TMR1IE)
   {
    PIR1bits.TMR1IF = 0;
    TMR1 = 64765;
    AdcOperation();
    __delay_us(1);
   }
}

Emin Aydın EROĞLU

Hocam olmaması gayet normal. Çünkü RA1'i siz analog olarak ayarlıyorsunuz. Siz o pini digital olarak karşılaştırma yapamazsınız. Eğer dediğiniz gibi yapmak istiyorsanız RA1 i digital ayarlayıp karşılaştırma sonucu ADC ölçümünü yapmalısınız. Ayrıca o karşılaştırma kısmınıda bulamadım kodlarda acaba kesmenin içerisine mi koydunuz da buraya yazarken sildiniz?

Extreme

   if(squarewave==0){goto adcstep2;}
    else if(PORTAbits.RA2==0){squarewave=0;goto adcfinished;}
    else{goto adcfinished;}
    adcstep2:
    if(PORTAbits.RA2==1)
    {
adc ölçümleri
    }
adcfinished:
..
..
bu bölüm kare dalgayla ilgili

RA1 değil RA2 tekrar kontrol edermisiniz hocam.

Emin Aydın EROĞLU

Hocam dediğim gibi bakın siz analog olarak tanımladığınız bir pini 1 mi 0 mı diye kontrol yapamazsınız o pini digital olarak tanımlamanız lazım. Eğer RA2 yi analog olarak kontrol etmiyecekseniz onu digital yapın. Yada C portuna alın kontrol pinini.

Extreme

ADCON1 = 0x0B;  için RA2 , Digital olmuyor mu ?

bence digital olarak tanımladım ben RA2 yi

Emin Aydın EROĞLU

Hayir hocam RA0 RA1 RA2 RA3 Analog tanimli suanda

Extreme

eğer ordaki yorum satırına takıldıysanız o eskiden kalmaydı.

Yada doğru kodu nereyi değiştiriceğimi gösterebilirmisiniz?

Emin Aydın EROĞLU

Hocam bakın Eğer RA2 yi digital yapmak istiyorsanız ister istemez RA3'ü de digital yapmak zorundasınız. Yukarıda ki paylaştığınız PCFGx tablosunu incelerseniz anlarsınız. ADCON1=0x0D; yaparsanız eğer RA0 ve RA1 Analog diğerleri digital olacaktır. Şimdi önemli olan şey sizin burada kaçtane analog girişe ihtiyacınız var onu tespit etmek. Eğer karşılaştırma yapacaksanız eğer digital pine ihtiyacınız var. A portunu analog ayarlarken maalesef pin atlayarak analog seçemiyorsunuz. Sırası ile analog seçebilirsiniz. Örneğin RA0 ve RA2 analog RA1 digital olsun diyemezsiniz. Ancak RA0 ve RA1 analog RA2 ve geri kalanları digital olsun diye seçebilirsiniz. Tablo bunu söylüyor.