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

Ola pessoal

Alguem poderia me dar uma ajuda com codigos que usa LCD, no PSI simula normal, mas no Proteus ISIS apresenta este erro "attempted to read after write a single nibble ".

Estou usando somente 4 bits (NIBBLE) ,mas se eu mudar para 8 bits simula normal.

Estou usando todos os pinos do LCD no mesmo port (ex. Port D),mas ja testei outras configuraçoes e tambem nao deu certo.

Obrigado a todos

jfeliciano

Link para o comentário
Compartilhar em outros sites

  • Coordenador

Colega Guilmo, é muito louvável sua atitude!, não existe limite de idade para aprender coisas novas nesta profissão!..., sua cabeça já trabalha focada nisso!..., sugiro começar lendo o tutorial postado pelo colega Paulo, na primeira mensagem deste tópico..., já vai te dar um boa base!...

Link para o comentário
Compartilhar em outros sites

Amigo Guilmo,

Muito legal sua atitude, e posso te responder com certeza que voce consegue !

Olha, eu tenho 50 anos, e a ÚNICA coisa que me limita é o uso de óculos para enxergar de perto :D !

Se voce quer mesmo aprender, conte conosco, estamos aqui dispondo nosso conhecimento e tempo para pessoas que como voce desejam aprender. É uma honra poder ajudar !

Começe da maneira correta, baixe o tutorial, leia desde o início, o importante é voce entender os diversos " circuitos eletrônicos " que existem dentro dos PIC's, e assim poder usar em seus programas.

Baixe o PIC SIMULATOR IDE, e copie os exemplos do tutorial, siga passo a passo as intruções sobre a simulação, principalmente nos dois primeiros exemplos, que são muito bem comentados em todos os passos.

É importante voce entender o "jeito" do BASIC, se tiver muitas dúvidas existem muitas versões disponíveis na Internet, muitas delas são freewares, e voce pode ler tutoriais sobre a linguagem, praticar e pegar o jeito.

Depois disso fica muito simples voce entender o BASIC do PSI, pois apenas foram acrescentadas instruções relativas ao hardware do PIC.

Poste aqui as suas dúvidas, ok ?

Jfeliciano,

Muita gente passa pelo que voce está passando, os programas funcionam até na vida real, mas não funcionam no Proteus.

É que existem pequenos truques no Proteus, algumas definições do programa em relação ao hardware tem de ser feitas manualmente.

Sugiro voce criar um tópico em separado, tem algumas pessoas bem experiente no Proteus que podem te ajudar fácilmente, ok ?

Um abraço a todos.

Paulo

Link para o comentário
Compartilhar em outros sites

amigo boa noite:

amigo guilmo tudo bem, seja bem vindo, pode contar com todos, tambem sou novato

por aqui, com a ajuda de todos deste forum estou aprendendo bem de devagar, não quero atrupelar as coisas, estou aprendendo a trabalhar com os Ios do pic 16f877a

graça a todas as feras desse forum, são tudo gente boa, só o fato de você postar a sua idade aqui ja é uma vitória, dezistir nunca, lembre-se aforça de vontade

desculpe gente apertei a técla errada, esva querendo dizer que a força de vontade é

o inicio de tudo, parabens.

Link para o comentário
Compartilhar em outros sites

Amigo Guilmo...

Seja bem vindo ao forum e não se preocupe quanto a idade.....parece que aqui a maior parte é "coroa". Eu mesmo tenho 58 anos, também trabalhei com rádio mono e multicanal e até há um ano atrás não entendia nada de programação de PIC's apesar de algumas tentativas anteriores estudando assembler. Hoje, graças aos companheiros desse fórum, já consegui resultados práticos inimagináveis há um ano atrás. Se houver alguma coisa em que possa ajudar, pode contar.

IAS

Link para o comentário
Compartilhar em outros sites

Vosso pedido é uma ordem !!!

