PIC18F47J53 A/D muundi probleem
#1
Õhtast!

Tekkis ootamatu probleem selle kiviga - A/D muundi näitab aiateibaid. Huvitav on see, et simus ei lõpeta ta kunagi mõõtmist. Maketil võtab muundamine umbes 18 us ja tulemus on enam kui kahtlane (kõigub 0..max).
Lugesin DS-i igat pidi aga ei saa pihta - justkui oleks kõik õige. Mida ta paganas siis tahab? Kas ehk on mingi seade, mida A/D lõigus ei mainita aga on kusagil mujal kirjas?
Kvarts on 16 MHz, sellest teen kivi PLL'iga 48 MHz prose taktiks (max lubatav!). ADC takt on Fosc/64 mis on ka lubatav. Taqu= Tad/4.
Kivi konf:
Kood:
errorlevel 0,-305,-302 INCLUDE "P18F47J53.INC" INCLUDE <MATHVARS.inc> ;**** Prose konfi (ropud :) sõnad **** CONFIG XINST=OFF, STVREN=OFF, WDTEN=OFF, PLLDIV = 4 ; extended käsustik OFF, Stack Overflow/Underflow Reset: OFF, Ftakt=16 MHz (kvarts) CONFIG CFGPLLEN = ON;FF ; PLL sees CONFIG CPUDIV = OSC1 ; No CPU system clock divide CONFIG OSC = HSPLL ; HS+PLL, USB-HS+PLL CONFIG SOSCSEL = RESERVED ; T1 gener - Reserved CONFIG CLKOEC = OFF ; CLKO output disabled on the RA6 pin CONFIG RTCOSC = INTOSCREF ; RTCC uses INTRC CONFIG CP0 = OFF ; koodimälu kaitseta CONFIG IESO=OFF, FCMEN=OFF CONFIG WDTPS=32768 CONFIG DSWDTPS=32, DSWDTEN=OFF,DSBOREN=OFF CONFIG IOL1WAY = ON ; The IOLOCK bit (PPSCON<0>) can be set once CONFIG ADCSEL = BIT12 ; 12 - Bit ADC Enabled CONFIG LS48MHZ = SYS48X8 ; System clock at 48 MHz USB CLKEN divide-by is set to 8

Muide, konfibitt "CONFIG CFGPLLEN = ON" on imelik, progeja näitab sed kui OFF. Kui sundida ON-seisu, käib prose tunduvalt aeglasemalt ehk siis on vist reaalselt OFF !? Pogeja on ASIX Presto. Viimane saadav update on peal!

Prose initis seisab:

Kood:
;******************************* bsf OSCTUNE,PLLEN ; See lollakas tahab siitkaudu PLLi sisse lülatamist...vist bsf OSCTUNE,INTSRC ; 31.25 kHz device clock derived from 8 MHz INTOSC source (divide-by-256 enabled) movlw 0x74 movwf OSCCON clrf STATUS ; nullime kõik võimaliku clrf INTCON clrf PIR1 clrf PIR2 clrf PIR3 clrf PIE1 clrf PIE2 clrf PIE3 ; **** üldkonf **** movlw 0x00 movwf INTCON2 ; pull-up takid OHV, reageerib langevatele frontidele movff WREG,PMCONH ; paralleelport OHV movff WREG,PMCONL movff WREG,PMMODEH movff WREG,PMMODEL movff WREG,PMEH movff WREG,PMEL ;---- kell ----------------------- movlb 0x0F ;RTCCFG is banked movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf RTCWREN,RTCCFG movlw 0xB3 ; kell sees, lubame väärtusi kirjutada, loeme alati õigesti :) movff WREG,RTCCFG movlw 0x00 ; kal. koef 0 movff WREG,RTCCAL movlw 0x04 ; kella takt sisemine, PMP kasutab Šhmidti puhvreid movff WREG,PADCFG1 movlw 0x55 ; luckku tagasi movwf EECON2 movlw 0xAA movwf EECON2 bsf PPSCON,IOLOCK ; write protect ON movlb 0x00 ; **** A/D **** movlw v_bat ; mõõdame AN5 (toide), muundi tööle ja stopp. movwf ADCON0 ; movlw 0xBD ; movff WREG,ADCON1 ; paremale, 20 Tad, F/16 movlw 0x96 ; 1001 0110 B'10000110';0xBE; movff WREG,ADCON1 ; paremale, 4 Tad, F/64 movlb 0x0F ; movlw 0x03 movff WREG,ANCON0 ; AN2,3,4,5,6,7 on analoogsisendid movlw 0x9D movff WREG,ANCON1 ; bangap ref. ON, AN9 on analoogsisend movlb 0x00

Hakkan muundama:
Kood:
; ************************************************************************************************************* ; *** A/D muundamine: mõõdab ja keskmistab 8 korda ************ ; ************************************************************************************************************* Read_ADC: movlw .8 movwf ADCcount clrf ADCtempH clrf ADCtempL bsf LEDS Read_ADC1: bsf ADCON0,GO Read_ADC2: btfsc ADCON0,GO goto Read_ADC2 bcf LEDS bcf PIR1,ADIF bcf CARRY movf ADRESL,W ....
Siit edasi simus ei jõuta kunagi.
Ma...ei saa enam pihta...
Vasta
#2
Ma ei tea konkreetset picci, aga kontrolli AD toitepinge üle, kas seal on korralik kondekas ? Ja referentspinge samuti. Ja mis allikast sa mõõdad ? Kas allika takistus on kõrge või madal ?

Meil on korduvalt olnud nii et otsime mingeid imelisi softikalasid aga tegelikult on mõni toite või maaots lahti Smile
Vasta
#3
(21-02-2011, 01:23 AM)KaruTEC Kirjutas: Ma ei tea konkreetset picci, aga kontrolli AD toitepinge üle, kas seal on korralik kondekas ? Ja referentspinge samuti. Ja mis allikast sa mõõdad ? Kas allika takistus on kõrge või madal ?..

Toites (3,3V) on 10uF keraamilised konded otse prose jalgade juures. Tugipinge on toitepinge. Allika takistus on tõesti liiga kõrge - 5,6k. Seda peab vähendama sest lubatav on kuni 1k. Andes otse toiteblokist pinge mõõtesisendile asi siiski ei muutunud. Ja simule see ju ei mõju nagunii. Jääb mulje, et midagi on konfiga (taktsagedused, jagurid ?) valesti...aga vahest tõesti viga mujal. Otsin edasi.

Lisanduv probleem samal kivil ja skeemil. Tahtsin kasutada prose PWMi rauda et tekitada 6 servoväljundit (pulss 1..2ms, kordusperiood 5ms). Aga...ei saagi kui just prose takti meeletult alla ei tõmba! Kas ma saan millestki valesti aru või ongi prose PWM mõeldud kõrgemate sageduste jaoks?

