|
|
View previous topic :: View next topic |
Author |
Message |
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
Problem with : Porting driver to ccs |
Posted: Fri Aug 05, 2011 7:46 am |
|
|
Hi guys trying to port a Arduino driver to CCS and facing the pointer to constant error .
Here the function being called
Code: |
/*
* scrolltextcolor()
* Scrolls a text string from left to right
* Simple function for the original ht1632_putchar method without MULTICOLOR and no background color
* Original function by Bill Ho
* scrolltextxcolor(y location, string , colorname (RANDOMCOLOR for random color), delaytime in milliseconds)
*/
void scrolltextxcolor(int y,char Str1[ ], byte color, int delaytime){
int messageLength ;
messageLength = strlen(Str1)+ 1;
byte showcolor;
int xa = 0;
while (xa<1) {
int xpos = X_MAX;
while (xpos > (-1 * ( 6*messageLength))) {
for (i = 0; i < messageLength; i++) {
if (color==4){
showcolor=rand()+1;
}
else
{
showcolor=color;
}
ht1632_putchar(xpos + (6* i), y,Str1[i],showcolor);
}
delay_ms(delaytime);// reduce speed of scroll
xpos--;
}
xa =1;
}
} |
Here the line in main() that get the error !!
Code: |
scrolltextxcolor(4,"HAPPy New year ",RANDOMCOLOR,30);
|
Thanks for your help !!
PIC18F452
CCS 4.124
Last edited by mindstorm88 on Tue Aug 09, 2011 10:33 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 05, 2011 12:27 pm |
|
|
Quote: | #include <18F452.h>
#device PASS_STRINGS=IN_RAM
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
|
Add the line shown in bold below, in that position. The compiler will then
copy the constant string to RAM and pass the RAM string to the function.
This is all handled internally by the compiler, if you add that #device line. |
|
|
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
|
Posted: Fri Aug 05, 2011 12:52 pm |
|
|
You got it right on !!!! now another problem appear according to the length of the string if i put
Code: |
scrolltextxcolor(4,"PCM programmer is th",RANDOMCOLOR,30);
|
it works , but if i add 1 character or more as this
Code: |
scrolltextxcolor(4,"PCM programmer is the Best",RANDOMCOLOR,30);
|
it freezes , it seems to be at this line
Code: |
while (xpos > (-1 * ( 6*messageLength)))
|
Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 05, 2011 12:57 pm |
|
|
In CCS, an 'int' is an unsigned 8-bit integer. In Arduino, it's a
signed 16-bit integer. In CCS, you need to declare it as 'signed int16'.
Arduino data types:
http://arduino.cc/en/Reference/Int
Also, my advice is don't do declarations of variables in mid-code. Move
them to the beginning of the function. |
|
|
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
|
Posted: Fri Aug 05, 2011 1:12 pm |
|
|
Thanks a lot, you've just proved again why this sentence needed to be printed !!!!!
Code: |
scrolltextxcolor(4,"PCM programmer is the Best",RANDOMCOLOR,30);
|
|
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Sat Aug 06, 2011 9:48 am |
|
|
I'm really mixed on whether 8bit compilers should default to 16bit int's. (signed or not)
I did read somewhere that the "int" should default to the architecture's int size, but C18, and apparently others do the same thing. 16bit ints are default on 8bit architectures.
This is nice for standardization, but it becomes really easy to overload a minimal-sized 8bit CPU with 16bit math everywhere.
(I've seen this before with C18 code not fitting code into a PIC18F where once the code was changed to be more explicitly 8bit, a HUGE amount of Program FLASH was reclaimed for more code.) _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Sat Aug 06, 2011 2:42 pm |
|
|
It is in K&R.
It is bent more often than adhered to, since many 8bit chips have native 16bit operations.
If you look at the Intel chips the 8088, was an 8bit microprocessor, but deliberately written to emulate the 16bit architecture they were trying to launch at the same time....
Best Wishes |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Sat Aug 06, 2011 3:04 pm |
|
|
Ttelmah wrote: | It is in K&R.
It is bent more often than adhered to, since many 8bit chips have native 16bit operations.
If you look at the Intel chips the 8088, was an 8bit microprocessor, but deliberately written to emulate the 16bit architecture they were trying to launch at the same time....
|
Irritating. I see a lot of waste on 8bit PIC's when C18 is used because programmers just take the default without looking any deeper.
I've recently been doing some stuff in Dynamic-C for the Rabbit's (OMG, don't get me started) and it's INT is signed-16 by default.
Bleah. _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
|
Posted: Tue Aug 09, 2011 10:40 am |
|
|
Ok another problem from my porting , i get an identifier problem when passing an array name to function, i can't see what's wrong !!
Code is not complete as it is really big !!
the problem is passing the my2font array !!
Here the first call :
Code: |
scrolltextsizexcolor(1,"PCM programmer rocks ",2,RANDOMCOLOR, 0,my2font,8,8,'G',0); |
First function being called:
Code: |
void scrolltextsizexcolor(int y,char Str1[ ], char size, byte color, byte secondcolor, unsigned char fontname, int columncountfont, char rowcountfont, char oddeven, int delaytime){
messageLength = strlen(Str1)+ 1;
xa = 0;
while (xa<1) {
xpos = X_MAX;
while (xpos > (-1 * ( columncountfont*size* messageLength))) {
for (i = 0; i < messageLength; i++) {
if (color==4){
showcolor=rand()+1;
}
else
{
showcolor=color;}
if (secondcolor==4){
showsecondcolor=rand()+1;
}
else
{
showsecondcolor=secondcolor;
}
ht1632_putcharsizecolor(xpos + (columncountfont*size * i), y,Str1[i], size, showcolor, showsecondcolor, fontname, columncountfont, rowcountfont, oddeven);
}
delay_ms(delaytime);// reduce speed of scroll
xpos--;
}
xa =1;
}
} |
Second Function called by the first , problem at compilation happen here !!!
Code: |
void ht1632_putcharsizecolor(int x, int y,int8 c, char size, byte color, byte secondcolor, unsigned char fontname, int columncountfont, char rowcountfont, char oddeven) //unsigned char fontname[][NCOLUMNS]
{
// unsigned char dots, dots2,dots3;
//byte cc,cc2, cc3, rr, g, t, t3, divisor;
// byte maximumdrawfont, showcolor,showsecondcolor; //128 for the large fonts (=8x8 and 12x8), 64 for all smaller ones
if (rowcountfont<=7)
maximumdrawfont=64;
else
maximumdrawfont=128;
for (col=0; col<columncountfont*size ; col++) {
// Addressing the right 8 lines because 'The Dot Factory' starts from the bottom, all others from top
if (rowcountfont <=8) {
cc=col/size;
dots = fontname[c][cc]; //***** Previous identifier must be a pointer******
divisor=1;
}
|
Part of the array used by the function
Code: |
const char my2font[256][8]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x00
{0x7E,0x81,0xA9,0x8D,0x8D,0xA9,0x81,0x7E}, // 0x01
{0x7E,0xFF,0xD7,0xF3,0xF3,0xD7,0xFF,0x7E}, // 0x02
{0x70,0xF8,0xFC,0x7E,0xFC,0xF8,0x70,0x00}, // 0x03
{0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00}, // 0x04
{0x1C,0x5C,0xF9,0xFF,0xF9,0x5C,0x1C,0x00}, // 0x05
|
Last edited by mindstorm88 on Tue Aug 09, 2011 11:11 am; edited 1 time in total |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Tue Aug 09, 2011 10:50 am |
|
|
mindstorm88 wrote: | Ok another problem from my porting , i get an identifier problem when passing an array name to function , i can't see what's wrong !!
Code is not complete as it is really big !!
|
Then you should write a small example of the problem.
I find when I do that, I figure out the problem myself before I need to come here.
So write a small example... and see if that doesn't help.
What you're asking now is to debug your code for you... which we don't mind, but we have the requirement that you distill it down to something we can quickly digest. There's a lot of context missing (as you said, because your code is big) and we don't have time to go over it all. (we have to work to pay the bills)
But make a small example that shows your issue and we'll be happy to look at it.
-Ben _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
|
Posted: Tue Aug 09, 2011 11:04 am |
|
|
bkamen wrote: | What you're asking now is to debug your code for you... which we don't mind, but we have the requirement that you distill it down to something we can quickly digest. There's a lot of context missing (as you said, because your code is big) and we don't have time to go over it all. (we have to work to pay the bills)
But make a small example that shows your issue and we'll be happy to look at it.
-Ben |
I do understand Ben, even if I do a small part it won't compile !! I think it is just in the way the declaration of array is made between functions call !!!
If nobody sees it, i'll try to minimize it as much as possible for this function to be stand alone !!! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 09, 2011 12:12 pm |
|
|
Your problem is "how to I pass a 2-dimensional array to a function in CCS ?"
Strip your program down to essentials. Get rid of everything except
what's needed to study the problem. This is called making a test program.
Here's an example:
If I run the test program below, I get the following output in the MPLAB
simulator:
Quote: |
7E, 09, 09, 09, 7E,
7F, 49, 49, 49, 36,
3E, 41, 41, 41, 22,
|
Code: |
#include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
void ht1632_putcharsizecolor(int8 fontname[3][5])
{
int8 dots;
int8 row;
int8 col;
for(row=0; row < 3; row++)
{
for(col=0; col < 5; col++)
{
dots = fontname[row][col];
printf("%X, ", dots);
}
printf("\r");
}
}
//==========================================
void main()
{
int8 ABCfont[3][5] =
{
0x7E, 0x09, 0x09, 0x09, 0x7E, // A
0x7F, 0x49, 0x49, 0x49, 0x36, // B
0x3E, 0x41, 0x41, 0x41, 0x22, // C
};
ht1632_putcharsizecolor(ABCfont);
while(1);
}
|
|
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Aug 09, 2011 1:18 pm |
|
|
I don't know how critical it is to pass arrays by reference....
But I have found that designing so as to declare and access arrays in a global fashion saves a lot of code space and delay, so long as you keep your wits about you. |
|
|
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
|
Posted: Wed Aug 10, 2011 6:01 am |
|
|
PCM programmer wrote: | Your problem is "how to I pass a 2-dimensional array to a function in CCS ?"
|
That's exactly it !!
the goal is to be able to use the same function with 2-dimensional array of different size !!
is it possible ???
if the function is written this way :
Code: |
void ht1632_putcharsizecolor(int8 fontname[3][5])
|
it means all array use by this function must be 3x5 ?? |
|
|
mindstorm88
Joined: 06 Dec 2006 Posts: 102 Location: Montreal , Canada
|
|
Posted: Wed Aug 10, 2011 1:12 pm |
|
|
Here a strip down to 2 functions, the problem is still passing the array between function and the variable "rowcountfont" that change its value from one function to the other for no apparent reason !!! it start at main with a value of 8 , still 8 in the first function then 47 in the second tested in mplab sim !!
Code: |
#include <18F452.H>
#device PASS_STRINGS=IN_RAM
#device adc=10
#fuses hs, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#define RAND_MAX 3
#include <STDLIB.H>
#define Number_of_Displays 1
#define X_MAX (32*Number_of_Displays -1)
#USE FAST_IO (D)
#define CLK_DELAY delay_cycles(1)
#define RED 2
int8 my2font[3][8]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x00
{0x7E,0x81,0xA9,0x8D,0x8D,0xA9,0x81,0x7E}, // 0x01
{0x7E,0xFF,0xD7,0xF3,0xF3,0xD7,0xFF,0x7E}, // 0x02
};
int16 i;
int8 xa ;
signed int16 xpos, messageLength ;
char col ;
int8 dots, cc, showcolor,showsecondcolor, divisor, columncountfont, rowcountfont;
char oddeven;
/*******************************************
* second function called by the first one
*******************************************/
void ht1632_putcharsizecolor(int8 x, int8 y,char c, char size, int8 color, int8 secondcolor, int8 fontname[3][8], int8 columncountfont, int8 rowcountfont, char oddeven) {
for (col=0; col<columncountfont*size ; col++) {
if (rowcountfont <=8) {
cc=col/size;
dots = fontname[c][cc];
printf("%X, ", dots);
divisor=1;
}
printf("\r");
}
}
/**************************************
* first function being called
***************************************/
void scrolltextsizexcolor(int8 y,char Str1[ ], char size, int8 color, int8 secondcolor, int8 fontname, int8 columncountfont, int8 rowcountfont, char oddeven, int8 delaytime){
messageLength = strlen(Str1)+ 1;
xa = 0;
while (xa<1) {
xpos = X_MAX;
while (xpos > (-1 * ( columncountfont*size* messageLength))) {
for (i = 0; i < messageLength; i++) {
if (color==4){
showcolor=rand()+1;
}
else
{
showcolor=color;}
if (secondcolor==4){
showsecondcolor=rand()+1;
}
else
{
showsecondcolor=secondcolor;
}
ht1632_putcharsizecolor(xpos + (columncountfont*size * i), y,Str1[i], size, showcolor, showsecondcolor, fontname, columncountfont, rowcountfont, oddeven);
}
delay_ms(delaytime);// reduce speed of scroll
xpos--;
}
xa =1;
}
}
/***********************************************************************
* MAIN
***********************************************************************/
void main()
{
while(1)
{
scrolltextsizexcolor(1,"\2\1 ",2,RED, 0,my2font,8,8,'G',0);
}
}
|
|
|
|
|
|
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
|