Define CONF_WORD = 0x31c4
'configurado para clock interno de 4 Mhz
'e GP3 como I/O em vez de Reset
Define CLOCK_FREQUENCY = 4
AllDigital

TRISIO = 11111100b 'GP0 e GP1 saidas; GP2 entrada
WPU.2 = 1 'habilita o weak pull up
Symbol led1 = GP0
Symbol led2 = GP1
Symbol botao = GP2

Dim vled1 As Bit
Dim vled2 As Bit
inicio:
If botao = 1 Then Goto inicio
vled1 = 0
vled2 = 1
Gosub saida
WaitMs 10
vled1 = 1
vled2 = 0
Gosub saida
WaitMs 10
Goto inicio
End
saida:
led1 = vled1
led2 = vled2
Return

Basta ligar dois leds através de um resistor de 270 ohms ou maior aos pinos GP0 e GP1, o outro pino dos Leds pode ser no terra ou no +VCC, só cuidado com o sentido dos Leds; e um botão ligado ao terra no pino GP2, e pronto.

Quando apertar o botão na primeira vez e manter apertado, os LEDs vão piscar; quando soltar o botão, pára do jeito que está..., ao apertar, eles continuam piscando.

Detalhe : o valor do WAITMS 10 serve apenas para a simulação; se for fazer o projeto real, substitua por WAITMS 500 , compile e grave o chip com esse valor, ok ?

Boa diversão !

Paulo

Link para o comentário
Compartilhar em outros sites

Saudações aos usuários do CDH!

Meu nome é Leonardo, tenho 40 anos, atuo na área de eletrônica/informática, manutenção/operação.

Acompanho esse tópico desde janeiro/2010, gostaria muito de parabenizar o Paulo por esta importante contribuição que viabiliza leigos como eu, ter acesso a programação dos microcontroladores.

Agradeço também aos usuários que sempre estendem a mão diante das dúvidas: Felipe, SOSCHIP, IAS, Jorgeletrônico, e aos demais usuários, que com suas dúvidas ou erros, revelam caminhos que iniciantes não devem percorrer.

Muito obrigado a todos!

Link para o comentário
Compartilhar em outros sites

Felipe,

Tem certeza ??? Porque no datasheet dele tá dizendo que é ativado em 1 .... segue em anexo o trecho do datasheet. dá uma conferida se realmente eu tenho de inverter o bit, pois eu não montei o circuito, só simulei no PSI .

Leonardo,

Obrigado pelas suas palavras, e voce pode ver que sempre somos ajudados por vários amigos, isto que faz este tópico ser realmente útil !

Paulo

post-464954-13884956431516_thumb.png

Link para o comentário
Compartilhar em outros sites

Uepa, faltou um detalhe que acabei esquecendo, os PIC12, podem ter seus WPU habilitados individualmente e em nivel '1' conforme citado pelo grande mestre. O bit que deve ser invertido é o GPPU (equivalente ao RBPU) que fica no option_reg.

To ficando velho =D. Valeu mestre!

Abs.

Link para o comentário
Compartilhar em outros sites

Opa, que isso, Felipe, eu que agradeço por voce acompanhar o que eu escrevo, aliás, não era voce que dizia que só programava em Assembler ???? :D:D:D

Tá ficando velho ?????? BEM-VINDO AO CLUBE !!!!!:lol:

Tá ficando bom em Basic, meu velho amigo !!!! :D

Num esquenta não, a gente se confunde o tempo todo com os AVR's e PIC's.... se voce reparar na maioria de meus posts, quase todos tem algum tipo de edição, o motivo é exatamente este :

Eu estou trabalhando apenas com os AVR's agora, e muitas vezes escrevo coisas sobre os PIC's que não estão "totalmente corretas" , depois eu releio e acho algum erro e corrijo !

Mas sempre que voce achar algo suspeito , por favor, poste mesmo, que é para a gente não ensinar a ninguém errado !

Um abraço !

Paulo

