Guia 3 – Entrada/Saída Digital

1 – Objetivos

      Ao final desta prática o aluno deverá ser capaz de configurar as portas dos
microcontroladores da família MC68HC908QT/QY para entrada ou saída digital e
elaborar firmwares baseados na utilização destas portas.


2 – Informações Relevantes para a Prática

     As figuras 1 e 2 exibem as pinagens dos microcontroladores HC908QT4 e
HC908QY4 que serão considerados nesta prática.




     Figura 1: Pinagem do HC908QT4                  Figura 2: Pinagem do HC908QY4

      Um resumo das especificações elétricas dos microcontroladores é mostrado
na tabela 1.

              Máximos Permitidos
              Tensão de Alimentação     VDD        -0.3   a V
                                                   +6
              Corrente nos pinos        I          +-25      mA
              (PAT0-PTA5)
              Corrente nos demais pinos I          +-15      mA

              Características elétricas (VDD=5V)
              ILoad=-10mA                 VOH      VDD-1.5   V (mínimo)
              ILoad =+10mA                VOL      1.5       V (máximo)
                                          VIH      0.7*VDD   V (mínimo)
                                          VIL      0.3*VDD   V (máximo)
              Resistor pull-up            RPU      25        kΩ

            Tabela 1: Resumo das especificações elétricas dos microcontroladores
A figura 3 exibe os registradores relacionados às portas de entrada e saída
e a figura 4 exibe o circuito lógico da porta A.




             Figura 3: Registradores relacionados às portas de Entrada/Saída (E/S)




                           Figura 4: Circuito lógico da porta A (PTA)
A configuração das portas de E/S dos microcontroladores e a manipulação
de dados nestas é realizada através dos registradores mostrados na figura 3. O
acesso a estes registradores pode ser feito de várias formas diferentes. A
seqüência de código mostrada a seguir foi retirada do arquivo de definição
‘MC68HC908QT4.h’ e nos permite entender quais as formas de se acessar estes
registradores.

typedef unsigned char byte;

/*** PTA - Port A Data Register ***/
typedef union {
  byte Byte;
  struct {
    byte PTA0    :1;    /* Port A Data Bit 0,   Keyboard   interrupt   pin   0   */
    byte PTA1    :1;    /* Port A Data Bit 1,   Keyboard   interrupt   pin   1   */
    byte PTA2    :1;    /* Port A Data Bit 2,   Keyboard   interrupt   pin   2   */
    byte PTA3    :1;    /* Port A Data Bit 3,   Keyboard   interrupt   pin   3   */
    byte PTA4    :1;    /* Port A Data Bit 4,   Keyboard   interrupt   pin   4   */
    byte PTA5    :1;    /* Port A Data Bit 5,   Keyboard   interrupt   pin   5   */
    byte AWUL    :1;    /* Auto Wake-up Latch   Data Bit   */
    byte         :1;
  } Bits;
  struct {
    byte PTA_0   :6;
    byte AWUL    :1;
    byte         :1;
  } MergedBits;
} PTASTR;
extern volatile PTASTR _PTA @0x00000000;
#define PTA _PTA.Byte
#define PTA_PTA0 _PTA.Bits.PTA0
#define PTA_PTA1 _PTA.Bits.PTA1
#define PTA_PTA2 _PTA.Bits.PTA2
#define PTA_PTA3 _PTA.Bits.PTA3
#define PTA_PTA4 _PTA.Bits.PTA4
#define PTA_PTA5 _PTA.Bits.PTA5
#define PTA_AWUL _PTA.Bits.AWUL
#define PTA_PTA _PTA.MergedBits.PTA_0

/*** DDRA - Data   Direction Register A ***/
typedef union {
  byte Byte;
  struct {
    byte DDRA0     :1;   /* Data Direction Register A Bit 0 */
    byte DDRA1     :1;   /* Data Direction Register A Bit 1 */
    byte           :1;
    byte DDRA3     :1;   /* Data Direction Register A Bit 3 */
    byte DDRA4     :1;   /* Data Direction Register A Bit 4 */
    byte DDRA5     :1;   /* Data Direction Register A Bit 5 */
    byte           :1;
    byte           :1;
  } Bits;
  struct {
    byte DDRA_0    :2;
    byte           :1;
byte DDRA_3 :3;
    byte         :1;
    byte         :1;
  } MergedBits;
} DDRASTR;
extern volatile DDRASTR _DDRA @0x00000004;
#define DDRA _DDRA.Byte
#define DDRA_DDRA0 _DDRA.Bits.DDRA0
#define DDRA_DDRA1 _DDRA.Bits.DDRA1
#define DDRA_DDRA3 _DDRA.Bits.DDRA3
#define DDRA_DDRA4 _DDRA.Bits.DDRA4
#define DDRA_DDRA5 _DDRA.Bits.DDRA5
#define DDRA_DDRA _DDRA.MergedBits.DDRA_0
#define DDRA_DDRA_3 _DDRA.MergedBits.DDRA_3

