PİC16F877 Hakkında ufak bir sorun

immortall

Üye
Katılım
10 Eki 2018
Mesajlar
72
Puanları
1
Yaş
28
Arkadaşlar merhaba,
Ufak bir problem var. 7 segment display e 0-9 arası rakamları yazdırmak istiyorum. Fakat 2 ye kadar sayıyor. Başa dönüyor. Nedeni nedir acaba? Aynı şekilde kara şimşek uygulaması yaptığımda ledlerin 2 si yanıp başa dönüyordu. Anahtarın durumuna göre (0-1) 4 ledin yanıp 4 ledin söndürüldüğü uygulamada sürekli aynı ledler yanıyordu. Anahtarın konumu değişse de aynı ledler yanıyordu.

7 Segment uygulaması kodları ve devre; (Program MPLAB-X)
Kod:
#include <xc.h>



// CONFIG

#pragma config FOSC = XT     // Oscillator Selection bits (RC oscillator)

#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)

#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000

// #pragma config statements should precede project file includes.

// Use project enums instead of #define for ON and OFF.

int dizi[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X67};

void main(void) {



    TRISB=0x00;



    while(1)

    {

        for(int i=0; i<10; i++)

        {

            PORTB=dizi;

            __delay_ms(1000);

        }

    }

    

    

}
Nerede hatam var acaba? Teşekkür ederim.
 

Ekli dosyalar

  • Ekran Alıntısı.PNG
    63.6 KB · Görüntüleme: 19
Moderatör tarafında düzenlendi:
Kod eklerken code tag kullanın.
Yıldız * işaretleri olmadan şu şekilde yazılacak:
[code*]
Kodlar buraya
[/code*]

Programdaki şu satırı
Kod:
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
Şununla değiştir:
Kod:
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT DISabled)

Watch dog timer Bekçi köpeği diye araştırabilirsin.
 
Öncelikle cevabınız için teşekkür ederim. 7 Segment display uygulamasında sorunum çözüldü. Fakat led uygulamasında aynı sorun devam ediyor. Butona basılınca aynı ledler yanıyor.
Kod:
#include <xc.h>
// CONFIG
#pragma config FOSC = XT     // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF        // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
void main(void) {
   
    TRISB=0x00;
    TRISA=0xFF;
    while(1)
    {
        if (RA0==1){
            PORTB=0x0F;
        }
        if (RA0==0){
            PORTB=0xF0;
        }
    }   
}
 

Ekli dosyalar

  • 1.PNG
    61.9 KB · Görüntüleme: 9
  • 2.PNG
    64.4 KB · Görüntüleme: 10
Denemeden yazıyorum ama şu kodun çalışması lazım.
C:
#include <pic.h>

#ifndef _XTAL_FREQ
// Saat frekansı 16 Mhz
#define _XTAL_FREQ 16000000
#endif

__CONFIG (FOSC_HS & WDTE_OFF & LVP_OFF & CPD_OFF & CP_OFF);

int main()
{
    TRISAbits.TRISA0 = 1; //RA0 giriş
    TRISB = 0;    // PORTB çıkış

    PORTB = 0;    // PORTB üzerindeki tüm LED'ler kapalı

    while(1)
    {
        if (PORTAbits.RA0 == 1)
        {
            __delay_ms(250);
            PORTB = 0x0F; // b 0000 1111
        }
        else if (PORTAbits.RA0 == 0)
        {
            __delay_ms(250);
            PORTB = 0xF0; // b 1111 0000
        }
    }
}
 
Son düzenleme:
void main(void) kısmını silip mi yazacağım? Silip denedim derlemede sıkıntı çıkmadı ama ledler yine değişmedi hep aynı ledler yanıyor.
 
Benzetim programı üzerinde mi deneme yapıyorsunuz. Eğer öyleyse gerçek devre üzerinde denemenizi tavsiye ederim.

Üstteki kodu denemedim çünkü 8 tane LED takmam gerekecek. Ama kodun tamamını gösterecek şekilde düzenledim.

Aklıma gelen fikir RA0 yerine RD0'u giriş ucu olarak tanımlayıp tekrar deneyebilirsiniz.

Daha önce paylaştığım kara şimşek uygulamasını deneme kartı üzerinde denemiştim. PORTB'de 8 tane LED takılı.

LED'lerin B0'dan B7'e kadar sırayla aynı anda ikisi yanacak şekilde yanıp sönmesi gerekiyor.

Bu uygulamayı deneyebilirsiniz.

16F877A kılavuzunda 4Mhz için seçilecek sığacı 15pF olarak gösteriyor.
 
Arkadaşlar birşy sormak istiyorun
Ben asansör işi yapıyorum ve asansör kumanda kartlarını microdenetleyicilerke programlayacağız sorum şu mikrodenetleyicilere can bus seri haberleşme programaı yazmak zormudur daha önce hiç yazmadım
 
Daha önce hiç denemedim.

Ama burada anlatılanlara göre aslında CAN haberleşme protokolü için tüm PIC'ler kullanılabiliyor. Bazı PIC'lerin (örneğin PIC18F258) CAN iletişimi kolaylaştıran bazı bileşenlere sahip olduğunu öğreniyoruz.

Dahili CAN desteği olmayan bir mikro denetleyici kullandığınızda (örneğin PIC16F877A) mikro denetleyicinin yanı sıra MCP2515 CAN denetçi yongası ve MCP2551 veya TJA1040CAN alıcı yongasına ihtiyaç duyuluyor.

Yukarıdaki örnekte iki tane PIC16F877 kullanılmış. Bir tanesi LM35'ten gelen sıcaklık bilgilerini okuyor, diğeri ise CAN BUS iletişim protokolü ile gelen verileri gösteriyor.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…