P.S. : a vantagem do Basic : que raios que é isso de GPPU, RBPU ???? ( brincadeira !!! )

Link para o comentário
Compartilhar em outros sites

voce está certíssimo !!!

Felipe, me diz uma coisa, como voce tem bastante experiência com rotinas tipo FFT, na sua opinião, se eu fizer um analizador de espectro de áudio, tipo aqueles equalizadores com freq. de 32, 64, 128 ... 16 Khz, utilizando um AVR, com 10 faixas de frequências, aliás, se eu dividir esse trabalho para 2 AVR´s , cada um deles ficando com 5 bandas, e apresentar esse espectro numa matriz de Leds tipo 8 Leds x 5 colunas ( bandas ) , usando multiplex e podendo escolher entre mostrar apenas um Led em cada coluna, ou acendendo desde o primeiro até o led desejado, voce acha que conseguiremos fazer isso com um avr típico ( clock de 16 ou 20 Mhz ) ?

Lembre-se de que só precisamos da amplitude , não da fase .

Imagina a simplicidade de um projeto desse tipo, em vez de usar dezenas de filtros analógicos, usamos 2 Avr´s tipo Atmega 4 ou acima, para cada canal, e as matrizes de Leds, só isso !

Se achar que sim, voce conseguiria me ajudar na rotina de fft em basic, pois eu demorei uma semana só para escrever um filtro simples para detectar uma só frequência, e ainda não conseguí entender o algoritmo para fazer essa rotina. Para o analisador, preciso calcular e mostrar as 5 frequências pelo menos umas 5 vezes por segundo para ficar com efeito bom.

É um velho sonho, desde que eu participei do QRT-8800 da Quasar....

Veja o que voce acha.

Paulo

Link para o comentário
Compartilhar em outros sites

Interessante seria dividir o trabalho nos dois avr de modo que um faz o processamento e o outro so a parte grafica no caso a matriz de leds.

A brincadeira seria analisar um bloco de amplitudes onde cada uma iria representar uma função X(t), uma FFT nada mais do que pegar o sinal no dominio do tempo e aplicar varias pequenas DFTs no mesmo, para representar sua amplitude em função da frequencia, ou seja mestre paulo, acho que seria interessante primeiro tentar fazer uma DFT em um sinal amostrado pelo A/D do AVR e verificar em quanto tempo ele faz uma DFT para um valor lido.

Feito isso basta fazer a bagaça varias vezes, empregando o tal de metodo butterfly que tenho uma literatura da Texas bem legal.

Mas a minha sugestão em suma é deixar um AVR para fazer a função DSP (vamos precisar de ponto flutuante na brincadeira). e Outro para a parte grafica.

POsso dar uma olhada no codigo a medida que você for fazendo pra dar uns pitacos o que acha?

Abs.

Link para o comentário
Compartilhar em outros sites

Felipe, a parte gráfica é tranquilo, até a conversa entre os AVR´s é fácil de fazer.

O problema mesmo é o tal método Butterfly , acho que com 10 frequências não vamos conseguir fazer isso em Basic, só se utilizarmos rotinas matemáticas mais rápidas, tipo com inteiros e words. Se utilizarmos ponto flutuante, demora muito as contas, ainda mais para fazer a coleta, a conta e comunicação em 200 mseg.

Se for possível usar uma tabela de valores de seno ou cosseno já calculadas para facilitar, ajuda bastante.

Olha, eu lí e relí esse butterfly, e não consegui entender como funciona isso para codificar em Basic.

Achei algumas rotinas de DFT em basic bem antigo, que usam o butterfly, mas elas calculam também fase e trabalha com numeros complexos, para o que precisamos basta calcular a parte real, e só a amplitude relativa.

Se voce conseguir algo tipo um algoritmo, ou até escrever o trecho do butterfly, já dimensionado para apenas as quantidades de amostras necessárias para termos uma aproximação razoável , já resolve o problema, o resto eu mesmo me viro, e voce vai dando os pitacos para melhorarmos.

