Ir ao conteúdo

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


aphawk

Posts recomendados

Postado

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

Postado

sei nao amigo ,se usar goto nao vai ficar legal,e os waitms tbem vão parar o programa assim como o freqout,Sinceramente nao entendi o q isso faz cara ,pode explicar direitinho pra mim porque sou meio burro pra entender kkkkkkkkkkkkkkkkkk.

Postado

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.

Postado

Nossa mãe do Céu ..... já que o Jorge tá te ajudando, vou fingir que nem ví este tópico ......

Eita código meio maluco hihihihihihihihi

Manda bala Jorge !!!!!!!!!!!!!

Paulo

Postado

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

Postado

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

Postado

kkkkkkkkkkkkkk,nao e bicho de sete cabeça,o bom disso tudo e q nao se prende a loops amigo,e seu programa fica mais rápido e eficaz.Tamo ai pra qualquer duvida.

off:O professor paulao ,ta fugindo e kkkkkkkkkkkkkkkkkkkk

Postado

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.

Postado

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

Postado

É isso Professor,

Se ficar o bicho come, se correr o bicho pega então o negocio é PEGAR NO BICHO.

Vamos encarar sem cara feia. Obrigado pela sugestão, vou atrás dessa dica.

Um abraço,

Enio.

Postado

"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

Postado

É 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

Postado

grande mestre,valeu ae ,se e o cara ,graças a você to aprendendo e so tenho agradecer a deus e a suas apostilas ,valeu e tudo de bom pra você,consegui ja projetar o propeller e o dimmer de chuveiro ,ebaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Postado

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.

Postado

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

Postado

É isso ai amigão,

O seguinte:

Fiz dim contador as byte e dim flag as bit é isso?

Pergunto, como ocorre a implementação do "contador" para chegar a 2 ?

Está ocorrendo um loop entre testa: ---------- goto testa: =====> não sai disso.

Postado

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

Postado

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

Postado

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

Postado

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

Postado

'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

Arquivado

Este tópico foi arquivado e está fechado para 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...