Páginas










Primeiramente temos que pensar em rotinas que ficam decrementando uma variável e executando alguns comandos que perdem tempo, como o nop, lembrando que o número máximo de uma variável no PIC é 255. Na nossa Rotina fizemos a variável x=249, numa rotina que perde 4 ciclos de máquinas a cada decremento, apenas na última passagem são 3 ciclos, pois a instrução decfsz quando a variável é zero, usa dois ciclos e salta a próxima instrução que no caso é um goto ( 2 ciclos), então fica 1 do nop + 2 do decfsz que somam 3.
Calculando os ciclos de máquina rotina:
  1. Devemos levar em consideração a chamada a subrotina o call ( 2 ciclos );
  2. Inicializaçaõ da variável x (movlw 249 - movwf x) ( 2 ciclos) até aqui total de 4 ciclos;
  3. Como x = 249, isto dá um tempo de: { 4us(nop + decfsz x + goto ms2) X 248 = 992} até aqui total de 996 ciclos;
  4. Último decremento ( 1 ciclo do nop + 2 ciclos do decfsz, pula o goto) 3 ciclos, até aqui 999;
  5. Agora chegou no return (2 ciclos) totalizando 1001 ciclos de máquina;
  6. Dependendo da aplicação essa diferença de 1 us é tolerável.
Tem como fazer dar exatamente 1 milisegundo? Sim é lógico, para isso no programa tinhamos que fazer x = 248, isto daria um tempo de:{ 4 us( call + movlw 248 + movwf x)} + { 4us(nop + decfsz x + goto ms2) X 247 = 988 (rotina de decrementar)} + { 3us do último decremento} = 995. Como teremos mais 2 us do return, faltam 3us para completar 1000 ciclos, coloca-se então 3 nop antes do return. Faça a modificação, compile o programa novamente e verifique.
Aumentando o tempo do atraso
E se precisarmos de mais tempo, por exemplo 100 ms? Se essa rotina que fizemos gera aproximadamente 1 ms, basta executá-la 100 vezes. Fazemos então uma rotina para decrementar uma outra variável 100 vezes, e a cada decremento executar a rotina de 1 ms.

Simplex Magazine2

Aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.