Mas acho que a taxa de amostragem vai matar a gente ... pelo menos 32 Ksamples por segundo, vamos perder bastante tempo na coleta. Se usarmos um AVR cheio de RAM, por exemplo, um ATMEGA32, podemos fazer a coleta de dados e ir tratando o buffer anterior ao mesmo tempo, pois temos RAM para dois buffers de dados, o que que voce acha ? Só que o clock máximo dele é de 16 Mhz.

Sou muito fraco nisso de DSP, essa é a parte onde voce faz a diferença !!!

Um abraço !

Paulo

Link para o comentário
Compartilhar em outros sites

Eu sei que essa expressão aqui(da DFT) é constante então ja da pra manter calculada : e^-jw

ja da pra fazer essa operação em flutuante na mao e fazer a tradução para inteiro e obter uma precisão impressionante sem usar float (graças a nossa velha amiga microchip que tem um app note com numeros em FP)

O maior segredo do metodo butterfly é fazer a inversão dos termos, e isso tenho aqui de forma simples, eu achei certa vez um site que tinha funções para DSP usando AVR, so que em C, se for o caso seria interessante traduzir os algoritmos feitos em C e descer ele pro asm e rodar embarcado so a FFT em ASM no Basic, o que acha? Eu posso fazer a tradução do algoritmo pra ASM e comentar.

Certa vez fiz uma FFT usando um DSP56K da freescale / motorola de 512 pontos, vou ver se encontro o codigo (pois ja faz bastante tempo) e posto pra ficar mais fácil.

Quanto ao timing, me diga porque nao usamos as versões ATTINY que possuem uma PLL interno que permite gerar bases de tempo de ate 64MHz para usar com os perifericos, com isso esse tiny faria o processamento do sinal, cabendo a um ATMEGA32 ou ao ATMEGA1280 (o que uso atualmente) fazerem a parte grafica, ja que essa vai exigir maior FLASH, ao passo que para a função DSP vamos precisar de muita RAM para os buffers, tem tiny ai com 1k de RAM que da tranquilamente ja que a FFT sera de apenas 10 pontos.

Para os PICfanaticos, o assunto aqui também vale para os MCU da microchip, quem tiver sugestoes fique a vontade!

Abs.

Link para o comentário
Compartilhar em outros sites

Caros,

Já fiz a simulação de alguns programas da apostila PSI, após gerar o arquivo hex quando eu for gravar o PIC 16F84, será necessário fazer alterações no "PIC setting" do gravador?

Uso o gravador Willem Eprom versão 0,97ja, segue foto.

Estou com essa dúvida porque antes de gerar o arquivo hex, essas configurações foram pré-selecionadas no PSI. Até então tenho usado esse gravador para cópia de EPROMs.

Nos posts anteriores do TheCara ele menciona a necessidade de alterar a opção do oscilador para XT.

skinwillemeprom.jpg

Abç.

Link para o comentário
Compartilhar em outros sites

Quanto ao timing, me diga porque nao usamos as versões ATTINY que possuem uma PLL interno que permite gerar bases de tempo de ate 64MHz para usar com os perifericos, com isso esse tiny faria o processamento do sinal, cabendo a um ATMEGA32 ou ao ATMEGA1280 (o que uso atualmente) fazerem a parte grafica, ja que essa vai exigir maior FLASH, ao passo que para a função DSP vamos precisar de muita RAM para os buffers, tem tiny ai com 1k de RAM que da tranquilamente ja que a FFT sera de apenas 10 pontos.

Caramba, Felipe, tá vendo o quanto voce pode ajudar ??? Eu nem sabia que os Attiny podiam chegar nesse clock .... é uma beleza isso !!!

E pelo que vejo, também pode ser feito com um PIC para facilitar e usar o código do FFT, e usar outro PIC na visualização, ou até mesmo um AVR !

