|
|
View previous topic :: View next topic |
Author |
Message |
wedilo
Joined: 16 Sep 2003 Posts: 71 Location: Moers, Germany
|
How to rotate a string ? |
Posted: Mon Nov 24, 2003 8:27 am |
|
|
Hello to all,
I would like to monitor the status of a button via RS232. The character for high (button pressed) should be '-' and for low '_'. So that I can see on the terminal for example: ___-_-_-_-____
But I see : nnnnpnpnpnpnpnnnnn
Please have a look to the code:
Code: |
#include <18f452.h>
#use delay (clock=20000000)
#use RS232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
long lStartUp = 3017;
struct {
short int Button_1; // RC0
short int Button_2; // RC1
short int Button_3; // RC2
short int Button_4; // RC3
short int unused : 4; // RC4-7
} port_c;
#byte port_c = 0xF82
char sButton_1[31] = "______________________________";
char sLow[2] = "_";
char sHigh[2] = "-";
#int_timer1
timer1_isr() {
int ni;
setup_timer_1(T1_DISABLED);
set_timer1 (lStartUp);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
for (ni=0;ni<=29;ni++) {
sButton_1[ni] = sButton_1[ni+1];
}
if (port_c.Button_1 == 0) {
sButton_1[30] = sHigh;
}
else {
sButton_1[30] = sLow;
}
}
void main() {
set_timer1(lStartUp);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
putc(12);
For (;;) {
printf("Status of button 1: %s", sButton_1);
}
}
|
I think the mistake is in the isr where I rotate the characters.
I heard lots about pointers but can't use them.
Is there an easier way for that problem?
Thank you very much for any help
73 Sven |
|
|
KerryW Guest
|
|
Posted: Mon Nov 24, 2003 9:05 am |
|
|
When you define this:
char sLow[2] = "_";
char sHigh[2] = "-";
And use this:
buff[10]=sLow;
you are using the address of sLow, not its value.
Change the definition to:
char sLow = '_';
char sHigh = '-';
And use this:
buff[10]=sLow;
or use
char sLow[2] = "_";
char sHigh[2] = "-";
sLow[0] when you want a '_' character and sHigh[0] when you want a '-' character.
The first one (char sLow = '_'; ) will use less memory. |
|
|
wedilo
Joined: 16 Sep 2003 Posts: 71 Location: Moers, Germany
|
|
Posted: Tue Nov 25, 2003 2:56 am |
|
|
Hello KerryW,
I can't understand why, but it works.
Thank you very much
73 Sven |
|
|
KerryW Guest
|
Understanding pointers and arrays is crucial. |
Posted: Tue Nov 25, 2003 2:00 pm |
|
|
If you don't understand them, these problems will occur again and again.
Here is a thumbnail sketch of how it works.
char a; // location=0, 1 byte
int b; // location=1, 2 bytes
float c; //location 3, 4 bytes.
char *pa; // location 7, 1 byte
int *pb; // location 8, 1 byte
float *pc; // location 9, 1 byte
char x[2]; // location 10, 2 bytes
int y[2]; // location 12, 4 bytes
float z[2]; // location 16, 8 bytes
a=100; // location 0 contains 100
b=101; // location 1 contains 0, location 2 contains 101
y[0]=0x123; // location 12 contains 0x23, location 13 contains 0x01
pa=&a; // ‘&a’ mean ‘address of a’, or 0. Location 7 contains 0
pb=&y[0]; // location 8 contains 12
pb=y; // a synonym for ‘pb=&y[0]’, location 8 still contains 12.
*pb=102; // ‘*pb’ means ‘the location whose address is in location 8’. Location 8 contains 12, so it puts 0 in 12 and 102 in 13, because the compiler knows that pb points to a 2 byte integer.
pb++; // Location 8 was 12, but since it points to a 2 byte number, the compiler adds 2 instead of 1, so location 8 now contains 14.
If this doesn't do it for you, let me know. It's hard to explain in just a few lines. |
|
|
wedilo
Joined: 16 Sep 2003 Posts: 71 Location: Moers, Germany
|
|
Posted: Thu Nov 27, 2003 2:18 am |
|
|
Hello KerryW,
I was surprised about so much information. I will work through your message and will going to understand it completely.
It's hard stuff, but your are right: "it will occur ever and ever"
Thank you very much for your response
73 Sven |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Thu Nov 27, 2003 9:24 am |
|
|
KerryW,
CCS is a little different that most compilers:
int b in CCS is 1 byte
long c is 2 bytes
int32 is 4 bytes
Mark |
|
|
KerryW Guest
|
My compiler is old. |
Posted: Thu Nov 27, 2003 10:24 am |
|
|
I'm using something like 2.7?
I don't even have int32, although I knew that the newer ones had it. I wasn't sure how they had implemented if, if they had made int a 16 bit and long a 32, or what. I'm also not sure in they use high byte/low byte or low byte/high byte format. (I knew at one time, but I never remeber such things. If it becomes important, I just take a peek and see)
So many things to forget, and so little time. |
|
|
|
|
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
|