PS. Igaks juhuks skeem (Eagle 5.6) ka, ehk hakkab siit miskit silma, mida mina ei näe: http://parsek.yf.ttu.ee/~felc/F_copter.zip
Vasta
#4
Andmeleht räägib TRISA bittide seadistamisest, aga siintoodud koodis pole neist märkigi. Kas olen midagi kahe silma vahele jätnud?
Vasta
#5
(21-02-2011, 09:53 AM)andrei Kirjutas: Andmeleht räägib TRISA bittide seadistamisest, aga siintoodud koodis pole neist märkigi. Kas olen midagi kahe silma vahele jätnud?
Ei, portide suunad määran hiljem. Kogu init on selline:
Kood:
Init: call dly movlb 0x0E ; PPS on pangas 14. movlw 0x55 ; unlock movwf EECON2 movlw 0xAA movwf EECON2 bcf PPSCON,IOLOCK ; write protect OHV movlw .24 ; seome RxD2 pinniga RP24 movwf RPINR16 movlw 0x06 ; seome TxD2 pinniga RP23 movwf RPOR23 movlw .20 ; seome SDI2 pinniga RP20 movwf RPINR21 movlw .4 ; seome INT1 pinniga RP4 movwf RPINR1 movlw .5 ; seome INT2 pinniga RP5 movwf RPINR2 movlw .10 ; seome SDO2 pinniga RP19 movwf RPOR19 movlw .11 ; seome SCK2 pinniga RP21 movwf RPOR21 movlw .14 ; seome PWM1 pinniga RP7 movwf RPOR7 movlw .15 ; seome PWM2 pinniga RP8 movwf RPOR7 movlw .16 ; seome PWM3 pinniga RP9 movwf RPOR7 movlw .17 ; seome PWM4 pinniga RP10 movwf RPOR7 movlw .14 ; seome PWM5 pinniga RP0 (enhanced PWM out channel A) movwf RPOR0 movlw .15 ; seome PWM6 pinniga RP1 (enhanced PWM out channel B) movwf RPOR1 ;---- kell ----------------------- movlb 0x0F ;RTCCFG is banked bsf RTCCFG,RTCWREN movlw 0xB3 ; kell sees, lubame väärtusi kirjutada, loeme alati õigesti :) movff WREG,RTCCFG movlw 0x00 ; kal. koef 0 movff WREG,RTCCAL movlw 0x04 ; kella takt sisemine, PMP kasutab Šhmidti puhvreid movff WREG,PADCFG1 ; **** A/D **** movlw 0x03 movwf ANCON0 ; AN2,3,4,5,6,7 on analoogsisendid movlw 0x9D movwf ANCON1 ; bangap ref. ON, AN9 on analoogsisend movlw 0x55 ; luckku tagasi movwf EECON2 movlw 0xAA movwf EECON2 bsf PPSCON,IOLOCK ; write protect ON movlb 0x00 ;******************************* bsf OSCTUNE,PLLEN ; See lollakas tahab siitkaudu PLLi sisse lülatamist...vist bsf OSCTUNE,INTSRC ; 31.25 kHz device clock derived from 8 MHz INTOSC source (divide-by-256 enabled) movlw 0x74 movwf OSCCON clrf STATUS ; nullime kõik võimaliku clrf INTCON clrf PIR1 clrf PIR2 clrf PIR3 clrf PIE1 clrf PIE2 clrf PIE3 ; **** üldkonf **** movlw 0x00 movwf INTCON2 ; pull-up takid OHV, reageerib langevatele frontidele movlb 0x0F movlw 0x00 movff WREG,PMCONH ; paralleelport OHV movff WREG,PMCONL movff WREG,PMMODEH movff WREG,PMMODEL movff WREG,PMEH movff WREG,PMEL movlb 0x00 ; **** A/D **** movlw v_bat ; mõõdame AN5 (toide), muundi tööle ja stopp. movwf ADCON0 movlw 0x96 ; 1001 0110 B'10000110';0xBE; movwf ADCON1 ; paremale, 4 Tad, F/64 ; **** komparaatorid OHV ******* movlw 0x07 movwf CM1CON movwf CM2CON movlb 0x0F movwf CM3CON movlb 0x00 clrf CVRCON ; **** pordid **** clrf PCLATH clrf PORTD clrf PORTC clrf PORTB clrf PORTA clrf PORTE MOVLW B'11111100' MOVWF TRISA ; 2* kvarts, gyro-yaw, konde, gyro-y, gyro-x,srv6,srv5 MOVLW B'00001111' MOVWF TRISB ; srv4..1, gyro temper, acc-y, acc-x, ppm sisend MOVLW B'10111100' ; NB! Tx peab olema väljund ! MOVWF TRISC ; GPS serial, USB, vusb, UD, LEDS, LEDP MOVLW B'10000110' MOVWF TRISD ; side serial (USART2), SD_CS, SCK, SDI, SDO, CDI, F_CS MOVLW B'00111111' MOVWF TRISE ; -, MCLR, Press, Ibat, Vbat. Dj E-pordi pull-upid OFF MOVLW B'11111100' ; portide lähteseisud paika movwf PORTA MOVLW B'00001111' movwf PORTB MOVLW B'11111100' movwf PORTC MOVLW B'11000000' movwf PORTD MOVLW B'00001111' movwf PORTE ;---- serial port 1 -------------- ; side GPS'iga movlw B'00100110' ; 8 bitine saade movwf TXSTA1 movlw B'10010000' ; 8-bitine vv movwf RCSTA1 nop nop nop nop bcf BAUDCON2,BRG16 bcf TXSTA1,SYNC bcf TXSTA1,BRGH bcf PIR1,RC1IF ; bsf PIE1,RC1IE ; luba RC1 int movlw .155 ; baudrate = 4800 @ 48 MHz movwf SPBRG1 ;---- serial port 2 -------------- ; side ground control'iga movlw B'00100110' ; 8 bitine saade movwf TXSTA2 movlw B'10010000' ; 8-bitine vv movwf RCSTA2 nop nop nop nop bcf BAUDCON2,BRG16 bcf TXSTA2,SYNC bsf TXSTA2,BRGH bcf PIR3,RC2IF ; bsf PIE3,RC2IE ; luba RC2 int movlw .25 ; baudrate = 115200 @ 48 MHz movwf SPBRG2 ;*** PWM ja Taimerid *** movlw 0x00;0x0F movwf CCP4CON ; moodulid 4..7 PWMi režiimi movwf CCP5CON movwf CCP6CON movwf CCP7CON movwf CCP1CON movwf CCP2CON movwf CCP3CON bcf PIR1,ADIF BSF ADCON0,ADON ;Enable A/D module BSF ADCON1,ADCAL ;Enable Calibration BSF ADCON0,GO ;Start a dummy A/D conversion CALIBRATION ; BTFSC ADCON0,GO ;Wait for the dummy conversion to finish BRA CALIBRATION ; BCF ADCON1,ADCAL ;Calibration done, turn off calibration enable ;Proceed with the actual A/D conversion ;********************** EI LÕPETA MUUNDAMIST !!! ************************** return
Vasta
#6
Siis selles ka viga pole.

