Tutorial MSP430 – Prender un Led “Bienvenido a mi casa. Venga libremente, libremente, váyase a salvo, y deje algo de la alegría que trae consigo” Dracula, de Bram Stoker Vamos a trabajar con el microcontrolador MSP430F0!!, debido a "ue tiene s#lo !4 $ines, de los cuales $odemos utili%ar !0 $ines como &'(, )B de memoria de $ro*rama +Flas Memor-. - !MB de memoria de datos +/M.1 2aturalmente si en al*n momento nos "ueda cico este micro mi*raremos a otro con ma-or recursos1
n esta direccion de la em$resa Te5as &nstruments se &nstruments se encuentran dos arci6os "ue necesitamos tener a nuestro lado como material de consulta absoluto7 !1 Dataseet del MSP430F0! MSP430F0!! ! 1 8uia de 9suario de la Familia MSP430::: ;omo $odemos 6er en la ima*en, 6amos a reali%ar un c#di*o "ue acti6e un ni6el i* en el $in del MSP430F0!!1
l c#di*o "ue reali%ar< esta tarea se muestra a continuaci#n7 1
#include "io430.h"//libreria del propio IDE
2 3 4
//#define LED1 P1OUTbi!.P1OUT0//definicion del pin LED #define LED1 P1OUTbi!.P0//definicion del pin LED
5 6 7 8
in! ain $oid % //funcion principal & // '!op (a!chdo) !ier !o pre$en! !ie ou! re*e! +DT,TL - +DTP+ +DTOLD
9 10 11 12 13
//,PD - 0200//abili!ao* el ou!pu! dri$er de !odo* lo* pine* del puer!o 1. P1'EL - 0200//'e!eao* la funcion de I/O en !odo* lo* pine* del puer!o 1. P1DI - 02//'e!eao* !odo* lo* pine* del puer!o 1 coo *alida.
14 15
LED1 - 1//ni$el hi)h en el pin LED
16
(hile1%//bucle infini!o
17 18
5
;omo $ueden notar se trata de un len*uaje ; "ue res$eta el =ormato del 2S& ;, $racticamente $racticamente no emos tocado an 6arios as$ectos como el oscilador, modo de arran"ues, etc1 stos temas los iremos 6islumbrando con=orme a6ance el curso1 Pero $or aora toca entender entender "ue si*ni=ican si*ni=ican estos 3 re*is re*istros tros77 ;PD ;PD,, P!SL, P!D&/, - "ue si*ni=ica el label LD!1
;PD, P!SL, P!D&/ se necesitan con=i*urar de la si*uiente manera $ara $oder utili%ar el $in "ue corres$onde con el P!10, como out$ut7
(bser6en "ue $ara "ue el $in P!10 se com$orte como un $in d e salida +o de entrada. necesita "ue el bit 0 del re*istro P!D&/ sea cero, debido a "ue ese re*istro de=ine el com$ortamiento de entrada o salida del $in, donde un >! ? si*ni=ica >salida? - un >0@ es >entrada? +contrario a como trabajan los P&;s $or ejem$lo.1
sA mismo el bit 0 de P!SL tiene "ue ser cero, $ues esto le indica al $in "ue se com$orte como un $i $in n &' &'(, (, ot otro ro 6a 6alo lorr co con= n=i* i*ur urar arAa Aa al $i $in n $ar $ara a "u "ue e tr traba abaje je co con n al al*u *un n $e $eri ri= =ri rico co "u "ue e ti tien ene e multi$le5ado1 n otro $ro-ecto usaremos esta con=i*uraci#n1
C el bit 0 del re*istro ;PD tambin tiene "ue ser seteado a cero, $ara "ue abilite los bu==ers de entrada'salida del $in1 ste re*istro tiene ma-or rele6ancia cuando se usa el $in P!10 en el modo com$arador1
Des$us de todo esto -a tenemos el $in P!10 con=i*urado como salida +en el c#di*o lo emos a$licado a todos los $ines del $uerto !., entonces creamos el label LD! "ue re=erencia al bit 0 del re*istro P!(9T +"uien controla los $ines de salida del $uerto !.1 de=ine LD! P!(9TEbit1P P!(9TEbit1P!(9TE0, !(9TE0, donde7 P!(9TEbit re*istro P!(9T P!(9TE0 bit 0 del re*istro P!(9T
Finalmente un 6ideo $ara "ue la 6isita sea m
Tutorial MSP430 – Prender y Apagar un Led “Bienvenido a mi casa. Venga libremente, libremente, váyase a salvo, y deje algo de la alegría que trae consigo” Dracula, de Bram Stoker n esta nue6a entrada 6amos a estudiar un $ro*rama en el cual aremos $render - a$a*ar +$ar$adear. un led con un determinado retardo1 l $ro*rama a$arenta ser sim$le - sencillo, sin embar*o la $ondremos di=icil $or"ue asta aora no sabemos a "ue =recuencia estamos trabajando con el MSP430F0!!, es m
La =recuencia de oscilaci#n del MSP430F0!! +- de todos los MSP430555. de$ende de lo "ue se conoce como el Basic ;lock S-stem, el cual si miran en el *r<=ico si*uiente, se $uede obser6ar "ue est< constituido $or G elementos *lobales7
!1 ;lock Sources 1 ;lock Si*nals 31 Modos de ($eracion 41 /e*istros $ara con=i*urar ;lock Sources - ;lock Si*nals G1 /e*istros $ara con=i*urar el Modo de ($eracion Parece muca in=ormaci#n, lo sH, $ero -a dice el sabio re=rdi6ide - 6encercti6e Mode +M.?, es decir no tocaremos sus re*istros de con=i*uraci#n1 La a$licaci#n o utilidad de los $untos 3 - G se 6e re=lejado en el tema de aorro de consumo de ener*Aa, las di=erentes con=i*uraciones de loI $oIer mode $ermiten tener 6arios consumos en el orden de micro am$erios, se*n sea la necesidad de la a$licaci#n1 Clock Sources y Clock Signals
>C (din creo $rimero los clock sources - des$us a$arecieron los clock signals>1 &*ual tenemos "ue acer nosotros, $rimero debemos con=i*urar los clock sources - des$us a$arecieron los clock signals1 Por"ueJ Por el si*uiente *r<=ico, una ima*en abla m
l *r<=ico =ue e5traido del =amil- users *uide "ue les su*erA descar*ar en el $rimer $ost del tutorial, el es"uema re$resenta los blo"ues de trabajo del Basic ;lock S-stem $ara el MSP430F555, obser6en ademno est< im$lementado? $ara "ue se$an "ue eta$as no est
dar lu*ar a los ;lock Si*nals +;L), M;L), SM;L).1 Tenemos "ue seleccionar de "ue =uente +VL(;L), LF:T!;L), D;(;L). $ro6ienen las seKales de oscilaci#n del sistema +;L), M;L), SM;L).1 Clock Sources ntonces, los entendemos como la =uente de oscilaci#n $ara las seKales de reloj +;lock Si*nals. del sistema, - tenemos "ue seleccionar s#lo una de ellas, $ero $odemos cambiar entre una - otra en el tiem$o de ejecuci#n del $ro*rama del microcontrolador7 LF:T!;L)7 LoI=re"uenc-'i*=re"uenc- oscillator tat can be used Iit loI=re"uenc- >Iatc cr-stals? or >e5ternal clock sources? o= 3NO Q% or Iit standard cr-stals, resonators, or >e5ternal clock sources? in te 400kQ% to !OMQ% ran*e1 n el caso del MSP430F0!! el LF:T!;L) solo so$orta bajas =recuencias en el ran*o de !0)Q% asta G0)Q%1 D;(;L)7 >&nternal? di*itall- controlled oscillator +D;(.1 s un oscilador interno con un *ran ran*o de con=i*uraci#n de trabajo de asta !OMQ%1 VL(;L)7 &nternal 6er- loI $oIer, loI =re"uenc- oscillator Iit !kQ% t-$ical =re"uenc-1 s un oscilador interno de solo !)Q%, utili%ado $ara bajo consumo del sistema1 n esta entrada 6amos a trabajar con el oscilador interno D;(;L), $or ello los dem
l *r<=ico de arriba nos muestra en el eje ori%ontal los +del 0 al N. 6alores $ara el *ru$o de bits D;( +son 3 bits. "ue se encuentran en el re*istro D;(;TL, - en el eje 6ertical los 6alores +en realidad son !O 6alores, del 0 al !G. del *ru$o de bits /SL "ue se encuentran en el re*istro B;S;TL!1 Fijense el escalon "ue tiene $or ejem$lo /SL 0 $ara cada 6alor de D;(, a la i%"uierda en el eje 6ertical $odemos a$reciar la =recuencia >a$ro5imada? "ue conse*uimos en al*una de las con=i*uraciones1
esto me re=erAa cuando les decAa "ue tenemos un oscilador mu- 6ers
;omo mencion antes, e5isten otros 6alores de =recuencia $ara el D;( "ue no est
Clock Signals Son 3 salidas $ara el source "ue seleccionemos, donde cada clock si*nal tiene su $ro$ia con=i*uraci#n - a$licaci#n7 ;L)7 u5iliar- clock +;L)., sourced eiter =rom a 3NOQ% Iatc cr-stal or te internal LF oscillator1 Puede ser utili%ado con los clock source7 LF:T!;L), VL(;L)1 l source $ara esta seKal de$endera de la con=i*uracion de los bits LF:T!S + bits. del re*istro B;S;TL3 - del bit :TS +! bit. del re*istro B;S;TL!1 M;L)7 Main clock +M;L)., te s-stem clock used b- te ;P91 Puede utili%ar todos los source dis$onibles1 Por de=ecto des$ues de un reset del ci$ siem$re selecciona iniciar con el source D;(;L)1 Por c#di*o $odemos cambiarlo a otro source si lo re"uerimos - se reali%a esto con los bits SLM + bits. "ue est
n este $ro*rama utli%aremos el D;( a !MQ% junto con el M;L) con di6isor 6alor !, asA "ue amu- $oco "ue mani$ular1 Pro*rama de a$licacion 1 2 3 4 5 6 7 8 9 10
#include "io430.h"//libreria del propio IDE #include "in!rin*ic*.h" //#define LED1 P1OUTbi!.P1OUT0//definicion del pin LED #define LED1 P1OUTbi!.P0//definicion del pin LED in! ain $oid % //funcion principal & // '!op (a!chdo) !ier !o pre$en! !ie ou! re*e! +DT,TL - +DTP+ +DTOLD 6,',TL1 - ,L6,1789// U*e 18h: cal da!a for D,O
11 12
D,O,TL - ,LD,O789// U*e 18h: cal da!a for D,O
13 14 15 16 17 18
,PD - 0200//abili!ao* el ou!pu! dri$er de !odo* lo* pine* del puer!o 1. P1'EL - 0200//'e!eao* la funcion de I/O en !odo* lo* pine* del puer!o 1. P1DI - 02//'e!eao* !odo* lo* pine* del puer!o 1 coo *alida.
19
LED1 - 0//ni$el lo( en el pin LED
20
(hile1%//bucle infini!o & LED1 - 1 dela;c;cle*1<0000%//=00 ili*e)undo* LED1 - 0 dela;c;cle*1<0000%//=00 ili*e)undo* 5
21 22 23 24 25 26 27
5
28
Video Todos los arci6os los $ueden encontrar en7 4sared, bo5net1 stos nue6os enlaces estan com$ilador con la 6ersi#n del so=tIare &/ G140 7
Tutorial MSP430 – Barra de Leds – Maska)le %nterrupts *or %nput Port “Bienvenido a mi casa. Venga libremente, váyase a salvo, y deje algo de la alegría que trae consigo” Dracula, de Bram Stoker Vamos a reali%ar un $ro-ecto en el cual con un boton +normalmente en bajo ni6el. iremos des$la%ando la acti6aci#n de un led en la salida de un N455!3 se*n un contador interno en el MSP4301 n este sencillo ejem$lo a$renderemos a utili%ar los $ines del MSP430 como entradas l#*icas - tambin a con=i*urar sus res$ecti6as interru$ciones de cambio de estado $or =lanco de entrada1
%nterrupciones en el MSP430 sA como en otros microcontroladores, el MSP430 tambin 6iene $ro6isto de interru$ciones $or ardIare "ue $ermiten reali%ar di6ersas a$licaciones se*n la caraterAstica de la interru$ci#n "ue utili%emos1 Podemos usar las interru$ciones $or ejem$lo $ara los si*uientes casos7 Tareas ur*entes "ue deben ser atendidas inmediatamente - con ma-or $rioridad "ue el c#di*o $rinci$al1 Tareas de $oca =recuencia, como el manejo de $ulsadores en un umano1 sto nos libera de reali%ar un c#di*o con $ollin* +bucle $ara e6aluar constantemente en el orden de microse*undos una entrada l#*ica.1 Des$ertar el ;P9 del modo Slee$1 sto es mu- im$ortante en el MSP430, -a "ue $or lo *eneral se lo utili%a la ma-or $arte del tiem$o en modo de bajo consumo +loI$oIer mode. - $uede 6ol6er al modo acti6o +M mode. con una interru$ci#n1 Tipos de %nterrupciones n el MSP430 tenemos 3 ti$os de interru$ciones, stas son7
Si re6isamos el dataseet del MSP430F0!!, en la $a*ina !3, est< $lasmada una tabla con todas las interru$ciones "ue so$orta el microcontrolador +en realidad ese dataseet es $ara las series MSP430F053''!.7
Debemos obser6ar en esta tabla "ue e5isten 3 $osiciones de memoria +0loIest 3!i*est. o tambin llamados >6ectores? reser6ados $ara almacenar la direcci#n de los &S/ corres$ondientes a la interru$ci#n "ue los de=ine +tambin conocidos como los >interru$t andler?.1 ;omo $ueden a$reciar en dica tabla estio430505!1? "ue est< en los $ro*ramas "ue acemos con el &/ cuando seleccionamos el MSP430F0!!, - buscan lo si*uiente7
Para escribir el >interru$t andler? de la interru$ci#n "ue "ueremos *estionar, necesitamos saber el nombre del 6ector de la interru$ci#n "ue tiene en el microcontrolador "ue estamos $ro*ramando +siem$re - cuando sea desde el &/., $ara eso sir6en esos de=ines1 n esta entrada s#lo abarcaremos el estudio de las interru$ciones enmascarables +MS)BL &2T//9PTS. , $ara los dem __enable_interrupt >, la cual setea a ni6el *lobal la acti6aci#n de todas las interru$ciones enmascarables del MSP4301 Sino la utli%amos nin*una de las interru$ciones enmascarables $re6iamente - correctamente con=i*uradas =uncionar __enable_interrupt ? al =inal de la con=i*uraci#n de todas las interru$ciones enmascarables1 Para tener la =unci#n > __enable_interrupt ? dis$onible necesitamos colocar en la cabecera la inclusi#n7 #include “intrinsics.h” 1 Lue*o re"uerimos escribir el >interu$t andler? o &S/, "ue es el lu*ar donde aremos el tratamiento de la interru$ci#n1 n ; $ara el &/, e5iste un =ormato $ara escribir el >interru$t andler? o &S/ de la interru$ci#n "ue "ueremos utili%ar1 l =ormato es el si*uiente7
continuaci#n e5$licaremos los cam$os resaltados7 #pragma vector 7 esta directi6a es usada $ara es$eci=icar la direcci#n del 6ector de interru$ci#n "ue se escriba en el cam$o V;T(/E2MU1 P(/TEV;T(/?1
__interrupt 7 es usado $ara indicar al com$ilador "ue a*a la llamada con6encional "ue necesita una =unci#n de ti$o interru$ci#n1 <$%R_!"E7 es sim$lemente el nombre del >interru$t andler?, es decir $uede ser cual"uier nombre "ue $re=iera el $ro*ramador1 n nuestro caso le e $uesto de &S/E2M el literal >&nterru$cionPuerto@1 Dentro del >interru$t andler? escribimos el c#di*o "ue *estionar< las acciones conjunto "ue reali%ar< la interru$ci#n del ardIare es$eci=icado1 Finalmente +,+CA ol6idar de borrar el =la* de la interru$ci#n in6ocada1 %nterrupcion de Cam)io de Estado en el Pin de Entrada P-./ Para con=i*urar la interru$cion en el $in P1N necesitamos mani$ular los si*uientes re*istros7
De la ima*en entendemos "ue debemos con=i*urar el bit N del re*istro PD&/ con 6alor 0 $ara indicar >entrada?, lue*o el bit N del re*istro PSL con 6alor 0 $ara indicar =uncion de &'( +entrada'salida.1
Tambin debemos utli%ar el bit N del re*istro P/2, $ara es$eci=icar si el $in P1N tendr< una resistencia de $ullu$ +313V con el $in al aire. o $ulldoIn +0V con el $in al aire. conectada a su entrada1 sto $or lo *eneral se utili%a con $ulsadores normalmente abiertos o cerrados1
sA mismo acemos con el bit N del re*istro P&S, "ue $ermite es$eci=icar el =lanco de dis$aro de la interru$ci#n en el $in P1N1 Podemos seleccionar entre una transici#n de bajada a subida o 6ice6ersa1 n nuestro caso tenemos una seKal normalmente en bajo ni6el, $or ello ele*imos la transici#n de bajada a subida1
continuaci#n abilitamos la interru$ci#n del $in P1N escribiendo un ! en el bit N del re*istro P&1
Lue*o borramos el =la* de interru$cion en el bit N del re*istro P&F8 $ara e6itar sor$resas ines$eradas1 /ecordar borrar este =la* antes de salir del >interru$t anlder? o &S/1
Finalmente a*re*aremos la linea de comando >EEenableEinterru$t+.? $ara acti6ar de =orma *lobal todas las interru$ciones enmascarables $re6iamente con=i*uradas, como s el caso del $in P1N1 Programa de Aplicacin7 #include "io430.h"//libreria del propio IDE 1 #include "in!rin*ic*.h" 2 3 4 5
#define OUT P1OUTbi!.P1OUT1//definicion del pin LED #define OUT6 P1OUTbi!.P1OUT>//definicion del pin LED #define OUT, P1OUTbi!.P1OUT3//definicion del pin LED
6 7
un*i)ned char au2
8 9 10 11 12 13 14
in! ain $oid % //funcion principal & // '!op (a!chdo) !ier !o pre$en! !ie ou! re*e! +DT,TL - +DTP+ +DTOLD 6,',TL1 - ,L6,1189// U*e 18h: cal da!a for D,O D,O,TL - ,LD,O189// U*e 18h: cal da!a for D,O
15 16 17 18 19 20 21 22 23 24 25
,PD - 0200//abili!ao* el ou!pu! dri$er de !odo* lo* pine* del puer!o 1. P1'EL - 0200//'e!eao* la funcion de I/O en !odo* lo* pine* del puer!o 1. P1DI - 02//'e!eao* !odo* lo* pine* del puer!o 1 coo *alida. P1OUT - 0200 P1DIbi!.P1DI? - 0//pin de en!rada //,onfi)urao* pin P>.< ; P>.? coo en!rada* lo)ica*. P>DIbi!.P>DI< - 0//lo)ic inpu! P>'ELbi!.P>'EL< - 0//inpu!/ou!pu! func!ion P>DIbi!.P>DI? - 0//lo)ic inpu!
26 27 28 29
P>'ELbi!.P>'EL? - 0//inpu!/ou!pu! func!ion
30 31 32 33 34 35 36 37 38 39
//Priera capa de //,onfi)urao* la P>EAbi!.P>EA? P>IE'bi!.P>IE'? P>IEbi!.P>IE? P>IBbi!.P>IB? P>.?
ac!i$acion de in!errupcion in!errupci@n en el pin P>.? - 0//de*habili!ao* la re*i*!encia pullup/pulldo(n. - 0//in!errupcion en pul*o de *ubida lo( !o hi)h%. 1//habili!ao* la in!errupcion del pin P>.? - 0//lipiao* la bandera de in!errupcion del pin
//'e)unda capa de ac!i$acion de in!errupcion enablein!errup!%
40
au2 - ? (hile1%//bucle infini!o &
41 42 43 44 45
5 5
46 47 48
#pra)a $ec!or - POT>CE,TO in!errup! $oid In!errupcionPuer!o>$oid%&
49
OUT - 0 OUT6 - 0 OUT, - 0
50 51 52 53
ifau2 OUT 5 ifau2 OUT6 5 ifau2 OUT, 5
54 55 56 57 58 59 60 61 62 63 64
65 66 67 68 69 70 71
0201% -- 0201%& - 1 020>% -- 020>%& - 1 0204% -- 0204%& - 1
ifau2 - ?%& au2 - 0 5el*e& au2 5 P>IBbi!.P>IB? - 0//6orro el fla) de in!errupcion.
5
Timer n esta nue6a entrada estudiaremos el com$ortamiento, con=i*uraciones, - re*istros "ue constitu-en el Timer Block del TimerE "ue $osee el microcontrolador MSP430F!31 n e=ecto emos dejado atr
Timer1A s en esencia un timer'counter de !O bits, con re*istros de control - ca$tura'com$araci#n "ue en conjunto $ro$orcionan mucas con=i*uraciones "ue ser6ir
Debemos mencionar "ue en los MSP430 $ueden aber m
m#dulo
TimerE
con
Andice
0
-
con
3
canales
;a$ture';om$are
con
Andice
!
-
con
canales
;a$ture';om$are
+T0;;/0,T0;;/!,T0;;/.1 Timer,_!- 7
m#dulo
TimerE
+T!;;/0,T!;;/!.1 mbos m#dulos al ser TimerE =uncionan de la misma manera, $or ello en los ejem$los trabajaremos solamente con el Timer0E3, mi*rar los ejem$los al otro timer ser< cosa de modi=icar tan s#lo el Andice en el nombre de los re*istros1
Veamos a continuaci#n todos los re*istros del Timer0E3 +sombreados en amarillo los re*istros asociados del Timer Block del Timer0E3.7
n esta entrada nos en=ocaremos en el estudio del Timer Block del Timer0E3, la otra $arte $rinci$al la dejaremos $ara la se*unda $arte del estudio del TimerE1 Timer Block del Timer01A3 l Timer Block del Timer0E3 est< *obernado $or un re*istro de control llamado T0;TL el cual se a$o-a en un re*istro timer'counter de !O bits llamado T0/ cu-o com$ortamiento se $uede con=i*urar1 Se $uede seleccionar la =uente del reloj - un $rescaler1 l Timer Block no tiene salida directa $or al*un $in sin embar*o *enera interru$ci#n con la bandera T&F8 cuando su contador T0/ re*resa a cero siem$re "ue se abilite su interru$ci#n con el bit T&1 sA mismo e5iste un modo de o$eraci#n donde se *enera interru$cion cuando el 6alor del re*istro contador T0/ sea i*ual al 6alor escrito en el re*istro T0;;/01
Si anali%amos el dia*rama de blo"ues del Timer Block em$e%ando $or la i%"uierda, tenemos los clock source de donde se selecciona uno mediante los bits TSSL +bits W del re*istro T0;TL.7 T!C/ +0. 7 seKal de reloj $ro6eniente de un $in e5terno, en el MSP430F!3 se ubica en el $in P!101 !C/ +!. 7 seKal de reloj $re6iamente con=i*urada del Basic ;lock S-stem en el MSP430F!31 %"C/ +. 7 seKal de reloj $re6iamente con=i*urada del Basic ;lock S-stem en el MSP430F!31 $C/ +3. 7 seKal de reloj $ro6eniente del $in P1! +T&2;L). "ue $ermite incrementar con =lanco de bajada al re*istro T0/, $ara los dem
Las seKales de interru$ci#n del Timer Block +T&, T&F8. del MSP430F!3 las describiremos a continuaci#n1 $nterrupcion del Timer &loc' en el Timer*_!+ Las interru$ciones del Timer0E3 son otro tema, $ues en la tabla de 6ectores de todas las interru$ciones enmascarables tiene reser6ado dos 6ectores, el 4 - el G1 l 6ector 4 res$onde a 3 banderas de interru$cion7 T0;;/! ;;&F8, T0;;/ ;;&F8 - T0;TL T&F81 l 6ector G solamente re=iere a la bandera T0;;/0 ;;&F81
Para esta $rimera $arte, 6amos a en=ocarnos solamente en el =la* T&F8 de la interru$cion Timer0E3 +6ector 4.1 ora nos sur*e una $re*unta, c#mo identi=icamos en el 6ector 4 a la bandera T&F8J Sucede "ue e5iste un re*istro llamado T0&V cu-o 6alor $ermite conocer cual de las 3 interru$ciones se a $roducido1 T!*$V si*ni=ica7 Timer0E3 &nterru$t Vector Value, - tiene la $ro$iedad de "ue $or ejem$lo cuando se $roduce la interru$ci#n del T&F8 +"ue s cuando e5iste un desborde del timer T0/. se car*a en dico re*istro el 6alor 050, es decir des$ues de "ue el com$ilador in6o"ue a la =unci#n de interru$cion del 6ector 4 del Timer0E3, debemos de consultar una 6e% dentro de la &S/ al re*istro T0&V $or su 6alor $ara determinar el ti$o de interru$ci#n, lue*o de esta lectura el re*istro se resetea autom
Las interru$ciones T&F8 $or desborde del re*istro timer T0/ se con=i*uran con los bits M; +bits G4 del re*istro T0;TL. - tienen el si*uiente com$ortamiento7 3p "ode7 n este modo la interru$cion se $roduce cuando el 6alor del re*istro T0/ se reinicia en cero justo des$us de "ue su 6alor a-a sido i*ual al 6alor del re*istro T0;;/01
Continuous "ode7 n este modo la interru$cion se $roduce cuando el 6alor del re*istro T0/ se reinicia en cero justo des$us de "ue su 6alor a-a sido i*ual a 05FFFF +OGG3G en decimal.1
9$'DoIn Mode7 n este modo la interru$cion se $roduce cuando el 6alor del re*istro T0/ lle*a a cero justo des$us de "ue su 6alor se a-a decrementado desde "ue el 6alor de T0/ es i*ual el 6alor del re*istro T0;;/01
Finalmente dica interru$ci#n con =la* T!$67 +bit 0 del re*istro T0;TL. se acti6a con el bit T!$E +bit ! del re*istro T0;TL.1 Para entender - consolidar el =uncionamiento del Timer Block emos reali%ado un c#di*o donde mediante 3 $ulsadores se $odr< seleccionar las con=i*uraciones del source clock, del in$ut di6ider, - del mode control1 Programa de Aplicacion7 #include "io430.h" 1 #include "in!rin*ic*.h" 2 #include "b*pFb*p.h" 3 #include "lcd>2121<.h" 4 5 6 7 8 9 10 11 12 13 14 15 16
char char char char
e*!ado,LG e*!adoDIC e*!ado8ODO cabia
in! ain $oid % & un*i)ned char !i!uloH1< - " icroebebido* " un*i)ned char linea1H1< - ",LGJ DICJ " un*i)ned char linea>H1< - "8ODOJ " un*i)ned char *ource0H= - "T,LG" un*i)ned char di$0H> - "/1" un*i)ned char odo0H10 - "'TOP 8ODE "
17 18 19 20 21 22
un*i)ned char *ource1H= - ",LG " un*i)ned char di$1H> - "/>" un*i)ned char odo1H10 - "UP 8ODE un*i)ned char *ource>H= - "'8,LG" un*i)ned char di$>H> - "/4"
"
un*i)ned char odo>H10 - ",OAT.8ODE "
23 24
un*i)ned char *ource3H= - "IA,LG" un*i)ned char di$3H> - "/7" un*i)ned char odo3H10 - "UP/DA 8ODE"
25 26 27 28
// '!op (a!chdo) !ier !o pre$en! !ie ou! re*e! +DT,TL - +DTP+ +DTOLD
29 30
6,',TL1 - ,L6,1189// U*e 18h: cal da!a for D,O D,O,TL - ,LD,O189// U*e 18h: cal da!a for D,O
31 32 33 34 35
,LGIni!% '8,LGIni!% T,LGIni!%
36
T,,0 - 100
37 38
6o!one*Ini!%
39 40
P1DIbi!.P1DI4 - 1//*alida
41 42
LcdIni!%
43 44
Lcd'!rin)K!i!uloM1
45 46
Lcd'!rin)Klinea1M1M1%
47 48 49
e*!ado8ODO - > e*!adoDIC - 3 e*!ado,LG - > cabia - 1
50 51 52 53 54 55
enablein!errup!%//ac!i$a !oda* la* in!errupcione* ena*carable*.
56
(hile1%&
57 58
do& 5(hilecabia -- 0%
59 60
cabia - 0
61 62 63 64 65 66 67 68 69
*(i!che*!ado,LG%& ca*e 0J Lcd'!rin)K*ource0M=M=M1% breaN ca*e 1J Lcd'!rin)K*ource1M=M=M1% breaN ca*e >J
70 71 72
Lcd'!rin)K*ource>M=M=M1% breaN ca*e 3J Lcd'!rin)K*ource3M=M=M1% breaN 5
73 74 75
*(i!che*!adoDIC%& ca*e 0J Lcd'!rin)Kdi$0M>M1=M1% breaN ca*e 1J Lcd'!rin)Kdi$1M>M1=M1% breaN ca*e >J Lcd'!rin)Kdi$>M>M1=M1% breaN ca*e 3J Lcd'!rin)Kdi$3M>M1=M1% breaN 5
76 77 78 79 80 81 82 83 84
85 86 87 88 89 90
*(i!che*!ado8ODO%& ca*e 0J Lcd'!rin)Kodo0M10M% breaN ca*e 1J Lcd'!rin)Kodo1M10M% breaN ca*e >J Lcd'!rin)Kodo>M10M% breaN ca*e 3J Lcd'!rin)Kodo3M10M% breaN 5
91 92 93 94 95 96 97
98 99 100
'e!upTier03e*!ado,LGM e*!adoDICM e*!ado8ODO%
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
5 5 #pra)a $ec!or - TI8E01CE,TO in!errup! $oid In!errupcionLo(PrioTier03$oid% & un*i)ned char au2 au2 - TIC ifau2 -- 020%& P1OUTbi!.P1OUT4 - P1OUTbi!.P1OUT4 T,TLbi!.TIB - 0 5 5 #pra)a $ec!or - POT1CE,TO in!errup! $oid In!errupcionPuer!o1$oid% & if6OTOA1IB%&
117 118 119 120 121 122 123 124 125 126 127 128
129 130 131 132 133 134
135 136 137 138 139 140
141 142 143 144 145
e*!ado,LG ife*!ado,LG 3%& e*!ado,LG - 0 5 cabia - 1 6OTOA1IB - 0 5 el*e if6OTOA>IB%& e*!adoDIC ife*!adoDIC 3%& e*!adoDIC - 0 5 cabia - 1 6OTOA>IB - 0 5 el*e if6OTOA3IB%& e*!ado8ODO ife*!ado8ODO 3%& e*!ado8ODO - 0 5 cabia - 1 6OTOA3IB - 0 5
5
146 147 148 149 150 151 152 153 154 155 156
2ideo 1-7 2ideo -1-7 Arci5os7 Bo5net1 4Sared1 stos nue6os enlaces estan com$ilador con la 6ersi#n del so=tIare &/ G140 7
4Sared esta se*unda $arte del TimerE, trataremos con los re*istros ;a$ture';om$are en su con=i*uracion de ;a$tura +;a$ture Mode.1 Veremos lo $r
Capture Mode del Timer01A3 n la $rimera $arte del $ost del TimerE, mencionamos los re*istros "ue constitu-en el Timer0E3 dentro del MSP430F!3, de los cuales los "ue est
(bser6emos "ue $ara el ;anal 0 e5isten dos re*istros, lo mismo $ara los otros canales, todos ellos tienen la misma estructura - =unci#n1 n nuestro $ro-ecto emos trabajado solamente con el ;anal 0, el estudio de los dem
TA0CC60 n el Modo ;a$tura este re*istro almacena el 6alor del re*istro T0/ cuando se cum$le con la condici#n de ca$tura de =lanco del Timer0E31 Dica condici#n se con=i*ura en el otro re*istro del ;anal 0 +T0;;TL0.1
;itamos un ejem$lo, di*amos "ue "ueremos medir el anco de un $ulso +LoIQi*LoI. entonces en el $rimer =lanco de subida *enera interru$cion +des$us 6eremos donde est< su 6ector de interru$ci#n - c#mo seleccionar el =lanco de ca$tura. - leemos el 6alor del T0;;/0 +"ue acaba de ca$turar el 6alor del To/. $ara almacenarlo en un re*istro "ue llamaremos FS, lue*o se *enera otra interru$cion en el =lanco de bajada - *uardamos el 6alor del T0;;/0 en otro re*istro FB1 ntonces $ara determinar el anco del $ulso sim$lemente restamos FB – FS, cu-o resultado estar< en =unci#n del source clock "ue ten*a con=i*urado el Timer Block del Timer0E31 Frecuencia TimerBlock !G)Q% +!MQ% SM;L), di6isor '. FS !0O +$rimera ca$tura del =lanco de subida en Terminos del T0;;/0. FB !4OW +se*unda ca$tura del =lanco de bajada en Terminos del T0;;/0. nco de Pulso en Terminos del T0;;/0 FB – FS O3 nco de Pulso en Se*undos O3'+!G)Q%. O3'!G000 se*1 1!04 mse*1 TA0CCTL0 l se*undo re*istro del ;anal 0 $ermite con=i*urar el com$ortamiento del canal, asA como la abilitaci#n de su interru$cion1 Describiremos a continuaci#n sus cam$os1
;M5 +bits !G!4. 7 S#lo $ara el Modo ;a$tura1 Permite de=inir el =lanco de ca$tura del ;anal 01 07 Sin ca$tura1
!7 ;a$tura en =lanco de subida1 7 ;a$tura en =lanco de bajada1 37 ;a$tura en ambos =lancos1 ;;&S5 +bits !3!. 7 S#lo $ara el Modo ;a$tura1 Permiten de=inir la seKal de entrada cu-os =lancos 6amos a ca$turar1 07 ;;&01 ntrada $ara el ;anal 01 !7 ;;&0B1 ntrada B $ara el ;anal 01 7 82D1 Pone a ni6el bajo la ntrada del ;anal 01 37 V;;1 Pone a ni6el alto la ntrada del ;anal 01 Las entradas ;;&0 - ;;&oB del MSP430F!3 se ubican en los $ines P!1! +;;&0. - en P1 +;;&0B.7
S;S +bit !!. 7 S#lo $ara el Modo ;a$tura1 Sir6e $ara sincroni%ar la ca$tura de la seKal con el timer clock1 De $re=erencia siem$re abilitarlo1 S;;& +bit !0. 7 Bit de s#lo lectura "ue sir6e $ara monitorear el estado actual de la entrada de la seKal ;;& +seKal "ue $ro$orciona el blo"ue de los bits ;;&S5. $ero sincroni%ada1 ;P +bit . 7 Bit "ue $ ermite de=inir el modo de trabajo de los ;anales de ;a$tura';om$araci#n1 07 Modo de ;om$araci#n1 !7 Modo de ;a$tura1 (9TM(D5 +bits NG. 7 S#lo $ara el Modo ;om$araci#n1 5$licaremos estos bits en el tercer $ost del TimerE1
;;& +bit 4. 7 Bit $ara abilitar la interru$cion del ;anal de ;a$tura';om$araci#n1 ;;& +bit 3. 7 Bit de s#lo lectura "ue sir6e $ara monitorear el estado actual de la entrada de la seKal ;;& +seKal "ue $ro$orciona el blo"ue de los bits ;;&S5.1 (9T +bit . 7 S#lo $ara el Modo ;om$araci#n1 5$licaremos estos bits en el tercer $ost del TimerE1 ;(V +bit !. 7 S#lo $ara el Modo ;a$tura1 &ndica de "ue se a $roducido una se*unda ca$tura del timer T0/ sin "ue se alla leAdo la $rimera ca$tura almacenada an en T0;;/01 Se debe borrar mediante c#di*o1 ;;&F8 +bit 0. 7 Bandera de la interru$ci#n ;;& del ;anal 01
%nterrupcin del Modo Captura del Timer01A3 La interru$cion del ;anal 0 es m
n el c#di*o nos ser6imos del nombre del 6ector de=inido $or >T&M/0E0EV;T(/? $ara construir la =unci#n de *estionar< su interru$ci#n de ca$tura1
Bueno, -a e5$uesta la teorAa tenemos "ue ecar mano a la $r
Programa de Aplicacin n este $rimer ejem$lo tenemos un $ro*rama "ue $ermite determinar el anco de un $ulso en la entrada ;;&0 del ;anal 0 del Timer0E37 1 2 3 4 5 6 7 8 9 10 11 12 13
#include #include #include #include
"io430.h" "in!rin*ic*.h" "b*pFb*p.h" "lcd>2121<.h"
un*i)ned un*i)ned un*i)ned un*i)ned
in! *aple' in! *aple6 char *aple*!a!e - 0 char *apleoN - 0
un*i)ned char da!o*H4 in! ain $oid % & un*i)ned char !i!uloH1< - " icroebebido* "
14
// '!op (a!chdo) !ier !o pre$en! !ie ou! re*e! +DT,TL - +DTP+ +DTOLD
15 16 17
6,',TL1 - ,L6,1189// U*e 18h: cal da!a for D,O D,O,TL - ,LD,O189// U*e 18h: cal da!a for D,O
18 19 20
P1DIbi!.P1DI4 - 1//*alida
21 22 23
24 25 26
27
LcdIni!% Lcd'!rin)K!i!uloM1
28
enablein!errup!%
29 30
(hile1%&
31 32
(hile*apleoN--0%%
33 34
if*apleoN%& un*i)ned in! au2 au2 - *aple6 *aple' ,on$er!e2To'!rin)au2M da!o*% Lcd'!rin)Kda!o*M4M1M>% *apleoN - 0 5
35 36 37 38
39 40 41
5 5
42
#pra)a $ec!or - TI8E00CE,TO
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
in!errup! $oid In!errupcioni)hPrioTier03$oid% & if*aple*!a!e -- 0%& *aple' - T,,0 *aple*!a!e 5 el*e if*aple*!a!e -- 1%& *aple6 - T,,0 *aple*!a!e *apleoN - 1 5 T,,TL0bi!.,,IB - 0 5 #pra)a $ec!or - TI8E01CE,TO in!errup! $oid In!errupcionLo(PrioTier03$oid% & un*i)ned char au2 au2 - TIC ifau2 -- 020>%& T,,TL1bi!.,,IB - 0 5 el*e ifau2 -- 020%& P1OUTbi!.P1OUT4 - P1OUTbi!.P1OUT4 T,TLbi!.TIB - 0 5 5
70 71 72 73 74
n este se*undo ejem$lo emos im$lementado la lectura de una trama de $ulsos "ue $ertenecen a la codi=icaci#n ;(D3W "ue utli%an las tarjetas de c#di*o de barras, donde el anco de los $ulsos determinan el di*ito codi=icado7 1 2 3 4 5 6 7
#include #include #include #include
"io430.h" "in!rin*ic*.h" "b*pFb*p.h" "lcd>2121<.h"
un*i)ned char *aple*!a!e - 0 un*i)ned char *apleoN - 0 un*i)ned char da!o
8 9 10
un*i)ned in! barra' un*i)ned in! barra6
11 12 13 14 15 16 17 18
un*i)ned in! e*pacio6 un*i)ned in! e*pacio' un*i)ned in! di)i!ocode3Q un*i)ned in! len)h!code3QHQ in! ain $oid % & un*i)ned char !i!uloH1< - " icroebebido* "
19
// '!op (a!chdo) !ier !o pre$en! !ie ou! re*e! +DT,TL - +DTP+ +DTOLD
20 21 22
6,',TL1 - ,L6,1189// U*e 18h: cal da!a for D,O D,O,TL - ,LD,O189// U*e 18h: cal da!a for D,O
23 24
P1DIbi!.P1DI4 - 1//*alida
25 26 27 28
29 30 31
32
LcdIni!% Lcd'!rin)K!i!uloM1
33
enablein!errup!%
34 35
(hile1%&
36 37
(hile*apleoN--0%%
38 39
if*apleoN%&
40
un*i)ned in! au2 un*i)ned in! ancho un*i)ned in! peRue
41 42 43 44 45 46 47 48 49 50 51 52
//de!erinao* la* lon)i!ude* iflen)h!code3QH0len)h!code3QH1%& ancho - len)h!code3QH0 peRue - len)h!code3QH1 5 el*e & peRue - len)h!code3QH0 ancho - len)h!code3QH1 5 //hallao* el codi)o fordi)i!ocode3Q - 0Mau2 - 0 au2 S Q au2%&
53 54 55 56 57
iflen)h!code3QHau2 S peRue>%%& //colocao* un cero di)i!ocode3Q - di)i!ocode3Q 02E 5 el*e & //colocao* un uno
di)i!ocode3Q - di)i!ocode3Q 0201
58
5 di)i!ocode3Q - di)i!ocode3Q SS 1
59 60
5 di)i!ocode3Q - di)i!ocode3Q 1 //ipriir el da!o //,on$er!e2To'!rin)di)i!ocode3QM da!o*% ifdi)i!ocode3Q -- 0200Q4%& da!o - VV 5 el*e ifdi)i!ocode3Q -- 020034%& da!o - V0V 5 el*e ifdi)i!ocode3Q -- 0201>1%& da!o - V1V 5 el*e ifdi)i!ocode3Q -- 0200<1%& da!o - V>V 5 el*e & da!o - VEV 5 Lcd'!rin)Kda!oM1M1M>% *apleoN - 0 di*ablein!errup!%
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
5 5
76 77
5
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
#pra)a $ec!or - TI8E00CE,TO in!errup! $oid In!errupcioni)hPrioTier03$oid% & *(i!ch*aple*!a!e%& ca*e 0J barra' - T,,0 breaN ca*e 1J barra6 - T,,0 e*pacio6 - barra6 len)h!code3QH0-barra6barra' breaN ca*e >J e*pacio' - T,,0 barra' - e*pacio' len)h!code3QH1-e*pacio'e*pacio6 breaN ca*e 3J barra6 - T,,0 e*pacio6 - barra6 len)h!code3QH>-barra6barra' breaN ca*e 4J e*pacio' - T,,0 barra' - e*pacio' len)h!code3QH3-e*pacio'e*pacio6 breaN ca*e =J barra6 - T,,0 e*pacio6 - barra6 len)h!code3QH4-barra6barra' breaN
105
106 107 108 109
110 111 112 113
114 115 116 117
118 119 120 121 122 123 124 125 126 127 128 129 130 131
// // // // // // // //
ca*e
5
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
#pra)a $ec!or - TI8E01CE,TO in!errup! $oid In!errupcionLo(PrioTier03$oid% & un*i)ned char au2 au2 - TIC ifau2 -- 020>%& T,,TL1bi!.,,IB - 0 5 el*e ifau2 -- 020%& P1OUTbi!.P1OUT4 - P1OUTbi!.P1OUT4 T,TLbi!.TIB - 0 5 5
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
2ideos7
Lab 4 - Interrumpe con ensamblador y C
En esta práctica, vamos a cubrir dos temas principales: - Interrups y rutinas de servicio de interrupción - C programación del M!4"#
Tutorial y $ntecedentes
% - Las interrupciones en la $samblea
Las interrupciones serán discutidos en la con&erencia - pero en pocas palabras 'ue son un mecanismo para tomar el control del procesador en &unción de la petición de (ard)are* El procesador completa con gracia la instrucción actual y luego los +servicios+ de la interrupción, eecute el código denido en una rutina de servicio de interrupción* .ay muc(as &uentes de las interrupciones en el M!4"#, pero en este laboratorio vamos a centrar en la entrada de propósito general en !%*" 'ue está unido al pulsador*
/na interrupción en !%*" se puede activar mediante el control de varios puertos % registros encontrados:
!%IE es un registro 'ue permite a las interrupciones para el puerto % pins*
!%IE es el opositor 'ue determina 0si las interrupciones están (abilitadas para el pin correspondiente1 para 'ue el borde 0ascendente o descendente1 causa una interrupción*
!%I23 es el registro en el 'ue cada bit !I23 es la bandera de interrupción para su correspondiente pin de E 5 y se establece cuando el borde de la se6al de entrada seleccionada aparece en el pin* Todos !I23 interrumpen banderas solicitar una interrupción cuando su correspondiente bit !7Ie y el bit 3IE se establecen* Cada bandera !I23 se debe restablecer con el so&t)are* El so&t)are tambi8n puede congurar cada bandera !I23, proporcionando una manera de generar un programa iniciado interrupción*
9it #: in interrupción está pendiente 9it %: /na interrupción está pendiente
ólo las transiciones, los niveles estáticos, no causan interrupciones* i cual'uier bandera !I23 cuaa durante la rutina de servicio de interrupción !, o si se establece despu8s de la instrucción ;ETI de una rutina de servicio de interrupción ! se eecuta, la bandera conunto !I23 genera otra interrupción* Esto asegura 'ue se reconoce cada transición*
2inalmente, las banderas de interrupción debe ser limpiado y, nalmente, las alarmas deben estar (abilitadas en todo el mundo* Estas tres l
Cómo implementar rutinas de servicio de interrupción
!ara utili=ar interrumpe necesita congurar su interrupción espec<ca 0puerto %*" en este caso1, desactive las interrupciones pendientes y (abilitar las interrupciones globalmente* Este código (ace esto*
bis*b > ##?., y !%IE@ !%*" Interrupción (abilitada bis*b > ##?., y !%IE@ .i !%*" 5 borde in&erior bic*b > ##?., y !%I23@ I23 !%*" $utori=ado bis*) > 3IE, ;@ L!M4, (abilitar las interrupciones
$6adir este código de eemplo al nal de su programa de la asamblea para incluir una rutina de servicio de interrupción para el puerto %* /sted tendrá 'ue a6adir el código del programa espec<co por encima de la instrucción ;ETI* El bic*b es necesario borrar el indicador de interrupción* Esto se conoce como +reconocer+ la interrupción y evita una solicitud de interrupción siendo administrados más de una ve=*
@ ------------------------------------------------- -----------------------------!%AI;@ !%*# Toggle salida @ ------------------------------------------------- -----------------------------@ $B$I; CDI3 $F/G !$;$ E;HICI E ITE;;/!CID E ;/TI$ bic*b > ##?., y !%I23@ I23 !%*" $utori=ado retina@ ;egreso de I; @ @ ------------------------------------------------- ----------------------------@ interrupción Hectores @ ------------------------------------------------- -----------------------------