Interrupções Externas Dois acontecimentos podem gerar o pedido de interrupção: Transição 1 0 Nível 0 A fonte destes acontecimentos é aplicada a um dos pinos INT0 e INT1. Logo que se faça a activação das interrupções por intermédio do registo IE, os pinos INT0 e INT1 deixam de ser E/S, respectivamente.
Interrupções Externas (cont.) Registo SFR envolvido: TCON - - - - IE1 IT1 IE0 IT0 ITx: x={0,1}: determinação se a interrupção é desencadeada em resposta à transição (Itx=1) ou em resposta ao nível (Itx=0). IEx: x={0,1}: bit que determina o pedido de interrupção, sendo levado a 1 quando tal acontece.
Interrupções Externas (cont.) Esquematicamente
Interrupções Sensíveis à transição (1 0) A transição é captada por um falso detector da seguinte maneira: O pino correspondente é amostrado em cada ciclo de instrução. Caso se verifiquem os níveis 1 e 0 em ciclos contíguos, por esta ordem, então IEx passa a valer 1, ficando este valor armazenado. Tem-se então um pedido de interrupção (é necessário que estas condições permaneçam durante pelo menos 12 ciclos de relógio). Se, antes do atendimento, o sinal voltar a 1 e depois a 0, não se tem novo pedido de interrupção. O bit IEx é levado a 0 pelo hardware em resposta ao RETI da rotina de atendimento.
Interrupções Externas (cont.) O pedido de interrupção acontece logo que se observe o nível 0 no pino INTx. O estado do bit IEx segue o estado do pino INTx. Ou seja, pode ter-se INTx=0 e não se ter atendimento. Basta que INTx deixe de ser 0 na altura em que a CPU verifica o estado de IEx. Por outro lado, se após o atendimento se continuar a ter INTx=0, então ter-se-á novo atendimento. Para evitar esta catadupa de atendimentos deve ser o hardware externo a repor INTx a 1. Isto implica que a rotina de atendimento deve comunicar ao hardware externo que o pedido de interrupção foi reconhecido. Este mecanismo é conhecido por handshaking.
Bits de fechadura (lock bits) (AT89C51) O AT89C51 dispõe de 3 fechaduras, configuráveis através de LB1, LB2 e LB3. As fechaduras são: LB1 LB2 LB3 Protecção 1 0 0 Não é possível executar instruções MOVC residentes na memória externa que se refiram a endereços de memória interna. A memória de programa não é programável, só apagável. O micro só executa instruções se o nível no pino EA não mudar, i.e., for o observado durante o reset. 1 1 0 O mesmo que o anterior. Adicionalmente, não se pode verificar a programação da memória. 1 1 1 O mesmo que o anterior. Adicionalmente, não é possível executar instruções na memória externa. 0 0 0 A execução do programa não tem restrições
Contador watchdog (AT89S8252) O watchdog é um registo cuja contagem procede ao ritmo de um oscilador independente do oscilador que alimenta a CPU. Quanto o contador chega ao fim da contagem a CPU é reiniciada (reset). Deste modo evita-se que o PC (program counter) possa conter endereços aos quais não corresponde programa. Para evitar o reset há que reiniciar a contagem com a frequência necessária. Isto passa por escrever um bit numa dada posição de memória (espaço SFR).
Contador watchdog (cont.) O tempo que passa desde que a contagem é iniciada até que o reset aconteça é ajustável, por patamares. Este ajuste é feito escolhendo o valor da pré-escala. A tabela seguinte apresenta os valores da temporização para o caso do AT89S8252. Note-se que os valores não são precisos (i.e., os reais são diferentes dos nominais), devido à imprecisão da fonte de sincronismo do contador. O controlo da contagem e o seu reinício é feito por intermédio de bits de registos do espaço SFR.
Contador/temporizador 2 (AT89S8252) Este contador funciona num modo diferente dos vistos para os C/T0 e C/T1, denominado captura. O diagrama seguinte ilustra o seu funcionamento. O bit EXEN2 tem de ser 1 para se ter este modo. Quando se tiver uma transição 1 0 no pino T2EX, os valores de contagem nos registos TH2 e TL2 são transferidos para os registos RCAP2H e RCAP2L, respectivamente, e o bit EXF2 transita para 1, que determina um pedido de interrupção. Deste modo mediu-se o tempo que passou até que no pino T2EX se tivesse uma transição.
Gerador de relógio programável Esta facilidade permite que no pino P1.0 (do AT89S8252) se gere uma onda quadrada com frequência de 61Hz a 4MHz (com a CPU alimentada a 16MHz), com 50% de duty cycle. A frequência da onda gerada é determinada a partir da seguinte fórmula, em que RCAP2H e RCAP2L representam o conteúdos dos registos do contador/temporizador 2.
SPI Resumo Comunicação full-duplex Interface 3 fios Comunicação síncrona Operação como mestre ou escravo Frequência máxima de 1.5MHz Transferência LSB primeiro ou MSB primeiro 4 taxas de comunicação possíveis Geração de interrupção após a transferência Protecção contra colisões Ligações
Transferências SPI (cont.)
Registo de configuração SPI (cont.)
SPI (cont.) Interrupções e colisões Registo de dados
Memória de dados interna - AT89S8252 Existem 256B de RAM e 2KB de EEPROM. Os 128B altos da RAM ocupam um espaço paralelo ao SFR. Instruções com endereçamento directo referem-se aos SFR. Ex: MOV 0A0H,#data refere-se a P2. Instruções com endereçamento indirecto refere-se aos 128B de RAM. A memória de stack pode ocupar este espaço. Ex: MOV @R0,#data refere-se à RAM. A memória EEPROM é seleccionada escrevendo 1 no bit EEMEM do registo WMCON (96H). De seguida, qualquer instrução MOVX acede a este espaço, em que os endereços vão de 0000H a 07FFH. Para aceder à memória de dados externa, faz-se EEMEM=0. Para se escrever na memória EEPROM, há que fazer EEMWE=1 (registo WMCON). Por segurança, deve ter-se EEMWE=0 sempre que não se pretenda escrever na EEPROM. Os ciclos de escrita demoram aproximadamente 2.5ms. O progresso da escrita pode ser feito controlando o estado do bit RDY/BSY (registo WMCON). Se RDY/BSY=0, então a escrita ainda não terminou.
Programação do microcontrolador - interfaces série Memórias de programa e dados (EEPROM) internas podem ser programadas através do porto SPI (enquanto RST=1). < fosc/40
Formas de onda: Programação (cont.)
Instruções para programação: Programação (cont.)
Programação (cont.) Receita da programação: 1. Alimentar o microcontrolador; 2. RST=1; 3. esperar não menos que 10ms; 4. PC envia comando programming enable (ver tabela anterior); 5. PC envia comando write code memory por cada byte, até que todas as instruções tenham sido programadas, e esperando não mais que 2.5ms/B (não há necessidade de apagar antes de escrever o próprio microcontrolador desempenha essa acção automaticamente); 6. de seguida, podem enviar-se comandos de leitura ( read code memory ) para confirmar o sucesso da programação. 7. RST=0 para executar o programa; 8. cortar alimentação, caso se pretenda remover o microcontrolador. É possível apagar todo a memória de programa, bem como programar os lock bits. A receita para programação prévia da memória de dados é totalmente idêntica.