Ir ao conteúdo
  • Cadastre-se
Vicente Cesar

RESOLVIDO Duvida com programação em assembly para pic

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

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.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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.

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×