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

Tche, tá mais fácil do que voce imagina.

Veja o código correto :


'PIC 12F629
Define CONF_WORD =[COLOR=Red] 0x31c5[/COLOR] 'int osc clock out
Define CLOCK_FREQUENCY = 4
TRISIO = 111100b
Dim contador As Word
Dim flag As Bit
flag = 0
contador = 0
[COLOR=Red]GP0 = 0[/COLOR] 'saida inicialmente em nivel 0

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

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
INTCON.GIE = 1 'habilita interrupçao global
Enable


[COLOR=Red]'agora, o programa fica esperando passar o tempo,
'observando o valor de flag.
'quando passar o tempo determinado, liga a saida GP0

inicio:
If flag = 1 Then
GP0 = 1 'liga a saida GP0 ( passou 1 minuto ! )
Endif
Goto inicio
[/COLOR]
End

On Interrupt 'Rotina de tratamento de interrupção
Save System 'salva o contexto, use sempre

contador = contador + 1

If contador = 120 Then
flag = 1
Endif

[COLOR=Red]TMR1H = 0x0b 'reinicializa o timer 1 !!!!
TMR1L = 0xdc[/COLOR]

PIR1.TMR1IF = 0 'habilita a interrupção novamente
Resume

Return

Em vermelho tem as alterações que eu fiz.

O programa espera 1 minuto, e só então liga a saida GP0 com nivel lógico 1.

Cuidado na simulação, ou voce vai esperar um tempãoooo no seu micro !

Para simular, mude os valores dos timers e o valor de contador ( por exemplo, 5 em vez de 120 ) .

Cuidado que sua CONFIG WORD estava errada ok ?

Veja se resolveu !

Paulo

Link para o comentário
Compartilhar em outros sites

Saudações professor

Não resolveu ainda, o programa fica preso no laço inicio ==> flag nunca chega a 1 !!!!!!!!

Como o flag vai a 1 a cada 500 ms não seria ele o responsável por incrementar o contador até 120? 500x120= 1 min ==> penso eu que contador=contador + 1 deveria estar dentro dete laço, e GP) = 1 dentro do laço contador ?

Alguma coisa não fecha pois de qualquer maneira o flag não vai a 1.

Forte abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

saudaçoes the!

'PIC 12F629

Define CONF_WORD = 0x31c5 'int osc clock out

Define CLOCK_FREQUENCY = 4

TRISIO = 111100b

Dim contador As Word

Dim flag As Bit

flag = 0

contador = 0

GP0 = 0 'saida inicialmente em nivel 0

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

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

INTCON.GIE = 1 'habilita interrupçao global

Enable

'agora, o programa fica esperando passar o tempo,

'observando o valor de flag.

'quando passar o tempo determinado, liga a saida GP0

inicio:

If flag = 1 Then

ativa=1

Endif

if flag=0 then

ativa=0

endif

Goto inicio

End

On Interrupt 'Rotina de tratamento de interrupção

Save System 'salva o contexto, use sempre

if ativa=1 then

contador = contador + 1

endif

If contador = 120 Then

gp0=1

Endif

TMR1H = 0x0b 'reinicializa o timer 1 !!!!

TMR1L = 0xdc

PIR1.TMR1IF = 0 'habilita a interrupção novamente

Resume

Return

Link para o comentário
Compartilhar em outros sites

Fala grande Jorge,

O problema é que a expressão flag não vai a 1, quando eu forço a barra e digo flag = 1 antes do laço IF flag = 1 then ........ ai a rotina processa legal. Será que essa expressão é a que realmente identifica o estouro ou seria o número 65536 que seria a ultima contagem do ciclo?

Link para o comentário
Compartilhar em outros sites

Tche,

Alguma coisa está errada em sua simulação, aqui funcionou direitinho, eu só mudei os valores de TIMER1 e de CONTADOR para fazer a simulação, e logo o LED acendeu em GP0.

Não montei o circuito no protoboard, mas é tão simples que não tem como dar errado !

Segue o programa alterado para testar a simulação, repare no que está na cor Vermelha :