18us muundusaeg on ka justkui õige: 13 takti * 64 / 48_000_000 Hz = 17,3... us. Seega, muundab küll, aga mida...

Kas oled proovinud bandgap'i või tuuma pinget mõõta? Äkki hakkab midagi hargnema.
Vasta
#7
(21-02-2011, 11:47 AM)andrei Kirjutas: ...Kas oled proovinud bandgap'i või tuuma pinget mõõta? Äkki hakkab midagi hargnema.
Ei veel, proovin. Reaalne prose mõõdab küll (ehk muundamine saab millalgi otsa, ca 18 us läheb aega kui ossiga mõõta !) aga tulemus kõigub 0..max vahel suvaliselt.
Mingi kala selle porsega vist ikkagi on. Siin saab 1 tüüp samuti kõikuva näidu kuigi mitte nii hirmsalt muutuva: http://www.microchip.com/forums/m551549.aspx
Ja siin leiab keegi et PIC24-l samuti ei lasta ADCON0.GO bitti maha: http://www.microchip.com/forums/m421836.aspx

Päris head lahendust (peale ootamise) ei leitagi. Ongi prose vigane ? Või MPLAB IDE ?
Vasta
#8
Küll see viga ka silma jääb.

Tabeli 22-1 (lk. 375) märkus ütleb, et prose kiirustel üle 1 MHz peab A/D teisenduse ajaks prose üldse magama panema. Prose kiirusega mängimine peaks paljastama, kui vajalik see on. Pollimise puudumisel saad muidugi prose magama ka panna.
Vasta
#9
(21-02-2011, 01:30 PM)andrei Kirjutas: Küll see viga ka silma jääb.

Tabeli 22-1 (lk. 375) märkus ütleb, et prose kiirustel üle 1 MHz peab A/D teisenduse ajaks prose üldse magama panema....
See mõjub ilmselt täpsusele - vähem häireid. AD on ju 12-bitine. Proovisin (simus) ikkagi: nagu sleep'i läks, tehti AD-le OFF. Ja tulemust ikka ei anta. Ei mõista ma selle prose hinge...
Vasta
#10
Mul jäi küll kahe silma vahele, et 18us sisse ei mahu kuidagi 4xTad sämplimise aeg, sest 4xTad = 4*64/48 us = 5.3... us. Samas:
Kood:
movlw 0x96 ; 1001 0110 B'10000110';0xBE; movff WREG,ADCON1 ; paremale, 4 Tad, F/64

Kas tõesti prose unustab signaali sämplida ja tuleb ise see 2us viide ette panna?
Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: 1 külali(st)ne