Práctica 1: Introducción al entorno MPLAB X y simulación ...€¦ · 1) Cargar en un registro...
Transcript of Práctica 1: Introducción al entorno MPLAB X y simulación ...€¦ · 1) Cargar en un registro...
DepartamentodeIngenieríaElectrónicaETSIdeTelecomunicaciónUniversidadPolitécnicadeMadrid
Práctica 1: Introducción al entorno
MPLAB X y simulación de programas en
ensamblador y C
Autores:
Pedro José Malagón Marzo
ProfesoresdelDpto.deIngenieríaElectrónica
Fechaúltimarevisión:Abril2017
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
2
Contenido 1. Introducción.......................................................................................................................4
2. Proyectodeejemplo:ports_control.X...............................................................................4
3. Primerproyecto:p1.X........................................................................................................5
3.1. Ejercicio.Modificaports_control.S.................................................................................6
4. Entradasenelsimulador:Estímulos..................................................................................9
4.1. Ejercicio.FunciónmPORTA2PORTB..............................................................................10
5. BigEndianyLittleEndian.................................................................................................10
5.1. Ejercicio.Endianness....................................................................................................10
6. FuncionesenC.................................................................................................................11
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
3
Tabla de figuras
Figura1. SeleccióndepinesparaelLogicAnalyzer...................................................................7Figura2. I/OPinsconregistrosdelpuertoA.............................................................................7Figura3. Breakpointinicial........................................................................................................8Figura4. Barradeherramientasdeldepurador........................................................................8Figura5. Personalizacióndelabarradeherramientas..............................................................9Figura6. Seleccióndeestímulos................................................................................................9Figura7. TipodeproyectoparaPIC32.....................................................................................12Figura8. Seleccióndedispositivo............................................................................................12Figura9. Escogerelsimuladorcomohardware.......................................................................13Figura10. EscogerelcompiladorXC32....................................................................................13Figura11. NombredeproyectoyestablecercomoMainProject...........................................14
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
4
1. Introducción
Lasesiónpráctica1consisteenutilizarrealizarprogramasenensambladordeMIPSyenCparaunPICdelafamiliaPIC32MX.Losobjetivosmásimportantesdeestaprácticason:
• FamiliarizaciónconelentornodedesarrolloMPLABIDEdeMicrochip:
o Simulador
o Depuracióndeprogramas
• Consolidacióndeconceptosbásicosvistosenclase:
o Manipulacióndebits
o Controldeperiféricos:GPIO
Al igual que en la práctica 0 utilizaremos MPLAB X IDE para editar y simular el programa.UtilizaremoselcompiladorXC32paracompilar.
En primer lugar abriremos un proyecto existente en ensamblador, con un programa enensamblador, que iremos modificando y ampliando para conseguir lo que se pide.Aprenderemos a visualizar el estado de los pinesGPIO y provocar cambios en las entradas.Ademásveremosotrasutilidadesdedepuración:variables,registrosymemoria.
EnsegundolugarcrearemosunproyectoenCeimplementaremoslasmismasfuncionesquehayamostenidoquehacerenC,comprobandoqueobtenemosunresultadoequivalente.
El resultadoseráunficherocomprimido(.zip)conunconjuntodecapturasdepantalla,unfichero ensamblador y un fichero en C con todas las funciones que se hayan pedido. Porfavor,siguelanomenclaturaindicada.
2. Proyecto de ejemplo: ports_control.X
EnprimerlugartenemosqueabrirelprogramaMPLABIDE(buscarenelmenúinicio).
Vamos a trabajar con un proyecto de ejemplo proporcionado por Microchip. Se trata delproyecto ports_control.X, que realiza operaciones sobre el puerto A de GPIO. El códigooriginal,enotrasinstalaciones,sepuedeencontrareneldirectoriodeinstalacióndexc32:
PATH_DE_MICROCHIP\xc32\v1.40\examples\assembly_examples\ports_control
Ennuestrocasoyaestádisponibleenlacarpetadelentorno:
C:\Usuarios\usuario\MPLABXProjects
El proyecto tiene un único fichero fuente ports_control.S, en la carpeta Source Files. Esteficherotienedosfunciones:
• mPORTAClearBits que recibe un único argumento: la máscara con los pines delpuertoAquehayqueponera0.
• main,quepreparaelargumentopasadoamPORTAClearBits(máscaraparabit7).
La extensión típica para el fichero ensamblador es .s o .asm. En este caso se utiliza .S (enmayúscula) para poder utilizar el preprocesador de C (así lo interpreta el compilador xc32).Gracias a ello el fichero hace uso de etiquetas (típicas del preprocesador de C) como a0 o
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
5
IOPORT_BIT_7,queestándefinidasenel ficheroxc.h.Los ficherosdecabecera incluídoscon<>sonlosdelsistema.Unodelosdirectoriosdelsistemaes
C:\Archivosdeprograma\Microchip\xc32\v1.40\pic32mx\include
LosregistrosdecontroldeunpuertodeGPIOson:
• TRISx:cadabitcontrolaladireccióndelpin(0essalida,1esentrada)
• PORTx:cadabitreflejaelvalordelpin(0esnivelbajo,1esnivelalto)
• LATx:cadabitreflejaelvalordelregistrodesalidadelpin.Estevalorcoincideconelpinsiestáconfiguradocomosalida,ypuedenocoincidirsiesentrada.
Para modificar un solo bit de un registro, manteniendo el resto con su valor original,normalmenteesnecesarioleerelvaloractualdelregistro,realizarunaoperaciónbinaria(ORoAND) con la máscara adecuada, y guardar el resultado en el registro. Se necesitan 3operaciones(Read/Modify/WriteoRMW)parahacerlo.Siobservamoselcódigo,sehacesoloenunaoperación.Noseaccedeal registroLATAenestecaso,sinoal registroLATACLR.Casitodos los registros de control de periféricos tienen asociados 3 registros que facilitan lamodificacióndebitsenunaúnica instrucción.Lafunciónqueserealizadependedelsfijodelregistro:CLR (paraponerbitsa0),SET (paraponerbitsa1)e INV (paracambiarbits). Los4registros (LATA, LATACLR, LATASET y LATAINV) son consecutivos y cada uno ocupa 32-bits,aunqueluegosoloalgunosdeellostienensentido,porquenohayatantasGPIO(sepuedeverenlasección11.2CLR,SETandINVRegistersdeldatasheet).
Losnombresde los registrosestándisponibleseneldatasheetdel componente.Paraqueelcompilador lospuedautilizar,estándefinidos losnombres,asociadosa lasdireccionesrealesdelregistro,enelficheroensamblador
C:\Archivosdeprograma\Microchip\xc32\v1.40\pic32-libs\proc\32MX250F128B\p32mx250f128b.S
ElficheroparaC(p32mx250f128b.h),quevimosenclase,conlasestructurasdeaccesoacadabitdelosregistros,tienelapalabraexternporquelavariableyaestádeclaradaenesteficheroconlapalabraclave.globalNOMBRE_DEL_REGISTRO(.globalLATACLRenestecaso).
El siguiente paso es generar el códigomáquina: compilar. Se compila el proyectomarcadocomoMainProject(ennegrita).Sinoeselabierto,póngalocomoMainProjecthaciendoclickenelbotónderechodelratónsobreelnombredelproyecto,yseleccionandolaopciónSetas
MainProject.LacompilaciónserealizaatravésdelmenúRun->BuildMainProject( )o
atravésdelmenúRun->CleanandBuildMainProject( ).Enelsegundocaso,selimpiantodoslosficherosintermediosgeneradosencompilacionesanterioresysecompiladesdecerotodoelproyecto.Elproyectodebecompilarcorrectamente.
3. Primer proyecto: p1.X
Enel anexo1detallamos lospasosa seguirpara crearunproyectoparanuestrodispositivoutilizandoelcompiladorgratuitoXC32,que incluyetodas lasherramientasparaconvertir losficherosenensambladoroCa códigomáquinadelMIPSdisponibleenelPIC32.Elproyectoincluye un conjunto de etiquetas de preprocesador para indicar el dispositivo y el lenguajeutilizado.Segúnlasetiquetasdefinidasseaccedeaunapartedelficheroxc.h,talycomosehavistoenclase.
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
6
A continuación vamos a realizar nuestroprimerprograma, inspiradoenel ejemplo. Creeunnuevo proyecto y llámelo p1. Los ficheros fuente, tanto en ensamblador como en C, semuestranenlacarpetaSourceFiles.Noesposiblecrearenelentornounfichero.Smayúsculadeformacorrecta,por loquehayqueañadirunoyaexistente,creadofueradelentorno(enestecasoeldelejemploports_control).Hacemosclick conelbotónderechoen la carpetayseleccionamosAddExistingItem...
Navegaporelexploradordearchivoshastaseleccionarelficherodelejemplo,queestáen:
C:\Usuarios\usuario\MPLABXProjects\ports_control\source\ports_control.S
Marca las opcionesRelative (para que siga funcionando si copias el proyecto a otro sitio) ycopy(paraquehagaunacopiaymantengamoselejemplocomoreferencia).
Elsiguientepasoesgenerarelcódigomáquina:compilar.Lacompilaciónserealizaatravésdel
menúRun -> BuildMain Project ( ) o a través delmenúRun -> Clean and BuildMain
Project( ).
3.1. Ejercicio. Modifica ports_control.S
Elobjetivoestenerunanuevafunción,mPORTAToggleBits,conunargumento,queinviertalospines(Toggle)delpuertoAquesecorrespondanalosbitsdelargumentoqueesténa1.Enunarutinamain1seconfiguraránlospinesdelpuertoy,enunbucleinfinito,sellamaráalafunciónmPORTAToggleBitsconunargumentoparainvertirlos3bitsmenossignificativos.
Lasfasesson:
1. Modificarelnombredelaetiquetamainparaqueseamain02. Duplicarlarutinamain0yllamarlamain1.3. Añadirunanuevarutinamain,con3líneasdecódigo,antesdemain0.Tienequesaltar
amain1. main: j main1 nop4. Crear, además de la función mPORTAClearBits, la función mPORTAToggleBits. Esta
función,envezdeponera0,inviertelosbitsqueestána1enelargumento.¿Sepuedesimplificarlafunciónutilizandootroregistro?Siesasí,hazlo.
5. Modificarlarutinamain1paraqueconfigurelasGPIOcorrectamente(salidasdigitales)yllame,enunbucleinfinito,alafunciónmPORTAToggleBitsparamodificarlosbits0,1y2delpuerto(RA0,RA1yRA2).Elprogramanodeberíallegarnuncaalbucleinfinitoexistenteendless.
Paramodificar un registro como puede ser TRISA, es importante realizarlo en 3 fases, tal ycomosehaceenelejemploconLATACLR:
1)Cargarenunregistro(s0)ladirecciónconlapseudoinstrucciónla
2)Cargarenotroregistro(s1)laconstantequesequieraalmacenar(oleerlavariable)
3)Almacenarelregistros1enladirecciónalmacenadaens0
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
7
Una vez el proyecto compile correctamente vamosa simularlo. El simulador tieneasociadasunasventanasquedebemosactivaratravésdelmenúWindow->Simulator.Activaremoslas3,yapareceranpestañasen laventanadeabajoparapodervisualizarlas:LogicAnalyzer, I/OPinsyStimulus.
EnprimerlugarseleccionaremosLogicAnalyzer,quenospermiteverelvalordelospinesqueseleccionemos,comosihubiésemospuestounosciloscopioamedirlaGPIO.Paraseleccionar
lospinesavisualizarpulsamoselicono .
Seleccionamos los pines que queremos modificar en el programa: RA0, RA1, RA2 y RA3,quedandoelresultadomostradoenlasiguientefigura
Figura1. SeleccióndepinesparaelLogicAnalyzer
AhoraseleccionamoslapestañaI/OPins.Estapestañamuestraelestadodelospines:modo,valor y módulo asociado. Recordamos que el número de pines es limitado y hay muchosperiféricosdisponibles.Tantoparaseñalesdeentradacomodesalidaaunmódulosepuedeelegirentrevariospinescomoalternativa(sección11.3PeripheralPinSelecteneldatasheet).Para lasentradas, losperiféricos tienenun registrode control (nombrede la señalmásRalfinal, como INT4R o U2RXR) en el que se elige qué pin de qué puerto se conecta. Para lassalidas,cadapintieneunregistrodecontrol(RPA0RoRPB3R)enelqueseeligequéseñaldesalidaseconectaaestepin(quémódulolocontrola).
El periférico del conversor analógico-digital (ADC) no es configurable, y se controla con elregistroANSELx (ANSELA,ANSELB, ...): cadabit controla si el pin está siendoutilizado comoentradaanalógicadelADC(1)ocomodigital(0).
En la ventana I/O Pins añade 4 filas, una para cada pin de interés, quedando el resultadomostradoenlasiguientefigura
Figura2. I/OPinsconregistrosdelpuertoA
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
8
Porúltimo,antesdesimular,vamosaponerunpuntodeparada(breakpoint)alcomienzodelprograma. Los puntos de parada detienen el programa y nos permiten acceder al valor dememoria, registros y variables que tiene en ese momento el programa. De esta manerapodemoscomprobarsielcomportamientoeseladecuado.Lospuntosdeparadaseponenysequitanconunsimpleclickderatónenelnúmerodelíneaenelquesequiereponer.Enestecaso,hayqueponerunpuntodeparadaenlaprimerainstruccióndespuésdelmain(jmain1).Elsímbolodestopenvezdelnúmerodelíneaindicaquehayunpuntodeparada.
Figura3. Breakpointinicial
Yaestamospreparadosparasimularelprograma.SehaceutilizandoelmenúDebug->Debug
MainProjectoconelicono .
Enelmomentodelanzarelsimuladorseactivantodoslosiconosdecontroldelaejecucióndelsimuladorodepuradorenlabarradeherramientas,talycomomuestralasiguientefigura:
Figura4. Barradeherramientasdeldepurador
Elanexo2explicalafuncióndecadabotóndelsimulador.
Para poder visualizar correctamente los iconos de depuración puede que tengamos quepersonalizar la barra de herramientas del entorno, a través del menú View -> Toolbars.Tenemosquetenerseleccionadaslasopcionessegúnlasiguienteimagen
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
9
Figura5. Personalizacióndelabarradeherramientas
Hayquedepurarelprogramahastaquefuncione.Recomendamosquesehagaconejecuciónpaso a paso, comprobandoel valor de los pines en LogicAnalyzer y en I/OPins. Si no es elcorrecto, tenencuenta loquehemoscomentadoanteriormentesobre ladirección (TRISx)ysobrelosADC(ANSELx).
Unavez terminado, realizaunacaptura (botónPrintpantalla)de laventanaLogicAnalyzeryotradeI/OPins.Guárdalasenlosficheroslogic_1.jpgyio_1.jpgrespectivamente,utilizandoelprogramaPaintdeWindows.
4. Entradas en el simulador: Estímulos
En el apartado anterior hemos visto las herramientas disponibles para ver el valor de lassalidas.Enelsimuladorpodemosasignarvaloresdeentradade lospines,simulandoelvalorque pondrían elementos externos. La ventana Stimulus nos permite controlarlos de formacómoda.
Hay5pestañasdiferentesparasimularentradas.Enesteprimerejemplovamosaverelmássimple:Asynchronous.Estaventanapermitecambiarelvalordeunpinmedianteunbotón(lacolumna Fire). Es necesario seleccionar el pin y la acción que se desea realizar. La figuramuestralasposiblesaccionesquesepuedenrealizar.
Figura6. Seleccióndeestímulos
SetHigh: Poneelpina1
SetLow: Poneelpina0
Toggle: Cambiaelvalordelpin
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
10
PulseHigh: Pone el pin a 1 tantos tiempo como se indique en Value. Las unidades detiempopuedenser tiempo (ns,us,ms)o ciclosde reloj (independientede lafrecuenciadereloj).
PulseLow: Pone el pin a 0 tantos tiempo como se indique en Value. Las unidades detiempopuedenser tiempo (ns,us,ms)o ciclosde reloj (independientede lafrecuenciadereloj).
SetVoltage: PoneelvalordetensiónquesedeseeenV(parasimularentradasanalógicas).
AñadelospinesRA0aRA3alaventanadeestímulos.AñadealLogicAnalizeryalI/OPinslospinesRB0aRB3.
4.1. Ejercicio. Función mPORTA2PORTB.
Debesreutilizarelprogramaprevio.CreaunanuevafunciónmPORTA2PORTBqueleaelvalorquehayenelpuertoAypongaesevalorenelpuertoB.Utilizalaventanadeestímulosparavariar su valor y comprobar su correcto funcionamiento. Llama a esta función de formaindefinida desde una nueva rutinamain2 (inspirada enmain1), a la que se tiene que saltardesdelarutinamain.
Una vez hayas terminado realiza una captura (botón Print pantalla) de la ventana LogicAnalyzer y otra de I/O Pins. Guárdalas en los ficheros logic_2.jpg y io_2.jpg, utilizando elprogramaPaintdeWindows.
5. Big Endian y Little Endian
Paradistinguirsiunsistemaesbig-endianolittle-endiantenemosquevercuáleselordenenelquesealmacenanlosbytesenmemoria:elmássignificativoenladirecciónmásbaja(big-endian)oelmenossignificativoenladirecciónmásbaja(little-endian).Sitenemosencuentaque podemos hacer operaciones sobre 32-bits, sobre 16-bits y sobre 8-bits, podemoscomprobarfácilmenteelendiannessdelsistema.
Enclasehemoshecholaoperaciónalmacenandounvalorde32-bitsenmemoriaycargandoenunregistroelbyte1deesazonadememoria.UtilizandolosestímulosqueacabamosdeveryelpuertoA¿puedescomprobarlo?TenencuentaquelosregistrosdelpuertoAtienen32-bits,aunquesólohaya5disponiblesennuestromicrocontrolador.Enunaoperacióndelecturalospinesnodisponiblesdansiempre0.
5.1. Ejercicio. Endianness
Crea una nueva función endianness que te ayude en la tarea. Añade una rutina main3(inspirada enmain2) que llame a la función de forma indefinida, ymodificamain para quesalteamain3.Lafunción,parecidaalaanterior,debeutilizarcargade8-bitsenvezde32-bits(lb en vez de lw). Al leer un solo byte, si es el menos significativo tendrá el valor de losestímulos,mientrasqueelmássignificativo tendrá todo0.¿El sistemaesLittleEndianoBigEndian?Adjuntaunacapturadelsimuladorquejustifiquelarespuesta.Elnombredelacapturatiene que ser big.jpg si consideras que es big endian y little.jpg si consideras que es littleendian.
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
11
6. Funciones en C
Desde un fichero ensamblador se puede llamar a funciones de un fichero en C y viceversa.Cadaficherosecompilaporseparadoy,alenlazar(linker),segeneraunficheroejecutablequecontienetodaslasfunciones.Sidesdeunficherosellamaaunafuncióndelaquenosetieneimplementación,ellinkersequejaconelmensajeundefinedreferenceto.
6.1. Ejercicio. Implementación en C
Elobjetivodeesteejercicioesimplementarfuncionesequivalentesalasquehemoshechoenensamblador en un fichero C, que llamamos ports_control.c. Para crear el ficheroseleccionamoslacarpetaSourceFilesyseleccionamoselmenúFile->NewFile.EscogemoseltipoC->CSourceFile.
Enesteficherotenemosquehacerlaimplementacióndelassiguientesfunciones:
voidmPORTAClearBitsenC(intarg);
voidmPORTAToggleBitsenC(intarg);
voidmPORTA2PORTBenC(void);
voidendiannessenC(void);
Lasfuncionesyasuponenquelospinessehanconfiguradocorrectamente.
EnelcasodeendiannessenC,lamejormaneradecargarunbytedeunadireccióndememoriadataesalmacenarladirecciónenunavariabledetipochar*.Leerelcontenidodeestavariablees equivalente a cargar un byte de memoria en registro. Para forzar la asignación de ladirección del registro PORTA, que es de tipo int, hay que hacer un casting, para que elprogramadorindiquequesabequeestácambiandoeltipo(sinosaleunaviso).LainstrucciónparaalmacenarladireccióndePORTAquedaríacomosigue:
char*ptr=(char*)(&PORTA);
Para poder llamar a las funciones y comprobar el funcionamiento debemos sustituir en elfichero ports_control.S todas las llamadas a las funciones originales. Añadiremos al final elsufijo enC para que llame a las funciones implementadas en C. Al depurar paso a paso elsimuladorcambiadeficherocuandollega.Compruebaquetodastenganelmismoresultado.Es posible ver el código ensamblador generado por el compilador en el menúWindow ->Debugging -> Disassembly. Se ve que cada instrucción en C se corresponde con varias enensamblador.
Todaslasimágenesyficherosgenerados,conlanomenclaturaindicada,setienenqueañadiraunficheroP1_NOMBRE_APELLIDO_puesto_XX.zip.NOMBREtienequesersustituidoporelnombredelalumno,APELLIDOporelapellidoyXXtienequesersustituidoporelnúmerodepuesto. Ambos miembros de la pareja tienen que generar el fichero (se puede copiar ycambiarelnombre).
El fichero .zip se puede crear seleccionando los ficheros, pulsando el botón derecho,seleccionandoEnviara->ficherocomprimido.
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
12
ANEXO1:CreacióndeunproyectoBlink.X
SecreaunproyectonuevoatravésdelmenúFile->Newproject,outilizandoelicono
1.Chooseproject:MicrochipEmbedded->StandaloneProject
Figura7. TipodeproyectoparaPIC32
2.SelectDevice:Family32-bitMCUs(PIC32),Device:PIC32MX250F128B
Figura8. Seleccióndedispositivo
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
13
3.Selecttool:Simulator
Figura9. Escogerelsimuladorcomohardware
6.Selectcompiler:XC32(v1.40)(C:\Archivosdeprograma\Microchip\xc32\...)
Figura10. EscogerelcompiladorXC32
7.SelectProjectNameandFolder:dejartodosloscampospordefectoyponerelnombrequecorresponda.Porejemploelprogramasepuedellamarblink(típicoprimerprograma).
Elcampo"Setasmainproject" indicaqueesteeselproyectoquesevaacompilarysimularcuandoseutilicenlasherramientasdelmenú.
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
14
Figura11. NombredeproyectoyestablecercomoMainProject
PulsamosFinish.Enestemomentoapareceenellateralizquierdounascarpetasgeneradasporelproyecto.
SELC–IntroducciónalentornoMPLABXysimulacióndeprogramasenensamblador
15
ANEXO2:Botonesdelsimulador
Paraelprocesodedepuración.Detieneelprograma.
Pause.Sielprogramaseestáejecutandodeformalibre(nopasoapaso)sepuedeparar, además de con los puntos de parada, pulsando este botón. Esto activa el resto deopcionesdisponibles.
Reset.Comienzadenuevoelprogramayladepuración.
Continue.Ejecutahastaqueencuentreunpuntodeparada.
Stepover.Ejecutalasiguienteinstrucción.Siesunallamadaafunción,laejecutacomosifueraunaúnicainstrucción(enensamblador,jal)
Step into. Ejecuta la siguiente instrucción. Si es una llamada a función, sigue laejecuciónpasoapasodentrodelafunción.
Stepout.Ejecutahastaqueencuentreunretornodefunción(enensambladorjr$ra)
Runtocursor.Ejecutahastaquelleguealcursor.Esequivalenteaponerunpuntodeparadadondeestáelcursoryquitarlosegúnsepara.
SetPCtocursor.Empiezaaejecutardesdelainstrucciónenlaquesehapuestoelcursor.Esinteresanteparadepurarfuncionesconcretas.
Focus cursor at PC. Pone en la pantalla la instrucción que se va a ejecutar acontinuación.