Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

TUTORIAL: Mais sobre os Ponteiros

Share:

TUTORIAL: Mais sobre os Ponteiros



Olá pessoal! Em um dos tutoriais aqui do blog expliquei o que é um ponteiro e como declará-lo. Mas se você ainda não sabe, aqui vai a definição: um ponteiro é uma variável que armazena um endereço qualquer da memória. Ao manipular este ponteiro, na verdade você está manipulando a memória apontado por ele. Veja mais aqui.

Neste tutorial mostrarei como o microcontrolador interpreta isso.

Primeiramente iremos tratar do PIC16F. Como disse, "um ponteiro é uma variável". O compilador irá reserva um ( ou dois ) byte(s) para o ponteiro para armazenar o endereço que irá receber.

//declaramos uma variável "Ptr".
//Define o valor desta variável com o endereço de PORTA.
char *Ptr = &PORTA;

Existe duas formas de escrever para uma memória. Através do endereçamento direto (PORTA = 9;) ou endereçamento indireto, utilizando os ponteiros (*Ptr = 9;). Através do endereçamento indireto, o microcontrolador irá utilizar um registro virtual ( INDF ) e o registro FSR.

O registro FSR é o que vai receber o endereço apontado pelo ponteiro.

O registro INDF possui o valor da memória de endereço apontado pelo FSR.

Então, quando manipulamos o ponteiro:

//Definimos o valor de PORTA
 *Ptr = 9;

O microcontrolador na verdade, manipula estes registros: FSR e INDF.

Veja este exemplo:
 
char *Ptr = &PORTA; //Aponta para PORTA
unsigned *Timer = &TMR1L; //Aponta para o contador do TIMER1

void main()
{
  *Ptr = 9; //define o valor de PORTA
  //Ou
  FSR = &PORTA; //passa o valor da variavel "Ptr",
  // que no caso é o endereço de PORTA
  INDF = 9; //define o valor de PORTA

  *Timer = 0xFF55; //Define o valor do timer1
  //Ou
  FSR = &TMR1L; //passa o valor do endereço de TMR1L
  INDF = 0x55; //definimos o valor de TMR1L
  FSR++; //incrementa. Agora aponta para TMR1H
  INDF = 0xFF; //definimos o valor de TMR1H
}

Há uma vantagem de se trabalhar com os registros FSR e INDF, em vez de declarar um ponteiro: Otimiza o código, deixando de executar várias instruções da manipulação da variável ponteiro e economiza memória. A desvantagem é que gasta mais linhas de programação e dificulta o  entendimento.

Para o PIC18F, já é um pouquinho diferente. Além de possui mais memória, obrigando a trabalhar como dois registros para o endereçamento, possui algumas funções adicionais:

FSR0L e FSR0H - Recebe um endereço.
INDF0 - recebe o valor do endereço apontado por FSR0( FSR0L e FSR0H ).

Também há:
POSTDEC0recebe o valor do endereço apontado por FSR0 e decrementa FSR0.
POSTINC0recebe o valor do endereço apontado por FSR0 e incrementa FSR0.
PREINC0: incrementa FSR0 e recebe o valor do endereço apontado por FSR0.
PLUSW0: recebe o valor do endereço apontado por (FSR0 + valor do acumulador W). Não afeta o registro FSR0.


Este tutorial foi somente pra ampliar seus conhecimentos. Até mais!!!

2 comentários: