Ir ao conteúdo
  • Cadastre-se

Tutorial : Introdução ao uso de PIC´s em BASIC com o PIC Simulator IDE - Parte 1/2


Posts recomendados

Jorge já houve progressos:

Usei um loop extenso porém não suficiente dai acrescentei um waitms baixo de modo a não interferir na rotina. Dá uma olhada.

'PIC 12F629

Define CONF_WORD = 0x31c1 'int osc clock out

Define CLOCK_FREQUENCY = 4

TRISIO = 111100b

Dim b As Byte

Dim i As Word

b = 0

For i = 0 To 6000

GP0 = 0

WaitMs 12

If b = 1 Then

Goto inicio

Endif

If GP5 = 1 Then

FreqOut GP1, 800, 100

b = 1

Endif

inicio:

If GP2 = 1 And b = 1 Then

FreqOut GP1, 800, 100

WaitMs 30

FreqOut GP1, 800, 100

Goto fim

Endif

Next i

goto termina

fim:

GP0 = 0

End

termina:

GP0=1

End

Link para o comentário
Compartilhar em outros sites

Já está funcionando.

Eu ligo o circuito e tenho zero em GP0 e dai a rotina me dá 2 minutos para que eu sete a porta GP5 e receba um beep de confirmação o proximo passo e com a porta GP2 e dai tenho 2 beeps de confirmação e o sistem encerra com GP0 em ZERO (até então tenho GP0 fixo em ZERO como eu queria sem interromper a rotina). Se nestes 2 minutos eu não setar as entradas, o programa encerra com GP0 em 1 e desliga a corrente do sistema que estiver conectado nesta porta.

A parada do waitms é muito curta e multiplicada pelo numero de vezes do laço consigo obter os 2 minutos necessários.

Link para o comentário
Compartilhar em outros sites

:DAgora eu é que faço KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK:D

