|
|
View previous topic :: View next topic |
Author |
Message |
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
Programming PIC16F87X as 10 bit ADC and reading it serially |
Posted: Thu Mar 04, 2010 2:18 am |
|
|
Hello everyone....
I want to programme pic16f877 as 10 bit adc and read it serially such that it can be interfaced with a Mobile or Modem to send the data. The program should send AT commands for SMS then the Value V shown in the program below. Someone please suggest modification. It is urgent..
Quote: | #include<16F877.h>
#device ADC=10
#fuses HS,NOWDT
#use delay(clock=10000000)
#use re232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include<stdio.h>
#include<math.h>
#include<STDLIB.H>
int16 value,value1,h,V,M;
void main(){
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while(1){
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
value = read_adc();
h=0.0078201*value;
if(h<=4)
{
M=2*acos((4-h)/4);
V=10*(16*M/2-16*sin(M/2)+h*4*sin(M/2));
}
else
{
M=2*acos((h-4)/4);
V=10*(16*3.14159*(1-M/(2*3.14159))+h*4*sin(M/2)-16*sin(M/2));
}
printf("%f/n/r",(float)V);
}} |
_________________ zaky |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Thu Mar 04, 2010 3:10 am |
|
|
Someone please help me.. it is urgent.... _________________ zaky |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Thu Mar 04, 2010 4:31 am |
|
|
Reply please.......... _________________ zaky |
|
|
Ttelmah Guest
|
|
Posted: Thu Mar 04, 2010 4:55 am |
|
|
Comments in the code:
Code: |
while(1) {
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
delay_ms( 3000000);
//If these delays worked, it'd be 8.3 hours, before you got here
//For debugging, stick the delays after the transmission, so you can
//see what happens.....
//However, RTFM. What is the maximum value you can use in a
//delay?......
value = read_adc();
h=0.0078201*value; //h=0 to 8 _integer_
if(h<=4) {
M=2*acos((4-h)/4);
//If incoming value < 512
//Just five possible values for 'M'. 1.5707, 1.318, 1.047, 0.7227, 0
//Is this what you really want/mean?....
V=10*(16*M/2-16*sin(M/2)+h*4*sin(M/2));
//Again only five possible output values fo the whole 512 inputs
}
else {
M=2*acos((h-4)/4);
V=10*(16*3.14159*(1-M/(2*3.14159))+h*4*sin(M/2)-16*sin(M/2));
}
printf("%f/n/r",(float)V);
}
}
|
It'd be much simplr, if you posted what you actually expect your arithmetic to actually do?.
You seem to be forgetting at least one thing - h -is an integer, 0 to 8. with only nine possible output values for the arithmetic, it'd be much simpler just to have these stored and output them from a lookup table....
Read up in the data sheet on the recommended ADC clock. ADC_CLOCK_INTERNAL, is _not_ what should be used....
Best Wishes |
|
|
Guest
|
|
Posted: Thu Mar 04, 2010 6:57 am |
|
|
Code: | #include<16F877.h>
#device ADC=10
#fuses HS,NOWDT
#use delay(clock=10000000)
#use re232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include<stdio.h>
#include<math.h>
#include<STDLIB.H>
float value,value1,h,V,M;
void main(){
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while(1){
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
delay_ms( 300000);
value = read_adc();
h=0.0078201*value;
if(h<=4)
{
M=2*acos((4-h)/4);
V=10*(16*M/2-16*sin(M/2)+h*4*sin(M/2));
}
else
{
M=2*acos((h-4)/4);
V=10*(16*3.14159*(1-M/(2*3.14159))+h*4*sin(M/2)-16*sin(M/2));
}
printf("%f/n/r",(float)V);
}
}
|
I think it should be okay now with float. I used Turbo C to apply the same formula and it was working fine. These are to find out the volume of a oil in a cylinder.
My main problem is how edit this program to send AT commands followed by value V through SMS using a mobile ? |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Thu Mar 04, 2010 7:05 am |
|
|
Sorry
I posted the above comment without login...
Also check the commands for serial communication whether they are alright..
Zaky _________________ zaky |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Fri Mar 05, 2010 2:19 am |
|
|
Hi everyone
I am getting the following error messages when i run it. Someone please confirm is it the right way to send AT commands followed by the adc result on a mobile phone.
Code: |
#include<16F877.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay(clock=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include<stdio.h>
#include<math.h>
#include<STDLIB.H>
//#include "C:\Program files\PICC\Devices\16f877.h"
#Byte PortA=0x05
#Byte PortB=0x06
#use fast_io(A)
#use fast_io(B)
#Define Nop #Asm Nop #EndAsm
int16 value;
float h,V,M;
void main(){
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while(1){
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
value = read_adc();
h=0.0078201*value;
if(h<=4)
{
M=2*acos((4-h)/4);
V=10*(16*M/2-16*sin(M/2)+h*4*sin(M/2));
}
else
{
M=2*acos((h-4)/4);
V=10*(16*3.14159*(1-M/(2*3.14159))+h*4*sin(M/2)-16*sin(M/2));
}
send_SMS();
void send_SMS(void)
{
printf("AT\r\n");
delay_ms(5000);
printf("at+cmgf=1\r\n");
delay_ms(5000);
printf("at+cmgs=\"+4478XXXXXXXX\"\r\n");
delay_ms(5000);
printf("%f/n/r",(float)V);
putc(0x1A);
delay_ms(5000);
}
void main()
{
SET_TRIS_A( 0b10000110 );
SET_TRIS_B( 0b00000101 ); delay_ms(1);
send_SMS();
while(1)
{
// Toggle led
PORTA ^= 1;
// Simple delay
delay_ms(500);
}
}
}
|
After compiling it I am getting the following error messages:
Quote: |
Error 12 Undefined identifier Send_SMS()
Error 117 Improper use of a function identifier in the line ""printf("AT\r\n");
Error31 line70 identifier is already used in this scope.
|
_________________ zaky |
|
|
Ttelmah Guest
|
|
Posted: Fri Mar 05, 2010 3:20 am |
|
|
You have two 'main' functions defined. Won't work.
The first doesn't have a closing bracket, so the whole bracketting 'goes to pot....
Basic syntax errors.
Best Wishes |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Fri Mar 05, 2010 4:33 am |
|
|
Thanks Ttelmah
Code: |
#include<16F877.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay(clock=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include<stdio.h>
#include<math.h>
#include<STDLIB.H>
//#include "C:\Program files\PICC\Devices\16f877.h"
#Byte PortA=0x05
#Byte PortB=0x06
#use fast_io(A)
#use fast_io(B)
#Define Nop #Asm Nop #EndAsm
int16 value;
float h,V,M;
void main(){
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while(1){
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
value = read_adc();
h=0.0078201*value;
if(h<=4)
{
M=2*acos((4-h)/4);
V=10*(16*M/2-16*sin(M/2)+h*4*sin(M/2));
}
else
{
M=2*acos((h-4)/4);
V=10*(16*3.14159*(1-M/(2*3.14159))+h*4*sin(M/2)-16*sin(M/2));
}
send_SMS();
void send_SMS(void)
{
printf("AT\r\n");
delay_ms(5000);
printf("at+cmgf=1\r\n");
delay_ms(5000);
printf("at+cmgs=\"+4478XXXXXXXX\"\r\n");
delay_ms(5000);
printf("%f/n/r",(float)V);
putc(0x1A);
delay_ms(5000);
}
void main()
{
SET_TRIS_A( 0b10000110 );
SET_TRIS_B( 0b00000101 ); delay_ms(1);
send_SMS();
while(1)
{
// Toggle led
PORTA ^= 1;
// Simple delay
delay_ms(500);
}
}
}
|
Now I am getting the error message
"Improper use of function identifier" at line printf("AT\r\n");
and undefined identifier at line "send_SMS();" _________________ zaky |
|
|
bungee-
Joined: 27 Jun 2007 Posts: 206
|
|
Posted: Fri Mar 05, 2010 6:22 am |
|
|
Again you have TWO main() functions. This will not work, then you have some statements outside the {} brackets.
Then in send_sms function you are using variables, that are not declared there... |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Fri Mar 05, 2010 7:28 am |
|
|
Someone please remove the errors... I am really stuck... _________________ zaky |
|
|
bungee-
Joined: 27 Jun 2007 Posts: 206
|
|
Posted: Fri Mar 05, 2010 10:44 am |
|
|
We certainly could do that, but errors there are so trivial and by doing so you would not learn anything.
But I'll give you a hint structure ....
Code: |
#FUSES
int some_global_variable;
void some_function1()
{
do_something();
}
void other_function(int pass_variable)
{
printf(" %X \r\n",pass_variable);
}
void main()
{
int Local_variable;
do_setup();
while(1)
{
do_some_operations();
some_function1();
other_function(35);
}
}
|
Observe where I declared functions and where I placed function main(). Global variable can be used by all functions, where Locab_variable can be used only in function main. |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Sun Mar 07, 2010 11:58 pm |
|
|
Code: |
#include<16F877.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay(clock=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=
#include<stdio.h>
#include<math.h>
#include<STDLIB.H>
//#include "C:\Program files\PICC\Devices\16f877.h"
#Byte PortA=0x05
#Byte PortB=0x06
#use fast_io(A)
#use fast_io(B)
#Define Nop #Asm Nop #EndAsm
int16 value;
float h,V,M;
void send_SMS(void)
{
printf("AT\r\n");
delay_ms(5000);
printf("at+cmgf=1\r\n");
delay_ms(5000);
printf("at+cmgs=\"+923469400983\"\r\n");
delay_ms(5000);
printf("%f/n/r",(float)V);
putc(0x1A);
delay_ms(5000);
}
void main(){
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
SET_TRIS_A( 0b10000110 );
SET_TRIS_B( 0b00000101 ); delay_ms(1);
while(1){
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
delay_ms( 30000);
value = read_adc();
h=0.0078201*value;
if(h<=4)
{
M=2*acos((4-h)/4);
V=10*(16*M/2-16*sin(M/2)+h*4*sin(M/2));
}
else
{
M=2*acos((h-4)/4);
V=10*(16*3.14159*(1-M/(2*3.14159))+h*4*sin(M/2)-16*sin(M/2));
}
send_SMS();
}
}
|
Now I am getting the error message Line94(0,1) Out of ROM, a segment or the program is too large sin. _________________ zaky |
|
|
yousafzai82
Joined: 04 Mar 2010 Posts: 13 Location: Pakistna
|
|
Posted: Mon Mar 08, 2010 2:35 am |
|
|
Someone tell me how to use #separate functions or use some other means to remove the above error.... _________________ zaky |
|
|
hayee
Joined: 05 Sep 2007 Posts: 252
|
|
Posted: Mon Mar 08, 2010 4:27 am |
|
|
I compiled your program and it didn't show any error.
Why it is showing an error at your side? |
|
|
|
|
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
|