|
|
View previous topic :: View next topic |
Author |
Message |
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
pic18f67k90 problem adc |
Posted: Tue Oct 08, 2024 6:52 am |
|
|
hello everyone
i am a beginner in programming, my problem is: to acquire a value from 0 to 5V on ANA0 and send it to my screen with a pic18f67K90 or a pic18f67k22
the principle works but the problem is the linearity of the reading
attached is a raised curve, I think I forgot something!!
i have already made an identical assembly with a pic26k22 and I did not have this problem, the 67k90 or 67k22 must be special??
if someone could tell me where my mistake is, thank you in advance
cordially
I can't insert an image, sorry, explanation: input voltage
AN0 = 0v --> screen reading or debugger 234
AN0 = 1.2V --> screen reading or debugger 255
AN0 = 1.21V --> screen reading or debugger 0
An0 = 1.21v -> 4.9 v screen reading or linear debugger
An0= 5v --> screen reading or maximum debugger 188
/* compilateur CCS V5.116
PIC18F67K90 ( idem si pic18F67k22 )
*/
#include "main.h"
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); //2,0 ms overflow
setup_timer_2(T2_DIV_BY_16,250,10); //1,0 ms overflow, 10,0 ms interrupt
disable_interrupts(INT_TIMER0);
disable_interrupts(INT_TIMER2);
disable_interrupts(GLOBAL);
setup_adc_ports(sAN0, VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_20);
set_adc_channel(0);
delay_us(20);
while(TRUE){
bouton = input(PIN_E7);
if(bouton == 1){
potard1= read_adc(adc_start_and_read) ;
delay_us(100);
//////// tacho metre
fputc(0XAA,PORT1);
fputc(0X3D,PORT1); // 3D -> N16 write / 42 -> str write
/// adresse ////
fputc(0X00,PORT1);
fputc(0X08,PORT1);
fputc(0X00,PORT1);
fputc((potard1 & FILTRE_INT16_H ) >>8,PORT1) ;
fputc(potard1 & FILTRE_INT16_L ,PORT1);
//Copie suffixe
fputc(0XCC,PORT1);
fputc(0X33,PORT1);
fputc(0XC3,PORT1);
fputc(0X3C,PORT1);
delay_ms(5);
output_high(PIN_B3);
}
else
{
output_low(PIN_B3);
} // while true
}
#include <18F67K90.h>
#device ADC=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES VREGSLEEP //Ultra low-power regulator is disabled
#FUSES SOSC_LOW //Low-power SOSC circuit is selected
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV18 //Brownout reset at 1.8V
#FUSES ZPBORM //Zero-Power BOR
#FUSES RTCOSC_T1 //RTCC uses Secondary Oscillator as reference source
#FUSES MSSPMSK7 //MSSP uses 7 bit Masking mode
#FUSES MCLR //Master Clear pin enabled
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES BBSIZ2K //2K words Boot Block size
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWRT //Program memory not write protected
#FUSES NOEBTR //Memory not protected from table reads
#use delay(clock=64MHz,crystal=16MHz)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1) // ecran
#use rs232(baud=9600,parity=N,xmit=PIN_G1,rcv=PIN_G2,bits=8,stream=PORT2)
//Filtres
#DEFINE FILTRE_INT16_H 0xFF00
#DEFINE FILTRE_INT16_L 0x00FF
#DEFINE FILTRE_HH 0xFF000000
#DEFINE FILTRE_HL 0x00FF0000
#DEFINE FILTRE_LH 0x0000FF00
#DEFINE FILTRE_LL 0x000000FF
//#include <stdio.h>
//#include <stdlib.h>
int1 bouton ;
unsigned int8 potard1;
[/code][img][/img] |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Tue Oct 08, 2024 11:35 am |
|
|
quick comments
start putting comments at the end of most lines of code ! It costs nothing yet allows EVERYONE to understand what should be happening. It'll really help 3 weeks from now !
As a basic test, I'd JUST send the RAW data from the pot position.
This allows you to confirm PIC does read the pot and send the correct data.
Since it is a pot, I suggest a small (.1-1mfd ) cap on the wiper to ground as a 'filter' and sample at say a 1Hz rate
also add 'errors' to the USE RS232 (.... options...... ) |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Tue Oct 08, 2024 11:45 am |
|
|
I'm very puzzled why you are trying to access the upper 8 bits of an 8bit
value?..
However key difference is that the ADC on this chip is a differential ADC.
The top bit is a sign bit. |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
pic18f67k90 problem adc |
Posted: Fri Oct 11, 2024 2:41 am |
|
|
hello
thank you Ttelmah for your clear answer, I suspected that this chip was special but I would not have imagined that it was a differential input, sorry to abuse your knowledge how to do the code for this kind of application? for information I also put a capacitor for filtering on this input and the signal is very clean, I am starting with chip programming by passion and I have no training as a programmer!
thank you again for your help, you are a genius |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
pic18f67k90 problem adc |
Posted: Fri Oct 11, 2024 2:48 am |
|
|
for Mr Ttelmah: originally I am on a 16 bit value, but as I had the same problem I wanted to simplify my real value that I would like to use is indeed in 16 bit
thanks |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
|
Posted: Fri Oct 11, 2024 5:37 am |
|
|
Mr Ttelmah
how to configure this chip in single channel mode?? I looked at the datacheet page 373 but I don't know how to do it, or how to use it to have a linear scale from 0 to 4095??
thanks again for your help |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Fri Oct 11, 2024 7:07 am |
|
|
The point is it is always a differential ADC module. Even when you run it
so Vss is the second input. The top bit is always ADSGN. The result is
12bits plus sign. Because you were trying to select 8 bit mode, this switches
to returning the high 7 bits plus sign. If you just switch to 12bit mode,
and read the low twelve bits of the value returned, if you want 8 bits, just
rotate this right 4 bits. |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
pic18f67k90 problem adc |
Posted: Sat Oct 12, 2024 2:48 am |
|
|
thank you very much Ttelmah, I will do like that.
good luck on the forum you are great
best regards |
|
|
|
|
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
|