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

Olá Paulo, tudo bem professor!!!

Estou pensando em montar no protoboard somente o MT8880 e fazer alguns testes para entender melhor sua configuração. Entrar com sinais DTMF (por ex. o numero 1 onde obteria 0001 na saida de dados) com um led em D0 eu identificaria o nivel 1 mas como presumo ser muito rápida a informação pensei em colocar scr para fixar o led aceso.

Será que funciona?

Um forte abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Oi meu amigo, tudo bem sim, só descansando esperando prá engordar uns kilos até o dia 1 heheheheh !

Use o sinal CP/IRQ, pois quando ele vai para 0 significa que voce pode ler o sinal nos 4 pinos de saida.

Aí, enquanto esse sinal não voltar para 1, voce simplesmente ignora qualquer leitura dos 4 bits de saida do MT8880.

Quando o sinal voltar para 0, significa que tem um novo dado válido , ok ?

Ainda acho que a maneira mais simples é usar um PIC, com um display 7 segmentos, assim você visualiza o dígito DTMF fácil.

Primeiro, faça polling ( ou seja, fique sempre lendo o pino, sem usar interrupção ) do sinal CP/IRQ, depois, quando funcionar e voce tirar suas dúvidas com o 8880, mude seu programa e use uma interrupção do PIC, toda vez que tiver a transição de 1 para 0 no pino do PIC onde está ligado o CP/IRQ, voce le os 4 bits do MT8880 e armazena o DTMF lido numa variável, e use um flag para sinalizar que voce já leu ou não esse dado. Essa é a maneira mais correta de voce trabalhar ok ?

Manda bala que é tranquilo isso !

Um abraço, Enio, e aguardamos novidades !

Paulo

Link para o comentário
Compartilhar em outros sites

:DHo,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,Ho,:D

Com certeza não há regime que resista o final de ano.

Professor eu pesquizei muito mas ainda pairam duvidas e é por isso que eu penso em fazer esta simulação.

-Quando diz read e write se refere ao bus ==> Bo a B3

Read significa ler dados recebido no bus de dados e enviar tons DTMF na saida TONE.

Write significa receber tons DTMF e escrever no bus.

==>IRQ/CP => mantem-se em 1 e cai a 0 durante a escrita e a leitura.

em read o PIC envia os dados no bus e sinaliza com ZERO o inicio e o fim de D0 a D3.

em write o PIC recebe os dados do bus e a sinalização ZERO da mesma forma.

==>R/W=> o PIC tem que informar com R/W=0 se for escrita e R/W=1 leitura

==>CS=> o PIC tem que setar em zero tanto leitura como escrita.

==>RS0=> ?????????????????????

==>(fi)0=> ?????????????????????

Em razão dessas dúvidas de configuração é que eu pretendo fazer a simulação.

Se o amigo poder acrescentar algo sobre minhas considerações ficarei muito agradecido.

Abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Veja neste datasheet :

http://pdf1.alldatasheet.com/datasheet-pdf/view/77086/MITEL/MT8880.html

Repare a figura 16 . lá deixa bem claro 2 exemplos de sequência que voce tem de fazer.

A primeira é o RESET do chip, e isto tem de ser feito uma vez, ANTES de voce fazer qualquer coisa, e lembre-se de esperar pelo menos 100 milisegundos antes de voce conversar com o chip.

Esta sequência tem de ser feita apenas 1 vez ok ?

Quanto voce conversa com o chip, voce tem de simular um clock, é para isso que serve o sinal (fi)2 !!!!!

Veja agora o exemplo 2 dessa mesma figura 16, é um exemplo de uso do chip.

Do jeito que está escrito, assume-se que voce vai ficar lendo toda hora o registro de status do chip, mas nada impede de voce ficar apenas esperando uma interrupção, repare a observação entre os passos 3 e 4 do exemplo 2 !

Na prática, voce PRIMEIRO define os valores de CS , RS0 e R/W, e só então voce simula o clock (fi)2 da seguinte maneira :

- normalmente sempre deixe (fi)2 em nivel 0 .

- Após voce colocar os valores de CS, RS0 e R/W, espere 1 milisegundo, depois coloque (fi)2 em nivel 1 por 1 milisegundo, e finalmente volte (fi)2 para o nivel 0.

- Espere 2 milisegundos para usar os valores dos bits d0. d1, d2 e d3 . Pronto, operação concluida !!!

Esta é a maneira de voce conversar com o chip. A sequência de dados da conversa está no próprio exemplo 2.

Monte o circuito básico da figura 13 e mande bala ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Boa noite Mestre,

Já estou alinhavando a estrutura do programa.

Quando você diz:

- Espere 2 milisegundos para usar os valores dos bits d0. d1, d2 e d3 . Pronto, operação concluida !!!

Este seria aproximadamente o tempo que o IRQ/CP vai a ZERO durante a escrita. No caso podemos dispensar sua leitura.

Na operação de LEITURA, quando o PIC envia informações pelo BUS DADOS eu obrigatóriamente tenho que manter IRQ/CP = 0 durante o tempo necessario para que o MT8880 saiba que a informação já está completa.

Me corrija se estiver errado professor.

Aquele abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Oi Enio, não, a coisa funciona um pouco diferente :

Em primeiro lugar, quem controla o sinal IRQ/CP é o MT8880, e não o PIC !!!!!!!!!

Ou seja, voce vai ligar uma entrada do PIC nesse pino, entendeu ? é só de leitura, não é de escrita !

O PIC controla o sinal de clock (fi)2, e os outros sinais citados anteriormente.

Lembre-se de que voce tem de primeiro sinalizar ao MT8880 se voce vai ler ou escrever, e só então voce pode mudar os pinos do PIC que estão ligados nos bits d0,d1,d2 e d3 do MT8880, pois quando voce quer gravar dados no MT8880 os pinos do PIC vão virar pinos de saida, e assim que voce gravar os dados, voce tem de transformar novamente os pinos do PIC em entradas, para poder receber os dados do MT8880 em uma operação de leitura, entendeu ?

Na operação em que o PIC vai ler os dados do MT8880 :

- normalmente voce já está mantendo o sinal de clock (fi)2 = 0

- Assim que voce perceber que o pino IRQ/CP foi para zero, voce pode ler os dados dos bits d0,d1,d2 e d3.

Não precisa esperar tempo nenhum neste caso.

Mas imagine que voce deseja transmitir um DTMF imediatamente após ter recebido um DTMF, voce tem de esperar os tais 2 milisegundos após o sinal INT/CP ir novamente para o nivel 1 , para garantir que não haja nenhum problema. Só aí voce pode fazer as operações de escrita no MT8880.

Mas, para as operações de escrita, voce tem de simular o clock da maneira que eu descreví, com a temporização de 2 milisegundos.

Na verdade, se voce fizer com o tempo de meio milisegundo também já dá, mas é melhor ter uma margem boa de segurança.

Veja se entendeu ok ?

Paulo

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

Meus parabéns Professor a este nível de detalhamento de forma tão elucidativa não se encontra em lugar algum e olha que ralei um monte, com auxilio do tradudor google fui em diversos foruns.

As informações que se encontra é a nível profissional já para alunos como eu só através de alguém experiente e disposto a partilhar seu conhecimento.

Valeu, vamos ao projeto.

Abraços,

Enio.

Link para o comentário
Compartilhar em outros sites

Tchecara,

Na verdade, a informação toda está no datasheet... e interpretar o texto é algo em que é necessário ler bem literatura técnica em Inglês ! Usar o Google não ajuda muito nisso.

O funcionamento está mais elucidado nos desenhos de temporização, e é nele que olhamos para termos uma ideia mais clara da sequência de operações que teremos de fazer para "conversar" com o CI desejado.

Quanto ao que voce falou sobre a minha explicação, eu tento fazer um bom uso da experiência que eu acumulei e estou disposto a pelo menos tentar transmitir para quem , como você, está disposto a aprender.

Existem algumas pessoas que me procuram apenas para resolver um problema de trabalho, e outras que eu percebo que querem mesmo aprender. Quanto maior o esforço que me mostram, maior vai ser o meu emprenho em que consigam realizar o que desejam !

Sou adepto do velho ditado : É melhor ensinar a pescar, do que dar o peixe já pego !

Manda bala no projeto, eu estou indo pescar e só volto amanhã de tarde.

Boa diversão, Enio !

Paulo

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

Olá Paulo, Espero que tenha tido um bom Natal e que a pescaria também kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

Estou postando meus códigos para uma avaliação pois não obtive êxito. Por gentileza dá uma olhada.

Forte abraço,

Enio.

'TRANSMISSÃO E RECEPÇAO DTMF

'PIC 16F628A

Define CONF_WORD = 0x3f70

Define CLOCK_FREQUENCY = 4

reset:

For k = 1 To 6 'envia 6 pulsos ou seja 6 bytes de 3 bits CS, RS0 e R/W para resetar o chip MT8880

cs = 0

rso = 1

rw = 0

If k = 1 Or k = 6 Then 'cs, rso, rw ==> 011, 010, 010, 010, 010, 011 ==> 6 bytes para reset do MT8880

rw = 1

Endif

PORTA.6 = cs

PORTB.4 = rso

PORTB.7 = rw

Next k

WaitMs 100 'tempo de espera completar reset

Pic_le_dados: ‘ler DO, D1, D2 e D3

TRISB.0 = 1

TRISB.1 = 1

TRISB.2 = 1

TRISB.3 = 1

cs = 0 'chip Select=0 coloca MT8880 ativo quando 1 inativo

rso = 1 'Escrita ==> O mt8880 recebe dtmf entrada imput PINO 2 e escreve no banco de dados B0, B1, B2, B3

rw = 0 'Escrita

fi2 = 0 'clock

PORTA.6 = cs

PORTB.4 = rso

PORTB.7 = rw

WaitMs 1

fi2 = 1

PORTB.5 = fi2

WaitMs 1

fi2 = 0

PORTB.5 = fi2

WaitMs 2 'aguarda 2 segundos, após esse tempo posso ler os dados D0, D1, D2 e D3

If PORTB.0 = 1 And PORTB.1 = 0 And PORTB.2 = 0 And PORTB.3 = 1 Then 'tecla 9

PORTA.0 = 1

WaitMs 500

PORTA.0 = 0

Endif

Goto pic_le_dados

End

Link para o comentário
Compartilhar em outros sites

Tche,

Sem inicializar as variáveis, nada ia funcionar mesmo ...

E a sequência de RESET está errada.

Abaixo segue o programa corrigido, mas os valores de WAITMS estão todos grandes, apenas para rodar a simulação. Antes de gravar o PIC, coloque os valores corretos ok ?



'TRANSMISSÃO E RECEPÇAO DTMF
'PIC 16F628A
Define CONF_WORD = 0x3f70
Define CLOCK_FREQUENCY = 4

Dim k As Byte
Dim cs As Bit
Dim rso As Bit
Dim rw As Bit
Dim fi2 As Bit
Dim d0 As Bit
Dim d1 As Bit
Dim d2 As Bit
Dim d3 As Bit
Dim dados As Byte

TRISA.6 = 0
TRISB.4 = 0
TRISB.7 = 0
TRISB.5 = 0
TRISA.0 = 0

fi2 = 0

reset:
WaitMs 100 'ESPERA 100 MSEG ANTES DO RESET

Gosub viraentrada
cs = 0
rso = 1
Gosub le

Gosub virasaida

d0 = 0
d1 = 0
d2 = 0
d3 = 0
Gosub escreve

d0 = 0
d1 = 0
d2 = 0
d3 = 0
Gosub escreve

d0 = 0
d1 = 0
d2 = 0
d3 = 1
Gosub escreve

d0 = 0
d1 = 0
d2 = 0
d3 = 0
Gosub escreve

Gosub viraentrada
cs = 0
rso = 1
Gosub le
'PRONTO , AQUI ACABOU O RESET

pic_le_dados: 'ler do, d1, d2 e d3

dados = PORTB 'LE OS 8 BITS DE UMA VEZ
dados = dados And 00001111b 'FILTRA OS 4 BITS DESEJADOS


If dados = 9 Then 'tecla 9
PORTA.0 = 1
WaitMs 100
PORTA.0 = 0
Endif
Goto pic_le_dados
End

escreve: 'faz a gravação no MT8880
PORTB.0 = d0
PORTB.1 = d1
PORTB.2 = d2
PORTB.3 = d3

PORTA.6 = cs
PORTB.4 = rso
PORTB.7 = 0
fi2 = 1
PORTB.5 = fi2
WaitMs 50
fi2 = 0
PORTB.5 = fi2
WaitMs 50
Return

le: 'faz a leitura no MT8880

PORTA.6 = cs
PORTB.4 = rso
PORTB.7 = 1
fi2 = 1
PORTB.5 = fi2
WaitMs 50
fi2 = 0
PORTB.5 = fi2
WaitMs 50
dados = PORTB
dados = dados And 00001111b
Return

virasaida: 'TRANSFORMA OS PINOS DO PIC EM SAIDA

TRISB.0 = 0 'D0
TRISB.1 = 0 'D1
TRISB.2 = 0 'D2
TRISB.3 = 0 'D3
Return

viraentrada: 'TRANSFORMA OS PINOS DO PIC EM ENTRADA

TRISB.0 = 1 'D0
TRISB.1 = 1 'D1
TRISB.2 = 1 'D2
TRISB.3 = 1 'D3
Return


Veja se agora deu certo, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Amigo paulo!

Quanto tempo eim....

Cara, seguinte tava lendo o tópico aqui e me deparei com uma coisa que eu estava precisando a muito tempo, modem gsm..

Mas 380 reais!!!!!!!!!!!!!!!!!!!! :o:o:o:o:o:o

Tenho um desafio para nós!

Fazer um modem gsm de mais baixo custo...

O que acham? Quem topa?

Ele poderia ter comunicação i²c ou serial!

Se for o caso vou abrir um outro tópico.

Link para o comentário
Compartilhar em outros sites

Dá pra ver que o professor veio da pescaria com todo o gás. KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

É sem dúvida um ótimo passa tempo pode não pescar nada mas assunto é que não falta.

Eu omiti a inicialização das variáveis, coloquei apenas a parte mais complexa para tua analise. Estou olhando com muito carinho o que tu postou, tentando entender cada passo da programação, sem dúvida uma "Ótima lição de casa". Já testei PSI e rodou direitinho.

Valeu por mais essa.

Aquele abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Pois é, cansei de pegar matrinxãs ... mas as pirararas nem quiseram saber de morder nenhuma isca, enfim, nem tudo é perfeito !

Dani, faz tempo mesmo, realmente esses modem gsm custam os olhos, mesmo na China estão na faixa de US$ 55 cada.

O problema em fazer ele é só um : onde que arrumamos o transceptor gsm ( receptor e transmissor ) ?

O protocolo até não é difícil, eu já fiz um modem para falar com os flightfones dos avioes ( 1989..... ) , no fundo é apenas mais um modem com um subset específico de comandos "AT" ( que saudades dos modens Hayes ... ), pode ser feito tudo em basic mesmo. Mas o hardware ..........

Acho que por enquanto é melhor comprar o conjunto pronto viu Dani !!!

Tche, o RESET é uma sequência de comandos, começa com uma leitura, depois vem algumas escritas com dados específicos, e finaliza com uma leitura. Veja essa sequência naquela figura do datasheet ok ?

Depois, é só ficar lendo, mas para evitar surpresas lendo um bit de cada vez, eu preferí ler todos os bits e isolar apenas os que nos interessam.

Isso foi feito para evitar que por um acaso daqueles quase impossíveis, quando voce estivesse lendo um bit o dado tenha mudado para um outro tom... tá certo que a chance é quase zero, mas existe !

Bom, testa num protoboard e ve o que acontece ok ?

Um abraço a todos, e hoje vou pescar novamente bem cedinho ( daqui umas 4 horas .... )

Paulo

Link para o comentário
Compartilhar em outros sites

Boa Tarde Professor,

Depois de analisar linha por linha encontrei 3 erros (seria pega ratão?):DKKKKKKKKKKKKKKKKKkkkkkkkkkkkkkkkkkkkkkkkkk

Na operação RESET:

na segunda e terceira escrita os D3 estão com valores invertidos;

na quinta escrita faltou D0, D1, D2 e D3

1- Conforme você me disse, "Deve-se sinalizar antes se vai ler ou escrever (CS, RS e RW) sòmente após setar no PIC D0, D1, D2 e D3 para entrada ou saida.

==> não observei isto na operação de reset.

2- Depois do reset completo não teríamos que executar a seqüencia do segundo exemplo? E lêr sòmente após o irq/cp ir a zero quando então os bits estariam prontos em D0, D1, D2 e D3?

GRAVEI no chip mas não foi dessa vez!!!!!!!!!

:-BEER Com esse calor só tomando uma gelada.

Professor até a próxima aula.

Abraços,

Enio

Link para o comentário
Compartilhar em outros sites

