• Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

MAX7219 with Atmega16A | not showing the 2nd and 1st digit

ikelectro

Member
Here is the code I'm using. In simple when I send instruction to the digits it is showing perfect. But whenever I'm sending instruction to the MAX7219 in the function call "digit_separation", It is not showing the 2nd and 1st digit. Showing only 3rd digit. Can anyone help me on that?



Code:
#include <avr/io.h>
#define F_CPU 12000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

#define MOSI PORTB5
#define SCK PORTB7
#define SS PORTB4

#define setbit(port, bit) (port) |= (1 << (bit))
#define clearbit(port, bit) (port) &= ~(1 << (bit))



void execute  (unsigned char cmd, unsigned char data)
{
    PORTB &= ~(1<<SS);
 
    SPDR = cmd;
    while (!(SPSR & (1<<SPIF)));
 
    PORTB |= (1<<SS);
 
    PORTB &= ~(1<<SS);
 
    SPDR = data;
    while (!(SPSR & (1<<SPIF)));
 
    PORTB |= (1<<SS);
}



void digit_separation (unsigned char y)
 
    {    unsigned char a = ((y/100)%10);
        unsigned char b =((a/10)%10);
        unsigned char c = (b%10);
         
                execute (0x09,0XFF); // enable decoding
                execute (0X0A,0X04); // intensity level
                execute (0X0B,0X02); // scan four segments
                execute (0X0C,0X01); //TURN ON THE CHIP
                execute (0X0F,0X00); //normal mode
                execute(0X01,c);
                execute(0X02,b);
                execute(0X03,a);
             
    }
 


    int main (void)
{ 
    //
 
 
    DDRB = 0XFF;
    clearbit (PORTB,0);
    _delay_ms(1000);
    setbit(PORTB,0);
    _delay_ms(1000);
 
    DDRB = (1<< MOSI) | (1<<SCK) | (1<<SS); // making it out put
    SPCR = (1<<SPE)| (1<<MSTR)|(1<<SPR0); // SPI AS MASTER
 
    execute (0x09,0XFF); // enable decoding
    execute (0X0A,0X04); // intensity level
    execute (0X0B,0X02); // scan four segments
    execute (0X0C,0X01); //TURN ON THE CHIP
    execute (0X0F,0X01); // test mode
    _delay_ms(1000); //test mode wait 1 seconds
    execute (0X0F,0X00); // normal mode
    execute (0X01,0X03);
    
    execute (0X02,0X86);// FOR DECIMAL 128+8 setting the 7th bit
    
    execute (0X03,0X08);
    
    _delay_ms(3000);
 
    unsigned char x = 250;
 
    while (1)
    {
        for (;x>=0;x--)
        {
            digit_separation (x);
            _delay_ms(1000);
            //_delay_ms(1000);
        }
     
    }
 
//return 0;
}
 

Ian Rogers

User Extraordinaire
Forum Supporter
Most Helpful Member
Reading the data sheet... The scan limit is set to digits 0,1 & 2... Next to that is an asterisk... You have all 8 enabled

command 0x09 data 0xFF... Try 0x0F and have only four enabled.. The scan limit should be better!! Worth a try!
 

ikelectro

Member
Reading the data sheet... The scan limit is set to digits 0,1 & 2... Next to that is an asterisk... You have all 8 enabled

command 0x09 data 0xFF... Try 0x0F and have only four enabled.. The scan limit should be better!! Worth a try!
I have tried command 0X09, data 0X0F. but no luck. Same results.
 

wkrug

Active Member
unsigned char c = (y/100); //At 249 a rest 0f 2 will be in c
unsigned char b =(((y%100)/10)%10); //The rest of 249/100 = 49 divided by 10 will give You 4
unsigned char a = (y-(c*100)-(b*10)); //subtract from 249 - c*100 (=200) and b*10 (=40) The Rest will be 9
Try out this sequence to calculate the digits.
I think there is something wrong in Your calculation.
 

ikelectro

Member
Try out this sequence to calculate the digits.
I think there is something wrong in Your calculation.
Yea, thanks. Later, I also found that my calculation is wrong. Many thanks for you reply.
 

ERGOYE

Member
hi guys....i need your help. i am in need of creating HEX file from C file or h file. i tried but i was not succeded. thanks a lot.
 

Attachments

wkrug

Active Member
I've tried to rebuilt the failing files.
F_CPU in makefile was set by me to 16000000 please change when not OK.
CPU / 4000 was Changed into F_CPU / 4000 in UTIL File CPU wasn't defined anywhere.
Try out please, if that will work.
Please rename make.pnproj.c to make.pnproj and Makefile.rar to Makefile - ETO doesn't support that file extensions.
Use AVR_GCC to built Your wished .hex File
 

Attachments

wkrug

Active Member
if you change "Makefile" it makes a difference on hex file?
Yes, because some parameters are depending from predefines.
E.G. F_CPU = When there is a Variable depending from F_CPU like clock = F_CPU / 4000 then the variable "clock" changes depending from predefined F_CPU.
This was translated into Assembler and then into the the .hex file.
 

Ian Rogers

User Extraordinaire
Forum Supporter
Most Helpful Member
if you change "Makefile" it makes a difference on hex file?
I hope I do not sound disrespectful but I don't think you should be messing with the make file!! This is used by the linker to generate the end product! If you are using an IDE, then leave it alone..
 

ERGOYE

Member
Yes, because some parameters are depending from predefines.
E.G. F_CPU = When there is a Variable depending from F_CPU like clock = F_CPU / 4000 then the variable "clock" changes depending from predefined F_CPU.
This was translated into Assembler and then into the the .hex file.
wkrug....so can you creating hex file by using the newer "makefile" on (#9)?
wkrug i appriciat for your time
Again thanks a lot.
 

wkrug

Active Member
This is used by the linker to generate the end product! If you are using an IDE, then leave it alone..
I absolutly agree with You.
In the first post was no Makefile present.
But AVRGCC doesn't work without that. The project file was missing too.
So I've tryed to built the Makefile manually ( with mFile Generator ).
 

Latest threads

EE World Online Articles

Loading

 
Top