|
|
View previous topic :: View next topic |
Author |
Message |
paiza Guest
|
pic 12f675 code |
Posted: Mon Nov 11, 2002 8:53 pm |
|
|
Hello to everyone:
I changed this C program to fit the pic-C software. But somehow is not working, can somebody tell me whats wrong.
#include <16C717.h>
#use delay(clock=4000000,RESTART_WDT)
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#ZERO_RAM
setup_adc_ports(RA0_RA1_RA3_ANALOG);
setup_adc(ADC_CLOCK_DIV_2);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_vref(FALSE);
setup_comparator(FALSE);
int main()
{
const float DIVIDE_NUM = 1.66666;
const float COUNT_SOURCE = 120600;
const float Temp_Conv = 5;
float keepLevel=5;
float evalLevel=0;
float inRealVolts = 0;
float inTEMP = 0;
float countsize = 0;
float counter = COUNT_SOURCE;
while (1)
{
delay_ms(1000);
delay_us(10);
set_adc_channel(0);
inRealVolts = read_adc();
set_adc_channel(1);
delay_us(10);
inTemp = read_adc();
if (inRealVolts >1.66666)
{
inRealVolts = inRealVolts*1.1;
}
inTemp = inTemp / Temp_Conv;
evalLevel = inTEMP - KeepLevel;
if ((evalLevel > 0) && (keepLevel == 5))
{
countsize = (inRealvolts / DIVIDE_NUM);
}
if ((evalLevel > 0) && (keepLevel == 7))
{
countsize = (inRealVolts / DIVIDE_NUM);
keepLevel = 5;
}
if ((evalLevel <= 0) && (keepLevel == 5))
{
countsize = (inRealVolts / DIVIDE_NUM)*2;
keepLevel = 7;
}
if ((evalLevel <= 0) && (keepLevel == 7))
{
countsize = (inRealVolts / DIVIDE_NUM)*2;
}
counter = counter - countsize;
if ((counter>=118188) && (counter <=120600))
{
output_high(PIN_A2);
output_high(PIN_A4);
output_high(PIN_A5);
output_high(PIN_A6);
output_high(PIN_A7);
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
output_high(PIN_B4);
}
if ((counter>=108540) && (counter <118188))
{
output_high(PIN_A2);
output_high(PIN_A4);
output_high(PIN_A5);
output_high(PIN_A6);
output_high(PIN_A7);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
}
if ((counter>=96480) && (counter <108540))
{
output_low(PIN_A2);
output_low(PIN_A4);
output_low(PIN_A5);
output_low(PIN_A6);
output_low(PIN_A7);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
}
}
return;
}
I have Vdd connected to 5 V and Vss to ground.
Please if anybody has an idea please email me. It's urgent
email: paiz7820@uidaho.edu
___________________________
This message was ported from CCS's old forum
Original Post ID: 8770 |
|
|
john cutler
Joined: 06 Sep 2003 Posts: 82 Location: Hot Tub, California
|
Re: pic 12f675 code |
Posted: Mon Nov 11, 2002 10:04 pm |
|
|
2 things - first you're using the wrong Device Header File! you have "#include <16C717.h> " it must be
#include<12F675.h>
Also, the names you're using for setup_adc_ports()
RA0, RA1, RA3 are not correct for 12F675
look at the include file for the 12F675.
Good luck!
John
:=Hello to everyone:
:=I changed this C program to fit the pic-C software. But somehow is not working, can somebody tell me whats wrong.
:= #include <16C717.h>
:= #use delay(clock=4000000,RESTART_WDT)
:= #include <float.h>
:= #include <stdio.h>
:= #include <stdlib.h>
:= #ZERO_RAM
:=
:= setup_adc_ports(RA0_RA1_RA3_ANALOG);
:= setup_adc(ADC_CLOCK_DIV_2);
:= setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
:= setup_timer_1(T1_DISABLED);
:= setup_timer_2(T2_DISABLED,0,1);
:= setup_vref(FALSE);
:= setup_comparator(FALSE);
:=
:=
:=int main()
:={
:= const float DIVIDE_NUM = 1.66666;
:= const float COUNT_SOURCE = 120600;
:= const float Temp_Conv = 5;
:=
:= float keepLevel=5;
:= float evalLevel=0;
:=
:= float inRealVolts = 0;
:= float inTEMP = 0;
:= float countsize = 0;
:= float counter = COUNT_SOURCE;
:=
:=
:= while (1)
:= {
:= delay_ms(1000);
:= delay_us(10);
:= set_adc_channel(0);
:= inRealVolts = read_adc();
:= set_adc_channel(1);
:= delay_us(10);
:= inTemp = read_adc();
:=
:= if (inRealVolts >1.66666)
:= {
:= inRealVolts = inRealVolts*1.1;
:= }
:= inTemp = inTemp / Temp_Conv;
:= evalLevel = inTEMP - KeepLevel;
:= if ((evalLevel > 0) && (keepLevel == 5))
:= {
:= countsize = (inRealvolts / DIVIDE_NUM);
:= }
:= if ((evalLevel > 0) && (keepLevel == 7))
:= {
:= countsize = (inRealVolts / DIVIDE_NUM);
:= keepLevel = 5;
:= }
:= if ((evalLevel <= 0) && (keepLevel == 5))
:= {
:= countsize = (inRealVolts / DIVIDE_NUM)*2;
:= keepLevel = 7;
:= }
:= if ((evalLevel <= 0) && (keepLevel == 7))
:= {
:= countsize = (inRealVolts / DIVIDE_NUM)*2;
:= }
:= counter = counter - countsize;
:= if ((counter>=118188) && (counter <=120600))
:= {
:= output_high(PIN_A2);
:= output_high(PIN_A4);
:= output_high(PIN_A5);
:= output_high(PIN_A6);
:= output_high(PIN_A7);
:= output_high(PIN_B0);
:= output_high(PIN_B1);
:= output_high(PIN_B2);
:= output_high(PIN_B3);
:= output_high(PIN_B4);
:=
:= }
:= if ((counter>=108540) && (counter <118188))
:= {
:= output_high(PIN_A2);
:= output_high(PIN_A4);
:= output_high(PIN_A5);
:= output_high(PIN_A6);
:= output_high(PIN_A7);
:= output_low(PIN_B0);
:= output_low(PIN_B1);
:= output_low(PIN_B2);
:= output_low(PIN_B3);
:= output_low(PIN_B4);
:= }
:= if ((counter>=96480) && (counter <108540))
:= {
:= output_low(PIN_A2);
:= output_low(PIN_A4);
:= output_low(PIN_A5);
:= output_low(PIN_A6);
:= output_low(PIN_A7);
:= output_low(PIN_B0);
:= output_low(PIN_B1);
:= output_low(PIN_B2);
:= output_low(PIN_B3);
:= output_low(PIN_B4);
:= }
:= }
:= return;
:=}
:=
:=I have Vdd connected to 5 V and Vss to ground.
:=Please if anybody has an idea please email me. It's urgent
:=email: paiz7820@uidaho.edu
___________________________
This message was ported from CCS's old forum
Original Post ID: 8773 |
|
|
johnpcunningham Guest
|
Re: pic 12f675 code |
Posted: Tue Nov 12, 2002 10:27 am |
|
|
<font face="Courier New" size=-1>John Cutler already answered the obvious problems. Here are some additional ideas for you:
ADC
You need to make sure the ADC channel is off for digital inputs and outputs. It defaults to "ALL ANALOG" on reset and should be configured properly in your code.
TYPECAST
When you read a port, you need to typecast the value if you are working with different data types. For example:
inRealVolts = read_adc();
should be:
inRealVolts = float (read_adc());
since you are using the ADC value to compare to a float. Seems odd, but I have learned to typecast everything in my math calculations, if they are of different data types.
PORT MAPPING
You can also write directly to ports by using the define statement to define the port location:
#define PORTA 0x05
#define TRISA 0x85
...in you dcode you can do
TRISA = 0xF8; //set lower 3 bits as outputs
PORTA = 0x07; //set all lower bits on
delay_ms(100);
PORTA = 0x00; //set all lower bits off
for individual bit settings, you could use and/or or
just use the output_high() and output_low settings.
Instead of the PIN_A1 kind of names, try remanimg them so that
your code is easier for you to read:
#define RED_LED PIN_A0
#define BLUE_LED PIN_A1
...in you code, for example:
output_high(RED_LED);
output_low(BLUE_LED);
delay_ms(100);
output_high(BLUE_LED);
output_low(RED_LED);
</font>
___________________________
This message was ported from CCS's old forum
Original Post ID: 8802 |
|
|
|
|
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
|