GPIO MC9S08SH8 d.codevilla – 2015-11 – v1.2 MC9S08SH8 GPIO ● ● Los microcontroladores agrupan sus pines de entrada – salida en Ports, cada uno agrupa hasta 8 pines (y hay ports de menos de 8 pines) El SH8 tiene 17 pines de entrada y salida, y uno de salida solamente, organizados en tres grupos (ports) de 8 pines como máximo. ● Cada port se identifica con una letra. ● En este microcontrolador tenemos: Port A (6 pines), Port B (8 pines) y Port C (4 pines). ● La distribución de estos ports se muestra a continuación: Solo salida A5 A0 A4 A1 A2 A3 B7 B0 B6 B1 B5 B2 B4 B3 C3 C0 C2 C1 d.codevilla – 2015-11 – v1.2 GPIO – Diagrama en boques de un pin MC9S08SH8 d.codevilla – 2015-11 – v1.2 GPIO – Registros de configuración y datos ● MC9S08SH8 Cada pin tiene asociado un bit de dirección de datos (PTxDDn) que lo configura como entrada o como salida. Ej. el bit 5 del port B ---> PTBDD5 ● Además, un bit de datos (PTxDn) permite fijar el estado lógico del pin (si se lo utiliza como salida), o leer su estado (si se lo utiliza como entrada). Ej. el bit 2 del port C ---> PTCD2 ● Otros bits asociados a los pines permiten configurar pull-up o pull-down interno, interrupciones, etc ● Estos bits se agrupan en registros de 8 bits (en la memoria del microcontrolador) ● Tenemos por cada Port un registro de dirección de datos, un registro de datos, etc. d.codevilla – 2015-11 – v1.2 GPIO – Registros de dirección y datos ● MC9S08SH8 Para configurar los pines como entrada o salida se escriben los registros de dirección de datos: PTADD PTBDD PTCDD ● Para leer el estado de los pines (si son entrada o salida) y fijar el estado (si son salidas) se utilizan los registros de datos: PTAD PTBD PTCD d.codevilla – 2015-11 – v1.2 MC9S08SH8 GPIO – Registros de dirección ● Para configurar un pin como: - Entrada se escribe 0 en el bit correspondiente - Salida se escribe 1 en el bit correspondiente Ej.: para configurar el Port B de la siguiente forma: - 16, 15, 14, 6 y 7 como salidas - 13, 8, 5 como entradas Hay que escribir en el PTBDD: 0 1 1 0 0 1 1 1 PTBDD d.codevilla – 2015-11 – v1.2 GPIO – Registros de datos ● MC9S08SH8 Para fijar el estado de un pin configurado como salida: - Un 0 en el bit correspondiente, fija estado Low - Un 1 en el bit correspondiente, fija estado High ● Estos bits quedan memorizados (“Latcheados”) ● Además de fijar el estado de un pin escribiendo el bit que le corresponde, se puede leer su estado. ● Si se escribe en el bit de datos correspondiente a un pin configurado como entrada, se ignora la operación en ese bit. d.codevilla – 2015-11 – v1.2 MC9S08SH8 GPIO – Registros de datos Ej.: para configurar el Port B de la siguiente forma: - Los pines 16, 14, 6 estado alto - Los pines 15, 14, 7 estado bajo En las entradas se escribe 1 o 0; como son entradas, no se toma en cuenta la escritura. H L H H L Hay que escribir en el PTBD: X 1 0 X X 1 0 1 PTBD d.codevilla – 2015-11 – v1.2 MC9S08SH8 GPIO – Registros de dirección y datos Ej.: configurar el Port C y fijar los niveles como se indica en la figura H H L 1 1 0 1 0 x 1 PTCDD 1 PTCD d.codevilla – 2015-11 – v1.2 MC9S08SH8 GPIO – Registros de dirección y datos ¿Cómo colocar ceros y unos en estos registros? ● Los registros de dirección de datos y de datos son parte de la memoria del microcontrolador. ● Se puede escribir y leer información en ellos conociendo su dirección de memoria. ● Para simplificar el proceso, el entorno de desarrollo nos brinda la posibilidad de referirnos a estos registros (y el resto de los registros del microcontrolador) por su nombre; de esta manera, para escribir 01010101 en el registro PTBDD utilizando lenguaje C hacemos: PTBDD = 0b01010101; ● El ejemplo del slide anterior, en C: PTCDD = 0b00001101; PTCD = 0b00001001; //O PTCD = 0b00001011 d.codevilla – 2015-11 – v1.2 GPIO – Registros de dirección y datos MC9S08SH8 ¿Cómo colocar ceros y unos en estos registros? ● Para hacer referencia a un bit en particular utilizamos la siguente notación: nombreDelRegistro_nombreDelBit Ej.: PTAD_PTAD0 hace referencia al bit 0 del PTAD d.codevilla – 2015-11 – v1.2 MC9S08SH8 GPIO – Registros de dirección y datos Ej.: Si la llave está cerrada, encender el led D1 y apagar D2; Vdd Si está abierta, apagar D1 y encender y apagar en forma alternada D2 #include <hidef.h> #include "derivative.h" D1 D2 void main(void) { /* -- estado inicial: D1 y D2 apagados -- */ PTCD = 0b00000000; /* -- configuro entradas y salidas: C2 y C1 salidas -- */ PTCDD = 0b00000110; } for(;;) { if (PTCD_PTCD3 == 0) { //llave cerrada C3 == 0 PTCD_PTCD2 = 0; //Led D2 apagado PTCD_PTCD1 = 1; //Led D1 encendido } else { PTCD_PTCD1 = 0; //Led D1 apagado PTCD = PTCD ^ 0b00000100; //hace xor para toggle de C2 } } d.codevilla – 2015-11 – v1.2 GPIO – Registros de dirección y datos MC9S08SH8 Para mejorar la legibilidad, claridad, y facilidad de mantenimiento del código anterior usamos #define para referirnos a las diferentes patas: #include <hidef.h> #include "derivative.h" #define ENTRADA 0 #define SALIDA 1 #define ENCENDIDO 1 #define APAGADO 0 void main(void) { /* -- estado inicial: D1 y D2 apagados -- */ LED1 = APAGADO; LED2 = APAGADO; /* -- configuro entradas y salidas: C2 y C1 salidas -- */ _LLAVE = ENTRADA; _LED1 = SALIDA; _LED2 = SALIDA; #define ABIERTA 0 #define CERRADA 0 #define #define #define #define #define #define LLAVE LLAVE LED2 _LED2 LED1 _LED1 PTCD_PTCD3 PTCDD_PTCDD3 PTCD_PTCD2 PTCDD_PTCDD2 PTCD_PTCD2 PTCDD_PTCDD1 } for(;;) { if (LLAVE == CERRADA) { //llave cerrada C3 == 0 LED2 = APAGADO; //Led D2 apagado LED1 = ENCENDIDO; //Led D1 encendido } else { LED1 = APAGADO; //Led D1 apagado LED2 = ~LED2; //invierte estado de LED2 } } d.codevilla – 2015-11 – v1.2