DIATES - DIAdinamični TErapevtski Stimulator

DIAdinamični TErapevtski Stimulator

Vsebina:

Opis naloge in metode

Opis sistema:

Podrobnejši opis programa:

Literatura

Avtor










Definicija FES



Funkcionalna električna stimulacija (FES) je metoda, kjer želimo z draženjem živčnih in mišičnih tkiv s tokovimi impulzi doseči odzive, ki jih pacient funkcionalno uporablja.
Primeri uporabe FES:
  1. srčni vzbujevalniki, stimulacija hoje in stoje, gibov rok, dihanja, uravnavanja krvnega tlaka V teh primerih uporabljamo kontinuirano vzbujanje z električnimi tokovi.
  2. senzorične funkcije : pri odpravi bolečine, zaznavnje tlakov in sil.
Najstarejši primer, ki opisuje uporabo FES je srčni vzpodbujevalnik (pacemaker), katerega naloga je z električnimi dražljaji (stimulusi) periodično povzročati krčenje srčne mišice, tako da ohranja črpalno funkcijo.
Po mestu posredovanja ločimo: Po načinu posredovanja pa FES s: Nazaj
Tehnologija FES



FES lahko izvajamo le na centralno denerviranih nevromišičnih strukturah, kar narekuje obliko dražilnih tokov, ki so lahko: Nazaj
Splošni opis DIATES



Stimulator, ki ga delamo, vsebuje obe vrsti tokov in FES posreduje s pomočjo površinskih elektrod, saj gre predvsem za mišično stimulacijo. Velikost uporabljenih tokov je nastavljiva od 1 do 100 mA, medtem ko je uporabljena napetost nekje 150V. Pri izbrani vrsti elektrod vemo, da jakost toka z razdaljo med elektrodama in živcem upada, tako da je izbira upravičena, medtem ko bi morali pri izbiri implantiranih elektrod znižati omenjeni vrednosti za 10 krat.



Nazaj
Nekaj o uporabljenem mikrokontrolerju MC68HC11A1



MC68HC11, označuje družino 8 bitnih mikrokontrolerjev proizvajalca Motorola, izdelanih v HCMOS tehnologiji. Delujejo pri hitrostih vodila do 2MHz, če uporabljamo kristal 8MHz.Možna je tudi popolnoma statična uporaba (če kristal izključimo), kar zmanjšuje porabo energije.
Uporabljamo 68HC11A1, ki ga odlikujejo naslednje lastnosti:

Poleg standardnih enot, ki jih vsebujejo tudi njegovi predhodniki, vsebuje še 8 kanalni 8bitni A/D pretvornik in zelo razvejan sistem časovnikov, ki temelji na 16 bitnem prosto tekočem števcu.
Posebnost MC68HC11 družine je 8 bitni števec impulzov (pulse accumulator), ki šteje spremembe na zunanjem vhodu, ali pa ga uporabljamo za merjenje zelo dolgih period.
Razlika med omenjenima načinoma v podsistemu PIA (68hc24, ki ga ima ta mikrokontroler že integiranega): PIA je pri enostavnem načinu vključen, pri razširjenem pa izključen. Enostavni način se uporablja, ko imamo malo perifernih enot (toliko kot imamo I/O vrat - v tem primeru do 5), medtem ko razširjeni način rabimo, ko moramo naslovni prostor bolj natančno dekodirati, da bi omogočili priključitev več perifernih enot (primer uporabe je priključitev dodatnega pomnilnika). V enostavnem načinu imamo opravka z dvemi ločenimi I/O vrati (port B in C), medtem ko v razširjenem ti dve vrati združimo, da bi naslavljali 16 bitno. Razvojni sistem, ki sem ga uporabljal je emulator omenjenga mikrokontrolerja - to je M68HC11EVM (evaluation module). Ta sistem omogoča emulacijo MC68HC11A1 v razširjenem načinu, medtem ko za MC68HC11E9 pa v enostavnem načinu. Nazaj



