27-01-2010, 08:51 PM
(Seda postitust muudeti viimati: 27-01-2010, 10:39 PM ja muutjaks oli felch.)
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...
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:
Väljakutse näidis:
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...
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
;--------------------------------------------