Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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!

Editado por NikolaTesla

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.

Editado por Felipe Electronic

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

Editado por vtrx

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






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

×