Depois de um dia gravando e desgravando PIC fiquei "esperto" tô dando nó até em pigo d`água. A coisa é como bomba relógio, depois de ativada eu tenho 2 min para desativar. Como não conheço outra forma de temporizar a rotina enquanto ela roda por 2 min tive que fazer uso do laço e como esse não estava sendo suficiente além de extenso eu usei um pequeno tempo de Waitms que na prática não chega a paralizar a rotina.

Se houver alguma sugestão estamos ai, vamo nessa amizade.

Link para o comentário
Compartilhar em outros sites

amigao eis a Sugestão simples .use o tmr1 q estoura a cada 500ms. tendo 2 estouros 1 segundo ,ai e so incrementar um contador ate 60 e incrementar a variavel minuto,quando der dois então você testa o bit ,e faz o resto do codigo,assim poderá executar outras coisas sem se prender a loops.Eis o codigo do tmr1 (500ms)

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 1 'Prescaler 1:8

T1CON.T1CKPS1 = 1

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

Enable

On Interrupt 'Rotina de tratamento de interrupção

Save System 'salva o contexto, use sempre

'seguem As instruções a serem executadas na interrupção

PIR1.TMR1IF = 0

Resume

Link para o comentário
Compartilhar em outros sites

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Tenho certeza que depois de um bom descanso de feriadão o Professor Paulo irá me tirar desta enrrascada.

Socorrooooooooooooooooooooooooooooooooooooooo.

RESUMINDO:

GP0=1

WAITMS 60000 ==> mantenho GP0 em alta por 1 min =====> A ROTINA PÁRA

If GP1=1 then ==> Entre o intervalo de 0 a 1 min eu quero levar GP0 à ZERO

GP0=0

End

EndIf

A pergunta que não quer calar. Como manter GP0=1 por 1 minuto sem congelar a rotina?

A coisa tá feia, enquanto isso vou pesquizando.

Até mais.

Link para o comentário
Compartilhar em outros sites

Po.... vou ter de tentar entender esse rolo mesmo né ........:cry:

Bom, a maneira certá é mesmo usando interrupção do TIMER1 .... o Jorge tá certinho !

A ideia é fazer um relógio usando as interrupções, assim quando for começar os tais 2 minutos, voce fica checando se o tempo passou e checando o nível da porta, em um loop, que se repete enquanto os 2 minutos não acabam ....

Se precisar mesmo fazer o trem de pulso, sugiro usar também o TIMER0 para isso, controlado por um flag que é setado FORA das interrupções.

Já pensou um programinha usando os 2 timers, por interrupção ??? ( isso se esse PIC tem os 2 timers .... )

Agora, TCHECARA, sugiro ler o tutorial, para entender o uso do TIMER com interrupção ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

"configuração tmr0

OPTION_REG.T0CS = 0 'usar clock interno

OPTION_REG.PSA = 0 ' prescaler ligado no TIMER0

OPTION_REG.PS2 = 1 ' valor prescaler = 64

OPTION_REG.PS1 = 0

OPTION_REG.PS0 = 1

TMR0 = 0x3d ' contagem inicial do TIMER0 de 61

Com os comando acima, tudo já está programado, só falta ligar as interrupções, para

isso usamos a seqüência abaixo :

INTCON.T0IE = 0 'desabilita a interrupçao do TIMER0

"configuração tmr1

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 1 'Prescaler 1:8

T1CON.T1CKPS1 = 1

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

Enable

'roda rotina principal

If GP1=1 then ==> Entre o intervalo de 0 a 1 min eu quero levar GP0 à ZERO

GP0=0

endif

end

On Interrupt 'Rotina de tratamento de interrupção

Save System 'salva o contexto, use sempre

'seguem As instruções a serem executadas na interrupção

goto rotina principal

PIR1.TMR1IF = 0

Resume

return

OBS:Seria mais ou menos do jeito q esta aqui,ai você muda pra chegar ao q quer ,ali na rotina principal você monta um contador ,para qtas vezes quer q de os pulso , tipo ,você tem um tmr0 de 10 ms ,se for uma frequencia de 100ms então conta de 0 a 10 e sempre testando o flag do tmr0 e manda o port a 1,entendeu ne kkkkkkkkkkkkkk

Link para o comentário
Compartilhar em outros sites

É isso aí Jorge !!!!

Só que tem um truque quando usamos mais de uma interrupção :

TEMOS DE SABER QUEM ( qual hardware do PIC ) QUE GEROU A INTERRUPÇÃO, DESVIANDO PARA CADA UMA DAS ROTINAS RESPECTIVAS !

Ou seja, temos de analisar o registrador que mostra qual a interrupção que está ativa no momento ok ?

Ah, Tchê, os valores que o Jorge passou no Timer0 devem ser recalculados caso voce use ele para gerar o "trem de pulsos" ok ?

Manda bala Tchê !

Paulo

Link para o comentário
Compartilhar em outros sites

Olá meus amigos,

Tenho que confessar uma coisa:

Eu só tenho DOIS neurônios, o TICO e o TECO e pra complicar são inimigos não se falam.

Já sentei debaixo de uma macieira com a apostila do Paulo na esperança de uma maçã cair sobre minha cabeça porém, nem isso.

Não consegui implementar o TIMER. Precisaria de algo simples como:

GP0 = 1 durante 2 minutos.

If GP1= 1 then ===> tenho 2 min. para que GP0 seja levado a ZERO ==>quando GP1=1

GP0=0 após esse tempo será encerrado com GP0 pemanescendo em 1

end

endif

Desculpe a ignorância, já pesquizei, li e reli mas não entra na cabeça.

Abraços.

Link para o comentário
Compartilhar em outros sites

pensei nisso amigo,nao sei se e isso que quer

testa:

if gp1=1 then 'gp1 setado ativa flag de tempo

flag=1

endif

goto testa

"configuração tmr1

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 1 'Prescaler 1:8

T1CON.T1CKPS1 = 1

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

Enable

if contador =2 then 'passou dois minutos

If flag=1 then

flag=0

gp0=1

endif

endif

Link para o comentário
Compartilhar em outros sites

grande the,ou faz um msn ai pra nois trocar experiencia ok o qto mais rápido.Bom, o contador vai na interrupçao do tmr1,ou seja

configuração tmr1

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 1 'Prescaler 1:8

T1CON.T1CKPS1 = 1

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

Enable

contador=contador+1

if contador =2 then 'passou dois minutos

contador=0

If flag=1 then

flag=0

gp0=1

endif

endif

Link para o comentário
Compartilhar em outros sites

Professor Paulo,

Socorro, já estou ficando p. da cara( não é palavrão é pic da cara)KKKKKKKKKKKKK

O jorge me passou umas dicas mas não estou conseguindo fazer funcionar. Me aponte os erros por favor.

'PIC 12F629

Define CONF_WORD = 0x31c1 'int osc clock out

Define CLOCK_FREQUENCY = 4

TRISIO = 111100b

Dim contador As Word

Dim flag As Bit

contador = 0

'"configuração tmr1" 500 ms X 120 = 1 minuto

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 0 'Prescaler 1:8

T1CON.T1CKPS1 = 0

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

Enable

inicio:

If contador = 120 Then

goto fim

Endif

If flag = 1 Then ===>a cada 500 ms flag = 1 há incremento no contador

flag = 0

contador = contador + 1

Endif

Goto inicio

fim:

GP0 = 1

End

Link para o comentário
Compartilhar em outros sites

12F629

Define CONF_WORD = 0x31c1 'int osc clock out

Define CLOCK_FREQUENCY = 4

TRISIO = 111100b

Dim contador As Word

Dim flag As Bit

contador = 0

'"configuração tmr1" 500 ms X 120 = 1 minuto

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 0 'Prescaler 1:8

T1CON.T1CKPS1 = 0

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

intcon.gie=1

Enable

inicio:

contador = contador + 1

If contador = 120 Then

contador=0

goto fim

Endif

If flag = 1 Then ===>a cada 500 ms flag = 1 há incremento no contador

flag = 0

Endif

Goto inicio

fim:

GP0 = 1

End

Link para o comentário
Compartilhar em outros sites

Graaaaande Jorge,

Como é que vai meu amigo, tudo bem?

Ainda não funciona.

Você retirou o incremento do contador de dentro do flag? O contador tem que ser incrementado a cada 500 ms pelo flag.

Outra coisa, eu li o seguinte quanto ao prescaler:

00=1:1

01=1:2

10=1:4

11=1:8 =========> você colocou 0 no prescaler, tentei 11 mas o PSI não aceita.

__________|__________|__________ seria assim os pulsos do TIMER?

.....500ms..flag...500ms..flag

Link para o comentário
Compartilhar em outros sites

'PIC 12F629

Define CONF_WORD = 0x31c1 'int osc clock out

Define CLOCK_FREQUENCY = 4

TRISIO = 111100b

Dim contador As Word

Dim flag As Bit

contador = 0

'"configuração tmr1" 500 ms X 120 = 1 minuto

T1CON.TMR1CS = 0 'usar o clock interno

T1CON.T1CKPS0 = 0 'Prescaler 1:8

T1CON.T1CKPS1 = 0

TMR1H = 0x0b

TMR1L = 0xdc

T1CON.TMR1ON = 1 'habilita a contagem do TIMER1

PIE1.TMR1IE = 1 'habilita a interrupção do TIMER1

INTCON.PEIE = 1 'habilita todas as interrupções não mascaradas

intcon.gie=1 'habilita interrupçao global

Enable

Goto inicio

fim:

GP0 = 1

End

On Interrupt 'Rotina de tratamento de interrupção

Save System 'salva o contexto, use sempre

if flag=1 then 'passou 500ms ,se flag=1 incrementa contador

flag=0

contador=contador+1

endif

PIR1.TMR1IF = 0

Resume

Return

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!