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

faruk97

Üye
Katılım
1 Haz 2020
Mesajlar
21
Puanları
3
Yaş
23
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

  • 438.8 KB Görüntüleme: 9
  • 424 KB Görüntüleme: 9
  • 437.9 KB Görüntüleme: 8
  • 430.4 KB Görüntüleme: 8
Son düzenleme:

mehmet.bey

Paylaşımcı üye
Katılım
19 Ara 2011
Mesajlar
1,090
Puanları
108
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:
Konu Sah
F

faruk97

Üye
Katılım
1 Haz 2020
Mesajlar
21
Puanları
3
Yaş
23
Display ortak uç MX1 'e. I2C adresi 0x70.

Cevabınız için teşekkür ederim Hocam ama demek istediğinizi tam anlayamadım.
 

mehmet.bey

Paylaşımcı üye
Katılım
19 Ara 2011
Mesajlar
1,090
Puanları
108
Akşam bakayım...
 

mehmet.bey

Paylaşımcı üye
Katılım
19 Ara 2011
Mesajlar
1,090
Puanları
108
Display ortak ucu 5V da. Onu i2c
entegrenin MX1 ucuna bağlayıp
deneyin. Olmazsa bakarım.
 

mehmet.bey

Paylaşımcı üye
Katılım
19 Ara 2011
Mesajlar
1,090
Puanları
108
Bu şekilde uygun mu?

 
Konu Sah
F

faruk97

Üye
Katılım
1 Haz 2020
Mesajlar
21
Puanları
3
Yaş
23
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:

mehmet.bey

Paylaşımcı üye
Katılım
19 Ara 2011
Mesajlar
1,090
Puanları
108
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.
 

Sponsor Bağlantı

Forum istatistikleri

Konular
110,950
Mesajlar
781,553
Kullanıcılar
409,219
Son üye
htosun

Yeni konular

Üst