Ir ao conteúdo
  • Cadastre-se

Duvida projeto


Posts recomendados

Poderia simplificar e cortar um monte de instruções, deixando só o básico,  entre a linha enable e o end só um laço  para criar uma situação de sair da interrupção e retornar para ela novamente para ver se ela faz uma segunda entrada e um novo incremento da variável com isso acho com 50 linhas seria possível. Interessante que o meu projeto inicial onde a interrupção estava meio confusa inclusive tu pediu para eu colocar no final, fora daquele emaranhado todo a coisa em termos até funcionava isso é havia sucessivos incrementos e agora não, apenas um incremento inicial.

Link para o comentário
Compartilhar em outros sites

Olá Paulo, após fazer varios ensaios para ver porque a minha gambiarra funcionava embora toda errada e a tua sugestão não fazia a recontagem e ficava trancada no end. A moral é o seguinte na minha gambiarra a execução da rotina de interrupção nunca chegava a executar o RESUME pois antes era desviada através de um goto ciclo, fazendo sempre esse laço sem encerrar com RESUME pois a partir do momento que fizer o RESUME a coisa não implementa mais a variravel CONTA conforme havia comentado. Pergunto então, estaria correto fazer assim? Veja como ficou a titulo de exemplo o codigo:

 

'PIC 16F628A
Define CONF_WORD = 0x3f50
Define CLOCK_FREQUENCY = 4
AllDigital
TRISA = 0xff  'seta todas portas A como entrada
TRISB = 00000111b  'portas 0, 1 e 2 como entrada as demais saida
Dim conta As Byte
Dim flag_1 As Byte
PORTB.5 = 0
'WaitMs 100  'Vamos esperar o sensor estabilizar e depois mandar o pulso
OPTION_REG.T0CS = 0  'USAR CLOCK INTERNO
OPTION_REG.PSA = 0  'PS2, PS1, PS0 CONFIGURADOS PARA PRESCALER = 4
OPTION_REG.PS2 = 0
OPTION_REG.PS1 = 0
OPTION_REG.PS0 = 1
TMR0 = 0x06  'CONTAGEM INICIAL DO TIMER0 EM 6
INTCON.T0IE = 1  'habilita  timer0 interrupção
INTCON.GIE = 1  'habilitas todos interrupções un-masked
OPTION_REG.T0CS = 0  'definir fonte de relógio timer0 de instrução interna do relógio de ciclo
Enable
ciclo:

PORTB.5 = 1
WaitUs 10
PORTB.5 = 0
Goto contagem
verifica:
    If conta < 10 Then
        PORTB.7 = 1
        WaitMs 10
        PORTB.7 = 0
conta = 0
Goto ciclo  'Eco não retornou no tempo previsto, alarma e retorna novo ciclo
        Else
conta = 0
        Goto ciclo  'Tudo ok eco retornou em tempo portanto faz novo ciclo
    Endif
 
End__________________________________________________________________                                            

 

contagem:

On Interrupt  'interrompe a rotina à cada 1 mS
Save System
 
conta = conta + 1
 
If PORTA.4 = 0 Then  'se recebeu o eco porta.4 vai de 1 para ZERO
Goto verifica  'sair ' aqui ele tem que ir para esperando para verificar e já leva o valor de conta que se for igual a 10 alarma
Endif
 
sair:
TMR0 = 0x06
Goto ciclo
Resume________________________________________________________________________________________                                         

Link para o comentário
Compartilhar em outros sites

Ok, vou continuar pesquisando. Eu vi um vídeo muito bom de um camarada a respeito do TIMER0,  ele tem várias videos-aulas porém ele se dedica ao MikroC. Ele mostra um exemplo e diz que a garantia de que houve um estouro é o T0IF ir a 1 então ele condiciona sua variável a sofrer incremento só quando essa condição é satisfeita e depois ele faz o T0IF = 0, eu acho que seria assim:

 

aqui houve estouro então

 

If INTCON.T0IF = 1 then

conta = conta + 1

INTCON.T0IF = 0

endif

 

vai para novo estouro...........................................................

 

De tanto errar um dia eu acerto kkkkkkkkkkkkkkkkkkkkkkkkkkk, como na mega um dia eu acerto kkkkkkkkkkkkkkkkkkkkkkkkk.

Link para o comentário
Compartilhar em outros sites

Olá Paulo, finalmente consegui implementar um código que sai da interrupção e retorna à ela fazendo um novo ciclo. Dá uma conferida para nós.

 

'PIC 16F628A
Define CONF_WORD = 0x3f50
Define CLOCK_FREQUENCY = 4
TRISA = 0xff  'seta todas portas A como entrada
TRISB = 00000111b  'portas 0, 1 e 2 como entrada as demais saida
Dim conta As Byte
PORTB.5 = 0
AllDigital
OPTION_REG.T0CS = 0  'USAR CLOCK INTERNO
OPTION_REG.PSA = 0  'PS2, PS1, PS0 CONFIGURADOS PARA PRESCALER = 4
OPTION_REG.PS2 = 0
OPTION_REG.PS1 = 0
OPTION_REG.PS0 = 1
TMR0 = 0x06  'CONTAGEM INICIAL DO TIMER0 EM 6
INTCON.T0IE = 1  'habilita  timer0 interrupção
INTCON.GIE = 1  'habilitas todos interrupções un-masked
OPTION_REG.T0CS = 0  'definir fonte de relógio timer0 de instrução interna do relógio de ciclo
Enable
 
alarme:
If conta = 10 Then
conta = 0
PORTB.7 = 1
WaitMs 10
PORTB.7 = 0
Goto continua
Endif
 
End ________________________________________________________                                              
 
On Interrupt  'interrompe a rotina à cada 1 mS
Save System
conta = conta + 1
 
If conta = 10 Then
Goto sai
Endif
Goto continua
sai:
Goto alarme
continua:
TMR0 = 0x06
 
Resume  _____________________________________________________________                 

Link para o comentário
Compartilhar em outros sites

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...