Ir ao conteúdo
  • Cadastre-se

Duvida com programação em assembly para pic


Ir à solução Resolvido por Felipe Electronic,

Posts recomendados

Olá pessoal, estou tentando fazer um timer em assembly(que conta x segundos). Só que eu quero usa-lo em varios pontos do programa, ou seja, quando eu usar GOTO TIMER quero que ele execute e depois retorne ao ponto do programa do qual estava quando foi chamado, seria possível ? Como? Se poderem da detalhes sobre, agradeço.

Link para o comentário
Compartilhar em outros sites

  • Solução

 

 

Aqui no Clube do Hardware , é mais fácil você encontrar em código do Compilador PCW!

é esse tipo de comentário que acaba com a credibilidade do fórum. Inclusive se a turma do assembly ler isso...

 

 

@Vicente Cesar, para resolver suas dúvida existe mais de um caminho, o dito timer que você aparenta querer,  é o famigerado delay,  aquele que você especifica quantos segundos o programa deve aguardar para continuar operando, embora seja umas solução simples ela peca pelo fato da CPU ficar parada enquanto o tal delay aguarda e você fica impedido de realizar alguma outra tarefa, para tal existem formas mais sofisticadas baseadas em callbacks, onde você pode guardar o par PC:PCLATH  e desviar o fluxo do programa de forma temporária, quando o timer estourar...a propria subrotina faz um "pop" desse par e o prgrama retorna da onde parou. Para tal preciso de mais informações, então vou admitir que queira a solução mais simples.

Veja esse simples delay:

cblock 0x20  ;area de variaveiscontadorSegundoscontadorMiliscontadorBaseintconTempendc;; DelayBase; Essa funcao executa um delay em base de tempo de 10ms;DelayBase:    movlw .100              ;    movwf contadorMilis     ;    movlw .249              ;valor empirico para delay preciso de 1ms a 4MHz    movwf contadorBase      ;DelayBaseLoop:    clrwdt                  ; + 1cy    decfsz  contadorBase,f  ; + 1cy    goto    DelayBaseLoop   ; + 2cy    decfsz  contadorMilis,f ; cada vez que chegar nesse ponto                             ; significa que se passou 1ms    goto    DelayBaseLoop-2 ;    return                  ;;;   DelaySegundos;   Essa funcao faz a CPU ficar parada por N segundos ate um maximo de 25;   onde para cada segundo deve ser passado um valor igual a 10;   obs o parametro deve ser passado em wDelaySegundos:    movwf  contadorSegundos    movf   INTCON,w    movwf  intconTemp       ;salva contexto fazendo push em intcon    bcf    INTCON,GIE       ;derruba interrupcao    call DelayBase          ;delay de 10ms    decfsz contadorSegundos ;    goto    $-1             ;repete ate zerar o contador    movf    intconTemp,w    ;    movwf   INTCON          ;restaura interrupcoes    return                  ; 

Usando:

;; Seu código...;movlw .10call DelaySegundos ;fica travado aqui por 1 segundo;; continue seu codigo; 

De mais detalhes para sabermos se outras aproximações podem ajuda - lo melhor.

Abs.

Link para o comentário
Compartilhar em outros sites

É um temporizador que pausa o programa por mais ou menos 30 microssegundos para terminar a sincronização de imagem de um televisor com meu pic. Acho que dará certo seus métodos. Tenho mais uma duvida, tem como eu parar o processamento por um ciclo de clock ? E poderia explicar melhor como esse código retorna para o programa ? O contador de tempo eu entendi, mas não entendi como ele retorna ao ponto em que o programa foi interrompido.

Link para o comentário
Compartilhar em outros sites

 

 

Acho que dará certo seus métodos. Tenho mais uma duvida, tem como eu parar o processamento por um ciclo de clock ?

 Claro, assim:

 

nop ;gasta 1 ciclo de clock sem fazer nada

 

 

E poderia explicar melhor como esse código retorna para o programa ?

Essencialmente quando você chama qualquer subrotina a atraves da insgtrução Call, o processador irá guardar uma pilha, o endereço corrente acrescido de mais 1, quando, dentro da subrotina você usa a instrução return, o processador move o valor salva no topo da  pilha para o contador de programa e que desvia e retorna do ponto onde ele fez a chamada call.

Abs.

 

Link para o comentário
Compartilhar em outros sites

@Vicente Cesar voce deve atualizar a imagem,se for isso que pretende fazer,entre o tempo de varredura  vertical do quadro.

Este é o espaço de tempo usado para atualizar dados de vídeo.

Faça uma rotina usando oTimer para a geração do sincronismo vertical,dentro deste tempo voce atualiza os dados pois o Delay vai 'travar' o PIC dessincronizando a varredura.

voce pode usar a pagina do link aqui para calcular o tempo;

http://www.pml4all.org/profiles/blogs/pic-delay-code-generator-1

Link para o comentário
Compartilhar em outros sites

vtrx Eu sei que isso trava o PIC, mas é justamente o que eu preciso, pois eu já tenho todas as informações que quero que sejam impressas no momento que vou usar este Delay, mas achei interessante o link, só não consegui baixar o arquivo no botão de download, mas funcionou para usar online @_@ Obrigado 

Felipe, a instrução nop, quando eu testei ela gastou um ciclo de maquina, e não um ciclo de clock, ou seja, no pic a instrução demorou 4 vezes mais que o esperado.

Link para o comentário
Compartilhar em outros sites

 

Felipe, a instrução nop, quando eu testei ela gastou um ciclo de maquina, e não um ciclo de clock, ou seja, no pic a instrução demorou 4 vezes mais que o esperado.

 

 

Ops, queira me desculpar, ciclo de clock, não dá devido as próprias caracteristicas do PIC, seu pipeline, que por conseguinte divide o clock de entrada por 4. Logo pra toda e qualquer frequência de clock que você usar, admita que o PIC roda a essa frequência dividida por 4, triste mas tem suas vantagens uma vez que a maioria esmagadora das intruções levam 1 ciclo de máquina.

Abs.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...