Oi Tche, vamos lá :

Primeiro vou copiar aqui a sequência de RESET do datasheet :


Description Control Data
CS RS0 R/W b3 b2 b1 b0
1) Read Status Register 0 1 1 X X X X
2) Write to Control Register 0 1 0 0 0 0 0
3) Write to Control Register 0 1 0 0 0 0 0
4) Write to Control Register 0 1 0 1 0 0 0
5) Write to Control Register 0 1 0 0 0 0 0
6) Read Status Register 0 1 1 X X X X

Veja que consiste em uma leitura, seguida de 4 escritas, e termina com uma leitura.

Repare que os valores dos dados nas leituras estão como X.

Significa que não se aplica, pois quem vai fornecer os dados é o MT8880 !

Já nas escritas, os valores estão definidos como 0 ou 1, portanto são relevantes.

Agora, segue o meu código que utilizo na leitura :


Gosub viraentrada
cs = 0
rso = 1
Gosub le

Veja que eu mudo sim os pinos de D3,D2,D1 e D0 para que eles virem entrada, e só depois eu faço a leitura do MT8880.

Os valores que eu escrevo estão corretos, não encontrei nada invertido.... analise melhor o meu programa, e verá que não falta nenhum valor de D3,D2,D1 e D0 nas escritas !

Quanto ao seu Item 2, eu não estou usando a interrupção, pois ví que no seu programa voce também não está usando heheheh, como voce apenas deseja detectar o tom do 9, eu fico apenas fazendo Polling.

Mas o correto seria adaptar o programa para ler o status register para saber se temos dado válido certo ? Pode ser feito sem usar interrupção !

Basta ler o STATUS REGISTER, e testar o bit D2, se estiver setado , só aí voce faz uma leitura no RECEIVE DATA REGISTER. Veja detalhadamente a sequência do EXAMPLE2 do datasheet ok ?

Deixo isso para voce, dileto "aluno" ( HAHAHAHAH ) !

Paulo

Link para o comentário
Compartilhar em outros sites

Olá Professor Paulo,

Continuo na luta, precisei fazer download de um osciloscópio de pobre para fazer averiguações de sinais no protoboard. Esse aqui é o melhorzinho segundo alguns (http://www.zeitnitz.de/Christian/scope_en). Mas o meu objetivo aqui é colaborar com os amigos e indicar um link que tem um projeto de uma ponteira para osciloscopio de pc bastante interessante (http://wiki.laptop.org/go/Measure/Projects/Oscilloscope_probe) quem já montou diz que funciona legal.

Deixo a todos um Feliz Ano Novo.

Enio.

Link para o comentário
Compartilhar em outros sites

Olá Paulo,

:priv:Já tive progressos, consegui fazer com que o MT receba informação de dados via PIC e envie tom dtmf; Porém entrar com dtmf no MT e fazer a PORTA.0 = 1 conforme o projeto não estou conseguindo. Estou usando um teclado de um telefone velho para originar os tons. Consigo monitorar o tom no pino 2 do MT. Teria alguns sinais que eu pudesse averiguar no MT pois em relação ao PIC tá tudo OK.

:-BEERAbraços,

Enio.

Link para o comentário
Compartilhar em outros sites

:-BEER FELIZ 2010:-BEER

Eureka!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Consegui já estou lendo e escrevendo a "meiaaaaaaaaaaaa boca", tenho algumas duvidas.

Fiz todas as etapas do example 2 e no final verifico se bit2(D2) = 1 e então faço a leitura.

Acho que já escrevi umas 999,9 vezes no pic KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Fiz varias tentativas.........................................e então, decidi recorrer ao Mestre.

===> cosigo ler apenas um dado no caso o numero 9.

Como deveria proceder para ler n dados, teria que fazer um reset a cada leitura ?

===> No caso da escrita, a exemplo da leitura verifico se bit1(D3) = 1 e sòmente após faço a escrita ? Tenho o mesmo problema não consigo enviar seqüencia de numeros.

Um forte abraço e que esse ano seja repleto de alegrias, e muita paciência para aturar o aluno aqui,

Enio.

:ahh:

post-606226-13884954185406_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Aeeee Tchêeee !!! Acabei de voltar da praia, desculpe por não ter respondido antes !

Bom Ano Novo para todos, quem sabe Papai Noel traz uns políticos honestos de presente para o Brasil !!!

===> cosigo ler apenas um dado no caso o numero 9.

Como deveria proceder para ler n dados, teria que fazer um reset a cada leitura ?

Não precisa fazer o Reset mais de uma vez !!!!

Agora, voce tem de ficar checando o STATUS. Cada vez que voce ler um dado recebido do DTMF, o STATUS é automáticamente zerado novamente, e você só tem de ficar lendo ele de novo, até ter um novo dado recebido ok ?

A solução mais indicada para você é fazer um "buffer circular" , ou seja, uma matriz de , por exemplo, 10 elementos, e voce vai colocando os dados sequêncialmente, desde o início até o último, e uma variável de "ponteiro" indica qual a posição atual do ponteiro de escrita. Quando voce gravar a última posição, o ponteiro volta ao início, e assim vai sobre-escrever a matriz novamente.

Claro que para isso funcionar legal, voce tem de ter um outro "ponteiro de leitura", que indica a posição do último valor que voce leu na tabela....

Bom, falo isso para voce pesquisar sobre esse tipo de programa na Internet, ele é muito usado em comunicação de dados ok ?

Mas voce não precisa disso, como voce quer detectar uma sequência de alguns dígitos ( pelo menos eu imagino... ) , pode fazer uma máquina de estados simples, para detetar uma sequêcia válida digito a dígito.

Se , por exemplo, voce detetar o primeiro e o segundo, mas o terceiro dígito for errado, simplesmente volta ao início de toda a sequência.

===> No caso da escrita, a exemplo da leitura verifico se bit1(D3) = 1 e sòmente após faço a escrita ? Tenho o mesmo problema não consigo enviar seqüencia de numeros.

Copio novamente do Datasheet :


3) Write to Transmit Data Register 0 0 0 0 1 1 1
(send a digit 7)
--------------------------------------wait for an interrupt or poll Status Register ----------------------------------------------
4) Read the Status Register 0 1 1 X X X X
-if bit 1 is set, the Tx is ready for the next tone, in which case...
Write to Transmit Register 0 0 0 0 1 0 1
(send a digit 5)

