Curso Técnico de Nível Médio Integrado Eletrônica - 8o Período Disciplina de Microcontroladores 2 (EL08D) 1º Sem 2016 Professor Gabriel Kovalhuk Email: kovalhuk@utfpr.edu.br Página pessoal: http://paginapessoal.utfpr.edu.br/kovalhuk
General Purpose Input Output GPIO
General Purpose Input Output GPIO São os pinos de entrada e saída do microcontrolador; São responsáveis pela comunicação do microcontrolador com o mundo externo; No MSP430, cada pino, possui mais de uma função, isto é, o pino fornece acesso a diversos periféricos do microcontrolador. O acesso a estas funções se dá através da multiplexação dos pino;
General Purpose Input Output GPIO No diagrama simbólico do microcontrolador estas funções aparecem separadas por uma barra '/';
General Purpose Input Output GPIO A família MSP430 possui até 8 portas de entrada e saída O MSP430G2553 possui apenas 2 portas de entrada e saída; Cada porta possui até 8 pinos de entrada/saída; Cada pino pode ser individualmente configurado como entrada ou saída; É possível configurar resistores de pull-up ou pull-down, individualmente em cada pino; As portas P1 e P2 tem a capacidade de gerar interrupção;
General Purpose Input Output GPIO A cada porta está associado um conjunto de registradores de controle; O padrão de nomenclatura deste registradores é: PxYYY, onde x indica a porta e YYY indicam a função do registrador; Exemplo: P1OUT Registrador de saída PORT 1
General Purpose Input Output GPIO A nomenclatura dos pinos de GPIO do MSP430 segue o seguinte padrão: PX.Y: onde X indica qual é a porta e Y qual é o pino desta porta; Exemplo: P1.3 indica o pino 3 da porta 1; Obs. na linguagem C o acesso a cada pino é feito através de máscaras de bits nos registradores: P1OUT = 0x01; // coloca o pino P1.0 '1' P1OUT &= 0xFE; // coloca o pino P1.0 '0' Observe que 0xFE é igual a 0x01.
General Purpose Input Output GPIO Como funcionam as máscaras de bits nos registradores: Para setar um bit fazemos uma operação lógica OR do registrador com um valor que possua bits iguais a 1 nas posições que se deseja setar no registrador e zeros nas demais posições; Exemplo: para setar os bit 2, 5 e 6 do registrador P1OUT, fazemos um OR com o valor 01100100b, ou seja, 0x64 P1OUT = P1OUT 0x64; ou P1OUT = 0x64;
General Purpose Input Output GPIO Assim, supondo que P1OUT esteja com os bits 0, 4, e 6 setados e os demais em zero: Fazendo um OR com 0x64, temos: 7 6 5 4 3 2 1 0 P1OUT 0 1 0 1 0 0 0 1 7 6 5 4 3 2 1 0 P1OUT 0 1 0 1 0 0 0 1 0x64 0 1 1 0 0 1 0 0 Novo P1OUT 0 1 1 1 0 1 0 1 no fim, os bits 2 e 5 foram setados e os demais permaneceram inalterados, inclusive o bit 6 que já estava setado.
General Purpose Input Output GPIO Para zerar um bit fazemos uma operação lógica AND do registrador com um valor que possua bits iguais a 0 nas posições que se deseja zerar no registrador e uns nas demais posições; Exemplo: para zerar os bit 2, 5 e 6 do registrador P1OUT fazemos um AND de P1OUT = P1OUT & 0x9B; P1OUT &= 0x9B;
General Purpose Input Output GPIO Os arquivos.h dos diversos MSP430 possuem constantes definidas para cada bit individualmente: #define BIT0 (0x0001u) #define BIT8 (0x0100u) #define BIT1 (0x0002u) #define BIT9 (0x0200u) #define BIT2 (0x0004u) #define BITA (0x0400u) #define BIT3 (0x0008u) #define BITB (0x0800u) #define BIT4 (0x0010u) #define BITC (0x1000u) #define BIT5 (0x0020u) #define BITD (0x2000u) #define BIT6 (0x0040u) #define BITE (0x4000u) #define BIT7 (0x0080u) #define BITF (0x8000u) Assim, para ficar mais bem documentado, podemos usar BIT6 + BIT5 + BIT2 no lugar de 0x64 Como 0x9B é 0x64 negado, para zerar os bits com AND usamos ~(BIT6 + BIT5 + BIT2) no lugar de 0x9B
Registradores dos Ports 1 e 2
Registradores dos Ports 1 e 2 PxDIR (registrador de direção): Define se é pino de entrada ou se é pino de saída; Bit = 0 o pino é uma entrada; Bit = 1 o pino é uma saída; Exemplo: Definindo os pinos P2.0 e P2.1 como saída: P2DIR = BIT0 + BIT1; //Define P2.0 e P2.1 como saída Definindo o pino P1.7 como entrada: P1DIR &= ~BIT7; // define o pino P1.7 como entrada Obs: no reset todos os pinos são definidos como entrada;
Registradores dos Ports 1 e 2 PxOUT (registrador de saída): contém o valor do pino correspondente, quando o pino está configurado como saída; Exemplo: colocando o pino P1.0 em '0': P1OUT &= ~BIT0; // coloca o pino P1.0 em '0' colocando o pino P1.6 em '1': P1OUT = BIT6; // coloca o pino P1.6 em '1'
Registradores dos Ports 1 e 2 Exercício: faça um programa em C para que o LED vermelho, ligado ao pino P1.0 pisque numa frequência aproximada de 1HZ.
#include msp430g2553.h GPIO Exemplo int main() { WDTCTL = WDTHOLD + WDTPW; P1DIR = BIT0; // desativa watch dog // define P1.0 como saida While(1) { P1OUT ^= BIT0; //inverte o estado de P1.0 For( long int t=0; t<50000; t++); // delay } }
Funções Intrínseca No IAR existem algumas funções chamadas intrínsecas. Estas funções executam o processamento de baixo nível (assembly) no MSP430; Estas funções já estão pré definidas no IAR; Para usá-las é necessário acrescentar #include intrinsics.h no início do código; Algumas funções intrinsecas: delay_cycles(int n); // gasta n ciclos de máquina enable_interrupt(); // habilita as interrupcoes disable_interrupt(); // desabilita as interrupcoes
Registradores dos Ports 1 e 2 Exercício: faça um programa em C para que o LED vermelho, ligado ao pino P1.0, e o LED verde, ligado ao pino P1.6, pisquem alternadamente numa frequência aproximada de 1HZ. Use delay_cycles(563000); para gerar o delay.
Registradores dos Ports 1 e 2 PxIN (registrador de entrada): reflete o valor do pino correspondente, quando o pino está configurado como entrada; Exemplo: testando se o valor do pino P1.3 é zero: if((p1in & BIT3) == 0) { }
Registradores dos Ports 1 e 2 PxREN: Habilita o resistor de pull-up/pull-down do pino; Bit = 0 sem resistor de pull-up/pull-down; Bit = 1 com resistor de pull-up/pull-down; Esta função somente deve ser usada com o pino selecionando como entrada; Nesta situação, o registrador de saída (PxOUT) é usado para definir se o resistor é de pull-up ou se é de pull-down: Bit = 0 resistor de pull-down; Bit = 1 resistor de pull-up;
PxREN PxOUT Dvss (GND) DVcc 0 1 R pull-up/pull-down PxIN Pino
Registradores dos Ports 1 e 2 Exercício: faça um programa em C para que o LED vermelho, ligado ao pino P1.0, e o LED verde, ligado ao pino P1.6, mudem de estado, alternadamente, cada vez que o botão de uso geral (ligado ao pino P1.3) for pressionado.
Registradores dos Ports 1 e 2 PxSEL e PxSEL2: Definem a função do pino, isto é, a qual periférico interno o pino está atrealado; Fonte: SLAU144J. Sempre se deve consultar os registradores dos periféricos para verificar se é necessário definir a direção do pino; Quando PxSEL ou PxSEL2 estão setados, a função de interrupção do pino é desabilitada;
Registradores dos Ports 1 e 2 Alguns periféricos (como o ADC) possuem registradores específicos para configurar os pinos Exemplo de possibilidade de configuração para o pino P1.0:
Interrupções dos Ports 1 e 2 Cada pino dos ports 1 e 2 podem, individualmente, gerar interrupções de I/O; Cada pino dos ports 1 e 2 podem ser configurados individualmente para gerar interrupções por borda de descida ou por borda de subida; Existe uma posição no vetor de interrupção para as interrupções geradas pelos pinos do port 1 e outra posição para as interrupções geradas pelos pinos do port 2;
Registradores de Interrupções dos Ports 1 e 2 PxIE: Habilita a interrupção do pino correspondente: BIT = 0 interrupção desabilitada; BIT = 1 interrupção habilitada; PxIES: Define se a interrupção será gerada por borda de subida ou por borda de descida: BIT = 0 borda de descida; BIT = 1 borda de subida; PxIFG: Indica que existe uma interrupção pendente: BIT = 0 não existe interrupção pendente; BIT = 1 existe interrupção pendente;
Funções de Interrupção As rotinas de interrupção são executadas a partir de uma chamada de hardware; No IAR, para definir que uma função é para atender uma interrupção, usa-se a diretiva: #pragma vector=tipo_de_interrupcao Onde tipo_de_interrupcao indica o endereço da interrupção no vetor de interrupção; O valor tipo_de_interrupcao pode ser encontrado no msp430g2553.h;
Funções de Interrupção #define TRAPINT_VECTOR (0 * 2u) /* 0xFFE0 TRAPINT */ #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */ #define PORT2_VECTOR (3 * 2u) /* 0xFFE6 Port 2 */ #define ADC10_VECTOR (5 * 2u) /* 0xFFEA ADC10 */ #define USCIAB0TX_VECTOR (6 * 2u) /* 0xFFEC USCI Transmit */ #define USCIAB0RX_VECTOR (7 * 2u) /* 0xFFEE USCI Receive */ #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0A CC1, TA0 */ #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */ #define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */ #define TIMER1_A1_VECTOR (12 * 2u) /* 0xFFF8 Timer1_A CC1 4, TA1 */ #define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA Timer1_A CC0 */ #define NMI_VECTOR (14 * 2u) /* 0xFFFC Non maskable */ #define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */
Funções de Interrupção A função deve começar com interrupt; A função não pode retornar nenhum valor e não pode receber nenhum parâmetro Exemplo: interrupt void funcao(void) { //escreva aqui sua função }
Funções de Interrupção Exemplo: função de interrupção para o pino P1.3 #pragma vector=port1_vector interrupt void port1_int() { } P1OUT ^= BIT0; // inverte o estado de P1.0 P1IFG &= ~BIT3;// reseta o flag de interrupcao
Funções de Interrupção Configuração da interrupção do pino P1.3 int main() { } // realiza as demais configuracoes P1IE = BIT3; // habilita a interrupcao pelo pino // P1.3 P1IFG &= ~BIT3;// reseta o flag de interrupcao enable_interrupt(); // habilita as interrupcoes // continua o programa
Registradores dos Ports 1 e 2 Exercício: faça um programa em C para que o LED vermelho, ligado ao pino P1.0, e o LED verde, ligado ao pino P1.6, mudem de estado, alternadamente, cada vez que o botão de uso geral (ligado ao pino P1.3) for pressionado, usando interrupção.
Recomendações da Texas Os pinos não utilizados devem ser configurados como saída e deixados em aberto. Assim contribuem para a redução de consumo do MSP430.
Referência Bibliográfica MSP430x2xx Family User's Guide, SLAU144J, Texas Instruments, 2013; MSP430G2x53 Datasheet (SLAS735J), Texas Instruments, 2011/2013.