Periferne enote



Srce sistema je mikrokontroler 68HC11A1, ki deluje v razširjenem načinu, tako da lahko dostopa do programa, ki je shranjen v EPROMu 27C128 (16k*8). Dekodiranje v sistemu je nepopolno in sicer na zgornja dva byta natančno.
Tipkovnica 1 in 2
Tipkovnica je zasnovana kar se da enostavno. Do tipk dostopamo preko 8 kratnega zatiča 74HC573, ki mu omogočimo izhode, ko ga želimo brati, sicer pa sam zatič ni v uporabi, ker je vezan kot stikalo.

LCD prikazalnik LM4857 (4*40 znakov)
Prikazalnik LM4857 tovarne Densitron je sestavljen iz dveh identičnih sklopov, ki prikazujeta vsak po 2*40 znakov. Vsak vsebuje procesor, ki dani podatek na vhodu prekodira v 5*7 oz. 5*10 točkovno kodo in jo nato prikaže na zaslonu. Podatek vpisujemo paralelno na različne naslove. En 2*40 prikazalnik zahteva kar 4 lokacije naslovnega prostora in sicer:
LED prikazalnik LTM 8522
     Ta podsistem je modul, ki vsebuje hibridno vezje. To vezje je preprost primer serijskega sinhronega vmesnika. Ima 35 bitni pomikalni register, ki ga vpisujemo s frekvenco 125KHz. Na začetku prenosa postavimo Data Enable v aktivno stanje 0, nato pošljemo startni bit, in 32 podatkovnih, ostali pa so stop biti. Podatkovni biti so kodirani v 7-segmentni kodi. Register bo dano vsebino pomikal skladno z uro, dokler start bit ne sproži vpisa v zatiče (to se zgodi, ko pošljemo 36. bit!), ki vsebino zadržujejo do novega paketa podatkov. Če je vsebina, ki jo pošljemo že enaka vpisani, se "novi" podatek ne vpiše.

D/A pretvorniki
      Gre za 4 kanalni 8 bitni D/A pretvornik MAX505 tovarne Maxim. Kanale izbiramo z dvema adresnima bitoma (to je edini primer, ko je uporabljeno popolno dekodiranje v sistemu). Ko izberemo določeno adreso je s tem že izbran tudi kanal, tako da le še vpišemo podatek, ki ga do naslednjega vpisa zadrži vhodni zatič MAX505.
Nadzor napajanja
Nadzor polnenja akumulatorjev je izveden s procesorjem MTA11200 tovarne Arizona Microchip, vendar pa ta del projekta še ni docela raziskan.
Nazaj
Splošni opis programa



Program sestoji iz:
  1. časovno zaščitenih vpisov
  2. inicializacij
  3. uporabniškega vmesnika
  4. glavne zanke
  5. prekinitev
Časovno zaščiteni vpisi
Časovno zaščiteni vpisi so del programa, ki traja prvih 64 ciklov procesorske ure (2MHz). V teh ciklih lahko neovirano nastavljamo razna delilna razmerja (prescaler rate) za prekinitve. V našem primeru nastavimo delilno razmerje za LED prikazalnik (tu delimo CLK s 16) in pa za tipkovnici (ne delimo CLK), nato izberemo še način proženja in omogočimo AD pretvornik. Uporabniški vmesnik
Ta del programa bo spremenil stanje določene sistemske spremenljivke glede na kombinacijo pritisnjenih tipk. Nastavitve so zasnovane dvonivojsko: Na prvem nivoju pritisnemo eno od funkcijskih tipk (ura,predtok,program,start/stop), na drugem nivoju pa s tipkama gor in dol spreminjamo ter z enter potrdimo vrednost spremenljivke. Iz drugega nivoja se lahk vrnemo le s tipko enter, nakar s ponovno izbiro določene tipke prvega nivoja zopet prestavljamo vrednosti, dokler ne zaznamo kombinacije enter in start. Takrat omogočimo še prekinitvi (prekinitev, ki izšteva LED časovnik in prekinitev, ki "riše" na izhodu D/A pretvornika tokovne impulze) in beremo vrednost A/D kanala toliko časa, dokler ni vrednost jakosti kanala na 0! Vrednosti spremenljivk med nastavljanjem sproti izpisujemo na LCD prikazalnik.
Glavna zanka
V glavni zanki najprej pogledamo če se je LED časovnik že izštel, nato beremo vrednost A/D pretvornika, nakar zajeto vrednost pretvorimo iz BIN v BCD kodo, dobljenim BCD digitom prištejemo 30hex, da dobimo ASCII kodo, ki jo nato izpišemo na LCD prikazalnik in zanko ponovimo, če ni bila pritisnjena tipka stop, ali če se ura še ni izštela.
Nazaj

Primer zglednega kodiranja
To je rutina, ki pretvarja 16 bitno binarno vrednost ADR3 v njeno BCD kodo (BCD_STO, BCD_DES, BCD_ENI). Izkoriščena je le polovična zmogljivost rutine, saj je podatek ADR3, ki ga pretvarjamo 8 biten. Rutina pa dela takole:

BIN_BCD LDAA    #$00	;resetiramo vrednosti vseh BCD digitov
	STAA    BCD_ENI
	STAA    BCD_DES
	STAA    BCD_STO
	LDY     #BCD_STO	;naložimo začetni digit, ki ga bomo izračunali 
	LDAB    ADR3		;naložimo vrednost, ki jo pretvarjamo 
CONVTOK LDX     #$A		;naložimo vrednost 10dec, s katero bomo delili
	IDIV				;celoštevilsko delimo
	STAB    0,Y			;shranimo tekoči digit
	DEY					;vzamemo naslednji digit
	CPX     #$0000		;pogledamo ali je ostanek pri deljenju 0
	XGDX				;zamenjamo D in X (ostanek postane nov deljenec)
	BNE     CONVTOK		;ponavljamo dokler ni ostanek 0 
	RTS
Nazaj
Inicializacija LED in LCD
Inicializacijo LED sestavljata dve proceduri:

LEDINIT         LDX     #$1000
		BCLR    (PORTA-$1000),X,$80     ;DATA ENABLE* = 1
		LDAA    #$32    ;SPIE=SPE=0,DWOM=MSTR=1,CPOL=CPHA=0,F=125kHz
		STAA    SPCR
		LDAA    #$3F    ;VSI PINI SO IZHODNI
		STAA    DDRD
		LDAA    #$3F
		STAA    PORTD   ;VSI PINI SO NA 1
		RTS

RESET           LDX     #$1000
		BSET    (PORTA-$1000),X,$80     ;DATA ENABLE = 1 (tu je zopet 		   										;										;negativna logika)					         
		BRN     RESET					;
		BCLR    (PORTD-$1000),X,$0C     ;MOSI IN MISO = 0
		BRN     RESET
		LDAA    #35
		STAA    STEVEC
PRAZNI_REG      BSET    (PORTD-$1000),X,$10     ; SPRAZNI REGISTER (POSLJE 35. CLK IMPULZOV)
		BSET    (PORTD-$1000),X,$0C     ;MISO & MOSI = 1, => SDA = 0
		BRN     RESET
		BCLR    (PORTD-$1000),X,$10
		LDAA    STEVEC
		DECA
		STAA    STEVEC
		BNE     PRAZNI_REG
		BCLR    (PORTA-$1000),X,$80     ;DATA ENABLE = 1
		RTS

**************** TABELA 7 SEGMENTNIH KOD ZA STEVILKE *********************
******** KODE STEVILK SO V NEGATIVNI LOGIKI (0 POMENI PRIZGAN SEGMENT)****
ST_0    FCB     $03
ST_1    FCB     $9F
ST_2    FCB     $25
ST_3    FCB     $0D
ST_4    FCB     $99
ST_5    FCB     $49
ST_6    FCB     $41
ST_7    FCB     $1F
ST_8    FCB     $01
ST_9    FCB     $09
FULL    FCB     $00
BLANK   FCB     $FF

DIGITI          LDX     #$1000
		BSET    (PORTA-$1000),X,$80     ;DATA ENABLE = 0
		BCLR    (PORTD-$1000),X,$0C     ;MOSI IN MISO = 0 => SDA = 1
**************	START BIT ****************
		BSET    (PORTD-$1000),X,$10     ;PRVI URIN IMPULZ (ZACETEK)
		BCLR    (PORTD-$1000),X,$10     ;PRVI URIN IMPULZ (KONEC)

		BSET    (PORTD-$1000),X,$0C     ;MISO & MOSI = 1, => SDA = 0
		BCLR    (PORTA-$1000),X,$80     ;DATA ENABLE = 1
		BSET    (SPCR-$1000),X,$40      ;SPI ENABLE
		BSET    (PORTA-$1000),X,$80     ;DATA ENABLE = 0

		LDY     #ST_0
		LDAB    DES_MIN
		ABY
		LDAB    0,Y   ;PRVI DIGIT
		STAB    SPDR
WAIT1           LDAA    SPSR  ; POLLED NACIN (BEREMO MSB SPSR)
		BPL     WAIT1         ;CAKANJE DA SE PRENOS IZVRSI
************	PODOBNO PONOVIMO ZA OSTALE TRI DIGITE *************
		LDY     #ST_0
		LDAB    EN_MIN
		ABY
		LDAB    0,Y   ;DRUGI DIGIT
		EORB    #$01		   ;Z EXOR PRIZGEMO DECIMALNO PIKO
		STAB    SPDR		   ;NA DRUGEM DIGITU
WAIT2           LDAA    SPSR
		BPL     WAIT2           ;CAKANJE DA SE PRENOS IZVRSI

		LDY     #ST_0
		LDAB    DES_SEK
		ABY
		LDAB    0,Y   ;TRETJI DIGIT
		STAB    SPDR
WAIT3           LDAA    SPSR
		BPL     WAIT3           ;CAKANJE DA SE PRENOS IZVRSI

		LDY     #ST_0
		LDAB    EN_SEK
		ABY
		LDAB    0,Y   ;CETRTI DIGIT
		STAB    SPDR
