PIC18F47J53 A/D muundi probleem - felch - 20-02-2011
Õ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...
RE: PIC18F47J53 A/D muundi probleem - KaruTEC - 21-02-2011
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
RE: PIC18F47J53 A/D muundi probleem - felch - 21-02-2011
(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
RE: PIC18F47J53 A/D muundi probleem - andrei - 21-02-2011
Andmeleht räägib TRISA bittide seadistamisest, aga siintoodud koodis pole neist märkigi. Kas olen midagi kahe silma vahele jätnud?
RE: PIC18F47J53 A/D muundi probleem - felch - 21-02-2011
(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
RE: PIC18F47J53 A/D muundi probleem - andrei - 21-02-2011
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.
RE: PIC18F47J53 A/D muundi probleem - felch - 21-02-2011
(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 ?
RE: PIC18F47J53 A/D muundi probleem - andrei - 21-02-2011
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.
RE: PIC18F47J53 A/D muundi probleem - felch - 21-02-2011
(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...
RE: PIC18F47J53 A/D muundi probleem - andrei - 21-02-2011
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?
|