O documento fornece instruções para configurar as portas de entrada e saída digitais de microcontroladores da família MC68HC908QT/QY. Detalha os registradores relacionados às portas, suas especificações elétricas e como acessá-los através de código. Fornece também dois exemplos de firmware para controlar hardware externo usando estas portas: 1) controlar LEDs e um botão; 2) implementar um semáforo com temporização de sinais.
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
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 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)
3. 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;
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
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.
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--);
}