'PIC 12F629
Define CONF_WORD = 0x31c5 'int osc clock out
Define CLOCK_FREQUENCY = 4
TRISIO = 111100b
Dim contador As Word
Dim flag As Bit
flag = 0
contador = 0
GP0 = 0 'saida inicialmente em nivel 0

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

T1CON.TMR1CS = 0 'usar o clock interno
T1CON.T1CKPS0 = 1 'Prescaler 1:8
T1CON.T1CKPS1 = 1
[COLOR=Red]TMR1H = 0xff[/COLOR]
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


'agora, o programa fica esperando passar o tempo,
'observando o valor de flag.
'quando passar o tempo determinado, liga a saida GP0

inicio:
If flag = 1 Then
GP0 = 1 'liga a saida GP0 ( passou 1 minuto ! )
Endif
Goto inicio

End

On Interrupt 'Rotina de tratamento de interrupção
Save System 'salva o contexto, use sempre

contador = contador + 1

[COLOR=Red]If contador = 5 Then[/COLOR]
flag = 1
Endif

[COLOR=Red]TMR1H = 0xff 'reinicializa o timer 1 !!!![/COLOR]
TMR1L = 0xdc

PIR1.TMR1IF = 0 'hsbilita a interrupção novamente
Resume

Veja se você selecionou o modelo do PIC correto, e coloque um LED na saida GP0 para você ver.

Use a simulação no modo ULTIMATE, minimize a janela do compilador Basic para rodar mais rápido.

Use a opção WATCH VARIABLES para ver o incremento de CONTADOR ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

:o Caracoles, não é que funcionou!:D

PROFESSOR Valeu!!!!!!!!!!

Fiquei com a seguinte dúvida:

Eu achava que Flag ia a 1 quando fechava o ciclo de contagem e retornava a zero na recontagem (sendo que a cada 1 incrementava o contador) porém, ele somente vai a 1 quando o contador diz que ele é 1 ai então ele faz GP0 = 1.

Como é que ele sai daquele ciclo "inicio" e segue até o contador pois a principio isso ocorreria quando flag=1 mas ai GP0 seria =1 antes do contador atingir o final.

Link para o comentário
Compartilhar em outros sites

Como é que ele sai daquele ciclo "inicio" e segue até o contador pois a principio isso ocorreria quando flag=1 mas ai GP0 seria =1 antes do contador atingir o final.

Pois é exatamente esse o poder das interrupções !!!!!

Veja, o nosso programa principal fica simplesmente testando o valor de flag a todo instante, e se ele lê flag=1 ele aciona a saida GP0. Mais nada !

Agora, quem controla o valor de flag ?

É a rotina de interrupção !

A cada 500 mseg, o programa principal é interronpido, e o controle é passado para a rotina de interrupção.

Essa rotina simplesmente incrementa o contador, e verifica se ele atingiu o valor desejado ( 120 ) . Se não atingiu, a rotina de interrupção prepara de novo o valor para o timer1, ( ou seja, ele esperar mais 500 mseg antes de interromper novamente ) , e encerra a rotina , devolvendo o controle ao programa principal, que vai continuar a mesma tarefa que ele estava fazendo, que é o tal do loop início.

Caso a rotina de interrupção tenha incrementado o contador 120 vezes, ela faz flag = 1 , e assim que a rotina terminar e o programa principal continuar, ele vai perceber que mudou o valor de flag.

Simples, não é ?

Agora, caso voce tenha de ficar mudando o valor de GP0, pode ser feito tanto na rotina de interrupção, mediante mudança no conteúdo de contador, ou até mesmo no programa principal ( no loop início ).

Veja se conseguiu entender, meu amigo, sugiro ler mais um pouco na apostila do tutorial sobre os usos das interrupções nos outros exemplos, isso vai te abrir novas idéias ok ?

A resposta certa para a sua pergunta é esta : o programa nunca sai daquele loop ( ciclo início ), do jeito que está escrito ! Mas quando ocorre uma interrupção, o programa pára, e quem é executada é a rotina de interrupção. Quando esta rotina termina, o programa volta no mesmo ponto onde ele estava, que é executar o loop infinitas vezes ! Mas qualquer variável do programa pode ter seu valor alterado dentro da rotina de interrupção , e é graças a isto que o programa funciona !

