Diferentsiaalpinge mõõtmine
#15
Sain vist rütmile pihta - tööle hakkas. Vigu oli palju ja kui nad kõik fiksitud, toimis küll.
Igatahes selgus, et tuleb (võib ) saata esmalt ADC-le käsubiti ja siis lugeda tema vastust. Võimalik et vastupidi on kõik vaid 1 biti võrra nihkes, ei viitsi proovida.
Tänud kaasa mõtlemast!
Google otsingu jaoks (ehk on kellegil veel selle kiviga probleeme):
----------------
Sample code for communicating with Microchip's ADC converter MCP3304 over a bit-bang SPI port. Code is in assembly language, comments in estonian. Author refuses to translate... Smile
First block of code is the driver routine, second example shows how to call it.
Implemented on PIC18F4620 running at 40 MHz (10 MHz crystal with PLL enabled.
Works OK! Happy hacking!
---------------
Kivi ajur sai säärane:
Kood:
; *************************************************************************************************************
; ************************ MCP3304 ajur-kruvikas **************************************************************
; *************************************************************************************************************
; sisend: valitava kanali number ja režiimi bitt "kanalis".
; väljund loetud väärtus ADCresH ja-L. Neid on vaja nihutada 2 bitti paremale ja siis vanemast baidist 3 vanemat bitti ära visata. Bitt 4 on märk: kui 1 siis tulemus ńegatiivne.
; *************************************************************************************************************
;#define SCKj            PORTD,.5                ; MCP3304 clock
;#define CSj                PORTB,.5                ; MCP3304 CS, aktiivne LOW        
;#define SCKDIN            PORTC,.1                ; MCP3304 data in
;#define SCKDOUT            PORTC,.0                ; MCP3304 data out
;#define DRVp            PORTD,.3                ; elektroodi draiv
;#define DRVm            PORTD,.4                ; elektroodi draiv
; *************************************************************************************************************
convertMCP3304:    movlw    0x0F                    ; kanalis on valitava ADC kanali kood (noorem nibble)
                andwf    kanal,F                    ; vanem nibble mättasse
                movlw    0x10                    ; start-bitt püsti
                addwf    kanal,F
                bcf        CSj                        ; side algus
                nop
;                bsf        SCKj                    ; ca 100 ns tuleb 1. + front
                call    rd_wrMCP3304            ; saada start, režiim ja aadress. Loe vastus. Unusta see...
                clrf    kanal                    
                call    rd_wrMCP3304            ; saada mõttetu sodi, vaid takt vajalik. Loe vastusbait 0
                movff    datain,ADCresH            ; sisaldab: X,X,0,märk,bitt11..bitt8
                clrf    kanal                    
                call    rd_wrMCP3304            ; saada mõttetu sodi, vaid takt vajalik. Loe vastusbait 1
                movff    datain,ADCresL            ; sisaldab: bitt7..bitt0
                bsf        CSj                        ; side lõpp
                return
; *************************************************************************************************************
rd_wrMCP3304:    movlw    .8
                movwf    transfcount
                clrf    datain
rd_wrMCP3304_1:    bcf        SCKDIN                    ; rehkendame saadetava biti väärtuse, MSB first
                btfsc    kanal,.7
                bsf        SCKDIN                    
                rlcf    kanal,F
                bsf        SCKj                    ; peale + fronti peaks kivi lugema
                nop
                nop
                bcf        SCKj                    ; peale - fronti võiks vastus olemas olla
                nop
                nop
                bcf        _CARRY
                btfsc    SCKDOUT                    ; loeme saadud biti
                bsf        _CARRY
                rlcf    datain,F
                decfsz    transfcount
                goto    rd_wrMCP3304_1
                return

Väljakutse näidis:
Kood:
                movlw    0x01                    ; IN1=-, IN0=+
                movwf    kanal
                call    convertMCP3304            ; mõõdab voolu
                movlw    .0                        ; 5*7 font
                movwf    fontnr                
                movlw    .5*.6                
                movwf    dispX
                movlw    .5
                movwf    dispY
                call    goto_XY                          ; goto valitud kohta ekraanil
                movlw    'I'
                call    printchar
                movlw    '='
                call    printchar
                call    prout
                                return                                     ; muundatud ja trükitud, aitab küll...
;---------------------
prout:            bcf        _CARRY
                rrcf    ADCresH,F    
                rrcf    ADCresL,F    
                bcf        _CARRY
                rrcf    ADCresH,F    
                rrcf    ADCresL,F    
                movf    ADCresH,W    
                movlw    '+'
                btfsc    ADCresH,.4
                movlw    '-'
                call    printchar        
                movf    ADCresH,W
                btfsc    ADCresH,.4
                comf    ADCresH,W
                andlw    0x0F    
                call    HEX2LCD
                movf    ADCresL,W    
                btfsc    ADCresH,.4
                comf    ADCresL,W
                call    HEX2LCD
                return
;--------------------------------------------
Vasta


Sõnumeid selles teemas
Diferentsiaalpinge mõõtmine - Autor: felch - 12-01-2010, 10:53 PM
RE: Diferentsiaalpinge mõõtmine - Autor: andrei - 12-01-2010, 11:39 PM
RE: Diferentsiaalpinge mõõtmine - Autor: raivo - 13-01-2010, 07:39 AM
RE: Diferentsiaalpinge mõõtmine - Autor: KaruTEC - 13-01-2010, 09:35 AM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 17-01-2010, 10:32 PM
RE: Diferentsiaalpinge mõõtmine - Autor: andrei - 18-01-2010, 10:50 AM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 18-01-2010, 02:58 PM
RE: Diferentsiaalpinge mõõtmine - Autor: KaruTEC - 24-01-2010, 01:55 PM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 25-01-2010, 09:24 AM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 26-01-2010, 11:36 PM
RE: Diferentsiaalpinge mõõtmine - Autor: andrei - 27-01-2010, 12:31 PM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 27-01-2010, 02:09 PM
RE: Diferentsiaalpinge mõõtmine - Autor: andrei - 27-01-2010, 03:40 PM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 27-01-2010, 06:17 PM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 27-01-2010, 08:51 PM
RE: Diferentsiaalpinge mõõtmine - Autor: andrei - 27-01-2010, 09:04 PM
RE: Diferentsiaalpinge mõõtmine - Autor: felch - 27-01-2010, 10:31 PM

Alamfoorumi hüpe:


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