Arkadaşlar Max7219 ile display uygulaması çalışmıyor yardımcı olur musunuz?

Başlatan 17omer17, 24 Ağustos 2015, 17:17:45

17omer17

İyi günler.Max7219 ile 4 digit display sürmek istiyorum. Max7219 u pic16f628a sürücem programını yazdım proteus ta denedim ancak max7219 displayleri sürmedi.Galiba bir yerde hata yapıyorum.Hata ya kodda ya da proteustaki max7219 da.Bana yardımcı olabilir misiniz.Teşekkür ederim.
Kod bu çalıştırmadığım için daha geliştirmedim. Sadece herhangi bir digite sayı yazdıracağım.

#include <16f628a.h>                              
#fuses INTRC_IO,NOWDT,NOBROWNOUT,NOLVP,NOPUT,NOCPD                                     
#use delay (clock=4000000)  
#include "max7219.c"

void main()
{  
   setup_oscillator(OSC_4MHZ);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);       

   init7219();                       
   delay_ms(5);
   
while(true)
{
write7219(1, 1);
delay_ms(20);
}
}

MAX7219 kodu

/* 
****************************************************************************************************** 
* Chip        : MAX7219 
* Author      : Burak HANÇERLİ 
* Mail        : bhancerli@gmail.com 
* Description : MAX7219 LED Display Driver Routines - v1.1 
*    
*  
*  The Maxim MAX7219 is a led display driver. It can control up to 64 individual leds or eight 
*  7-segment-display. 
* 
*  Max7912 uses 3-wire to communicate with microcontroller. 
*    - DATA   : Used to transmit data. 
*    - CLOCK  : Used to generate clock signal which is required for transmitting each bite of data. 
*    - LOAD   : Used to load data to the Max7913's Dual-Port SRam. 
*                  
*  DESCRIPTION OF USER FUNCTIONS 
* ------------------------------- 
*  init7219()                      : Required for initialize MAX7219. This function have has to be called before calling any function. 
*  write7219(digit, data)          : Writes data to the specified digit number. If Decimal Point needed on any digit, just add 
                                     128 to the data. 
                                     For example : write7219(1,3)   = writes "3"  to first digit. 
                                                   write7219(1,131) = writes "3." to first digit. 
*  shutdown7219(operatingMode)     : Set operatingMode = 0 to Shutdown mode 
*                                    Set operatingMode = 1 to Normal mode 
*  decode7219(decodeMode)          : Sets digit-decode mode. code-B or no-decode mode. Look up datasheet for detailed instructions. 
*                                    For example, if user sets decodeMode = 4, (4=0b00000100), then 3. digit will be 
*                                    decoded as code-B algorithm, but other pins don't have any decode mode. 
*  brightness7219(brightnessLevel) : Sets brightness level of digits. 
*                                    brightnessLevel = 0  ; minimum brightness level 
*                                    brightnessLevel = 15 ; maximum brigthness level 
*                                    
*  scanLimit7219(totalDigitNumber) : Sets number of connected digits to the MAX7219. When init7912() function is called, 
                                     number of digit will be setted to 4 as default. 
                                      
*  test7219(testMode)              : Sets 7-segment-display test-mode on or off. 
                                     testMode = 0 ; normal operation mode 
                                     testMode = 1 ; display test mode 
                                      
** THIS LIBRARY CAN BE USED, DEVELOPED OR SHARED WITH REFERRING THE AUTHOR.                                    
******************************************************************************************************/ 


// CONSTANTS // 
// - Connection Pins (CHANGE THESE PINS AS YOU WISH) 
#define CLK       PIN_A4 
#define LOAD      PIN_A3 
#define SEND_DATA PIN_A2 

// - Mode Selection 
#define decode 0x09 
#define brightness 0x0A 
#define scanLimit 0x0B 
#define shutDown 0x0C 
#define dispTest 0x0F 

// Firt 4 bites (not used generally) 
#define firstBites 0x0 

// Wait function 
#define wait delay_ms(1) 

long serialData=0; 



void clock7219() // clock (CLK) pulse 
{ 
   output_low(CLK); 
   wait; 
   output_high(CLK); 
} 

void load7219()  // load (LOAD) pulse 
{ 
   output_low(LOAD); 
   wait; 
   output_high(LOAD); 
} 

void send7219(long data) // send 16 bit data word to the 7219 
{ 

   int count; 
   for (count=0; count<16; ++count) 
   { 
      output_bit(SEND_DATA, shift_left(&data,2,0)); // set data (DIN) level 
      clock7219(); // clock data in 
   } 
   load7219(); // latch the last 16 bits clocked 
} 

void dataMaker(byte mode, int dataIncoming) // Standart data package function 
{ 
   serialData=firstBites; 
   serialData<<=4; 
   serialData|=mode; 
   serialData<<=8; 
   serialData|=dataIncoming; 
   send7219(serialData); 
} 

void write7219(byte digit, int data) // Send data to digits 
{ 
   dataMaker(digit, data); 
} 

void shutdown7219(int operatingMode) 
{ 
   dataMaker(shutDown,operatingMode); 
} 

void decode7219(int decodeMode) 
{ 
   dataMaker(decode, decodeMode); 
} 

void brightness7219(int brightnessLevel) 
{ 
   dataMaker(brightness, brightnessLevel); 
} 

void scanLimit7219(int totalDigitNumber) 
{ 
   dataMaker(scanLimit, totalDigitNumber); 
} 

void test7219(int testMode) 
{ 
   dataMaker(dispTest, testMode); 
} 

void init7219() 
{ 
   dataMaker(shutDown, 1);     // No-Shutdown mode. Normal Operation mode. 
   dataMaker(decode, 15);      // All digits are programmed as code-B decode mode. 
   dataMaker(scanLimit, 4);    // Total digit number set to 4. 
   dataMaker(brightness, 15);  // Full brightness. 
}






xoom

decode7219(decodeMode) ayarlarını sonsuz döngüden önce belirtmelisin..

17omer17

Tam olarak decode7219(decodeMode) nin içine ne yazacağımı bilmiyorum .Program üzerinde değişiklik yaparak gösterir misiniz?

ugurer


17omer17

Bir gelişme olmadı fakat aynı işi yapan ve daha ucuz bir yöntem buldum

ugurer


ahmet2015



PIC16F628A A4 pini OD (Open Drain) yapıda olduğundan Proteusta bu pini +5 volta çekmemiz lazımki Mosfet
  üzerinden akım akabilsin.


Şema için Kod:

#include <16f628a.h>                             
#fuses INTRC_IO,NOWDT,NOBROWNOUT,NOLVP,NOPUT,NOCPD,MCLR                                     
#use delay (clock=4000000) 
#include "max7219.c"

void main()
{
   SET_TRIS_A( 0x00 );

   setup_oscillator(OSC_4MHZ);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);       
   
   init7219();                       
   delay_ms(5);

while(true) {
      write7219(1, 1);
      write7219(2, 2);
      write7219(3, 3);
      write7219(4, 4);      
      delay_ms(20);
   }
}

ugurer

Yardımlarınız için teşekkürler. Simülasyonda bir sorun olmamıştı benim ama devreyi kurduğum zaman görüntü alamamıştım. Problemin çözümü besleme bacaklarına kondasatör eklemeniz gerekiyor, ekledikten sonra problem kalmıyor. Fakat @17omer17 'nin bahsettiği diğer yöntemi merak ettim.

17omer17

74hc164 entegresi ile yaptım. Oldukça ucuz bir entegre SMD si de var. Ayrıca yazılım yardımıyla istediğiniz  karakterleri oluşturabilirsiniz.