Uma vez preparado o MT8880 para enviar DTMF no modo Burst ( que é o que esse exemplo faz nos ítens 1 e 2 ), voce escreve o dado DTMF, e fica lendo o STATUS de transmissão, que é o bit D1 ( preste atenção nisso !!! ).

Quando o CI estiver pronto para transmitir outro dado, ele vai setar esse bit, e então voce pode escrever novamente o dado a ser transmitido, ok ?

Repare que nada impede voce de ler o STATUS apenas uma vez, e saber se existe dado recebido pelo CI ( bit D2 ), ou se pode transmitir novamente ( bit D1 ), e sinalizar por algum flag ambas a operações.

Crie uma nova funcão LE_STATUS, onde na saida ela indica pelos flags TX_OK se pode transmitir, e DADO_OK se tem um novo dado para ser lido ok ? Lembre-se de declarar essas variáveis no início como tipo BIT.

Agora, o limite é sua imaginação, e só depende de sua experiência em programação !!! Vai tentando que só assim que se aprende !

Ah ..... pode ficar tranquilo , voce ainda pode gravar o seu PIC pelo menos umas 149.000 vezes ainda sem nenhum risco !!!!!!!!!!!!!!!!!!!!!

Um abraço !!!

Paulo

Link para o comentário
Compartilhar em outros sites

Olá Paulo, :D

Obrigado pela dedicação, desculpe-me por ser inconveniente mas a minha bolinha é muito curta embora eu tenha boa vontade.

-A recebeção de tons DTMF está funcionando legal.

eu fiz uma sequencia de 3 numeros quando completada portb.0 = 1

-Na transmissão ainda estou ratiando.:confused:

Conforme exemplo 2 Datasheet transmitir o numero 75.

- Após o reset

- executar os itens 1 e 2

- no item 3 eu envio o meu primero número (7) para o BUS DE DADOS

- aguardo uns 100 ms

- no item 4 eu faço a leitura até que o bit 1 (D3) = 1

- agora posso enviar o segundo número (5)

e assim sucessivamente para enviar n números (enviar – checar bit 1 – enviar).

É isso ai meu amigão.

Aquele Abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Olha, tem uma maneira de ficar tudo bem mais fácil :

