I am having a heck of a time getting A/D conversion to work with the pic18f67j50. I know I am probably missing something basic from rtfm.
In desperation, I have tried to copy some C demo code (that is working on my hardware), and translate the basic setup to picbasic pro. My hardware is the Olimex PIC_LCD3310 located here http://www.olimex.com/dev/pic-lcd3310.html
I have the display working. Right now I just have an analog operator issue.
Here is my setup from the include file:
And here is one of my attempts at getting A/D out of it:Code:else LIST LIST p = 18F67J50, r = dec, w = -311, w = -230, f = inhx32 INCLUDE "P18F67J50.INC" ; MPASM Header CONFIG XINST = OFF CONFIG STVREN = OFF ;added CONFIG WDTEN = OFF ;added CONFIG CP0 = OFF ;added CONFIG IESO = OFF ;added CONFIG FCMEN = OFF ;added CONFIG CCP2MX = DEFAULT ;added CONFIG PLLDIV = 5 CONFIG WDTPS = 32768 ;was 512 CONFIG CPUDIV = OSC1 CONFIG FOSC = HSPLL CONFIG MSSPMSK = MSK5 ;added NOLIST endif
This is an (apparently BAD) attempt at making it look almost just like:Code:DEFINE OSC 48 include "modedefs.bas" include "LCD_3310.pbp" TRISD = 0 PORTD.0 = 1 'turn on g sensor PORTD.1 = 0 'select scale for g sensor PORTD.2 = 0 'select scale for g sensor TRISA = %00000111 'set porta.0, 1, and 2 as inputs TRISB = 0 CM1CON = 7 CM2CON = 7 TRISC = 0 TRISE = 0 ADCON0 = %00000001 'turn on adc ADCON1 = %00000010 'fosc/32 ?? 'am I translating c language ADCON1=0x10 above correctly? resx var word x var word y var word z var word adval var word x=0 y=0 z=0 adval = 0 PORTD.0 = 1 'turn on g sensor (again) '************************************************* @bsf WDTCON,ADSHR ;set shared address SFR with WTCON<4> - is this right? ADCON0 = %11111110 ' channel with a 0 is analog input, all others digital @bcf WDTCON,ADSHR ADCON1 = %10111110 'right justified, AD=20AD, A/D clock=fosc/64 ADCON0.0 = 1 'turn on adc ADCON0.2 = 0 'channel select bit CHS0(should already be a 0) ADCON0.3 = 0 'Channel select bit CHS1(should already be a 0) start: Pause 500 ' Wait .5 second loop: ADCON0.1 = 1 'Start Conversion adval = 0 'clear result word notdone: pause 5 if ADCON0.1 = 1 Then notdone 'wait for low on bit-2 of ADCON0, conversion finished adval.highbyte = ADRESH 'move HIGH byte of result to adval adval.lowbyte = ADRESL 'move LOW byte of result to adval ADCON0 = %00000000 'turn off adc 'Lcdout $fe, 1 'Clear screen 'Lcdout "Value: ", DEC adval 'Display the decimal value @ PrintStr 0,0, "Z= " ;display on Nokia 3310 @ PrintVar 24,0, _adval ;display result on 3310 Pause 100 'Wait .1 second 'Goto loop 'Do it forever End
If someone could point out what an idiot I am, that would be great!Code:#pragma config XINST = OFF // Extended instruction set #pragma config STVREN = OFF // Stack overflow reset #pragma config PLLDIV = 5 // (20 MHz crystal used on this board) #pragma config WDTEN = OFF // Watch Dog Timer (WDT) #pragma config CP0 = OFF // Code protect #pragma config CPUDIV = OSC1 // OSC1 = divide by 1 mode #pragma config IESO = OFF // Internal External (clock) Switchover #pragma config FCMEN = OFF // Fail Safe Clock Monitor #pragma config FOSC = HSPLL // Firmware must also set OSCTUNE<PLLEN> to start PLL! #pragma config WDTPS = 32768 // #pragma config WAIT = OFF // Commented choices are // #pragma config BW = 16 // only available on the // #pragma config MODE = MM // 80 pin devices in the // #pragma config EASHFT = OFF // family. #pragma config MSSPMSK = MSK5 // #pragma config PMPMX = DEFAULT // #pragma config ECCPMX = DEFAULT #pragma config CCP2MX = DEFAULT ;---------------snip ////////////MMA pins configuration - Sleep mode disabled/////////////////////////////// TRISDbits.TRISD0=0; PORTDbits.RD0=1; //GS1 =0 TRISDbits.TRISD1=0; PORTDbits.RD1=0; //GS2=0 TRISDbits.TRISD2=0; PORTDbits.RD2=0; TRISAbits.TRISA0=1; TRISAbits.TRISA1=1; TRISAbits.TRISA2=1; //ADC module enable //ADCON1=0x10111110; //right-justified; AD=20AD;A/D clock=fOSC/64 ADCON0=0x01; //Enable ADC module ADCON1=0x10; ////////////////////////MMA measure///////////////////// resx=0; x=0; y=0; z=0; sym=0; PORTDbits.RD0=1; //MMA SLEEP MODE disable //**************************************************************************** ANCON0bits.PCFG0=0; //AN0 - analog input ADCON1=0b10111110; //right-justified; AD=20AD;A/D clock=fOSC/64 // ADCON1=0x10; ADCON0bits.ADON=1; //Enable ADC module, AVdref, AVss //set Z-axis measure ADCON0bits.CHS0=0; ADCON0bits.GO=1; //BSF ADCON0,GO ;Start conversion while(ADCON0bits.GO); // BSC ADCON0,GO ;Is conversion done? ; GOTO $-1 ;No, test again resz=ADRESL; z=ADRESH; z=(z<<8)|resz; resz=z; ADCON0=0x00; //stop ADC //****************************************************************************
Thanks!
Walter




Bookmarks