Paulo

Link para o comentário
Compartilhar em outros sites

Legal, Tchê !!!!

Dá uma olhada no tutorial, tem um exemplo que usa 2 displays de 7 segmentos que são multiplexados , usando interrupção.

Dá para ver o funcionamento na simulação, e é muito bom para ilustrar o funcionamento do programa principal e das interrupções.

Agora, este programa que estamos discutindo nos tópicos anteriores é um excelente uso do TIMER1, grande maioria das pessoas sabe apenas como usar o TIMER0.

Só para lembrar, nada impede que sejam usados OS DOIS TIMERS ao mesmo tempo, cada um deles gerando uma interrupção com finalidade diferentes.

Por exemplo, voce poderia fazer o TIMER0 gerar uma base de tempo tipo um relógio, e o TIMER1 fica responsável por fazer várias tarefas com horário programado.

Uma ideia bem poderosa é essa aqui :

- TIMER0 gerando uma base de tempo para relógio, mantendo hora, minuto e segundo. Esta interrupção seria ativada 100 vezes por segundo ( a cada 10 milisegundos) .

- TIMER1 ativado a cada 1 segundo , e que atenderia uma tabela de horários pré-definidos. Por exemplo, uma tabela de vários dispositivs a serem ligados em um horário e desligados em outro. Essa rotina simplesmente lê a hora, e ve se é para ativar ou desativar algum dispositivo em função da tabela.

A um processo desse tipo damos o nome de ESCALADOR DE TAREFAS. É bem fácil de ser feito usando uma máquina de estados ( sugiro pesquisar o funcionamento disto, será muito útil no futuro ! ) .

E o programa principal estaria cuidando de outras tarefas, por exemplo, interface com o usuário via teclado e display, e tratamento de dispositivos de segurança.

Enfim, para usar um PIC, independente da linguagem, temos de saber também conceitos de programação, e por mais que voce leia, pode acreditar que só com a prática que voce vai saber resolver os problemas .

Sabe, fico cahteado de ver que hoje em dia, quando temos hardwares como os PIC´s e os AVR´s , tão poderosos e fáceis de programar, eu esteja velho demais para fazer projetos realmente grandiosos..... mas estou tentando passar isso para a nova geração, que são vocês que estão lendo este fórum !

Bons projetos, amigo Tchê !

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK:D

Gostei da nova geração ==> uns chamam de terceira idade mas eu prefiro ficar com a nova geração pois a idade está na cabeça e devemos permanecer eternamente jovens pois faz bem para o espírito e o corpo agradece.

Valeu professor.

Grande Jorge,

Especialista em ASM

Amigo, andei navegando pela net e encontrei um site de um camarada que se propos a colocar som no PIC. Ele projetou um software que está disponível em sua pagina cujo objetivo é capturar som em Wav e transforma-lo em código ASM.

Já fiquei imaginando em um projeto onde a máquina fala com o operador ==> seria show de bola. Digamos uma botoeira de acesso onde a máquina diria coisas do tipo:

Digite a senha,

Senha incorreta,

tempo esgotado, e etc, etc.

Tu por acaso conheces ou tem ideia a esse respeito.

Um abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

É com satisfação que retorno aos amigos.

É possivel fazer um discador dtmf com pic?

Imagino usar 10 entradas para digitar os numeros e 1 entrada para dar enter e gravar na EEprom do pic (com possibilidade de ser reescrito).

Quando houver um alarme o número seria processado.

Agradeço a colaboração e deixo um forte abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Fala Jorjão,

Como está o amigo, tudo bem !!!

Pois é uma das minhas dificuldades é a falta de conhecimento de como gravar/reproduzir informações na EEprom. A ideia é deixar gravado o número do telefone na memória e gerar o dtmf dentro do pic. Tenho consultado na internet mas ainda não encontrei nada parecido e ainda mais em basic.