- Se voce esperar 200 mseg antes de transmitir um novo numero, pode simplesmente escrever, sem ler o STATUS, que tal ?

Tenta desta maneira, e veja se funciona. Lembro apenas que a transmissão está sendo feita no modo Burst, portanto cada dígito dura menos de 100 mseg....

Veja se agora vai !!!

Paulo

Link para o comentário
Compartilhar em outros sites

:DGoooooooooollllllllllllllllllllllllllllllllllllllll:D

:aplausos:Que golaço professor

Funcionou beleza e para conferir liguei a uma linha telefonica e fiz a ligação com total sucesso.:lol:

Mas a luta continua kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

Os numeros que irei receber serão codigos do tipo *3593# ==> ligar alarme etc, etc.....

A variavel dados não está aceitando os simbolos * e #, teria que mudar a declaração dela.

Estou pesquizando.

Indicaria algum livro de basic bom para consulta, os que eu tenho são de visual basic e é um saco 95 % dele é sobre como usar o programa visual basic e o restante dá uma pincelada na linguagem basic tenho um de QBasic mas também já tá muito defasado.

Saudações,

Enio.

Link para o comentário
Compartilhar em outros sites

Heheheh legal, viva a GAMBIARRA !!!! Tem horas que a gente ganha um tempão com umas sacadas dessas !!!! Agora tá quase tudo ok.... quanto ao Visual Basic, ele não tem nada, mas NADA mesmo parecido com a linguagem Basic tradicional, é pura perda de tempo...

Eu sugiro mesmo voce ler com atenção o manual do próprio PSI, alguém postou um link aqui neste Fórum de uma versão traduzida da documentação, é excelente para voce começar, ok ?

Quanto ao seu problema com a variável DADOS , ela aceita qualquer valor numérico entre 0 e 255, portanto mais do que o suficiente para voce tratar os 16 caracteres do teclado DTMF , não é ?

O problema é que voce tem de "traduzir" os símbolos..... repare no Datasheet a figura 7 :

Os digitos de 1 a 9 realmente correspondem ao valor decimal de 1 até 9, mas daí em diante, voce tem de substituir no seu programa :

"0" = 10

"*" = 11

"#" = 12

"A" = 13

"B" = 14

"C" = 15

"D" = 0

Ou seja, se voce quiser transmitir um símbolo "#" , tem de fazer DADOS = 12 e chamar a transmissão !

Igualmente, se na recepção voce tiver o valor DADOS = 0 , significa na verdade que voce recebeu o símbolo "D" !!!

voce pode fazer essa "equivalência" usando a função LOOKUP, sendo que usará uma para codificar a transmissão, e depois usará outra para fazer a recepção, entendeu ?

Meu amigo, a melhor maneira de aprender é essa que voce está fazendo : metendo as caras ... não tem aprendizado melhor do que esse !

Volte ä "bancada" e veja se deu certo ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Antes de mais nada parabens Paulo pela segunda parte do tutorial do PSI. Após um tempo ausente e voltando ao estudo do assembler do PIC e também do BASIC torno a pedir uma orientação aos mestres de plantão: Como fazer para enviar via RS232 uma mensagem com cinco bytes para o PIC onde o primeiro byte, o terceiro e o quinto sejam caracteres de controle (uma maneira de ter certeza que o segundo byte e o quarto byte contêm as informações corretas)?

A rotina de recepção de um byte via rs232 põe o byte recebido em W

movf TEMP ;Salvo o byte recebido em TEMP

incf CONTADOR ;incremento CONTADOR

movf CONTADOR,W ;Carrego W com o valor de CONTADOR

xorlw 0x01 ;Verifico se é o byte 1

btfss STATUS,z

goto TESTA_GRUPO

return ;volta para a rotina de recepção

TESTA_GRUPO

MOVF TEMP,W ;carrega W com o Byte recebido

XORLW 0X47 ;TESTA SE É O CARACTERE "G"

BTFSC STATUS,Z

return

BSF PORTB,4 ;SE SIM, LIGA LED

INCF CONTADOR

MOVLW 0X2A ;CARREGA W COM "*"

return

essa rotina se repete 5 vezes, porém só identifica o primeiro byte, os seguintes não. lembrando que os bytes 1,2 e 3 são descartados, a informação está contida nos bytes 2 e 4 que seriam salvos e utilizados.

Grato.

IAS

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!