Busque no blog

sábado, 9 de março de 2013

Zilog - Usando os pinos de I/Os dos Microcontroladores Z8 encore XP

Zilog - (PS0199) - Aprenda a usar as IOs desse microcontrolador.





     Finalidade :
      Este trabalho visa a mostrar como inicializar e a usar os pinos de entrada e saída dos microcontroladores da Zilog séries Z8 encore XP e na utilização de periféricos do mesmo. Este trabalho possui muita informação importante a respeito de como ler e escrever nos registros e nas entradas e saídas do microcontrolador em diferentes modos de operação.

     Resumo de uso geral dos pinos de I/Os.
          Os microcontroladores da Zilog com core Z8 encore XP suportam sete portas de 8 bits (portas de A~G) e uma de 4 bits (porta H) para operações de entrada e saída. Cada port possui ou está associada a um registro específico de controle e dados. O registro de controle é usado para determinar a direção dos dados, se dreno aberto, saída de sinal ou entrada e funções especiais dos periféricos. Na figura abaixo é mostrado um diagrama simplificado dos pinos dos ports do microcontrolador.

          Quando qualquer pino do microcontrolador for configurado ou definido como entrada, o microcontrolador lê os dados desses pinos para dentro dos registros específicos, guarda-os e  os disponibiliza para futuros processamentos. Para facilitar, vamos chamar os pinos do microcontrolador de GPIO que ajuda a entender melhor o que são. Neste contexto, quando um pino de GPIO pode ser usado como fonte de interrupção externa se definido como operação de pino de entrada., assim como definido como pino de saída, dados de dentro do microcontrolador são enviados nestes pinos para circuitos ou dispositivos externos.Se definidos como pinos alternativos para periféricos internos sua finalidade vai depender de qual função o periférico tem para ser setado ou configurado.
          Nem todos os microcontroladores da linha Z8 encore possuem acesso aos 8 ports da linha, como estamos focando em microcontroladores de 80 pinos, isso não é problema, mas para micros de 20 pinos ou menos, sim. Para uma lista mais completa de pinos acessíveis de acordo com o modelo do microcontrolador acesse o datasheet "Z8 Encore! XP 64K Series Flash Microcontrollers Product Specification (PS0199) " em http://www.zilog.com/docs/z8encore/ps0199.pdf disponível do site da zilog em www.zilog.com.
          A maneira mais comum de configurar o uso dos pinos do microcontrolador para entrada, saída ou alternativo, que é o uso dos periféricos é usando as funções dos registros internos e sub registros associados alista a seguir mostra melhor como isso funciona.
  • Endereço do port (PxADDR)
  • Controle do port (PxCTL)
          O estado dos pinos após um reset ou início de alimentação do micro é o seguinte :
  • Os pinos do port estão em modo normal - periféricos desativados.
  • Todos os pinos estão configurados como entrada. 
  • O conteúdo do registro de dados de entrada (PxIN)  é desconhecido.
  • O conteúdo do registro de dados de saída (PxOUT) é 0X00. 
  • Os pinos dos ports estão com o driver em tri-state.  
          Os valores dos registros dos ports e sub registros no modo reset estão nas tabelas a seguir. 


       
          Todos os pinos GPIOs devem ser inicializados a um valor de estado referente ao que se deseja antes de serem usados. O trabalho aqui descrito se foca em uma parte desse processo de descrição dos registros da linha Z8 Encore! XP que serve para guiar os usuários a definirem bem os pinos do microcontrolador de forma organizada e desejada.

Z8 Encore! XP descrição breve dos registros.

          São quatro registros do microcontrolador Z8 Encore! XP que permitem o acesso aos pinos do mesmo no que se refere a controle do GPIO, dadoa de entrada e dados de saída. Os endereços dos ports de A-H e registro de controle juntos, são usados para se ter acesso aos sub registros para configuração e controle dos ports.
          Esses quatro registros do microcontrolador Z8 Encore! XP são brevemente explicados a seguir:

  • Registro de endereço de PORT (PxADDR) seleciona o sub registro adequado a funcionalidade do port e do GPIO. É usado em conjunto com o registro de controle de portas e ter acesso a todos os controles de pinos do GPIO.
  • Registro de controle de port (PxCTL)  define o controle do port GPIO permitindo acesso aos sub registros.
  • Registro de entrada de dados (PxIN) retorna um valor no pino do port associado para ser processado.
  • Registro de dados de saída (PxOUT) escreve os dados de dentro do microcontrolador nos pinos correspondentes a fim de controlar cargas ou circuitos.
          NOTA: Os quatro registros mencionados acima estão definido no arquivo de cabeçalho ez8.h.    
                              Para usar as definições de código inclua o arquivo no seu programa como "#include 
                               '<ez8 .h>', no seu código C para microcontroladores zilog. 

          Uma breve descrição do sub registro de port usado com o registro de endereço de port é dado a seguir.

  • Sub registro de direção de dados (DATA_DIR) contem defino o valor de acesso a dados como sendo 0x01 e é usado para definir pinos do port tanto como entrada como saída. Definindo valores de 1 para setar o pino como entrada e 0 como saída.
  • Sub registro de função alternativa (ALT_FUN) é usado para ativar as funções internas dos periféricos do microcontrolador e é definido como valor de dado de 0x02. Definindo valores de 1 para acionar as funções alternativas dos periféricos.
  • Sub registro de controle de saída (OUT_CTL) define o pino de saída como push-pull se valor for 0 e dreno aberto, se valor for 1. Este sub registro contem valores de dado de 0x03 e afeta on pinos diretamente.
  • Sub registro de habilitar alta corrente de saída (HDR_EN) é usado para habilitar e desabilitar operações em pinos em operação de alto consumo de corrente (como em LEDs). Este sub registro contem valor de dado de 0x04 e afeta diretamente os pinos do microcontrolador. 
  • Sub registro de habilitar fonte de recuperação em modo STOP (SMRS_EN) configura o pino como fonte de modo recuperação de dados e é definido como valor de dado de 0x05.
          Os valores dos sub registros são definidos como se segue em todos os exemplos citados neste trabalho.:
          
           #define DATA_DIR            0x01           // direção dos dados nos pinos.
           #define ALT_FUN              0x02           // função alternativa.
           #define OUT_CTL              0x03           // Controle de saída de sinal/bit/bite.
           #define HDR_EN                0x04           // Habilita controle de corrente no pino.
           #define SMRS_EN             0x05            // Habilita/desabilita fonte de recuperação em modo STOP.

          NOTA:
          Para salvaguardar os valores nos sub registros de serem sobre escritos acidentalmente, defina valor de 0x00 no registro PxADDR antes de modificar os outros sub registros para uso particular conforme se deseja. 

          Para uma lista mais completa de sub registros acessíveis de acordo com o modelo do microcontrolador acesse o datasheet "Z8 Encore! XP 64K Series Flash Microcontrollers Product Specification (PS0199) " em http://www.zilog.com/docs/z8encore/ps0199.pdf disponível do site da zilog em www.zilog.com.

 Definindo os pinos GPIOs como entrada.

           Para configurar ou definir os pinos do port GPIO como entrada, use o registro de endereço do port apropriado juntamente com o registro de controle de port e o sub registro de direção de dados. Para evitar alguma interferência em outras funções do port, o sub registro de função alternativa é colocado um valor padrão de 0x00. Para acessar dados do pino do port, use o registro de dados de entrada do port em questão. 
          Por exemplo, assuma que você queira usar o pino 6 do port F (PF6) como pino de entrada, o pedaço de código a seguir ilustra bem como você pode fazer para usar o pino 6 do port F como entrada.

/**********************************************************************************************************/
//                               exemplo de inicialização de pino 6 do port F usado como entrada            //
/**********************************************************************************************************/
PFADDR = 0x02;                                                   // Selecionamos port F e sub registro função       
                                                                                 //  alternativa.
PFCTL &= 0x00;                                                    // O registro de controle do port F é colocado 
                                                                       //valor padrão pois este não possui função alternativa
PFADDR = 0x01;                                                // Registro de endereço do port F habilita sub  
                                                                               //registro de direção de dados.
PFCTL |= 0x40;                                                    // registro de controle do port F seleciona bit 6  
                                                                                //como entrada.
                                                                                //Não é necessário selecionar o sub registro de  
                                                                               //saída desde que a configuração desejada seja  
                                                                               //de entrada. 
/**********************************************************************************************************/
//                               lendo dados do pino 6 port F                                                                            //
/**********************************************************************************************************/

