Pessoal, depois de mais uma semana daquelas... segue mais um pouco de teoria e um tiquinho de prática com o R8C/25 ...
Desta vez vamos falar um pouco sobre IOs no R8C/25 e comparar com seus "equivalentes" em PIC.
Para alguns pode ser um assunto fácil e até trivial, mas é interessante explicar bem para o pessoal que está iniciando em microcontroladores... afinal isso aqui é um blog para divulgar informações e incentivar o desenvolvimento tecnológico...
O mais interessante é que tudo que for escrito neste post poderá ser aplicado para outros MCUs como o PIC, AVR, etc...
Vamos lá!
Basicamente todo MCU(Microcontrolador) tem um conjunto de Entradas(Inputs) e Saídas(Outputs) ou IOs como são comumente chamados. É através destes IOs que os MCUs se comunicam com componentes externos, como sensores, displays de LCD, teclados, teclas, Leds, e toda sorte de dispositivos que podemos conectar num MCU dentro de um projeto.
A princípio todo pino de um MCU é um pino de IO com algumas excessões como por exemplo os pinos de alimentação (Terra e 5V), pinos do clock (cristal) e alguns pinos que eventualmente em alguns modelos funcionam somente como Entrada ou como Saída. Além é claro de casos onde existem pinos NC ou Not Connected.
A quantidade de IOs que cada chip tem depende basicamente do seu invólucro. Veja alguns exemplos abaixo:
PIC 16F628A - invólucro de 18 pinos sendo 16 IOs dependendo da configuração de clock que se escolhe.
PIC 16F877A - invólucro de 40 pinos sendo 33 IOs
R8C/25 - invólucro de 52 pinos sendo 41 pinos de IO, mais 3 de input only...
Para maiores informações relativos à serie R8C Tiny da Renesas veja gráfico abaixo e visite a página http://america.renesas.com/fmwk.jsp?cnt=r8ctiny_series_landing.jsp&fp=/products/mpumcu/m16c_family/r8c_tiny_series/.
Somente à título comparativo, o link equivalente da Microchip é http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1002&mid=10〈=en&pageId=74 para os MCUs de 8Bits.
Muitos pinos em vários MCUs podem ter funções especializadas de IOs, como por exemplo ADCs, saídas PWM, UART(serial), I2C, etc...
Todo pino de IO deve ser inicializado antes de ser utilizado, e configurado de acordo com a utilização que se deseja dentro do seu design. Essa inicialização serve para sinalizar a direção do bit, se entrada; ou saída; se é analógico, etc... Processo também conhecido como Bit Direction (em inglês).
Em geral, todo MCU tem uma área específica de memória onde contém informações de configuração de todos os pinos, definidos na inicialização e ao decorrer da execução do programa em sua memória. Esta área chama-se SFR, ou Special Function Registers.
SFR é nada mais que uma coleção de bits divididos ao longo de um trecho da memória do microcontrolador onde setamos bits contendo informações sobre comportamente de cada periférico dentro do MCU. Por exemplo se um determinado pino é de entrada ou saída, e se esta entrada por exemplo é analógica ou digital... a ainda mais... se for escolhida como entrada analógica, qual a profundidade de bits da conversão do ADC ou em outras palavras se esta entrada analógica será de 8 ou 10 bits de resolução. Dentre outras utilizações que tratam direta ou indiretamente IOs.
Em linguagem C fica um pouco mais fácil de acessar os SFRs e configurá-los.
Mais especificamente falando em CCSC nós temos funções pré-concebidas para configurar os SFRs, no caso dos PICs. No caso dos R8C Tiny, temos sempre gerado na criação do projeto um arquivo de inicialização contendo vetores para cada registro do SFR ou para conjuntos de Bits específicos.
Usando incialmente como exemplo vamos pegar um PORT do PIC... por exemplo o Port B de um 16F877:
Cada port representa 1 Byte de Dados ou 8 Bits... cada Bit em um port pode ter sua configuração de direção ... em outras palavras ...
1 Byte = 8 Bits = 0b00000000
Podemos colocar somente 4 bits alternadamente como saída e 4 como entrada.
0b01010101
Bits setados como 1 são marcados para input enquanto que os bits marcados como 0 são de output.
em CCSC ficaria algo assim:
set_tris_b(0b01010101);
Por outro lado usando o HEW e o compilador C para o R8C/25 temos a seguinte situação para a mesma configuração só que no Port 2:
No arquivo hwsetup.c, na função ConfigurePortPins() nós acrescentamos a seguinte linha:
pd2 = 0b11110000;
Como dito anteriormente o vetor pd2 aponta para o SFR correspondente no chip e sua definição estará em sfr_r825.h . Se você não o fez, então faça uma leitura deste arquivo e compare o mesmo com o Datasheet do chip. Verás que tudo corresponde.
Do mais... para setar o port inteiro podemos usar:
Em CCSC
#byte port_b=6
no header do programa ...
e port_b = 0xFF;
para setar tudo com nível alto na saída.
Em Renesas:
p2=0xFF;
Agora vamos ler os bits individualmente...
Em geral no CCSC tem os todos os pinos do microcontrolador que usamos declarados no arquivo de header do mesmo, por exemplo o PIC 16F877 temos todos os pinos identificados... vale a pena dar uma olhadinha no arquivo header do microcontrolador que você está utilizando.
PIN_D0 = 1; //para setar o pino D0 do 16F877 como nível alto.
PIN_D0 = 0; //para setar o pino D0 do 16F877 como nível baixo.
ou
if(PIN_D0) { // para testar se o pino D0 está em nível alto.
if(!PIN_D0) { // para testar se o pino D0 está em nível baixo.
Obviamente ao utilizarmos estes procedimentos devemos setar anteriormente o pino como entrada ou como saída, de acordo com o datasheet do mesmo.
Lembren-se que alguns pinos geralmente os pinos do port a são iniciados como entradas ou saídas analógicas nos PICs, portanto no processo de inicialização é necessário setar corretamente a configuração para utilizá-los de forma correta e evitar leituras/escritas incorretas.
Nos Renesas podemos identificar os pinos individualmente através da colocação do underline e do número do pino do port que queremos acessar. Mais uma vez vale a dica de dar uma olhada no arquivo header do dispositivo que você estiver utilizando para conferir os pinos disponíveis e possíveis recursos que podem ser utilizados, assim como literalmente conhecer o datasheet de cabo a rabo, lendo inclusive as observações. A maioria dos problemas que eu geralmente tenho quando quero fazer algo acontecem justamente nestas observações.
Por exemplo:
p2_0 = 1; // seta o pino zero do port 2 como nível alto
p2_0 = 0; // seta o pino zero do port 2 como nível baixo
analogamente podemos usar o mesmo método para ler o pino:
if(p2_0) { // para testar se o pino zero do port 2 está em nível alto.
if(!p2_0) { // para testar se o pino zero do port 2 está em nível baixo.
Bom pessoal é isso, espero ter esclarecido este ponto.
domingo, 13 de julho de 2008
Assinar:
Postar comentários (Atom)
Recebí um kit de desenvolvimento da Renesas. Tenho alguma experiência em pic (prog. asm) e pretendo iniciar em 16 bit´s. Como adquiri um kit de Renesas pretendo começar com este. Mas não sei o grau de dificuldade em trabalhar com eles. Visto que não consegui até agora material didático. Por isso pergunto onde posso encontrar material didático ou algum curso aqui no Brasil. É valido começar com esta linha?
ResponderExcluirMarc,
ResponderExcluirentre em http://eletronica.etc.br e assine a lista CBE (Comunidade Brasileira de Eletrônica, antiga PICLISTBR). Por lá você consegue contato direto comigo e com o pessoal que distribui Renesas aqui no Brasil.
Qual kit você adquiriu? A Renesas é muito boa e tem uma plataforma muito consistente para se iniciar no mundo dos microcontroladores... já está começando certo e melhor que muita gente por aí!
Ok, obrigado pela dica. O tempo de aprendizado é fundamental para pessoas como eu que procura se aprofundar nesta área, porém faz isso "off line", ou seja, não é tarefa profissional cotidiana. O kit que adquirí é o H8 Starter kit
ResponderExcluirH8 é complicado , comece com a linha R8C ou M16C
ResponderExcluirpretendo ser revendedor no RJ dessa linha mas encontro a dificuldade de não ter representação da renesas nesse sentido...
ResponderExcluirOpa opa... gente querendo revender Renesas aqui no Brasil é sempre muito interessante... coloque um e-mail para entrarmos em contato...
ResponderExcluirVais vender em pequenas quantidades? quais as linhas que pensa em revender? R8C, H8?