|
|
View previous topic :: View next topic |
Author |
Message |
Markdem
Joined: 24 Jun 2005 Posts: 206
|
there must be a better way |
Posted: Mon Jan 02, 2006 3:49 am |
|
|
OK, we all know i dont know what i am doing . Can sombode tell me a better way of doing this??
Code: |
lightbank1_on_h = atoi(gets(rs232data));
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
gets(rs232data);
lightbank1_on_h = atoi(rs232data);
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
gets(rs232data);
lightbank1_on_h = atoi(rs232data);
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
gets(rs232data);
lightbank1_on_h = atoi(rs232data);
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
gets(rs232data);
lightbank1_on_h = atoi(rs232data);
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
|
i know there is a emu thing in c, but i have no idea how to use it here.
Thanks, Mark |
|
|
Markdem
Joined: 24 Jun 2005 Posts: 206
|
|
Posted: Mon Jan 02, 2006 5:08 am |
|
|
Hi All, just to add, what i am trying to go is seta bunch of vars using rs232. This all works, but my program is now to big and i am getting out out rom errors. Is there a way of maybe getting a list and reading it?
Thanks for all your help
Mark |
|
|
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Mon Jan 02, 2006 9:23 am |
|
|
Markdem wrote: | Is there a way of maybe getting a list and reading it? |
Look at the list file (.lst) in the same directory as the HEX file.
As far as trying to do what you are in your code sample it appears as though you are just doing:
Code: |
lightbank1_on_h = atoi(rs232data);
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
gets(rs232data);
|
Five times?
Why not:
Code: |
for(i = 0;i < 5;i++) {
lightbank1_on_h = atoi(rs232data);
gets(rs232data);
lightbank1_off_h = atoi(rs232data);
gets(rs232data);
lightbank1_on_m = atoi(rs232data);
gets(rs232data);
lightbank1_off_m = atoi(rs232data);
gets(rs232data);
} |
Or, explain in more detail what you're trying to do. Is this your reception of data to set the 1307?
John |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Mon Jan 02, 2006 9:35 am |
|
|
Another suggestion, why not put the gets() and Atoi() in a function and call it? Something along the lines of:
int getdata()
{
get your string input here, convert to int using atoi() then return with the int value
Update: As Humberto says below, make sure to validate the string then add a null (0x0) to the end of the number string after reception and BEFORE using atoi(). Otherwise the function may "run off into the wilderness" while doing the conversion and give you strange results.
}
lightbank1_off_h = getdata();
Later on after you get things basically working, rather than using gets(), it would be a good idea to use an #int_rda() interrupt routine to get the chars and store them in a buiffer. This way you have time to do other things in Main() and dont spend all your time sitting and waiting on gets().
Last edited by dyeatman on Mon Jan 02, 2006 11:32 am; edited 3 times in total |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Mon Jan 02, 2006 11:05 am |
|
|
atoi(string)
By definition the string parameter in the function atoi()
is a pointer to a null terminated string of characters.
1) If you don't have a characters array that ends with 0x00 (null) as the string terminator, the atoi() function will try to process incoming data (by incrementing a pointer) until it can finds a null byte somewhere.
Before using atoi() you must validate the received data because if the result can't be represented, the behavior of atoi() is undefined.
2) Try to ovoid using atoi() if you have not enough room in your memory. Remember that it use stdlib.h
3) Try to make the ASCII to int convertion in one place, not in every new line of your code.
Humberto |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Mon Jan 02, 2006 1:05 pm |
|
|
Humberto wrote: | 3) Try to make the ASCII to int convertion in one place, not in every new line of your code. |
Mark is fetching a new character on every other line, so he's trying to convert new data with atoi(). |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Mon Jan 02, 2006 2:11 pm |
|
|
Quote: |
Mark is fetching a new character on every other line, so he's trying to convert new data with atoi().
|
= Double wrong !!!
Do not forget he starts this thread with this phrase:
there must be a better way
Humberto |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Jan 02, 2006 6:09 pm |
|
|
Quote: | 2) Try to ovoid using atoi() if you have not enough room in your memory. Remember that it use stdlib.h | I want to emphasize on this. atoi() is a very versatile function, it accepts both decimal and hexadecimal, upper and lower characters, positive and negative values but this comes at a price: look at the list file and you'll see it takes over 400 bytes on a PIC18 with v3.241
If you know the format of the data you are receiving you can write a less versatile but more compact version by stripping all unneeded functionality from the CCS supplied function in stdlib.h. |
|
|
Markdem
Joined: 24 Jun 2005 Posts: 206
|
|
Posted: Mon Jan 02, 2006 7:38 pm |
|
|
Thank you all for your replys. The blockof code i have pasted is wrong, The lightbank changes 5 times, so it gets on on_h, off_h, on_m and off_m for 5 light banks. Basicly i am making a timer for 5 lights, and the data i am getting here is the hour and min that the timers need to go on and off.
I have put in alot of time tring to think of ways that i can use for loops, and i might have a way of doing it. However, is this really the best way of doing this. All i really need is to get 20 ints form my vb app. Is there maybe a better way of sending that much data??
I am not really loking for code (unless you really want to write it), i just need ideas
Again, thanks so much for your help |
|
|
Markdem
Joined: 24 Jun 2005 Posts: 206
|
|
Posted: Mon Jan 02, 2006 7:52 pm |
|
|
just to make it easyer to see what i am tring to do, here is my code.
Please dont lauth at it, i am tring to learn
Code: |
#include <16f877a.h>
#device adc=8
#fuses NOWDT,HS, NOPROTECT, BROWNOUT, NOPUT, NODEBUG, NOLVP
#use delay(clock=20000000)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3)
#use rs232(baud=57600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)
#include <STDLIB.H>
#include <ds1307.c>
#include <lcd420.c>
#include <24LC256.c>
#include <ctype.h>
#define FAN PIN_C0
#define LIGHT1 PIN_D0 //global defines
#define LIGHT2 PIN_D1
#define LIGHT3 PIN_D2
#define LIGHT4 PIN_D3
#define LIGHT5 PIN_D4
#define PHVALVE PIN_D5
#define HEATER1 PIN_D6
#define HEATER2 PIN_D7
#define LCDBACKLIGHT PIN_E0
#define SYSOK PIN_E1
//enum memory
// {addmaxtemp=0, addmaxhoodtemp, addmaxph,
// addlightbank1_off_h, addlightbank1_on_h, addlightbank1_on_m, addlightbank1_off_m,
// addlightbank2_off_h, addlightbank2_on_h, addlightbank2_on_m, addlightbank2_off_m,
// addlightbank3_off_h, addlightbank3_on_h, addlightbank3_on_m, addlightbank3_off_m,
// addlightbank4_off_h, addlightbank4_on_h, addlightbank4_on_m, addlightbank4_off_m,
// addlightbank5_off_h, addlightbank5_on_h, addlightbank5_on_m, addlightbank5_off_m
// };
#define addmaxtemp 0x00
#define addmaxhoodtemp 0x01 //global memory allocations
#define addmaxph 0x02
#define addlightbank1_on_h 0x03
#define addlightbank1_off_h 0x04
#define addlightbank1_on_m 0x05
#define addlightbank1_off_m 0x06
#define addlightbank2_on_h 0x07
#define addlightbank2_off_h 0x08
#define addlightbank2_on_m 0x09
#define addlightbank2_off_m 0x10
#define addlightbank3_on_h 0x11
#define addlightbank3_off_h 0x12
#define addlightbank3_on_m 0x13
#define addlightbank3_off_m 0x14
#define addlightbank4_on_h 0x15
#define addlightbank4_off_h 0x16
#define addlightbank4_on_m 0x17
#define addlightbank4_off_m 0x18
#define addlightbank5_on_h 0x19
#define addlightbank5_off_h 0x20
#define addlightbank5_on_m 0x21
#define addlightbank5_off_m 0x22
int sec, min, hrs, day, mth, year, dow, newdata; // setup varibales
int heatstat, newtimes;
int currentph, maxph, currenttemp, maxtemp, maxhoodtemp, fanstat;
int currenthood, currentkh, phvalvestat,currentc02;
int lightbank1_on_h, lightbank1_off_h, lightbank2_on_h, lightbank2_off_h;
int lightbank3_on_h, lightbank3_off_h, lightbank4_on_h, lightbank4_off_h;
int lightbank5_on_h, lightbank5_off_h, lightbank1_stat, lightbank2_stat;
int lightbank3_stat, lightbank4_stat, lightbank5_stat, phvalve_stat, fan_stat;
int lightbank1_force, lightbank2_force, lightbank3_force, lightbank4_force, lightbank5_force;
int phvalve_force, heater_force, fan_force;
int lightbank1_on_m, lightbank1_off_m, lightbank2_on_m, lightbank2_off_m;
int lightbank3_on_m, lightbank3_off_m, lightbank4_on_m, lightbank4_off_m;
int lightbank5_on_m, lightbank5_off_m;
int serialreq;
char rs232data [5];
#int_rda //request recived from vbapp
void serial()
{
serialreq = 0;
serialreq = getc();
switch (serialreq)
{
case 48: //requset to get current live data
printf("%U\n",currenttemp);
printf("%U\n",currenthood);
printf("%U\n",currentph);
printf("%U\n",currentkh);
printf("%U\n",currentc02);
printf("%U\n",lightbank1_stat);
printf("%U\n",lightbank2_stat);
printf("%U\n",lightbank3_stat);
printf("%U\n",lightbank4_stat);
printf("%U\n",lightbank5_stat);
printf("%U\n",heatstat);
printf("%U\n",phvalvestat);
printf("%U\n",fanstat);
break;
case 49: //request to get user set data
printf("%u\n",maxtemp);
printf("%u\n",maxhoodtemp);
printf("%u\n",maxph);
printf("%02u:%02u\n",lightbank1_on_h,lightbank1_on_m);
printf("%02u:%02u\n",lightbank1_off_h,lightbank1_off_m);
printf("%02u:%02u\n",lightbank2_on_h,lightbank2_on_m);
printf("%02u:%02u\n",lightbank2_off_h,lightbank2_off_m);
printf("%02u:%02u\n",lightbank3_on_h,lightbank3_on_m);
printf("%02u:%02u\n",lightbank3_off_h,lightbank3_off_m);
printf("%02u:%02u\n",lightbank4_on_h,lightbank4_on_m);
printf("%02u:%02u\n",lightbank4_off_h,lightbank4_off_m);
printf("%02u:%02u\n",lightbank5_on_h,lightbank5_on_m);
printf("%02u:%02u\n",lightbank5_off_h,lightbank5_off_m);
break;
case 50: //request to force light 1 on or off
lightbank1_force = getc();
break;
case 51: //request to force light 2 on or off
lightbank2_force = getc();
break;
case 52: //request to force light 3 on or off
lightbank3_force = getc();
break;
case 53: //request to force light 4 on or off
lightbank4_force = getc();
break;
case 54: //request to force light 4 on or off
lightbank5_force = getc();
break;
case 55: //request to force heater on or off
heater_force = getc();
break;
case 56: //request to force ph valve on or of
phvalve_force = getc();
break;
case 57: //request to force fan on or of
fan_force = getc();
break;
case 97: /set time
gets(rs232data);
hrs = atoi(rs232data);
gets(rs232data);
min = atoi(rs232data);
gets(rs232data);
sec = atoi(rs232data);
gets(rs232data);
day = atoi(rs232data);
gets(rs232data);
mth = atoi(rs232data);
gets(rs232data);
year = atoi(rs232data);
ds1307_set_date_time(day,mth,year,1,hrs,min,sec);
break;
case 98: //set water vars
gets(rs232data);
maxtemp = atoi(rs232data);
gets(rs232data);
maxhoodtemp = atoi(rs232data);
gets(rs232data);
maxph = atoi(rs232data);
newdata = 1;
default:
printf("fffff");
break;
}
}
//void lightsetup()
// {
// disable_interrupts(INT_RDA);
// lightbank1_on_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_h = atoi(rs232data);
// gets(rs232data);
// lightbank1_on_m = atoi(rs232data);
// gets(rs232data);
// lightbank1_off_m = atoi(rs232data);
// enable_interrupts(INT_RDA);
// newdata = 1;
// }
void phwork() //READ PH VALUE SUB
{
set_adc_channel(1); //port a0
delay_ms(200);
currentph = 0;
currentph = Read_ADC(); //read ph value
delay_ms(200);
lcd_gotoxy(6,3);
printf(lcd_putc,"%03U",currentph);
if(phvalve_force < 50) //works out if valve is forced on or off
{
if(phvalve_force == 48)
{
output_low(phvalve);
phvalvestat = 0;
lcd_gotoxy(17,4);
printf(lcd_putc,"OFF");
}
else
{
output_high(phvalve);
phvalvestat = 1;
lcd_gotoxy(17,4);
printf(lcd_putc,"ON ");
}
}
else
{
delay_ms(1); //do ph controll here
}
}
void tempwork() //READ TEMP VALUE SUB
{
set_adc_channel(0); //port a0
delay_ms(200);
currenttemp = 0;
currenttemp = Read_ADC(); //read temp value
delay_ms(200);
lcd_gotoxy(6,2);
printf(lcd_putc,"%03U",currenttemp);
if(heater_force < 50)
{
if(heater_force == 48)
{
output_low(heater1);
output_low(heater2);
heatstat = 0;
lcd_gotoxy(9,4);
printf(lcd_putc,"OFF");
}
else
{
output_high(heater1);
output_high(heater2);
heatstat = 1;
lcd_gotoxy(9,4);
printf(lcd_putc,"ON ");
}
}
else
{
if(currenttemp >= maxtemp)
{
output_low(heater1);
output_low(heater2);
heatstat = 0;
lcd_gotoxy(9,4);
printf(lcd_putc,"OFF");
}
else
{
output_high(heater1);
output_high(heater2);
heatstat = 1;
lcd_gotoxy(9,4);
printf(lcd_putc,"ON ");
}
}
}
void lightwork()
{
ds1307_get_time(hrs,min,sec);
if(lightbank1_force < 50)
{
if(lightbank1_force == 48)
{
output_low(light1);
lightbank1_stat = 0;
}
else
{
output_high(light1);
lightbank1_stat = 1;
}
}
else
{
if (hrs >= lightbank1_on_h && hrs <= lightbank1_off_h && min >= lightbank1_on_m && min < lightbank1_off_m)
{
output_high(light1);
lightbank1_stat = 1;
}
else
{
output_low(light1);
lightbank1_stat = 0;
}
}
if(lightbank2_force < 50)
{
if(lightbank2_force == 48)
{
output_low(light2);
lightbank2_stat = 0;
}
else
{
output_high(light2);
lightbank2_stat = 1;
}
}
else
{
if (hrs >= lightbank2_on_h && hrs <= lightbank2_off_h && min >= lightbank2_on_m && min < lightbank2_off_m)
{
output_high(light2);
lightbank2_stat = 1;
}
else
{
output_low(light2);
lightbank2_stat = 0;
}
}
if(lightbank3_force < 50)
{
if(lightbank3_force == 48)
{
output_low(light3);
lightbank3_stat = 0;
}
else
{
output_high(light3);
lightbank3_stat = 1;
}
}
else
{
if (hrs >= lightbank3_on_h && hrs <= lightbank3_off_h && min >= lightbank3_on_m && min < lightbank3_off_m)
{
output_high(light3);
lightbank3_stat = 1;
}
else
{
output_low(light3);
lightbank3_stat = 0;
}
}
if(lightbank4_force < 50)
{
if(lightbank4_force == 48)
{
output_low(light4);
lightbank4_stat = 0;
}
else
{
output_high(light4);
lightbank4_stat = 1;
}
}
else
{
if (hrs >= lightbank4_on_h && hrs <= lightbank4_off_h && min >= lightbank4_on_m && min < lightbank4_off_m)
{
output_high(light4);
lightbank4_stat = 1;
}
else
{
output_low(light4);
lightbank4_stat = 0;
}
}
if(lightbank5_force < 50)
{
if(lightbank5_force == 48)
{
output_low(light5);
lightbank5_stat = 0;
}
else
{
output_high(light5);
lightbank5_stat = 1;
}
}
else
{
if (hrs >= lightbank5_on_h && hrs <= lightbank5_off_h && min >= lightbank5_on_m && min < lightbank5_off_m)
{
output_high(light5);
lightbank5_stat = 1;
}
else
{
output_low(light5);
lightbank5_stat = 0;
}
}
}
void hoodfan()
{
if(fan_force < 50)
{
if(fan_force == 48)
{
output_low(fan);
fanstat = 0;
}
else
{
output_high(fan);
fanstat = 1;
}
}
else
{
output_low(fan); //this is where we check if the hood is getting too hot
}
}
void readuservars() //reads user set vars from eeprom
{
maxtemp = read_eeprom(addmaxtemp);
maxhoodtemp = read_eeprom(addmaxhoodtemp);
maxph = read_eeprom(addmaxph);
lightbank1_on_h = read_eeprom(addlightbank1_on_h);
lightbank1_off_h = read_eeprom(addlightbank1_off_h);
lightbank1_on_m = read_eeprom(addlightbank1_on_m);
lightbank1_off_m = read_eeprom(addlightbank1_off_m);
lightbank2_on_h = read_eeprom(addlightbank2_on_h);
lightbank2_off_h = read_eeprom(addlightbank2_off_h);
lightbank2_on_m = read_eeprom(addlightbank2_on_m);
lightbank2_off_m = read_eeprom(addlightbank2_off_m);
lightbank3_on_h = read_eeprom(addlightbank3_on_h);
lightbank3_off_h = read_eeprom(addlightbank3_off_h);
lightbank3_on_m = read_eeprom(addlightbank3_on_m);
lightbank3_off_m = read_eeprom(addlightbank3_off_m);
lightbank4_on_h = read_eeprom(addlightbank4_on_h);
lightbank4_off_h = read_eeprom(addlightbank4_off_h);
lightbank4_on_m = read_eeprom(addlightbank4_on_m);
lightbank4_off_m = read_eeprom(addlightbank4_off_m);
lightbank5_on_h = read_eeprom(addlightbank5_on_h);
lightbank5_off_h = read_eeprom(addlightbank5_off_h);
lightbank5_on_m = read_eeprom(addlightbank5_on_m);
lightbank5_off_m = read_eeprom(addlightbank5_off_m);
}
void writeuservars() //wites user set vars to eeprom
{
disable_interrupts(INT_RDA);
write_eeprom(addmaxtemp, maxtemp);
write_eeprom(addmaxhoodtemp, maxhoodtemp);
write_eeprom(addmaxph, maxph);
write_eeprom(addlightbank1_on_h,lightbank1_on_h);
write_eeprom(addlightbank1_on_h,lightbank1_off_h);
write_eeprom(addlightbank1_on_h,lightbank1_on_m);
write_eeprom(addlightbank1_on_h,lightbank1_off_m);
write_eeprom(addlightbank2_on_h,lightbank2_on_h);
write_eeprom(addlightbank2_on_h,lightbank2_off_h);
write_eeprom(addlightbank2_on_h,lightbank2_on_m);
write_eeprom(addlightbank2_on_h,lightbank2_off_m);
write_eeprom(addlightbank3_on_h,lightbank3_on_h);
write_eeprom(addlightbank3_on_h,lightbank3_off_h);
write_eeprom(addlightbank3_on_h,lightbank3_on_m);
write_eeprom(addlightbank3_on_h,lightbank3_off_m);
write_eeprom(addlightbank4_on_h,lightbank4_on_h);
write_eeprom(addlightbank4_on_h,lightbank4_off_h);
write_eeprom(addlightbank4_on_h,lightbank4_on_m);
write_eeprom(addlightbank4_on_h,lightbank4_off_m);
write_eeprom(addlightbank5_on_h,lightbank5_on_h);
write_eeprom(addlightbank5_on_h,lightbank5_off_h);
write_eeprom(addlightbank5_on_h,lightbank5_on_m);
write_eeprom(addlightbank5_on_h,lightbank5_off_m);
enable_interrupts(INT_RDA);
}
void printtime()
{
ds1307_get_time(hrs,min,sec);
lcd_gotoxy(1,1);
printf(lcd_putc,"\%02d:\%02d:\%02d", hrs,min,sec);
}
void printdate()
{
ds1307_get_date(day,mth,year,dow);
lcd_gotoxy(11,1);
printf(lcd_putc,"%02d/\%02d/20\%02d",day,mth,year);
}
void main() //START OF MAIN PROGRAM
{
lcd_init(); //int lcd display
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"AquaMaster");
lcd_gotoxy(1,2);
printf(lcd_putc,"Mark Demczuk");
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 10%%");
delay_ms(200);
output_d(0x00); //make sure outputs are low
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 40%%");
delay_ms(200);
readuservars(); //get eeprom vars
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 50%%");
delay_ms(200);
lightbank1_force = 50; //set vars
lightbank2_force = 50;
lightbank3_force = 50;
lightbank4_force = 50;
lightbank5_force = 50;
heater_force = 50;
phvalve_force = 50;
lightbank1_stat = 0;
lightbank2_stat = 0;
lightbank3_stat = 0;
lightbank4_stat = 0;
lightbank5_stat = 0;
newdata = 0;
newtimes = 1;
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 60%%");
delay_ms(200);
setup_port_a(ALL_ANALOG); //setup adc
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 70%%");
delay_ms(200);
ds1307_init();
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 80%%");
delay_ms(200);
init_ext_eeprom(); //setup eeprom
lcd_gotoxy(1,4);
printf(lcd_putc,"Booting - 90%%");
delay_ms(200);
printf(lcd_putc,"\f"); //setup of screen
lcd_gotoxy(1,2);
printf(lcd_putc,"TEMP:");
lcd_gotoxy(13,2);
printf(lcd_putc,"GH:");
lcd_gotoxy(1,3);
printf(lcd_putc,"pH:");
lcd_gotoxy(13,3);
printf(lcd_putc,"CO2:");
lcd_gotoxy(1,4);
printf(lcd_putc,"HEATERS:OFF");
lcd_gotoxy(13,4);
printf(lcd_putc,"CO2:OFF");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1) //start of main loop
{
output_high(sysok);
phwork(); //readph
printtime();
printdate();
output_low(sysok);
tempwork(); //readtemp
printtime();
output_high(sysok);
if(newdata == 1)
{
newdata = 0;
writeuservars();
}
lightwork(); //check lights
printtime();
output_low(sysok);
hoodfan(); //check for overheating
printtime();
}
}
|
|
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Mon Jan 02, 2006 8:30 pm |
|
|
This function is too long.
Quote: |
#int_rda //request recived from vbapp
void serial()
{
serialreq = 0;
serialreq = getc();
switch (serialreq)
{
case 48: //requset to get current live data
printf("%U\n",currenttemp);
printf("%U\n",currenthood);
printf("%U\n",currentph);
printf("%U\n",currentkh);
printf("%U\n",currentc02);
printf("%U\n",lightbank1_stat);
printf("%U\n",lightbank2_stat);
printf("%U\n",lightbank3_stat);
printf("%U\n",lightbank4_stat);
printf("%U\n",lightbank5_stat);
printf("%U\n",heatstat);
printf("%U\n",phvalvestat);
printf("%U\n",fanstat);
break;
case 49: //request to get user set data
printf("%u\n",maxtemp);
printf("%u\n",maxhoodtemp);
printf("%u\n",maxph);
printf("%02u:%02u\n",lightbank1_on_h,lightbank1_on_m);
printf("%02u:%02u\n",lightbank1_off_h,lightbank1_off_m);
printf("%02u:%02u\n",lightbank2_on_h,lightbank2_on_m);
printf("%02u:%02u\n",lightbank2_off_h,lightbank2_off_m);
printf("%02u:%02u\n",lightbank3_on_h,lightbank3_on_m);
printf("%02u:%02u\n",lightbank3_off_h,lightbank3_off_m);
printf("%02u:%02u\n",lightbank4_on_h,lightbank4_on_m);
printf("%02u:%02u\n",lightbank4_off_h,lightbank4_off_m);
printf("%02u:%02u\n",lightbank5_on_h,lightbank5_on_m);
printf("%02u:%02u\n",lightbank5_off_h,lightbank5_off_m);
break;
case 50: //request to force light 1 on or off
lightbank1_force = getc();
break;
case 51: //request to force light 2 on or off
lightbank2_force = getc();
break;
case 52: //request to force light 3 on or off
lightbank3_force = getc();
break;
case 53: //request to force light 4 on or off
lightbank4_force = getc();
break;
case 54: //request to force light 4 on or off
lightbank5_force = getc();
break;
case 55: //request to force heater on or off
heater_force = getc();
break;
case 56: //request to force ph valve on or of
phvalve_force = getc();
break;
case 57: //request to force fan on or of
fan_force = getc();
break;
case 97: /set time
gets(rs232data);
hrs = atoi(rs232data);
gets(rs232data);
min = atoi(rs232data);
gets(rs232data);
sec = atoi(rs232data);
gets(rs232data);
day = atoi(rs232data);
gets(rs232data);
mth = atoi(rs232data);
gets(rs232data);
year = atoi(rs232data);
ds1307_set_date_time(day,mth,year,1,hrs,min,sec);
break;
case 98: //set water vars
gets(rs232data);
maxtemp = atoi(rs232data);
gets(rs232data);
maxhoodtemp = atoi(rs232data);
gets(rs232data);
maxph = atoi(rs232data);
newdata = 1;
default:
printf("fffff");
break;
}
}
|
I had not read all your code but in the interrupt routine I see the most evident conceptual mistake.
You should know that #int_rda is an interrupt handler, this implies that it should be as short and fast as possible because the microcontroller had been interrumped its normal task to take care of this event. While the microcontroller is running inside the interrupt routine, all other task are pending and waiting.
All that is needed to do inside the interrupt routine is to store all the necesary incoming chars and set a flag when such condition was satisfied and quit (return) to main.
Then in main() normally you have enough time to parse the received packet. Something like this:
Code: |
void main()
{
while(1)
{
..............
your stuff
..............
if(full_string_rcved)
{
switch (serialreq = serial_buffer[n])
{
case 48:
............
............
case 98:
}
full_string_rcved = FALSE;
}
}
}
|
If you search in this forum you will find a lot of examples regarding how to store and retrieve chars from a buffer.
Humberto |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
Don't do serial communication in the ISR |
Posted: Mon Jan 02, 2006 10:50 pm |
|
|
Here's an example of bad code:
Code: |
#int_something_or_other
void isr_something_or_other()
{
printf("hellp world!/n/r");
} |
Here's an example of better code:
Code: |
int8 g_iFlag;
#int_something_or_other
void isr_something_or_other()
{
g_iFlag = TRUE; // set the flag
}
void main()
{
g_iFlag = FALSE; // initialize the flag
while (1)
{
if (g_iFlag == 1) // check the flag
{
printf("hello word!\n\r")
}
}
}
|
Moral: Never ever do serial communication in the ISR. Especially RS232. |
|
|
Markdem
Joined: 24 Jun 2005 Posts: 206
|
|
Posted: Mon Jan 02, 2006 10:59 pm |
|
|
Hi All. OK, so i know know i should nt do anything in the isr that will take too much time. Is this correct? the only thing is, i need to act on the request as soon as i recive it. eg, when i get a request from the vb app to turn on a output, i want to do it right then, and not when the pic checks the flag that was set in the isr. How does one do such a thing?? |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1907
|
|
Posted: Mon Jan 02, 2006 11:25 pm |
|
|
What is your idea of "right away"? There's nothing wrong with doing it the way that has been suggested. The PIC's interrupt routine will set the flag, exit the interrupt, and then the main routine resumes. It will detect the flag and set the lights FAST. Really, REALLY fast. Maybe 30 - 40 instruction cycles at the most, which would be 30 - 40 microseconds if your clock is 4 MHz. 3 or 4 microseconds if you're running the PIC at 40 MHz.
I've developed a few commercial products, and I always handle interrupts in this manner. No data gets lost (missing incoming characters from the UART, button presses, external interrupts, etc.), and the PIC responds instantaneously (to the naked eye, anyway.) Give it a try. |
|
|
Markdem
Joined: 24 Jun 2005 Posts: 206
|
|
Posted: Mon Jan 02, 2006 11:36 pm |
|
|
OK, thanks for that, i will change the isr to only set flags, and then act on the flag.
This, however, does not fix the out of rom problem. Does anyone have any ideas on how i can send some kind fo configuration file to configure the on and off timers??
Thanks you very much for your help |
|
|
|
|
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
|