WAIT4           LDAA    SPSR
		BPL     WAIT4           ;CAKANJE DA SE PRENOS IZVRSI

		BCLR    (SPCR-$1000),X,$40      ;SPI DISABLE
		BSET    (PORTD-$1000),X,$10     ;(34. URIN IMPULZ -ZACETEK
		BCLR    (PORTD-$1000),X,$10     ;34. URIN IMPULZ - KONEC
		BSET    (PORTD-$1000),X,$10     ;35.IMPULZ (ZACETEK)
		BCLR    (PORTD-$1000),X,$10     ;35.IMPULZ (KONEC)
		BSET    (PORTD-$1000),X,$10     ;36.IMPULZ (ZACETEK)
		BCLR    (PORTD-$1000),X,$10     ;36.IMPULZ (KONEC)
		BCLR    (PORTA-$1000),X,$80     ;DATA ENABLE = 1
		BCLR    (SPCR-$1000),X,$40      ;SPI DISABLE
		RTS

LCDINIT LDAA    #%00000001      ;CLEAR DISPLAY
	STAA    WRINST1
BUSY1   LDAA    RDBUSY1          ;READ BF (BUSY FLAG)
	BMI     BUSY1
	LDAA    #%00111000      ;8-BIT OPERATION, 2-LINE DISPLAY, 5X7 FONT
	STAA    WRINST1
BUSY2   LDAA    RDBUSY1          ;READ BF (BUSY FLAG)
	BMI     BUSY2
	LDAA    #%00001100      ;DISPLAY ON, CURSOR OFF, NO BLINK
	STAA    WRINST1
BUSY3   LDAA    RDBUSY1          ;READ BF (BUSY FLAG)
	BMI     BUSY3
	LDAA    #%00000110      ;INCREMENT MODE, NO SHIFT
	STAA    WRINST1
BUSY4   LDAA    RDBUSY1          ;READ BF (BUSY FLAG)
	BMI     BUSY4
	RTS
Izpisovanje besedila na LCD prikzalnik
Na LCD prikazalnik moramo izpisovati sporočila, ki so odraz trenutnega stanja sistema. Sporočila so načeloma večzankovni nizi, zato za dano rutino potrebujemo prevajalnik, ki zna besedilo pretvoriti v niz ZAPOREDNIH ASCII kod znakov. To v osnovni izvedbi prevajalnika IASM11 storimo z ukazom FDB "Sporočilo, ki ga želimo izpisati",0. Na koncu definicije sporočila dodamo kodo znaka, ki se sicer v izpisanem tekstu ne bo nikdar pojavil. To je zank NUL (00)- z njim ločujemo besedila med seboj in določamo konec besedila.Tako zapisano sporočilo lahko zopet obdelujemo s pomočjo indeksnega naslavljanja. Primer kodiranja take procedure je BESEDA, ki po vrsti jemlje znake iz EPROMa in jih izpisuje na LCD prikaz dokler ne naleti na znak NUL (00). Rutino kličemo tako, da povemo KAM na LCD naj se sporočilo izpiše in v register X naložimo začetek niza znakov, ki ga želimo izpisati.

BESEDA  LDAA    RDBUSY1          ;READ BF (BUSY FLAG)
	BMI     BESEDA
	LDAA    0,X             ;BRANJE VREDNOSTI TEXTA
	BEQ     KON_BES
	STAA    WRDATA1          ;ZAPIS NA EKRAN
	INX
	BRA     BESEDA
KON_BES INX
	RTS
Nazaj


Prekinitvene rutine


Vse prekinitvne rutine v programu so periodične. MC68HC11 razen real-time interrupta in software intr. nima periodičnih interruptov, zato mu jih moramo vsiliti. To storimo na vseh interruptih tipa TOC (timer output compare). Prekinitve tipa TOC se sprožijo vedno, ko je vrednost števca TCNT enaka vrednosti primerjalega registra TOC. Najprej naložimo vrednost prostotekočega števca TCNT v register D, nato tej vrednosti prištejemo periodo in dobljeno vrednost shranimo v register primerjave npr. TOC5. Periodo izračunamo iz števila ciklov, ki jih procesor porabi da pride o vrednosti v primerjalnem registru, če vemo da vsak cikel ure poveča vrednost prosto tekočega števca TCNT za 1.

TOC5I   LDD     TCNT
	ADDD    #$03E8                  ;NASLEDNJA PREKINITEV ZA 0.5 SEKUNDE
	STD     TOC5
Nazaj

Literatura:

M68HC11 Reference Manual
Motorola Inc. 1991

Mikrokrmilniški sistemi
Programiranje v realnem času

doc. dr. Tadej Tuma
Založba FRI in FE 1997

Mikroprocesorski sistemi
Dušan Kodek
Bi-Tim d.o.o. 1993

Mikroprocesorji v elektroniki :zapiski s predavanj šol. leto 1997/98
Predavatelj: prof.dr.Franc Bratkovič
Nazaj







Avtor:
Matej Možek
Ulica Bratov Knapič 6
Telefon: +386 61 15 23 907
1210 Ljubljana
Slovenia (Europe)
E-pošta: matej.mozek@flux.fe.uni-lj.si
Nazaj