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