|
|
View previous topic :: View next topic |
Author |
Message |
thenr.
Joined: 18 May 2012 Posts: 3
|
18F4550 and LCD Analogic System |
Posted: Mon Jun 04, 2012 5:58 pm |
|
|
Hi guys, I need your help.
When I project a analogic system, using the pic 16f877A the value which shows at LCD is like 4,54V. But when I change for 18F4550 the value which shows is like 4V 5V. This way I can´t have precision, this is a part of the program.
ADC=10bits
delay_ms(10);
set_adc_channel(0);
delay_us(10);
x=read_adc();
x=x*0.004887585532746823069403714565;
this part belongs to LCD.
#define LCD_DATA_PORT getenv("SFR:PORTd")
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define DATA0 PIN_D4
#define DATA1 PIN_D5
#define DATA2 PIN_D6
#define DATA3 PIN_D7
#include "lcd.c"
Sorry about my English.
Can anybody help me ? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Mon Jun 04, 2012 6:03 pm |
|
|
1.. This line..
x=x*0.004887585532746823069403714565;
you really don't need nor will the compiler use that precision !!
2. what is 'x' declare as int8, int16, float ???
3. you should show us the whole program as well as the compiler version. |
|
|
thenr.
Joined: 18 May 2012 Posts: 3
|
|
Posted: Mon Jun 04, 2012 6:24 pm |
|
|
The compiler is PCWHD 4.114
x,v = int16
Follow the whole program.
Code: |
#include <18F4550.h>
#device adc=10 // seta precisao em 1023
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLPT1OSC //Timer1 configured for higher power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#FUSES ICPRT //ICPRT enabled
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8
#define LCD_DATA_PORT getenv("SFR:PORTd")
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define DATA0 PIN_D4
#define DATA1 PIN_D5
#define DATA2 PIN_D6
#define DATA3 PIN_D7
#include "lcd.c"
int16 x;
int16 v;
void main()
{
setup_adc_ports(AN0_TO_AN2|VSS_VDD); //portas AN0, AN1 e AN2 como analógicas
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //
setup_timer_2(T2_DIV_BY_16,62,1); //
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
LCD_init(); // chama a funcao do LCD, sem essa funcao o LCD nao
// escreve nada
while(1){
delay_ms(10);
set_adc_channel(0);
delay_us(10);
x=read_adc();
x=x*0.004887585532746823069403714565;
delay_ms(10);
set_adc_channel(1);
delay_us(10);
v=read_adc();
v=v*0.004887585532746823069403714565;
//printf(lcd_putc,"\r\n%ld %ld",v,x);
printf("\r\n%lu:%lu",v,x);
//printf(lcd_putc,"\nSUCESSO X");
printf(lcd_putc,"\r\n%lu:%lu",v,x);
}
} |
|
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Tue Jun 05, 2012 3:29 am |
|
|
The PIC is doing what you're telling it.
When you multiply by 0.004887585532746823069403714565 you are effectively dividing by ~200.
Your maximum ADC value is 1023.
Your variables x and v are both integers so can only have the values 0,1,2,3,4 & 5.
If you want to display the range say 0.000V to 5.000V, convert your variables to mV rather than V. Then print thousands digit, decimal point, remaining digits.
Mike |
|
|
thenr.
Joined: 18 May 2012 Posts: 3
|
|
Posted: Tue Jun 05, 2012 9:18 am |
|
|
I just changed the variables x and v for FLOAT.
Now I have the precision what I hoped.
Thank you !! |
|
|
|
|
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
|