Ben mi şaşırdım, Mikro C mi ?

Başlatan Erol YILMAZ, 16 Temmuz 2014, 20:37:28

Erol YILMAZ

Bir arkadaşım, USB arabirimini kullanmak istediğini belirtti.

Mikro C nin çok pratik HID bağlantısı sağladığını öğrendikten sonra TERMINAL'den gelen her HID paketi için C7 pinini "toggle"
yapan bir kod ile temel birşey göstermek istedim.

HID, paket haberleşme konusunda bir problem olmamasına rağmen en temel komutları işletemediğimi farkettim.

Ramazan'ın ortalarında olmanın da etkisi olabilir diyerek çok zorlamadım ama sizlere sormak istiyorum.

if(PORTC.F7) { LATC.F7 = 0;}
else         { LATC.F7 = 1;}


şeklinde Toggle sağlayamadım.

Nerede hata yapıyorum ?

RaMu

if(PORTC.F7) { LATC.F7 = 0;}  //portc7 ye 1 gelirse portc7 yi 0 yap
else         { LATC.F7 = 1;}  //portc7 ye 0 gelirse portc7 yi 1 yap


portc7 de buton varsa saçma olur,
portc7 de led varsa o zaman kendi kendine toggle yapıyor demektir,
tabi bunu görmek imkansız olur,
bu iki satırın altına en az 200 300 ms delay eklemek lazım.

Led nereye bağlı,
hangi durum gerçekleştiğinde led toggle yapacak?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Erol YILMAZ

#2
Kod tam olarak şu şekilde.
PORTC.F7 ye led bağlı.  C7 ye skopla baktım herhangibir osilasyon yok.
Portu okurken sürekli 0 okuduğu için çıkışa ilk paketi aldıktan sonra 1 yazıyor.
Bir sonrakinde de 0 okuyup tekrar 1 yazıyor.
yani PORTC7'yi okuyamıyorum.

unsigned char readbuff[64] absolute 0x280;
unsigned char writebuff[64] absolute 0x2c0;
char cnt;

void interrupt(){USB_Interrupt_Proc();}
void main(void){

  TRISC.B7 = 0;   LATC.F7 = 0;
  
  HID_Enable(&readbuff,&writebuff);

  while(1){
    while(!HID_Read());

    if(PORTC.F7) { LATC.F7 = 0;}  //portc7 ye 1 gelirse portc7 yi 0 yap
    else         { LATC.F7 = 1;}  //portc7 ye 0 gelirse portc7 yi 1 yap

    for(cnt=0;cnt<64;cnt++) 
      writebuff[cnt]=readbuff[cnt];

    while(!HID_Write(&writebuff,64));
  }
}

z

Scopla bakmak lazim. Bir sekilde ikinci kez topggle ediyordur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mr.Java

Bana sorun sigorta ayarlarında gibi geldi.

Erol YILMAZ

Portu okumak yerine bir değişkeni takip edersem gayet normal çalışıyor.

Misal bu kod aynı yerde normal toggle yapıyor...

    if(i) { LATC.F7=0; i=0; }  //portc7 1 ise 0 yap
    else  { LATC.F7=1; i=1; }  //portc7 0 ise 1 yap

Karamel

Cikis olan port u nasil okuyacaksiniz ki? birde picte lat registeri ne is yapiyor?

AsHeS

#7
PORT ve LAT diye çift registerda kullanılan PIC çıkışlarında çıkış için sadece LAT, giriş için sadece PORT kullanıldığını hatırlar gibiyim(datasheetten bakmak lazım) eğer dediğim gibiyse PORTC.F7 nin pek bir hükmü yok.

http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf 
Sf:118

Erol YILMAZ

#8
Bu pin, AN9 pinine denk geliyor ve Power On durumunda ANALOG ayarlı...

TRIS ten çıkış yaptığımızda çıkış olarak çalışıyor fakat  okumaya kalktığımızda sadece 0 okuyor...

Alıntı YapNote: On a Power-on Reset, RC<7:6> and RC<3:0> are configured as analog inputs and read as '0'.

Programın başına

ANSEL = 0;
ANSELH = 0;

ekledim. Şu anda normal çalışıyor...


Mikro C, gayet iyi çalışıyor.

RaMu

#9
if(PORTC.F7) { LATC.F7 = 0;}  //portc7 ye 1 gelirse portc7 yi 0 yap

Burayı şöyle kullanıp denesen
if(LATC.F7) { LATC.F7 = 0;}  //portc7 ye 1 gelirse portc7 yi 0 yap


Açıklama;
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/rmw.htm

Ayrıca PORTC de analog varmı comparator vs. bişe varmı,
kurulumu doğru yapdığından eminmisin,
bence usb olmadan önce portc7 deki ledi bir yakıp söndürmek lazım.

Ben yazana kadar sorunu çözmüşsün hocam.


Arada bir soru var üstü karalanmış;
Yukarıdaki linkde port ve lat durumu anlatılmış.
PORT birebir md.nin pinlerindeki durumu veriyor,
misal portb0 ı  kondansatörle gnd ye bağlayalım,
portb0 a programda 1 yazsak ve ardından portb yi okusak
pine bağlı kondansatör dolamadı için pine 1 yazmış olmamıza rağmen 1 okuyamayız,
ama aynı durumda latb0 a 1 yazsak ve hemen ardından okusak,
pinin fiziki durumuyla ilgilenmediği için 1 okuruz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Erol YILMAZ

Porta yazabilme durumu beni kandırdı.

Portun giriş kısmında da dijital olduğunu zannettim.

Halbuki ANSEL registerinde durum açıkça anlatılmış.

Alıntı YapANS9: RC7 Analog Select Control bit
1= Digital input buffer of RC7 is disabled
0= Digital input buffer of RC7 is enabled


LukeSkywalker

MikroC'de böyle temel hatalara hiç rastlamadım şu ana kadar. Sadece bir kez eski pro olmayan sürümde değişken isimleri ile alakalı bir bug bulmuştum ve bunu mikroelektronikaya rapor etmiştim. Sorunu çözüp versiyon güncellemesinde düzelttiler.
Saygılar.

RaMu

Hocam şuan uğraştığın hangi mikrodenetleyici?

Yani şumu oldu;
analog olan pini ANSEL ile dijitale çevirmeden
TRIS ile çıkış yapıp
LAT ile 1 0 yaptığımızda 1 0 oluyor fakat
PORT ile okuma yaptığımızda hep 0 okuyor.
Durum böylemi oldu?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Erol YILMAZ

#13
Aynen öyle oldu,
Mcu : PIC18F14K50

Alıntı yapılan: RaMu - 16 Temmuz 2014, 23:36:06
Hocam şuan uğraştığın hangi mikrodenetleyici?

Yani şumu oldu;
analog olan pini ANSEL ile dijitale çevirmeden
TRIS ile çıkış yapıp
LAT ile 1 0 yaptığımızda 1 0 oluyor fakat
PORT ile okuma yaptığımızda hep 0 okuyor.
Durum böylemi oldu?

Bu resim durumu çok iyi anlatıyor...
Okuma için sadece TRIS yetmez, ANSEL i de ayarlamak lazım.
Ama çıkışta ANSEL şartı yok.


RaMu

Bende şimdi isiste denedim, 18F14K50 için,
proteus8.1 de ansel eklemeden sadece ledi yaktı,
ansel eklendiğinde led yak söndür işlemini yaptı,
isis7.6 da ansel eklesemde sadece ledi yaktı,
herhalde isis7 de lat okuma kısmını atlamışlar.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html