/*** PTAPUE - Input Pull-Up Enable Register PTAPUE ***/
typedef union {
  byte Byte;
  struct {
    byte PTAPUE0 :1;           /* Pull-Up Enable bit 0, Port       A   */
    byte PTAPUE1 :1;           /* Pull-Up Enable bit 1, Port       A   */
    byte PTAPUE2 :1;           /* Pull-Up Enable bit 2, Port       A   */
    byte PTAPUE3 :1;           /* Pull-Up Enable bit 3, Port       A   */
    byte PTAPUE4 :1;           /* Pull-Up Enable bit 4, Port       A   */
    byte PTAPUE5 :1;           /* Pull-Up Enable bit 5, Port       A   */
    byte         :1;
    byte OSC2EN :1;            /* Enable PTA4 on OSC2 Pin */
  } Bits;
  struct {
    byte PTAPUE_0:6;
    byte         :1;
    byte OSC2EN :1;
  } MergedBits;
} PTAPUESTR;
extern volatile PTAPUESTR _PTAPUE @0x0000000B;
#define PTAPUE _PTAPUE.Byte
#define PTAPUE_PTAPUE0 _PTAPUE.Bits.PTAPUE0
#define PTAPUE_PTAPUE1 _PTAPUE.Bits.PTAPUE1
#define PTAPUE_PTAPUE2 _PTAPUE.Bits.PTAPUE2
#define PTAPUE_PTAPUE3 _PTAPUE.Bits.PTAPUE3
#define PTAPUE_PTAPUE4 _PTAPUE.Bits.PTAPUE4
#define PTAPUE_PTAPUE5 _PTAPUE.Bits.PTAPUE5
#define PTAPUE_OSC2EN _PTAPUE.Bits.OSC2EN
#define PTAPUE_PTAPUE _PTAPUE.MergedBits.PTAPUE_0



       As definições para os registradores relacionados à porta B são similares às
definições para os registradores da porta A.

       Nota: Os pinos não utilizados das portas de E/S deverão ser
conectados a níveis lógicos apropriados, Vdd (+5v) e Vss (GND), a fim de se
reduzir consumo excessivo de corrente e possibilidades de falhas por
efeitos eletrostáticos.
3 – Prática
PARTE I

       Considere um firmware para controlar um hardware composto de um
microcontrolador MC68HC908QT4, 2 leds e uma chave tipo push-button. A figura
4 exibe o diagrama eletrônico do hardware.




                         Figura 4: Diagrama eletrônico do hardware



      O hardware tem o seguinte funcionamento: O led ‘Led1’ conectado ao pino
PTA0 permanece aceso enquanto o push-button ‘PB’ permanecer em seu estado
normal, ou seja, normalmente aberto. Estando ’PB’ pressionado o led ‘Led2’ estará
aceso e o led ‘Led1’ estará apagado. A listagem do firmware é a seguinte:

#include <MC68HC908QT4.h>

void main(void)
{
   CONFIG1_COPD=1;                  //   desabilita módulo COP
   DDRA=0x03;                       //   define os pinos PTA0 e PTA1 como saídas
                                    //   e PTA2, PTA3, PTA4 e PTA5 como entradas
    PTAPUE_PTAPUE2=1;               //   habilita pullup para o pino PTA2
    for(;;) {

        if(PTA_PTA2) {
           PTA=0x00;
        }
        else {
           PTA=0x03;
        }
    }
}

    •   Analise e implemente o firmware e o hardware apresentado. Considere outras
        possíveis formas de se acessar os pinos da porta e a utilização da diretiva #define
        para definir nomes mais legíveis para estes pinos.
PARTE II

      Elabore um firmware para controlar um semáforo. O diagrama eletrônico do
