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.
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.
Nokta atışı hocam teşekkürler.
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.
Mikrodenetleyici: 18F4620
Analog olarak AN0,AN1 VE AN3 tanımlamak istiyorum.
Diğerleri Dijital olmak zorunda.
ADCON1 = ? ;
(http://s12.postimg.cc/579zk88t5/adcon1.jpg) (http://postimg.cc/image/579zk88t5/)
yardımcı olursanız çok mutlu olurum
ADCON1=0x0B olacak
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.
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);
}
}
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?
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.
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.
ADCON1 = 0x0B; için RA2 , Digital olmuyor mu ?
bence digital olarak tanımladım ben RA2 yi
Hayir hocam RA0 RA1 RA2 RA3 Analog tanimli suanda
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?
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.
tskler Emin hocam o sorunu hallettik.
Yeni bir sorunum var.
#define TRA_0 LATDbits.LATD0
#define TRA_1 LATDbits.LATD1
#define TRA_2 LATDbits.LATD2
#define TRA_3 LATDbits.LATD3
#define TRA_4 LATDbits.LATD4
#define TRA_5 LATDbits.LATD5
#define TRA_6 LATDbits.LATD6
#define TRA_7 LATDbits.LATD7
unsigned char Degerler
bu TRAları direkt olarak Degerler değişkene nasıl aktarırım ?
Hocam öncelikle eğer sen portu olduğu gibi okumak istiyorsan bu kadar farklı tanımlamaya ihtiyacın yok. Tek tanımlama yeterli. Sonra eğer sen portun değerini okuyacaksan o portu giriş olarak tanımlamalısın. Daha sonrada tanımlamanı PORTD şekilde yapmalısın. LATA çıkış için kullanılır.
#define TRA PORTD
unsigned char Degerler;
Degerler=TRA;
Şeklinde okuyabilirsin. Bunun sonucunda 8 bitlik D portunu Degerler değişkeninne atmış olursun.
Peki emin hocam ben bit bit işlem yapmak istiyorum.
net olarak bitlerden Rd7,Rd6,Rd5,Rd4,Rd3 bitlerine bir değişkene aktarmak istiyorum nasıl yapabilirim. ?Rd2 ve Rd1 ve Rd0 ile ilgilenmeden
Forumda sabit konu yapmıştık ama görmediniz sanırım: https://www.picproje.org/index.php/topic,53020.0.html (https://www.picproje.org/index.php/topic,53020.0.html)
Emin hocam,
18F4620 için
#define TRA LATD
unsigned char Degerler;
TRA=Degerler;
DEDİĞİMİZDE TRA içeriğini Degerler içeriğiyle dolduracak mı ? binary şeklinde
#define TRMA_0 LATCbits.LATC0
#define TRMA_1 LATCbits.LATC1
#define TRMA_2 LATCbits.LATC2
#define TRMA_3 LATCbits.LATC3
ben bunları aynı anda bir değer atamam gerekiyor
TRMA_3=0; TRMA_2=0; TRMA_1=0; TRMA_0=0; // bu şekilde degil aynı anda vermek istiyorum
TRMA=14; deyince hepsini ataması gibi ..
Böyle bir yöntem var mı arkadaşlar ?
LATC=0xFF; diyebilirsiniz mesela...
Birden fazla kullanacaksan, fonksiyon olarak yaz.
void fonksiyon (int degisken)
{
//fonksiyon yapması gereken iş.,
}
kullanımda
fonksiyon (14); //şeklinde kullanabilirsin
Merhaba Benim bir sorum olucak.
watchdog timer hesabını öğrenmek istiyorum. sadece hesabını kullanmasını biliyorum.
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
10mhz osilatör ile benim ne kadar süre CLRWDT(); komutunu kullanmazsam pic resetlenir.
Hesabını öğretebilecek var mı ?
Osilator farketmez,
wdt nin kendi rc osilatörü var picin içinde.
Ayarladığın (ayarlayabileceğin belli değerler var) değer kadar milisaniye
sonra resete sebep olur, yani
#pragma config WDTPS = 32768
için 32768 milisaniye içinde wdt yi clear yapmazsan pic resetlenir.
Datasheeti incelemen çok faydalı olur,
wdt timer0 ın prescaler ını kullanabiliyor,
timer0 ve wdt beraber kullanıldığında dikkat etmek gerekir.
WDTCON: WATCHDOG TIMER CONTROL REGISTER
diye bir register var, orda hangi ayarları yaptığınıza göre değişir.
bu registerın ilk 4 bitinin(WDTPS) değerleri, Prescale Rate değeridir, bunlar direkt olarak süreyi etkiler
WDTPS<3:0>: Watchdog Timer Period Select bits
Bit Value = Prescale Rate
0000 = 1:32
0001 = 1:64
0010 = 1:128
0011 = 1:256
0100 = 1:512 (Reset value)
0101 = 1:1024
0110 = 1:2048
0111 = 1:4096
1000 = 1:8192
1001 = 1:16384
1010 = 1:32768
1011 = 1:65536
1100 = reserved
1101 = reserved
1110 = reserved
1111 = reserved
ramazan hocam,
pic 18f4620 datashetti inceledim cok anlayamadım.
32768msn = 9 saniye yapar.
ama burda 1 saniye demiş
ben 32768 kullanırken 140saniye olarak uygulamada test ettim.
hangisi doğru hocam ?
32768 ms =32768/1000 = 32,768 yaklaşık 33 saniye yapar.
Ramazan hocam
20mhz osilatörlede 10mhz osilatörlede
33saniye mi ?
Daha önceki mesajdada söyledim ya
wdt nin kendi osilatörü var, mcuya bağladığın osilatörden bağımsız olarak çalışıyor.
Gökhan ın bahsettiği şeylere dikkat etmen gerekebilir,
kullandığın derleyici wdt ayarını kendi yapıyor mu bilmiyorum,
ccsc de basit bir satırla istediğin değeri veriyor ama
xc8 mplabx için registerları tek tek ayarlamak gerekeiliyor,
şurada Ramazan Subaşı nın bir yazısı var, 18f içinde temel oluşturabilir;
http://ramazansubasi.net/xc8-wdt-ve-sleep-uygulamasi/ (http://ramazansubasi.net/xc8-wdt-ve-sleep-uygulamasi/)
mesaj birleştirme:: 10 Nisan 2015, 16:46:17
Yalnız benim çıkarımım şu;
kullandığın mcu nun 18F4620
en düşük WDT zamanı 4ms
ve xc8 de yazdığın
#pragma config WDTPS = X
X defa 4ms kadar bekleyip WDT resetlemesine sebep oluyor.
Yani
#pragma config WDTPS = 32768
dediğinde
32768 x 4 = 131072 ms yani yaklaşık 130 saniye sonra WDT reset gerçekleşiyor.
İstersen
#pragma config WDTPS = 256
gibi deneyip 1 saniyede bir wdt reseti gerçekleşiyormu şeklinde test et,
sonra diğer değerleride test et,
tabi neden böyle olduğunuda araştırabilirsin.
Ramazan hocam dediğiniz net bir şekilde anlaşıldı teşekkürler.
xc8 'de yazılım bir yere 1000 kere girdiğinde tüm yazılımı resetlemek istiyorum.
Böyle bir komutumuz var mı ?
Yardımcı olurmusunuz ?
PIC18 ve üstü işlemcilerde reset komutu var. XC8'de var mıydı hatırlamıyorum ama zaten tek komut olduğu için asm kodu olarak C kodu içinde rahatlıkla çağrılabilir.
Galiba asm("RESET"); şeklinde kullanılıyor.
Selam,
RESET();
Bu şekildede oluyor.
FrequenceHigh=255;
if(!(40<=FrequenceHigh<=70)){FrequenceHigh=75;}
((bu kodun yerine if((FrequenceHigh<=40)||(FrequenceHigh>=70)) bunu yazsam çalışıyor )
cevap : FrequenceHigh=255;
Neden FrequenceHigh=75 olmuyor.
neden olabilir ?
Çünkü C'de karşılaştırma ifadeleri 3'lü yazılmaz. (40<=FrequenceHigh<=70) dediğin zaman muhtemelen önce 40<=FrequenceHigh işlemi yapılıyor ve cevap 1 çıkıyor. Sonra 1<=70 işlemi yapılıyor ve cevap yine 1 çıkıyor. Başına ! gelince 0 oluyor ve haliyle FrequenceHigh=75 komutu işletilmiyor hiçbir zaman.
Merhaba
@OxfordBlue bu sorular xc8 ile alakalı değil, lütfen C bölümünde sorun.
Gökhan Hocam, Dikkat ederim.
mplabx , xc8 'de bir projem var project1.x
ve bir main.c dosyası var buna header ve c dosyalarıyla ayırmak istiyorum.
örnek communication.h,communication.c,misc.c,misc.h
fakat başarılı olamadım.
ilk olarak com.h ve com.c adlı iki dosya açtım
com.c içeriği
#include "com.h"
void SerialGW(void)
{
fonksiyon içeriği
}
com.h içeriği
#include <xc.h>
void SerialGW(void);
main.c içeriği
#include <pic18f4620.h>
#include <pic18.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "com.h"
değişkenler v.s.
void SerialGW(void);
(http://s17.postimg.cc/40v07432z/111.jpg) (http://postimg.cc/image/40v07432z/)
gelen hata:
com.c:9: error: (192) undefined identifier "ComWait"
com.c:11: error: (192) undefined identifier "ComWaitCounter"
.
.
.
.
ComWait ve ComWaitCounter değişkenleri nerde tanımlıysa
aynısını com.c veya com.h içerisinde başına extern koyarak tekrar tanımlayın ama ilk değer vermemeniz lazım.
Peki o zaman örnek vereyim.
main.c
Tanımlamar , değişkenler v.s.
FrequenceRead();
com.c
#include "com.h"
extern unsigned int FrequenceTotal;
extern unsigned int Frequence;
extern unsigned int FrequenceCounter;
extern bit SquareWave;
extern bit FrequenceRec;
void FrequenceRead(void)
{
if(SquareWave==0)
{FrequenceRec=1;}
if((FrequenceRec)&&(SquareWave))
{
FrequenceTotal++;FrequenceRec=0;
}
FrequenceCounter++;
if(FrequenceCounter>=49650)
{
Frequence=FrequenceTotal;
FrequenceTotal=0;
FrequenceCounter=0;
}
}
com.h
#include <xc.h>
void FrequenceRead(void);
build ve gelen hata:
:0: error: (499) undefined symbol:
_SquareWave(dist/default/production\Mainboard.X.production.obj)
main.c dosyasına şunu eklemelisiniz:
extern void FrequenceRead(void);
mantığı anladınız mı?
bütün değişken ve fonksiyonlar için bu yöntem geçerlidir. Bir dosyadaki değişkeni başka bir dosyada kullanacaksanız extern ile tekrar tanımlayacaksınız.
bu _SquareWave adlı değişken mi fonksiyon mu artık neyse onu da dediğim gibi extern yapın kullandığınız yere.
Oldu. teşekkürler,
hex dosyasının oluşturulduğu yeri değiştirmek istiyorum.
Mainboard.X/dist/default/production/Mainboard.X.production.hex...
hex dosyası bu konuma oluşturuluyor.
Mainboard.X/hex/Mainboard.X.production.hex...
dosya konumuna oluşturulmasını istiyorum
propertiese bakıyorum ama uygun bir yer bulamadım.
Bu konuda bilginiz var mı ?
Bildiğim kadarıyla değiştirilmiyor.
Bu sayfayı inceleyin: http://microchip.wikidot.com/mplabx:directory-structure (http://microchip.wikidot.com/mplabx:directory-structure)
görüldüğü üzere, "şu şekilde değiştirebilirsiniz" felan da yazmamışlar.
MPLAB X proje ayarlarında derlemeden sonra çalıştırılacak programlar tanımlanabiliyor. Basit bir betik yazarak .hex dosyasını oluştuktan sonra otomatik taşımak mümkün olabilir.
Herkese iyi bayramlar,
while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_W))
bu kodun anlamını bana açıklayabilirmisiniz ?
İyi bayramlar.
PIC'in modeli nedir?
Ne iş yapan bir programın içinde geçiyor bu kod?
Bu tek bir satırın altında ne var, üstünde ne var?
Hocam internetde gezerken karşıma gelmişti. sadece komut setinde eksiklerim olduğunu düşündüm
while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_W))
Burada tahminim SSPCON2= 0x1F ise veya SSPSTATBİTS.r_w bir olduğu müddetçe burada bekle diye anlıyorum.
çok yanlış gelmişsiniz :)
sspcan2 'nin bitleri ile 0x1f in bitleri üzerinde AND işlemini yap daha sonra bunu sspstatbits.r_w ninkiler ile OR la çıkan sonuç sıfırdan farklı ise döngünün içine gir.
| = or işlemi yap
& = ve işlemi yap
|| = (1. veya 2.)
&& = (1 ve 2)
mesaj birleştirme:: 24 Eylül 2015, 21:29:11
https://gelecegiyazanlar.turkcell.com.tr/konu/ios/egitim/ios-101/mantiksal-operatorler
define CHECK_BIT(var,pos) !!((var) & (1 << (pos)))
merhabalar bu satırın anlamı hakkında yardımcı olabilecek var mı?
Alıntı yapılan: OxfordBlue - 23 Ocak 2016, 20:53:21
define CHECK_BIT(var,pos) !!((var) & (1 << (pos)))
merhabalar bu satırın anlamı hakkında yardımcı olabilecek var mı?
Bir değişkenin herhangi bir bitini kontrol etmek için kullanılan makro.
var yerine test etmek istediğiniz değişkeni, pos yerine de hangi bitini test etmek istediğinizi yazarsanız o bitin değerini görürsünüz.
int temp = 0x55 // 01010101
CHECK_BIT(temp, 3)
0 değerini döndürecektir.
Alıntı yapılan: vitruvius - 23 Ocak 2016, 21:08:52
Bir değişkenin herhangi bir bitini kontrol etmek için kullanılan makro.
var yerine test etmek istediğiniz değişkeni, pos yerine de hangi bitini test etmek istediğinizi yazarsanız o bitin değerini görürsünüz.
int temp = 0x55 // 01010101
CHECK_BIT(temp, 3)
0 değerini döndürecektir.
teşekkürler hocam , kodun içeriğindende bahsedermisin?
benim bildiğim pos (1 << (pos)) sola kaydırma işlemi yapıyor.
!! hakkında hiç bilgim yok.
Mantık şu; bir bitin 1 mi 0 mı olup olmadığını nasıl anlarsın? O biti 1 ile "and" işlemine tabi tutarsan sana bitin değerini verir.
Yani ilk önce, hangi biti test etmek istiyorsan o bitin altına 1 sayısını yerleştirmek lazım. Diyelim ki çalıştığımız sayı 0x55;
01010101 bizim sayımız
00000001 0x01 (1 şu an 0. bitte)
Biz 6 numaralı biti test etmek istiyorsak alt sayıdaki 1'i altıncı bit hanesine kaydırmamız lazım.
01010101 0x55
01000000 1 << 6 işlemi ile 1'i, 6 bit sola kaydırdık. Böylece istediğimiz yere geldi.
Bundan sonra esas sayımızla bizim hazırladığımız "maske"yi "and" işlemine sokarsak;
01000000 sonucunu elde ederiz. Bu sayı hex olarak 0x40, decimal olarak 64'dür. Yani bu işlemin sonucunu int bir değişkene atarsan 64 olarak saklanır.
Ama bu sayıyı boolean bir değişkenmiş gibi kullanmak isteyebilirsin. Yani sayıyı ya 0'a, yada 1'e dönüştürmek isteyebilirsin. Burada "!" (lojik değil) operatörü devreye giriyor.
Lojik anlamda C dilinde bir sayı "0" değilse "1" olarak kabul edilir. Sayı negatif olsa bile. Yani;
01000000 lojik-1'dir. Bunun tersini alırsan;
!(01000000) lojik-0 elde edersin -> 00000000
Bunun bir daha tersini alırsan;
!(00000000) lojik-1 elde edersin -> 00000001
Yani lojik anlamda sayının değeri değişmemiş oluyor. Tersinin tersini almak sayıyı değiştirmez.
Örnek bir kodla bakarsak;
#include <stdio.h>
#define CHECK_BIT1(var,pos) ((var) & (1 << (pos))) // Hicbir lojik ters islemi yapmadan
#define CHECK_BIT2(var,pos) !((var) & (1 << (pos))) // Sonucun bir kere tersini alarak
#define CHECK_BIT3(var,pos) !!((var) & (1 << (pos))) // Sonucun iki kere tersini alarak
int main()
{
int temp = 0x55;
int result1, result2, result3;
result1 = CHECK_BIT1(temp, 6);
result2 = CHECK_BIT2(temp, 6);
result3 = CHECK_BIT3(temp, 6);
printf("Result 1: %#04x -> %d\n", result1, result1);
printf("Result 2: %#04x -> %d\n", result2, result2);
printf("Result 3: %#04x -> %d\n", result3, result3);
return 0;
}
Bu kodun çıkışı:
Result 1: 0x40 -> 64
Result 2: 0000 -> 0
Result 3: 0x01 -> 1
Gördüğün gibi ilk makro'yu int bir değişkene yazınca 0x40, yani 64 olarak saklanır.
İkinci makro'yu int bir değişkene yazınca, bir kere lojik ters işlemini yaptığımız için kontrol ettiğimiz bitin tersini saklamış olduk. 0x00, yani 0.
Üçüncü makro'yu da int bir değişkene yazınca, kontrol ettiğimiz bitin tersinin tersini yazmış oluyoruz. 0x01, yani 1.
https://www.picproje.org/index.php/topic,60384.msg466892.html#msg466892 (https://www.picproje.org/index.php/topic,60384.msg466892.html#msg466892)
Çok açıklayıcı oldu teşekkürler.
Merhaba bit tanımlaması yapmak istiyorum . main .c de kullandığım bir değişkeni örneğin system.c 'dede kullanmak istiyorum.
.c 'de diyorum . header demiyorum çünkü .header lar bit tanımlanamıyorum xc8'de bug olduğunu düşünüyorum
main.c
bit a=0;
system.c
extern bit a;
bu şekilde çalışmalarda sorun oluyor . uyarı veriyor.
"initializer in extern declaration"
fikri olan var mı ?
c dilinde bit diye bir değişken türü yok.
...
typedef union {
struct {
unsigned ADON :1;
unsigned GO_nDONE :1;
unsigned CHS :5;
};
...
while (ADCON0bits.GO_nDONE);
şeklinde Microchip biti tanımlamış ve kullanmış.
Peki system.c dosyası bunu nerden anlasın? Arkadaşın sorunu bu bence :) bit typedef'inin tanımlı olduğu header'i system.c dosyasına include ederse düzelir sanırım.
XC8'de bit türü var ve doğrudan kullanılabiliyor. Ancak sanırım bazı kısıtlamalara tabi. Yanlış hatırlamıyorsam ilk değer verilemiyor ama bu çok sorun değil. xc.h dışında bir şey include etmeye gerek de yok.
arkadaşlar bit değişkenini .header için tanımlanmıyor. sadece .c dosyalarında tanımlanabiliyor .. Denermisiniz ?
Merhaba
Bana da 24 ya da 32 bitlik değişkenler lazım. mplab dökümanlarındaki tüm değişken tiplerini inceledim. Amacım pozitif olarak 24 ya da 32 bitlik değer girebilmek.
Karşılaştığım sıkıntı, tüm değişken tanımlarımın sadece 16. bitini 1 yaptığımda -32768 değerini alıyorum, unsigned komutu yazdığım halde.
Benim bu değerin üstüne pozitif olarak çıkmam gerek.
24 bit lik float ve double değişkenleri var ama onların da ilk 8 bit i ondalık değeri belirttiği için integer olarak 32767 değerinin üzerine çıkmıyor.
Dokumanda unsigned short, unsigned int 16 bit, unsigned long 24 bit, unsigned short long 32 bit olarak yazıyor ancak ben bu değerleri pic üzerinde okuyamıyorum.
uint16_t, uint24_t, uint31_t gibi diğer değişken tiplerinide denedim sonuç aynı. Pozitif olarak görebildiğim max değer 32767. ben 1000000 değerini değişkene atamak istiyorum.
Kullandığım pic 16f877a. Emin değilim ya da bilmiyorum ama varabildiğim tek sonuç kullandığım pic böyle birdeğeri, float ya da double değişkenleri dışında, 24 bitlik değeri depolayamıyor. Ama buda saçma geldi biraz bana.
bu arada tüm çalışmalarım simulasyon üzerinde. 2-3 güne gerçeğe dönüşecek ama bir şey değişeceğini sanmıyorum.
OxfordBlue, denemedim ama bu normal bir durum olabilir. bit türü standart bir tür olmadığından bazı kısıtlamalar var. Örneğin fonksiyon içinde de normal şekilde tanımlanamıyor, sadece static olarak tanımlanabiliyor. bit değişkeninin pointer'ı da olmuyor. Öyle sanıyorum ki başka bir şekilde çözüm bulman gerekecek.
ahmetzafer, bir ara galiba 32 bit değişkenlerle uğraşırken buna benzer bir sorun yaşamıştım gibi hatırlıyorum. Normalde gerekli olmayan birkaç casting ile çözmüştüm. Sanırım derleyiciden kaynaklı bir hata idi. Ama 16 bit değişkenler ile hiç böyle bir sorun yaşamadım.
MPLAB X proje klasörünü paylaşırsan bir de ben deneyeyim. Düşük bir ihtimalle proje ayarları ile ilgili bir durum olabilir.
Bir de bu şekilde deneyiniz...
/*
* File: main.c
* Author: mbmb
*
* Created on 03 Şubat 2016 Çarşamba, 21:35
*/
#include <stdint.h>
// PIC12F675 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 = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/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)
void main(void)
{
uint24_t degisken = 1000000;
while(1)
{
if(degisken >= 1000000)
{
degisken++;
}
}
}
Merhabalar ,
2 sorum var error değil ama warning alıyorum.
1.sorum
const unsigned char *Array[18] =
{
"......",
"ABC ","ABC ","ABC ",
"ABC ","ABC ","ABC ",
"ABC ","ABC ","ABC ",
"ABC ","ABC ","ABC ",
"......","......","......",
"......","......"
};
main.h:133: warning: (1478) initial value for "_ErrorCodes" differs to that in main.h:133
2.sorum
volatile unsigned int adcUp;
volatile unsigned int adc;
adcUp=(int)(adc)*(1.30);
system.c:13: warning: (356) implicit conversion of float to integer
yardım edermisiniz?
İlkini anlamadım ama ikincide durum belli: int = int * float şeklinde bir işlem var. Sağ taraf işlem sırasında kendi içinde float'a dönecek. Bunun int'e atılması küsuratın kaybolması anlamına geliyor ve derleyici seni uyarıyor. Derleyiciye "Ben ne yaptığımın farkındayım, sen sus." demek için sağdaki işlemin bir bütün olarak int'e cast edilmesi lazım. Yani şöyle yazabilirsin: adcUp = (int)(adc * 1.30);
İlkini net söylemek için kodun tamamını görmek lazım. _ErrorCodes'u en az iki kere tanımlayıp değer atamışsınız ve bu değerler birbirlerinden farklı. Muhtemelen başka bir header dosyası yada C dosyası içinde de değer ataması var. Onları bir kontrol edin.
İkinci sorumun cevabı için tşkler çalıştı.
İlki için tekrar yineliyim anlaşılması için.
main.h
const unsigned char *Array[18] =
{
"......",
"ABC ","ABC ","ABC ",
"ABC ","ABC ","ABC ",
"ABC ","ABC ","ABC ",
"ABC ","ABC ","ABC ",
"......","......","......",
"......","......"
};
bu kodu derleyince kodun bu kısmında warning hatası geliyor.
main.h:133: warning: (1478) initial value for "_ErrorCodes" differs to that in main.h:133
Merhabalar,
typedef struct __i2c_comm {
unsigned char buffer[MAXI2CBUF];
unsigned char buflen;
unsigned char event_count;
unsigned char status;
unsigned char error_code;
unsigned char error_count;
unsigned char outbuffer[MAXI2CBUF];
unsigned char outbuflen;
unsigned char outbufind;
unsigned char slave_addr;
} i2c_comm;
static i2c_comm *ic_ptr;
SSPBUF = ic_ptr->outbuffer[0];
ic_ptr->error_count++;
Yukarıdaki şekildeki kodlar nasıl okunur açıklamalı anlatabilirmisiniz ?
Sorduğunuz soru C dili ile ilgili: http://www1.gantep.edu.tr/~bingul/c/index.php?ders=15 (http://www1.gantep.edu.tr/~bingul/c/index.php?ders=15)
Merhabalar
xc8'de int bir sayiyi noktalı olarak bölmeden print etmenin bir yolu var mı ?
unsigned int sayi=9876;
printf("%4u",sayi); // bu islem noktasız olarak yapıyor.
bu int sayisini
mod işlemine tabi tutup karakterlerine ayırmadan
yada float tipde değişkene işlemeden
kısa yolla noktalı yapılabilir mi ?
Bu soru doğrudan C dili ile ilgili,
Nokta koymak istiyorsanız, önce sayıyı sprint ile stringe çevirip sonra sağdan başlayarak her üç karakterde bir nokta koyup (nokta koyduğunuz yerleri kaydırmanız gerekiyor bu arada), en son printf işlemine sokabilirsiniz.