PIC i2c modulü ile 7SEGMENTE veri yazma (SAA1064)

faruk97

Üye
Katılım
1 Haz 2020
Mesajlar
38
Puanları
1
Yaş
27
Merhaba arkadaşlar,

Ben PIC16F1509 ile bir i2c haberleşme uygulaması yapıyorum. Kullandığım program MPLAPX IDE XC8 derleyicisi. Yazdığım programda bir sorunla karşılaştım. Program 0'dan 9'a kadar sayıların gönderilmesi ve görmek. Proteus'da simülasyon yapıyorum ve gönderilen bilgiler doğru çıkmıyor. Garip çıktılar görüyorum. Bazı ekran fotoları koydum. Yardımcı olursanız çok sevinirim.

Şimdiden hepinize çok teşekkürler.

Kod:
// CONFIG1
#pragma config FOSC = HS        // Oscillator Selection Bits (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF       // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000
const char rakam[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int i;

void Bekle(void){
    while( (SSP1CON2 & 0x1F) || (SSP1STATbits.R_nW) )
    continue;
}

void Basla(void){
    SSP1CON2bits.SEN=1;
    //SSP1STATbits.S=1;
    while(SEN);
    //while(SSP1IF);
    //while(SSPSTATbits.BF);
    //SSP1IF = 0;
}

void Dur(void){
    //SSP1IF=0;
    SSP1CON2bits.PEN=1;
    while(PEN);
    //while(SSP1IF);
    //while(SSPSTATbits.BF);
}

signed char Yaz(unsigned char veri){
    Bekle();
    //SSP1IF=0;
    //TRISBbits.TRISB4=1;
    //TRISBbits.TRISB6=1;
    
    //SSPSTATbits.BF=0;
    //SSPSR=SSPBUF;
    SSP1BUF=veri;
    //while(SSPSTATbits.BF);
    //__delay_us(4);
    //TRISBbits.TRISB4=0;
    //TRISBbits.TRISB6=0;
    return (ACKSTAT);
}
void main(void) {
    
    TRISB=0xFF;
    CM1CON0bits.C1ON=0;
    CM2CON0bits.C2ON=0;
    ANSELB=0;
    SSP1CON1=0b00111000;
    SSPADD=9;
    SSP1STAT=0b10110000;
    SSP1CON2=0;
    SSP1STATbits.R_nW=0;
    //ADON=0;
    SSP1CON3=0b00000000;
    while(1){
        for(i=0;i<10;i++){
            Basla();
            Yaz(0x70);
            //while(ACKSTAT);
            Yaz(0x01);
            Yaz(rakam[i]);
            //Yaz(0x03);
            Dur();
            __delay_ms(500);
        }
    }
   // return;
}
 

Ekli dosyalar

  • 0.jpg
    0.jpg
    438.8 KB · Görüntüleme: 17
  • 1.jpg
    1.jpg
    424 KB · Görüntüleme: 21
  • 2.jpg
    2.jpg
    437.9 KB · Görüntüleme: 14
  • şema.jpg
    şema.jpg
    430.4 KB · Görüntüleme: 20
Son düzenleme:
Display ortak uç MX1 'e. I2C adresi 0x70.

Kod:
Başla()
Yaz(0x71)
Yaz(0x01)
Yaz(rakam[i])
Yaz(0x00)
Yaz(0x00)
Yaz(0x00)
Dur()
 
Son düzenleme:
Display ortak ucu 5V da. Onu i2c
entegrenin MX1 ucuna bağlayıp
deneyin. Olmazsa bakarım.
 
Bu şekilde uygun mu?

Ekran-g-r-nt-s-2020-06-01-23-49-40.png
 
Bu şekilde uygun mu?
Hocam öncelikle cevaplarınız için çok teşekkür ederim
bu şekilde yaptım, rakamlar gözüküyor, ama istediğim gibi değil.
Benim programım da 1.Segmentte 0-9'a kadar sayılar sırasıyla gözükecek. Ama bu program da -sizin gösterdiğiniz şekilde bağlantıları yaptığım da- iki displayde de rakamlar gözüküyor ama ikinci display'de birinciye göre daha çok ve düzgün ama ne sırasıyla gözüküyor ne de düzgün bir şekilde ve de devamlı olarak 8 sayısı çıkıyor. benim istediğim 1.displayde gözükmesi sırasıyla 8 sayısı çıkmadan 500ms'de bir sayıların değişerek sayması.

Bir yerlerde bir hata var ama ne tam olarak bulamadım :))
 
Son düzenleme:
Ana döngüden önce mod girilmeli,
örneğin; 12mA + statik mod.
Sonra dört diğit silinmeli. Yani boş
değer gönderilmeli.
Döngü içerisinde de aynı şekilde aktif
displaya değer gidecek pasif olana da
boş değer.
 

Forum istatistikleri

Konular
127,967
Mesajlar
913,969
Kullanıcılar
449,612
Son üye
esperran

Yeni konular

Geri
Üst