Diferentsiaalpinge mõõtmine
#11
ADC kivi ise tundub lihtne nagu regilaul olevat.

Kas SPI protokolli oled jälginud ossi või loogikaanalüsaatoriga?
Vasta
#12
(27-01-2010, 12:31 PM)andrei Kirjutas: ADC kivi ise tundub lihtne nagu regilaul olevat.

Kas SPI protokolli oled jälginud ossi või loogikaanalüsaatoriga?
Ossiga vaatan. Nagu oleks ja single-ended kanalit loeb õigesti ka. Samas DSi side osast on tõesti raske aru saada. Mis frondil kirjutada ja millal lugeda. Mul on softiline port ja genereerin signaale ise.Võiks nagu asja lihtsustada.
DS toob näite rauapordiga sidest. Miskipärast antakse alguses 1 baidis vaid start, reziim , d2 ja d1. D0 läheb järgmisesse baiti. See on nati segane - milleks ometi?
Vasta
#13
Ma sain aru, et mikrokontroller peab tegema nii:
* Lugeda D_IN-ist tõusval frondil
* Kirjutada D_OUT'i langeval frondil

Rauapordi side on nihkes sellepärast, et lõpp on sätitud täpselt 3. baidi lõppu.

Palju softi-SPI välja veab? Lk. 4 on antud SPI kellatakti vahemiku 0.105 ... 2.1 MHz.
Vasta
#14
(27-01-2010, 03:40 PM)andrei Kirjutas: Ma sain aru, et mikrokontroller peab tegema nii:
* Lugeda D_IN-ist tõusval frondil
* Kirjutada D_OUT'i langeval frondil

Rauapordi side on nihkes sellepärast, et lõpp on sätitud täpselt 3. baidi lõppu.

Palju softi-SPI välja veab? Lk. 4 on antud SPI kellatakti vahemiku 0.105 ... 2.1 MHz.
Oot, ma sain aru et vastupidises järjekorras: esmalt saadad muundile käsubiti ja siis loed, mida ta sellest arvab. Kas pole nii või pole vahet?
Ma vist pole eriline regilaulu sõber... Smile
Vasta
#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
#16
(27-01-2010, 06:17 PM)felch Kirjutas: Oot, ma sain aru et vastupidises järjekorras: esmalt saadad muundile käsubiti ja siis loed, mida ta sellest arvab. Kas pole nii või pole vahet?
On ikka vahet ja minu arust on ka õigem nii, nagu Sina teed:
1. saata bitt "1"
2. saata unipolaar/diferentsiaal bitt
3. saata kanalibitid D2, D1 ja D0.
4. saata 1 tühi bitt, mille jooksul sämplitakse signaal
5. lugeda tulemuse 13 bitti.

Päris kindlasti tead Sa seda kivi paremini kui mina, sest oled peaaegu asja tööle saanud Smile Andmelehe järgi tundub lihtne protokoll olevat.

Kas viitsid ehk kirjeldada oma softi SPI tööd? Ma ei ole eriti hea vigade tuvastaja üle interneti, aga nii on ehk lootust.

P.S. Seda ma kartsin, et jõuad enne ära lahendada kui mina siin postitan Smile
Vasta
#17
Huvitav on see, et mõnda DSi lugedes on kohe kõik selge. Mõnda aga tuleb lugeda ridade vahelt. Pärast, kui kivi töötab, on küll kõik selge....
Andreie, mu kõhklus oli selles et kas esmalt saata bitt kivile ja siis lugeda tema vastusbitt või teisipidi. Aga paistab, et võib nii ja naa kuid viimasel juhul on vastus 1 biti võrra nihkes.
Igatahes ajendas Su postitus mind koodi ossi ekraanil uuesti us-haaval üle vaatama kuni sain (no...loodan nii Smile )aru iga biti asukoha vajalikusest. Edasi jäi vaid vead parandada.
Tänud kõigile, case closed.
/F
Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: