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á:
POSTDEC0: recebe o valor do endereço apontado por FSR0 e decrementa FSR0.
POSTINC0: recebe 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!!!
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á:
POSTDEC0: recebe o valor do endereço apontado por FSR0 e decrementa FSR0.
POSTINC0: recebe 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!!!
muito bom...
ResponderExcluirÓtimo
ResponderExcluir