|
|
View previous topic :: View next topic |
Author |
Message |
wala.iswara
Joined: 10 Jun 2013 Posts: 21
|
Display counting number on dot 5x7 matrix and 16F628 |
Posted: Tue Jun 11, 2013 12:24 am |
|
|
Hallo,
I want to display counting number 0 to 9 on 5x7 dot matrix. The mcu is 16F628A.
I use the following code, successfully compiling, but not showing number with Proteus.
Can anyone tell me why? Or have any code for reference?
Code: |
//counting number 0 to 9 on 5x7 dot matrix with PIC16F628
//port B for row, Cathode matrix
//port A for column, Anode matrix
#include <16F628.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#INT_TIMER0
unsigned short i, count;
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return ( 0x3E, 0x41, 0x41, 0x41, 0x3E );
case 1 : return ( 0x00, 0x01, 0x7F, 0x21, 0x00 );
case 2 : return ( 0x31, 0x49, 0x45, 0x45, 0x27 );
case 3 : return ( 0x36, 0x49, 0x49, 0x49, 0x49 );
case 4 : return ( 0x04, 0x4F, 0x24, 0x14, 0x1C );
case 5 : return ( 0x4E, 0x51, 0x51, 0x51, 0x71 );
case 6 : return ( 0x4E, 0x51, 0x51, 0x51, 0x3E );
case 7 : return ( 0x70, 0x50, 0x48, 0x47, 0x40 );
case 8 : return ( 0x36, 0x49, 0x49, 0x49, 0x36 );
case 9 : return ( 0x3E, 0x45, 0x45, 0x45, 0x39 );
}
}
void main(){
setup_comparator(0x0ff07); // CCP off
set_tris_a(0x00);
set_tris_b(0x00);
while(TRUE){
for (i=0;i<5;i++) // Displaying i on 5x7 dot matrix
count=mask(i);
count++;
if (i>9)i=0;
delay_ms(500);
}
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Tue Jun 11, 2013 3:24 am |
|
|
There are several things wrong:
1) Forget Proteus..... It commonly has a lot of problems with the PIC chips, and unless you already know how to get PIC's working, can mislead you as to what works/doesn't.... This is a 'sticky' at the top of the forum.
2) HS, means a _greater_ than 4MHz crystal is going to be used. Then you have your clock set for 4MHz. Not compatible. Have you actually got the chip working, and done a simple 'flash an LED' test first.
3) #INT_TIMER0, means that the following routine is the handler for a timer0 interrupt. It should be immediately in front of the routine to be used, and then you are not using this at all. What the effect would be on the compiler is 'dubious'.....
4) You have 'i' being tested for being >9, yet it is counting 0 to 4.... One or the other is wrong.
5) Then you say 'displaying i on 5x7 dot matrix', but nowhere are you actually outputting anything to the matrix.
6) You have a line remarked with 'CCP off', yet it is the comparator being controlled here, not the CCP. Also using 'values' like this is poor practive. Use the defined keywords, so the command becomes self documenting.
At the moment the code really does nothing, do even with the limitations of Proteus, it is probably giving the right answer, that nothing will happen...
Best Wishes |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Jun 11, 2013 4:10 am |
|
|
And a few other huge ones: Code: | for (i=0;i<5;i++) // Displaying i on 5x7 dot matrix
count=mask(i);
count++;
if (i>9)i=0;
delay_ms(500); | 7) Which statements do you expect to be executed in the for-loop?
The C language defines that only the next statement will be executed, here your line 'count = mask(i);'.
If you want more instructions to be executed then put them inside a '{}' block.
Note that it is good practice to ALWAYS put '{}' characters around the part that you want to be executed in the for-loop, even when it is just one line. This will help you to see clearly which part is being looped.
Code: | unsigned short i, count; | 8) You do like short variables, don't you?
When you look up the 'short' type in the manual then you will see that for the CCS compiler this has a size of only 1 bit.... It can only contain 0 or 1, not all the larger values you want to store in them.
The size of types like 'int', 'short' and 'double' depends on the compiler. You will save yourself a lot of trouble by not using these types but use a type like int1, int8, int16 which will be the same on every compiler you ever use.
Code: | unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return ( 0x3E, 0x41, 0x41, 0x41, 0x3E ); | 9) You have specified that the function will return 1 'unsigned short' but then in the return statement you are returning 5 values?!?!?!?
Such a small program. So many errors.
I'm afraid you have a long way to go.
I suggest you have a look at the MPLAB simulator tool. You can use this to single step through your program and examine exactly what is happening. It will speed up your debugging process dramatically. |
|
|
wala.iswara
Joined: 10 Jun 2013 Posts: 21
|
|
Posted: Tue Jun 11, 2013 9:13 am |
|
|
Dear Ttelmah & ckielstra,
Thanks a lot.
Don't worry about the mcu, i was make 1 digit counter on 7 segment with my 16F628A, by 4Mhz clocking.
And now I am trying with dot matrix LED.
I am trying my new code. Still not working.
here is my new code:
Code: |
//counting number 0 to 9 on 5x7 dot matrix with PIC16F628
//port B for row, Cathode matrix
//port A for column, Anode matrix
#include <16F628.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#byte port_b = 6
int8 i, count;
int8 mask(unsigned short num) {
switch (num) {
case 0 : return 0x3E, 0x41, 0x41, 0x41, 0x3E ;
case 1 : return 0x00, 0x01, 0x7F, 0x21, 0x00 ;
case 2 : return 0x31, 0x49, 0x45, 0x45, 0x27 ;
case 3 : return 0x36, 0x49, 0x49, 0x49, 0x49 ;
case 4 : return 0x04, 0x4F, 0x24, 0x14, 0x1C ;
case 5 : return 0x4E, 0x51, 0x51, 0x51, 0x71 ;
case 6 : return 0x4E, 0x51, 0x51, 0x51, 0x3E ;
case 7 : return 0x70, 0x50, 0x48, 0x47, 0x40 ;
case 8 : return 0x36, 0x49, 0x49, 0x49, 0x36 ;
case 9 : return 0x3E, 0x45, 0x45, 0x45, 0x39 ;
}
}
void display_number(){
for (i=0; i<5;i++)
port_b = i;
port_b=mask(i);
output_high(PIN_A0);
delay_ms(100);
output_low(PIN_A0);
output_high(PIN_A1);
delay_ms(100);
output_low(PIN_A1);
output_high(PIN_A2);
delay_ms(100);
output_low(PIN_A2);
output_high(PIN_A3);
delay_ms(100);
output_low(PIN_A3);
output_high(PIN_A4);
delay_ms(100);
output_low(PIN_A4);
}
void main(){
setup_comparator(0x0ff07); // Comparator off
set_tris_a(0x00);
set_tris_b(0x00);
port_b=0;
while(TRUE){
display_number();
if (i>9)i=0;
delay_ms(1000);
}
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Tue Jun 11, 2013 9:20 am |
|
|
mask, is still only accepting a short....
Then a function returning an int8, returns _one_ number. Yours attempts to return five.
Then you output 'i' to port_b, and in the next instruction output mask(i). You will never see the first value.
Still have 4MHz clock and HS selected. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Jun 11, 2013 3:41 pm |
|
|
When programming it is very important to have an eye for details. You make some big errors but also a lot of tiny errors.
wala.iswara wrote: | Dont worry obout the mcu, i was make 1 digit counter on 7 segment with my 16F628A, by 4Mhz clocking. |
Code: |
#include <16F628.h> | Your include is not for the same processor as your hardware, only a letter 'A' different, but still a potential problem.
Code: | setup_comparator(0x0ff07); // Comparator off | You still didn't follow Ttelmah's suggestion. The problem in this line is that it is using a 'magic' value. Difficult to understand but can also change by CCS in the next compiler version and then you will have a very difficult problem to find. Change to: Code: | setup_comparator(NC_NC_NC_NC); // Comparator off |
Code: | output_high(PIN_A4); | We don't know your circuit, but this is a potential problem. Pin A4 is an open collector output only, meaning that you can not actively drive it high.
Code: | for (i=0; i<5;i++)
port_b = i;
port_b=mask(i); | You didn't fix issue number 7 from my previous post. I wonder why I do waste my time here. I'm off to bed now. |
|
|
wala.iswara
Joined: 10 Jun 2013 Posts: 21
|
|
Posted: Tue Jun 11, 2013 7:12 pm |
|
|
Dear Ttelmah & ckielstra,
I learning with PCW C Compiler IDE Version 3.28, have not #Include < xxx.h> for 16F628A. So i use #include<xxx.h> for 16F628.
Code: | setup_comparator(NC_NC_NC_NC_); // Comparator off | Yes, thanks for refreshing.
Quote: | ckielstra:
You didn't fix issue number 7 from my previous post. I wonder why I do waste my time here. I'm off to bed now. | I am trying, but OK lets relax for a moment. Its really confusing me. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Jun 12, 2013 1:38 am |
|
|
THE most important question.
Have you thrown Proteus/ISIS away?
(Very first advice given)
When you are using real chips, say so clearly, then many of us will try to help.
Mike |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Jun 12, 2013 1:56 am |
|
|
wala.iswara wrote: | I learning with PCW C Compiler IDE Version 3.28, have not #Include < xxx.h> for 16F628A. So i use #include<xxx.h> for 16F628. | v3.28 is the version number for the IDE, not for the compiler. The compiler has a version number like 3.xxx and can be found at the top of the list file (*.lst) in your project directory.
The PIC16F628A is from around 2003, this means you are using a compiler of more than 10 years old?
It should work for the PIC16F628, the differences are small, but you are taking some small risks here. Have a look at appendix C of the PIC16F628A data sheet for a list with differences between the two devices. |
|
|
wala.iswara
Joined: 10 Jun 2013 Posts: 21
|
|
Posted: Wed Jun 12, 2013 8:15 pm |
|
|
Hallo,
@Mike:
I was make a minimum system for my 16F628A.
http://www.flickr.com/photos/55060929@N06/
@ckielstra:
Yes. The version number is the version number of the IDE.
I was fixed issues no. 7. And result is LED blinking a cycle.
@Ttelmah:
Till now, i just have 4Mhz x-tall. I will change after i can get a higher ones. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Thu Jun 13, 2013 9:46 am |
|
|
OK. So you've got real hardware.
Driving an LED matrix has been discussed loads of times on this forum.
Do a search to see how others have done it.
You should be able to adapt what's in the link below to your circuit.
http://www.ccsinfo.com/forum/viewtopic.php?t=47436&start=0&postdays=0&postorder=asc&highlight=
Give it a try.
When/if you get stuck, show us what you've done and we'll try to help.
Don't worry about the crystal. 4MHz should be more than fast enough at this stage. Just change the fuse.
Mike |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Thu Jun 13, 2013 9:49 am |
|
|
I actually have working code for this...
it was a university project in 2005..... ill see if i can dig it up.
G. _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Thu Jun 13, 2013 10:10 am |
|
|
wala.iswara wrote: | Hallo,
@Mike:
I was make a minimum system for my 16F628A.
http://www.flickr.com/photos/55060929@N06/
@ckielstra:
Yes. The version number is the version number of the IDE.
I was fixed issues no. 7. And result is LED blinking a cycle.
@Ttelmah:
Till now, i just have 4Mhz x-tall. I will change after i can get a higher ones. |
Aaargh......
There is nothing whatsoever wrong with using a 4MHz crystal, but you _must_ set the oscillator to the correct setting to use this.
HS, is the 'high speed' oscillator, and is not rated to operate a 4MHz crystal. Using it tends to result in the crystal being over-driven, and increase the tendency to lock onto an overtone, rather than the correct frequency.
XT, is the correct oscillator fuse for 4MHz. _USE IT_.
Best Wishes |
|
|
wala.iswara
Joined: 10 Jun 2013 Posts: 21
|
|
Posted: Fri Jun 14, 2013 12:37 am |
|
|
Hallo,
@Ttelmah & Mike:
Ha ya ya...
The #fuses. Yes, my mistake! XT is for 4 Mhz, not HS.
Thanks alot.
Any way,
i just simplify my code, and use a 4017 shift register. It just for show 1 number, and not counting. It is work.
Code: | #include <16F628.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#define Clock_4017 PIN_A0 // -> to pin_14 4017
#define Reset_4017 PIN_A1 // -> to pin_15 4017
#byte port_b=6
int8 mask[]= { 0xFE, 0xFE, 0x00, 0xDE, 0xDE }; // 1
void main()
{
int8 i;
// ADD ALL PIC TRIS SETUP
setup_comparator(NC_NC_NC_NC); // Comparator OFF
set_tris_a(0);
set_tris_b(0);
delay_ms(500);
while (TRUE){
for (i = 0; i <5; i++) {
port_b = i;
port_b=mask[i];
delay_ms(25);
{
// Clock 4017
output_high(PIN_A0);
delay_ms(5);
output_low(PIN_A0);
delay_ms(5);
}
}
// Reset 4017
output_high(PIN_A1);
delay_ms(5);
output_low(PIN_A1);
delay_ms(5);
} //End while
} |
|
|
|
wala.iswara
Joined: 10 Jun 2013 Posts: 21
|
|
Posted: Fri Jun 14, 2013 2:58 am |
|
|
Quote: | i just simplify my code, and use a 4017 shift register. | Sorry, 4017 decade counter. Not shift register. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|