while(1)
             {
               Data = PFIN;                                       // guarda dados do port F para um registro  
                                                                       //temporário ( dados são colhidos do registro de  
                                                                         //dados de entrada).
               if (( Data & 0x40) == 0x00)            // testa se o bit 6 é zero.
                      {
                        user_routine();                          // coloque seu código aqui.
                       }
             }
     
          Todos os pinos do port GPIOs dos microcontroladores Z8 Encore! XP podem ser configurados para receberem interrupções externas com sinais de borda de subida ou borda de descida nas entradas de cada pino. As operações de requisição de inrterrupção só podem ser realizadas com os pinos configurados ou definidos como entrada e com inicialização apropriada para esta função. Para mais informações de como inicializar as interrupções externas, referencie o documento "Z8 Encore! XP 64K Series Flash Microcontrollers Product Specification (PS0199)" disponível em www.zilog.com .

Definindo os port GPIOs como saída.

       Para definir os pinos do port GPIO como saída, o registro do endereço do port e o registro do de controle serão usados com seus respectivos sub registros ( direção dos dados e controle de saída). Exteriorizar os dados de saída para os pinos dos ports, o registro de dados de saída dos ports é também usado. 
          Por exemplo, assuma que você queira usar os ports G e E como saída ( onde os dados são direcionados através dos pinos configurados como saída), dessa forma se escolheu, aleatoriamente, que o port G é ativo em nível alto ou +VCC e o port E, ativo em nível lógico baixo.
          O seguinte trecho de código ilustra melhor como podemos definir o port G e E como pinos de saída e direcionar os dados através desses pinos.

/********************************************************************************/
//           Inicialização dos ports G e E como saída                                                                                      //
/********************************************************************************/

PGADDR = 0x02 ;                                                    // Registro do endereço do port G seleciona sub  
                                                                                  // registro de função alternativa.
PGCTL &= 0x00 ;                                                     // Controle de port G define valor padrão por que    
                                                                                  // port G não tem função alternativa..
PGADDR = 0x01 ;                                                    // Registro de endereço do port G acessa sub registro 
                                                                                  // de direção de dados.
PGCTL &= 0x00 ;                                                     // Registro do port G define todos os pinos desse 
                                                                                   //port como sendo saída.
PGADDR = 0x03 ;                                                     // Registro de endereço do port G seleciona o 
                                                                                   //controle de saída.
PGCTL &= 0x00 ;                                                      // Registro de controle do port G é definido como 
                                                                             //push-pull, ou seja, com os resistores ligados ao +VCC.
PEADDR =0X02 ;                                                        // Registro de endereço do port E seleciona o sub  
                                                                                     //registro de função alternativa.
PECTL &= 0X00 ;                                                       // Registro de controle do port E desabilita as 
                                                                                     //funções alternativas de periféricos.
PEADDR = 0X01 ;                                                       // Registro de endereço do port E seleciona o sub  
                                                                                      //registro de direção de dados.
PECTL &= 0X00 ;                                                         // Registro de controle do port E define todos os  
                                                                                      //pinos como saída.
PEADDR = 0X03 ;                                                       // Registro de endereço do port E acessa sub  
                                                                                     //registro de controle de saída.
PECTL &= 0X00 ;                                                       // Registro de controle do port E define o controle 
                                                                                     //de saída em push-pull. 
/********************************************************************************/
//                    código que permite o pino ou pinos em nível alto                                                                 //
/********************************************************************************/

void Drive_High_to_Port_G(void)
                    {
                       PGOUT = 0X07 ;                             // Define os bits de 0~6 em nível alto.
                       PEOUT  &= 0X00;                           //  Define todos os bits do port E em nível baixo.
                    }

/********************************************************************************/
//                  código que permite colocar os bits de um port ou pinos em nível baixo                                   //
/********************************************************************************/

void Drive_Low_to_Port_G(void)
                     {
                      PGOUT = 0x00 ;                                // define todos os bits em lógica nível baixo.
                      PEOUT = 0x00 ;                                 // define todos os bits em nível lógico baixo.
                     }

          Concluindo, estes são os passos para se conseguir, por exemplo, acender um led com os microcontroladores da Zilog, uma nova abordagem e tradução parcial do documento da empresa que aqui foi idealizado. 
            No próximo post falaremos de como acessar alguns periféricos do microcontrolador e em um terceiro post  do assunto, tentaremos fazer alguns circuitos e usos do mesmo no mundo real.