Voltando aquele assunto sobre GRAVAÇÃO/REPRODUÇÃO DE SOM eu encontrei um código sem o projeto eletrônico, eu gostaria que tu desse uma olhada pois talvez nos ajude.

link ==> http://www.flyupload.com/files/view/PUVRQJvLBkKVJW7sOz67

Abraços,

Enio.

Link para o comentário
Compartilhar em outros sites

Tchecara, voce pode fazer isto de maneira bem fácil, já que as frequências envolvidas são baixas.

O DTMF nada mais é do que duas freqências sobrepostas, e voce pode fazer isto simplesmente com duas redes R/2R, cada uma delas ligada a 4 saidas do PIC, gerando um sinal ANALÓGICO que tem 16 níveis de tensão diferentes, controlados pelo TIMER1 do PIC que servirá de base de tempo para sintetizarmos as 2 frequências ao mesmo tempo, e somando as duas saidas usando um simples amplificador operacional e um filtro passa-baixas.

Embora seja a maneira mais barata, é a mais complexa de se fazer também a nivel de software, e não acho este o melhor caminho para quem está iniciando com microcontroladores.

O caminho mais simples é voce utilizar um CI próprio para isto, aqui no Brasil encontramos fácil estes dois CI's da Holtek, que são geradores de DTMF :

HT9200A - usa apenas interface serial de 5 bits.

HT9200B - usa tanto serial como PARALELA ( bem simples !!!! )

Segue o link do datasheet :

http://www.digchip.com/datasheets/parts/datasheet/196/HT9200A-pdf.php

E para o teclado, use um teclado matricial de 12 teclas, codificado como matrix 4X3 ( vai precisar de 7 pinos de entrada ) que voce já compra prontinho, próprio para uso em microprocessadpres, a um custo bem baixo.

A rotina em BASIC para tratamento deste teclado está na própria página de exemplos do fabricante do programa PIC SIMULATOR IDE, voce pode copiar e mudar para o seu uso.

Segue o link para voce visualizar, o que eu cito aqui está no EXAMPLE 5 ( aqui o teclado é de 16 teclas, tipo 4X4, mas é só voce alterar para 4X3 ) :

http://www.oshonsoft.com/picbasiccompilerexamples.html

Se voce optar pelo ci HT9200B, basta usar 5 pinos de saida do PIC para fazer todo o controle, e isto fica muiiiito simples.

Quanto a usar a EPROM do PIC, basta ler com atenção o tutorial que eu escreví, ou apenas olhar direto a página onde encontramos a explicação do uso da linguagem do PSI , reproduzo aqui o que te interessa, e veja que não poderia ser mais simples

Using internal EEPROM memory

Access to EEPROM data memory can be programmed using READ and WRITE statements. The first argument is the address of a byte in EEPROM memory and can be a constant or Byte variable. The second argument is data that is read or written (for READ statement it must be a Byte variable). It is suggested to keep interrupts disabled during the execution of WRITE statement.

Dim x As Byte

Dim y As Byte

x = 10

Read x, y

Write 11, y

Viu como é simples ?

Como dica, tanto o teclado como os CI's da Holtek podem ser encontrados no Mercado Livre ok ?

Boa montagem !

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Opa, não tem nada de brilhante não, é que nessas horas anos de experiência fazem a diferença, Tchecara, e é essa experiência que eu tento passar aqui para facilitar aos amigos que estejam precisando.

O que foi o mais importante para mim é que voce não está pedindo uma solução pronta, e sim apenas um caminho para voce mesmo trilhar e aprender com a solução !

Isso já me mostra que voce vai longe com os microcontroladores, pois vontade voce tem, porisso que fiz questão de te passar os links para ter a certeza de que voce vai seguir o caminho correto !

Mais uma vez, estou ä disposição para qualquer dúvida, ok ?

Boa diversão !!!!

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá Professor