hardware do semáforo é exibido na figura 5. Considere o que o botão ‘Pedestre’
poderá ser acionado a qualquer momento durante o período em que o sinal estiver
aberto (temporização verde) e nestas circunstâncias o ciclo de temporização
amarelo - vermelho deverá ser imediatamente ativado.




               Figura 5: Diagrama eletrônico do hardware do semáforo



      Considere a seguinte função para geração de atraso para temporização:

      void temporiza(unsigned int temp)
      {
         while(temp--);
      }

Pisca 2 leds

  • 1.
    Guia 3 –Entrada/Saída Digital 1 – Objetivos Ao final desta prática o aluno deverá ser capaz de configurar as portas dos microcontroladores da família MC68HC908QT/QY para entrada ou saída digital e elaborar firmwares baseados na utilização destas portas. 2 – Informações Relevantes para a Prática As figuras 1 e 2 exibem as pinagens dos microcontroladores HC908QT4 e HC908QY4 que serão considerados nesta prática. Figura 1: Pinagem do HC908QT4 Figura 2: Pinagem do HC908QY4 Um resumo das especificações elétricas dos microcontroladores é mostrado na tabela 1. Máximos Permitidos Tensão de Alimentação VDD -0.3 a V +6 Corrente nos pinos I +-25 mA (PAT0-PTA5) Corrente nos demais pinos I +-15 mA Características elétricas (VDD=5V) ILoad=-10mA VOH VDD-1.5 V (mínimo) ILoad =+10mA VOL 1.5 V (máximo) VIH 0.7*VDD V (mínimo) VIL 0.3*VDD V (máximo) Resistor pull-up RPU 25 kΩ Tabela 1: Resumo das especificações elétricas dos microcontroladores
  • 2.
    A figura 3exibe os registradores relacionados às portas de entrada e saída e a figura 4 exibe o circuito lógico da porta A. Figura 3: Registradores relacionados às portas de Entrada/Saída (E/S) Figura 4: Circuito lógico da porta A (PTA)
  • 3.
    A configuração dasportas de E/S dos microcontroladores e a manipulação de dados nestas é realizada através dos registradores mostrados na figura 3. O acesso a estes registradores pode ser feito de várias formas diferentes. A seqüência de código mostrada a seguir foi retirada do arquivo de definição ‘MC68HC908QT4.h’ e nos permite entender quais as formas de se acessar estes registradores. typedef unsigned char byte; /*** PTA - Port A Data Register ***/ typedef union { byte Byte; struct { byte PTA0 :1; /* Port A Data Bit 0, Keyboard interrupt pin 0 */ byte PTA1 :1; /* Port A Data Bit 1, Keyboard interrupt pin 1 */ byte PTA2 :1; /* Port A Data Bit 2, Keyboard interrupt pin 2 */ byte PTA3 :1; /* Port A Data Bit 3, Keyboard interrupt pin 3 */ byte PTA4 :1; /* Port A Data Bit 4, Keyboard interrupt pin 4 */ byte PTA5 :1; /* Port A Data Bit 5, Keyboard interrupt pin 5 */ byte AWUL :1; /* Auto Wake-up Latch Data Bit */ byte :1; } Bits; struct { byte PTA_0 :6; byte AWUL :1; byte :1; } MergedBits; } PTASTR; extern volatile PTASTR _PTA @0x00000000; #define PTA _PTA.Byte #define PTA_PTA0 _PTA.Bits.PTA0 #define PTA_PTA1 _PTA.Bits.PTA1 #define PTA_PTA2 _PTA.Bits.PTA2 #define PTA_PTA3 _PTA.Bits.PTA3 #define PTA_PTA4 _PTA.Bits.PTA4 #define PTA_PTA5 _PTA.Bits.PTA5 #define PTA_AWUL _PTA.Bits.AWUL #define PTA_PTA _PTA.MergedBits.PTA_0 /*** DDRA - Data Direction Register A ***/ typedef union { byte Byte; struct { byte DDRA0 :1; /* Data Direction Register A Bit 0 */ byte DDRA1 :1; /* Data Direction Register A Bit 1 */ byte :1; byte DDRA3 :1; /* Data Direction Register A Bit 3 */ byte DDRA4 :1; /* Data Direction Register A Bit 4 */ byte DDRA5 :1; /* Data Direction Register A Bit 5 */ byte :1; byte :1; } Bits; struct { byte DDRA_0 :2; byte :1;
  • 4.
    byte DDRA_3 :3; byte :1; byte :1; } MergedBits; } DDRASTR; extern volatile DDRASTR _DDRA @0x00000004; #define DDRA _DDRA.Byte #define DDRA_DDRA0 _DDRA.Bits.DDRA0 #define DDRA_DDRA1 _DDRA.Bits.DDRA1 #define DDRA_DDRA3 _DDRA.Bits.DDRA3 #define DDRA_DDRA4 _DDRA.Bits.DDRA4 #define DDRA_DDRA5 _DDRA.Bits.DDRA5 #define DDRA_DDRA _DDRA.MergedBits.DDRA_0 #define DDRA_DDRA_3 _DDRA.MergedBits.DDRA_3 /*** PTAPUE - Input Pull-Up Enable Register PTAPUE ***/ typedef union { byte Byte; struct { byte PTAPUE0 :1; /* Pull-Up Enable bit 0, Port A */ byte PTAPUE1 :1; /* Pull-Up Enable bit 1, Port A */ byte PTAPUE2 :1; /* Pull-Up Enable bit 2, Port A */ byte PTAPUE3 :1; /* Pull-Up Enable bit 3, Port A */ byte PTAPUE4 :1; /* Pull-Up Enable bit 4, Port A */ byte PTAPUE5 :1; /* Pull-Up Enable bit 5, Port A */ byte :1; byte OSC2EN :1; /* Enable PTA4 on OSC2 Pin */ } Bits; struct { byte PTAPUE_0:6; byte :1; byte OSC2EN :1; } MergedBits; } PTAPUESTR; extern volatile PTAPUESTR _PTAPUE @0x0000000B; #define PTAPUE _PTAPUE.Byte #define PTAPUE_PTAPUE0 _PTAPUE.Bits.PTAPUE0 #define PTAPUE_PTAPUE1 _PTAPUE.Bits.PTAPUE1 #define PTAPUE_PTAPUE2 _PTAPUE.Bits.PTAPUE2 #define PTAPUE_PTAPUE3 _PTAPUE.Bits.PTAPUE3 #define PTAPUE_PTAPUE4 _PTAPUE.Bits.PTAPUE4 #define PTAPUE_PTAPUE5 _PTAPUE.Bits.PTAPUE5 #define PTAPUE_OSC2EN _PTAPUE.Bits.OSC2EN #define PTAPUE_PTAPUE _PTAPUE.MergedBits.PTAPUE_0 As definições para os registradores relacionados à porta B são similares às definições para os registradores da porta A. Nota: Os pinos não utilizados das portas de E/S deverão ser conectados a níveis lógicos apropriados, Vdd (+5v) e Vss (GND), a fim de se reduzir consumo excessivo de corrente e possibilidades de falhas por efeitos eletrostáticos.
  • 5.
    3 – Prática PARTEI Considere um firmware para controlar um hardware composto de um microcontrolador MC68HC908QT4, 2 leds e uma chave tipo push-button. A figura 4 exibe o diagrama eletrônico do hardware. Figura 4: Diagrama eletrônico do hardware O hardware tem o seguinte funcionamento: O led ‘Led1’ conectado ao pino PTA0 permanece aceso enquanto o push-button ‘PB’ permanecer em seu estado normal, ou seja, normalmente aberto. Estando ’PB’ pressionado o led ‘Led2’ estará aceso e o led ‘Led1’ estará apagado. A listagem do firmware é a seguinte: #include <MC68HC908QT4.h> void main(void) { CONFIG1_COPD=1; // desabilita módulo COP DDRA=0x03; // define os pinos PTA0 e PTA1 como saídas // e PTA2, PTA3, PTA4 e PTA5 como entradas PTAPUE_PTAPUE2=1; // habilita pullup para o pino PTA2 for(;;) { if(PTA_PTA2) { PTA=0x00; } else { PTA=0x03; } } } • Analise e implemente o firmware e o hardware apresentado. Considere outras possíveis formas de se acessar os pinos da porta e a utilização da diretiva #define para definir nomes mais legíveis para estes pinos.
  • 6.
    PARTE II Elabore um firmware para controlar um semáforo. O diagrama eletrônico do hardware do semáforo é exibido na figura 5. Considere o que o botão ‘Pedestre’ poderá ser acionado a qualquer momento durante o período em que o sinal estiver aberto (temporização verde) e nestas circunstâncias o ciclo de temporização amarelo - vermelho deverá ser imediatamente ativado. Figura 5: Diagrama eletrônico do hardware do semáforo Considere a seguinte função para geração de atraso para temporização: void temporiza(unsigned int temp) { while(temp--); }