Por outro lado, se voce conseguir passar o código para o Asm dos AVR, nem precisa comentar, apenas me dizer os parametros e aonde eu tenho de pegar os dados, tipo um buffer em RAM e um flag de ready... eu consigo colocar dentro do Basic, sem nenhum problema, fazendo em Basic apenas a parte de comunicação com o segundo microprocessador !

O restante, toda a visualização do display, é fácil em Basic, e nem precisa ser um chip com tanta flash, acho que 8K tá mais do que suficiente para tudo !

Leonardo,

O que voce tem de ter cuidado é com o CONFIG WORD do PIC16F84, por exemplo, precisamos saber se voce vai usar um cristal padrão de 4 Mhz ( escolha XT ), ou se vai usar um oscilador tipo RC, o Watchdog tem de estar desligado, o Power-UP timer tem de estar ligado. Essas configurações são as que voce tem de mudar, ok ?

Elas também tem de ser selecionadas de acordo no PSI, veja na apostila como fazer isso.

Um abraço a todos.

Paulo

Link para o comentário
Compartilhar em outros sites

Leonardo,

O que voce tem de ter cuidado é com o CONFIG WORD do PIC16F84, por exemplo, precisamos saber se voce vai usar um cristal padrão de 4 Mhz ( escolha XT ), ou se vai usar um oscilador tipo RC, o Watchdog tem de estar desligado, o Power-UP timer tem de estar ligado. Essas configurações são as que voce tem de mudar, ok ?

Elas também tem de ser selecionadas de acordo no PSI, veja na apostila como fazer isso.

Um abraço a todos.

Paulo

Mestre, tava lendo exatamente isso na apostila, estou com um cristal em mãos de 11.0592 Mhz e se eu fosse usá-lo teria que escolher HS. Ok!

Quando eu for usar o gravador farei as "escolhas" conforme o PSI/apostila.

Estava pensando usar nas primeiras montagens o PIC 16F628A, mas já mudei de ideia para evitar erros. Usarei todos os componentes citados na apostila.

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

Leonardo,

Exatamente o que eu ia te sugerir .... compre logo um PIC16F877A ou 16F877, assim voce pode seguir tudo da apostila sem ter de mudar alguma coisa que, neste momento, voce ainda não esteja com o conhecimento necessário para fazer funcionar na prática. Use o cristal que eu usei no tutorial, assim não vai precisar mudar nada nas temporizações, ok ?

Só para confirmar, o modo correto é mesmo o HS para esse cristal de 11 Mhz !

Um abraço !

Paulo

Link para o comentário
Compartilhar em outros sites

amigo obrigado pelo codico mais porém esta aparecendo um erro na linha (Gosub saida)

tentei varias vezes e não consegui teirar esse erro, por favor obrigado.

Define CONF_WORD = 0x31c4

'configurado para clock interno de 4 Mhz

'e GP3 como I/O em vez de Reset

Define CLOCK_FREQUENCY = 4

AllDigital

TRISIO = 11111100b 'GP0 e GP1 saidas; GP2 entrada

WPU.2 = 1 'habilita o weak pull up

Symbol led1 = GP0

Symbol led2 = GP1

Symbol botao = GP2

Dim vled1 As Bit

Dim vled2 As Bit

inicio:

If botao = 1 Then Goto inicio

vled1 = 0

vled2 = 1

Gosub saida ´esta aparecendo um erro nessa linha

WaitMs 10

vled1 = 1

vled2 = 0

Gosub saida

Link para o comentário
Compartilhar em outros sites

Ola,

Paulo

Aprovetando a deixa do Leonardo, quero fazer umas perguntas.

Se for usar o oscilar RC, mas com a frequencia variavel, variando o valor de R , com um potecimetro por ex.

Como fica o " Define CLOCK_FREQUENCY ?

E se tem como simular isto no PSI ?

E como calcular frequencia minima e maxima ?

Obrigado

Jfeliciano

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!