Resolvi usar o MT8880 que é um tX e RX de DTMF o que me dará a facilidade de usar o proprio teclado do telefone para entrar em modo de programação e inserir os numeros a serem gravados no PIC para serem discados quando por exemplo em um alarme ocorrer um evento. Estou estudando o funcionamento do MT. O pino R/w quando eu habilito em 1 ele funciona como read e com zero como write. Durante a leitura tem um pino que fica em 1 avisando que Q0, Q1, Q2 e Q3 já estão completos e volta a zero para receber o seguinte digito e assim também é na escrita. Ainda não consegui decifrar quem são esses pinos pois não entendi a função de RS0 - Ф2 - IRQ/CP.

Se tiver alguma pista será bem vinda.

Abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Hehehe voce gosta de coisa complicada ein ????

Não consegui entender o que que tem o teclado do telefone com o MT8880 e o PIC, mas posso te ajudar no Mitel MT8880.

IRQ/CP - No modo de recepção, quando o CI detectar um tom válido, ele vai colocar essa linha em 0 volts durante algum tempo, sinalizando que existe um dado válido para ser lido.

Ф2 - É uma entrada tipo CLOCK , voce precisa gerar esse clock quando quiser acessar o CI para ler ou gravar alguma informação. Mas fora disto, TEM DE ESTAR INATIVO ok ?

RS0 - Seleciona o registrador a ser acessado na escrita ou na leitura. O CI possui 2 registradores internos, um é o Control Register, e o outro é o Data Register. Veja detalhes no datasheet, página 4-41, tabela 2.

Achei um circuito com o MT8880 e um PIC, que é EXATAMENTE o que voce está querendo fazer :

http://electronics-diy.com/electronic_schematic.php?id=597

Ainda acho bem mais simples o CI da Holtek ....

Paulo

Link para o comentário
Compartilhar em outros sites

ka ka ka ka...............

Professor essa foi nos dedos, pois foi inspirado neste circuito que eu aceitei o desafio e não vou descansar enquanto não consegui pois achei sensacional. Vou montar um alarme que estará conectado em uma linha que terá o telefone de casa em cima então, deste mesmo telefone eu digito um código e a central entra em modo de programação e eu insiro um numero de celular para em ocorrencia de alarme ligar para mim e caso quiser fazer qualquer alteração de numero não preciso entrar no sistema apenas uso o telefone. Será um tremendo barato melhor que isso só com incremento de voz (senha errada - tente outra vez e etc etc.). Vale a pena sonhar, é difícel mas não impossivel.

Este ambiente de conhecimento e troca de idéias é que nos impulsiona aos desafios.

Vale a pena com certeza arregaçar as mangas e ir a luta.

Saudações e obrigado mais uma vez,

Enio.

Link para o comentário
Compartilhar em outros sites

Opa, agora entendí o que voce quis dizer !

É uma boa ideia programar os números no PIC diretamente usando um telefone, sem dúvida ! Repare que o autor do projeto usou uma chave específica para esta função, assim fica bem mais fácil o programa.

Olha, esse projeto é bem fácil de ser programado em Basic mesmo, e eu ainda faria algo diferente para incrementar :

Quase sempre, os ladrões cortam a linha telefônica ANTES de fazer o assalto, faça um circuito detetor de tensão para medir a tensão da linha, caso ela seja menor do que 3 volts acione um alarme sonoro, tipo buzzer, para alertar o usuário de que a linha está sem funcionamento !

E também acione um relê para fazer algo diferente, por exemplo, acender todas as luzes de um local, ligar um aparelho de som, algo assim.

Falo isso porque onde trabalhava aconteceu exatamente isso, os caras cortaram a linha e o alarme ficou inútil.....

A próxima etapa é voce implementar um modem GSM , assim basta voce colocar um chip nele, e caso a discagem pela linha normal seja impossível, disque direto via celular, que tal ?

Veja este site aqui :

http://www.tato.ind.br/detalhesproduto.asp?id=94

Eles tem esses módulos que permitem tanto discar como atender via celular !!!! E o melhor, são fácilmente programáveis em Basic !

Bom, agora tá com voce !

Boa diversão, e depois conte como ficou o projeto.

Paulo

  • Curtir 1
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!