"PORTA" Komutu Çalışmıyor

Başlatan MrExploit, 11 Temmuz 2014, 02:54:10

MrExploit

Derleyiciye yeni başladım. Şöyle bir programım var...

#include <stdio.h>
#include <stdlib.h>
#include "XC8.h"

void init(void){
 TRISD=0b00000000;
}

void main(void) {
    init();

    PORTD=0x00; (PORTD=0b0000000 de denedim)
   while (1) {
   PORTD=0x00;;
   __delay_ms(50);
    PORTD=0xff;  (PORTD=0b11111111 de denedim)
   __delay_ms(50);
   }    
}


gördüğünüz gibi oldukça basit. Progamı yazınca , D portundaki ledler 1 kere yanıp sönüyor.

Eyer "PORTD=0x00"  yerine "RD0=0 , RD0=1" Kullanırsam hiçbir sorun olmuyor.
PORTD Komutu neden çalışmıyor ?

tekosis

bu derleyiciyi kullanmadım ama belki port tanımlaması o şekilde olmayabilir. misal port_d gibi birşey de olabilir.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Gökhan BEKEN

portd yerine latd kullanın.
örnekler:
LATD=0x0F; //portd'ye 0x0F yaz
LATBbits.LATB1=0; //portb nin 1. pinini 0 yap

burda da yazmıştım birkaç saat önce: https://www.picproje.org/index.php/topic,54215.msg413807.html#msg413807
ayrıntılı anlatımı ise burda yapmıştım: https://www.picproje.org/index.php/topic,53020.msg401790.html#msg401790
Özel mesaj okumuyorum, lütfen göndermeyin.

bbs2006

Output_d(0x00);  yazarsan tüm çıkışlar 0 olur,  output_d(0xff) olursada tüm çıkışlar 1 olur. bu şekilde çalışır.

Gökhan BEKEN

Alıntı yapılan: bbs2006 - 11 Temmuz 2014, 03:49:02
Output_d(0x00);  yazarsan tüm çıkışlar 0 olur,  output_d(0xff) olursada tüm çıkışlar 1 olur. bu şekilde çalışır.
CCS C'nin kendi fonksiyonudur o. XC8'de sökmez. PORT ile LAT farkı önemlidir. Kısa süreli değişimlerde port kullanılmaz. PORTB=PORTB işlemi bile yapamazsınız. Çünkü bunun anlamı portb yi oku portb'ye yaz, demektir çok hızlı bir işlem olduğundan portb'ye saçmasapan bir değer yüklenir.
Özel mesaj okumuyorum, lütfen göndermeyin.

MrExploit

main.c:39: error: (192) undefined identifier "LATD"

LATD ' yİ tanımıyor ki :(

tüm includeleri yaptım.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic16f887.h>

acaba pic16f887" kütüphanesinde mi yok bu komut.

LATBbits.LATB1=0  - Bunu tanıyor bak...

Maxim

LAT
16 serisinde yok bildiğim kadarıyla

Gökhan BEKEN

Alıntı yapılan: Maxim - 11 Temmuz 2014, 06:49:25
LAT
16 serisinde yok bildiğim kadarıyla
Evet bende öyle biliyorum. Hangi işlemciyi kullandığını belirtmemiş arkadaş, o yüzden yazdım.
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

16 serisi çeşit çeşit. Enchanced diye bir grup var. onlarda LAT register  var

Gökhan BEKEN

Aradaki bekleme sürelerini artırıp denediniz mi? Bu arada gerçek devrede mi simülasyonda mı deniyorsunuz?
Özel mesaj okumuyorum, lütfen göndermeyin.

mehmet

Lafı açılmışken LAT ve PORT üzerine bir şeyler söylemek istiyorum:

Malumunuzdur pic mcularda yaklaşık dört çevrimde bir komut işletilir. PORT
komutu da bu dört çevrimde işleyen komutlardandır. LAT ise dört çevrime
girmeden ilk çevrimde değişikliğe gitmesini sağlar. Burada bir handikap
vardır. Siz LAT ile daha yeni değer değiştirmiş bir pini yeniden değiştirmeye
çalışırsanız biraz gariplikler olacaktır.
Bence LAT sadece kritik zamanlama işlerinde kullanılması daha yerinde olacaktır...

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

Tagli

mehmet hocam, sen LAT ile PORT olayını karıştırdın sanırım. O dediğin read-modify-write olayı PORT için geçerli. LAT zaten bunu çözmek için eklenmiş. Başka bir işlevi yok. Daha önce bu konu dile getirilmişti birkaç kez forumda.

Ama arkadaşın sorunu bunlarla ilgili gibi gözükmüyor. Özellikle de bitleri tek başına sorunsuz kullanabilmesi şaşırtıcı. Maalesef benim de aklıma bir şey gelmedi. XC8'in delay kodlarıyla ilgili eskiden sorun yaşamıştım, ki bu konuda da forumda başlıklar var. Bekleme için, __delay_ms(1)'i döngü içinde kullanarak bir fonksiyon yazılarak denenebilir.
Gökçe Tağlıoğlu

MrExploit

İŞLEMCİM PIC16F887 ,XC8 , AMA HALA LAT KOMUTUNU TANIMIYOR VE PORT KOMUTUDA DÜZGÜN İŞLEMİYOR. ANLAMADIM GİTTİ!

Gökhan BEKEN

#13
16F serisi olduğu için tanımayabilir. Programınızda başka eksikler var.
mesela ben kullandığım işlemcinin header dosyasını yüklüyorum
örneğin:
#include "p18cxxx.h"

sigorta ayarlarınızı yapmamışsınız, örnek:
#pragma config OSC = HS, WDT = OFF, LVP = OFF

osilatörüzü belirtmemişsiniz:
#define _XTAL_FREQ 4000000 //Bekleme fonksiyonlarini 4mhz kristal için ayarlar

16F serisini bilmiyorum ama 18F serisinde anolog pinleri çıkış olarak yazmanın dışında, digital olduğunu da belirtmek gerekebiliyor:
ADCON1 = 0x0F; //bütün pinler dijital olsun

__delay_ms(50);
yazdığınız yerleri şu iki komutla değiştirerek deneyebilirsiniz:
i=0xFFFF; while(--i);


bu arada proje özelliklerinden bakarak doğru pic'i seçtiğinizden emin olun.

Özel mesaj okumuyorum, lütfen göndermeyin.

MrExploit

Dediklerinizin hepsini header file içinde yaptım zaten...

#include <xc.h>
#include "PIC16F887.h"

#pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = OFF        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


#define _XTAL_FREQ 8000000