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
Run-time error '5'

O PSI não compila, dá o erro e fecha o programa, para eu descobrir isso levou um bom tempo, apaguei o valor lógico sem querer. A causa está na ausência do valor lógico como no exemplo abaixo:

led=0
waitms 500
led=

Eu "rabisquei" alguma coisa aqui e coloquei esse seu código aí do jeitinho que está aí no PSI daqui e não aconteceu nada não.

Só p/ tirar a dúvida.

Coloca o código inteiro aí, desde o começo p/ eu ver se acontece o mesmo aqui.

Agricio

Postado

Ola Agricio,

Fiz o teste aqui e tambem deu o mesmo erro que Leonardo-SP, comentou

Foi só omitir um dos falores que deu o erro.

veja o exemplo que usei pra fazer o teste

AllDigital

TRISB = 0x00

Symbol led = PORTB.0

inicio:

led = 1

WaitMs 10 '0

led = 0

WaitMs 10 '0

Goto inicio

Jfeliciano

Postado

O máximo que aconteceu aqui foi indicar erro na linha 10; mas não fecha o programa não. Veja aí nas figuras abaixo; com o erro na LINHA 10 e depois SIMULANDO.

P/ que o led fique piscando o código é esse aí com PIC16F628

Define CONF_WORD = 0x3f70
Define CLOCK_FREQUENCY = 8
AllDigital
TRISA = 1
TRISB = 0
Symbol led = PORTB.0
inicio:
led = 1
WaitMs 10 '0
led = 0
WaitMs 10 '0
Goto inicio

Agricio

Postado

Também estou aprendendo, fiz um exemplo espero que seja útil para alguns, uma dica é evitar o uso de variaveis como "led" pois isso faz o programa ser maior, usando PORT diretamente fica um programa menor.

Meu exemplo usa comparação e verdadeiro (execute se for verdadeiro)

Descrição:

No inicio os 3 leds iniciam apagados, para ativalos precisa que duas chaves sejam acionadas(lógica AND), quando acionadas os leds vão acender em sequencia em um intervalo de tempo. Quando uma ou as duas chaves forem desacionadas os leds vão apagar em um sequencia de tempo.

Pic 16F84A

Define CONF_WORD = 0x0001
Define CLOCK_FREQUENCY = 4
TRISA = 0xff
TRISB = 00000001b
PORTA.0 = 0
PORTA.1 = 0
Dim x As Bit
inicio:
x = PORTA.0 And PORTA.1
WaitMs 100
If x = 1 Then
PORTB.1 = 1
WaitMs 100
PORTB.2 = 1
WaitMs 100
PORTB.3 = 1
Else
PORTB.1 = 0
WaitMs 100
PORTB.2 = 0
WaitMs 100
PORTB.3 = 0
Endif
Goto inicio
End

Amigos, alguem poria ajudar a fazer um timer em minutos (ex:30min )? Não sei por onde fazer, já que a função Wait é para mili ou micro segundos.

Ps: Quando dou start para uma simulçação o processador vai para 100% :o, o meu PC é athlon XP3200 (2.2GHz)

Postado
Também estou aprendendo, fiz um exemplo espero que seja útil para alguns, uma dica é evitar o uso de variaveis como "led" pois isso faz o programa ser maior, usando PORT diretamente fica um programa menor.

Meu exemplo usa comparação e verdadeiro (execute se for verdadeiro)

Descrição:

No inicio os 3 leds iniciam apagados, para ativalos precisa que duas chaves sejam acionadas(lógica AND), quando acionadas os leds vão acender em sequencia em um intervalo de tempo. Quando uma ou as duas chaves forem desacionadas os leds vão apagar em um sequencia de tempo.

Pic 16F84A

Define CONF_WORD = 0x0001
Define CLOCK_FREQUENCY = 4
TRISA = 0xff
TRISB = 00000001b
PORTA.0 = 0
PORTA.1 = 0
Dim x As Bit
inicio:
x = PORTA.0 And PORTA.1
WaitMs 100
If x = 1 Then
PORTB.1 = 1
WaitMs 100
PORTB.2 = 1
WaitMs 100
PORTB.3 = 1
Else
PORTB.1 = 0
WaitMs 100
PORTB.2 = 0
WaitMs 100
PORTB.3 = 0
Endif
Goto inicio
End

Amigos, alguem poria ajudar a fazer um timer em minutos (ex:30min )? Não sei por onde fazer, já que a função Wait é para mili ou micro segundos.

Ps: Quando dou start para uma simulçação o processador vai para 100% :o, o meu PC é athlon XP3200 (2.2GHz)

rafael.luc,

Na verdade nos exemplos citados por mim e pelo Leonardo-SP o "led" nao é exatamente uma variavel e sim um apelido "symbol" dado ao PORT , só pra facilitar na compreensão do programa , seria o mesmo que usar o PORT direto como voce fez,nao precisa declarar como variavel.

Quanto ao timer com tempos longos , acredito ser necessario o uso de interrupiçoes do timer0 ou timer1 do PIC.

Mas aguarde dicas dos mais experiente, tambem sou um iniciante !!

voce ja leu a apostila do prof. Paulo??

Até breve

jfeliciano

Postado
voce ja leu a apostila do prof. Paulo??
Eu li sim, bom material. Li a 1 parte display e LCD estou deixando pra depois

Fiz uma modificações, no meu programa. Removi os valores iniciais do PORT.0 e PORT.1, pois não estava surtindo efeito (provavelmente por estar fora do laço "goto"), e também o resultado da operação AND para TRUE

Quanto ao timer com tempos longos , acredito ser necessario o uso de interrupiçoes do timer0 ou timer1 do PIC.
Também gostaria de saber como uso os Timer internos do PIC, no momento achei uma solução usando FOR, colocando o Wait dentro de um FOR.

No meu exemplo abaixo, depois de desacionado uma ou as duas chaves, ele ainda vai executar 10 vezes o Wait, tempo de 10x (100Ms+100Ms)= 2000Ms, para um tempo maior basta aumentar o valor que vai FOR vai contar ou também diminuir o STEP

EX:

TRISA = 0xff
TRISB = 00000001b
Dim x As Bit
Dim i As Word
inicio:
x = PORTA.0 And PORTA.1
WaitMs 100
If x = True Then
For i = 0 To 100 Step 10
PORTB.1 = 1
WaitMs 100
PORTB.2 = 1
WaitMs 100
PORTB.3 = 1
Next i
Else
PORTB.1 = 0
WaitMs 100
PORTB.2 = 0
WaitMs 100
PORTB.3 = 0
Endif
Goto inicio
End

Postado
Fiz uma modificações, no meu programa. Removi os valores iniciais do PORT.0 e PORT.1, pois não estava surtindo efeito (provavelmente por estar fora do laço "goto"), e também o resultado da operação AND para TRUE

Eu simulei aqui e funcionou sim, do jeitinho que voce descreveu.

Vou simular o outro com a mudança do código p/ ver o que mudou.

Agricio

Postado
Eu simulei aqui e funcionou sim, do jeitinho que voce descreveu.

Vou simular o outro com a mudança do código p/ ver o que mudou.

Agricio

Seria intersante mater estes valores iniciais do PORTA.0 e PORTA.1,ele serve pra garantir que sempre que voce ligar o circuito ele comece sempre com o nivel 0 no PORT, porque pode acontecer de alguma vez o outra ele iniciar com qualquer valor que nao seja o esperado.

jfeliciano

Postado

jfelician, as PORTA do PIC foram configuradas no começo como entradas, sendo assim não é possivel zerar elas no inicio, visto que em um circuito real elas são manipuladas por chaves, sempre o PIC real inicia as chaves estarão abertas ou fechadas fisicamente, ao menos é que entendo...

Outro exemplo meu, desta vez é sinal de transito com um botão para pedestre, ou seja, um sinaleiro único em uma rua que sempre fica verde para passagem de veículos, muda apenas quando o pedestre solicita precionando um botão. Primeiramente abra a matriz de LEDs em Tools-->8x LED Board.

Configure:

Primeiro LED como PORTB,0 e cor como vermelho

Segundo LED como PORTB,1 e cor como vermelho

Terceiro LED como PORTB,2 e cor como amarelo

Quarto LED como PORTB,3 e cor como verde

Esses são os farois que vão para visão do motorista, existe dois leds para o vermelho, como é no sinal de transito real.

Sétimo LED como PORTB,6 e cor como vermelho

Oitavo LED como PORTB,7 e cor como verde

Esses são os farois que ficam voltados para visão do pedestre que ficam próximo ao botão, no inicio da faixa de pedestres.

Para solicitar a passagem como pedestre, apenas um pulso curto na chave (RA0) é necessario. É ativada em Tools--> Microcontroler ViewPrograma para PIC 16F84A (desta vez fiz os comentários!)

Define CONF_WORD = 0x0001
TRISA = 0xff
TRISB = 00000000b
Dim x As Bit 'declaração de x como variável binária
inicio:
x = PORTA.0 'x recebe o valor da chave em RA0
If x = True Then 'verdadeiro se RA0 foi ativado, senão vai para ELSE
PORTB.3 = 0 'apaga sinal verde para veiculos
PORTB.2 = 1 'aciona sinal amarelo, sinal vermelho para pedestre permanece
WaitMs 500 'conta um tempo para sinal amarelo
PORTB.2 = 0 'apaga o sinal amarelo
PORTB.0 = 1 'aciona o sinal vermelho1
PORTB.1 = 1 'aciona o sinal vermelho2
PORTB.6 = 0 'apaga o sinal vermelho para pedestres
PORTB.7 = 1 'aciona sinal verde para pedestres
WaitMs 1500 ' conta um tempo para os pedestre fazer a travessia
Else 'se a chave não foi acionada
PORTB.0 = 0 'apaga sinal vermelho1
PORTB.1 = 0 'apaga sinal vermelho2
PORTB.7 = 0 'apaga sinal verde para pedestres
PORTB.6 = 1 'aciona sinal vermelho para pedestres
PORTB.3 = 1 'aciona sinal verde para veiculos

Endif
Goto inicio
End

OBS: O programa é apenas para simulação, os tempos de cada sinal são menores que um sinal transito real.

O tempo que se leva para dar um pulso na chave é maior que a execusão do programa, portanto, sempre vai executar o IF uma vez, mas x não memoriza o pulso e retorna para ELSE, depois do WaitMs 1500, desde que chave não esteja precionada!

Postado

rafael.luc,

voce esta correto , eu é que fiz confusão aqui com o PORTB, que é saida!!

Legal o seu exemplo, só nao entendi bem o porque do uso da funçao "If x = True"

Não seria mais faciel "if x=1 ou x=0" faça isto??

jfeliciano

Postado
rafael.luc,

só nao entendi bem o porque do uso da funçao "If x = True"

Não seria mais faciel "if x=1 ou x=0" faça isto??

A função

If x = True [B]Then[/B]

O "Then" é obrigatório, sim pode ser "1" em vez de "TRUE", acredito que também pode ser usado High (para 1) e Low (para 0), tanto faz qual você usar!

Agora é um sinal de transito "inteligente", desta vez os LEDs para o motorista vão apagar em sequencia avisando o tempo restante:

Configure a matriz de LEDs como:

Primeiro LED como PORTB,0 e cor como vermelho

Segundo LED como PORTB,1 e cor como vermelho

Terceiro LED como PORTB,2 e cor como vermelho

Quarto LED como PORTB,3 e cor como amarelo

Quinto LED como PORTB,4 e cor como verde

Sexto LED como PORTB,5 e cor como verde

Sétimo LED como PORTB,6 e cor como vermelho

Oitavo LED como PORTB,7 e cor como verde


Define CONF_WORD = 0x0001
TRISA = 0xff TRISB = 00000000b
Dim x As Bit 'declaração de x como variável binária
inicio:
x = PORTA.0 'x recebe o valor da chave em RA0
If x = True Then 'verdadeiro se RA0 foi ativado, senão vai para ELSE
PORTB.4 = 0 'apaga o 1° sinal verde para veiculos
WaitMs 500 'tempo
PORTB.5 = 0 'apaga o 2° sinal verde para veículos
PORTB.3 = 1 'aciona sinal amarelo, sinal vermelho para pedestre permanece
WaitMs 500 'tempo
PORTB.3 = 0 'apaga o sinal amarelo
PORTB.0 = 1 'aciona o 1° sinal vermelho
PORTB.1 = 1 'aciona o 2° sinal vermelho
PORTB.2 = 1 'aciona o 3° sinal vermelho
PORTB.6 = 0 'apaga o sinal vermelho para pedestres
PORTB.7 = 1 'aciona sinal verde para pedestres
WaitMs 800 ' tempo para os pedestre fazer a travessia
PORTB.0 = 0 'apaga o 1° sinal vermelho
WaitMs 800 'pedestre ainda fazendo a travessia
PORTB.1 = 0 'apaga o 2° sinal vermelho
PORTB.6 = 1 'aciona sinal vermelho para pedestre
PORTB.7 = 0 'apaga sinal verde pra pedestres
Else 'se a chave não foi acionada
PORTB.2 = 0 'apaga 3° sinal vermelho para veículos
PORTB.6 = 1 'aciona sinal vermelho para pedestres
PORTB.4 = 1 'aciona 1° sinal verde para veiculos
PORTB.5 = 1 'aciona 2° sinal verde para veiculos
Endif
Goto inicio
End

Existe um "tempo morto" onde tanto o motorista como pedestre ambos estarão vendo os faróis vermelhos no final da contagem. Quando somente o 3° LED vermelho na visão do motorista estiver acionado (linha 22 e 23) é mais seguro assim.

qualquer duvida é só perguntar

Postado

Então pessoal, agradeço a atenção de todos.

No PIC 18 Simulator IDE também gera o mesmo erro:

5ckfs.jpg

Jfeliciano, não estou mexendo com LCD "ainda", mas, arrisco um pitaco, veja se a causa não está nas temporizações (muito rápido ou lento demais), pode haver uma diferença do PSI para o Proteus.

Abraço.

Postado
Então pessoal, agradeço a atenção de todos.

No PIC 18 Simulator IDE também gera o mesmo erro:

Abraço.

Pela quantidade de linhas que tem seu programa (mais de 3000MIL :o), acho que pegou pronto de alguma parte, provavelmente ele não é para compilador PIC Simulator IDE, algumas funções não devem ter para esse compilador que está no seu script/programa (mesmo sendo arquivos .BAS) isso é um palpite, já tentou com algum programa do próprio PIC Simulator IDE ?

Postado
Pela quantidade de linhas que tem seu programa (mais de 3000MIL :o), acho que pegou pronto de alguma parte, provavelmente ele não é para compilador PIC Simulator IDE, algumas funções não devem ter para esse compilador que está no seu script/programa (mesmo sendo arquivos .BAS) isso é um palpite, já tentou com algum programa do próprio PIC Simulator IDE ?

rafael.luc,qual é a versão do PSI voce esta usando?

Estou usando a mesma que o Leonardo usa , v6.91.

Porque o teste que fiz foi com poucas linhas, pra fazer piscar um led, e deu exatamnte o mesmo erro que o Leonardo esta falando.

Acho que pode ser algum bug do programa!!!

Como faço pra colocar esta imagem (print screen) da tela com o erro??

jfeliciano

Postado
rafael.luc,qual é a versão do PSI voce esta usando?

Estou usando a mesma que o Leonardo usa , v6.91.

Porque o teste que fiz foi com poucas linhas, pra fazer piscar um led, e deu exatamnte o mesmo erro que o Leonardo esta falando.

Acho que pode ser algum bug do programa!!!

Como faço pra colocar esta imagem (print screen) da tela com o erro??

jfeliciano

V6.73, baxei na net, não foi no site. Não tinha percebido que possui uma versão mais nova. O meu PC é WinXP 32 bits e Processador 32 Bits, a cada simulação o proc vai a 100% deve estar contando um tempo maior para para os temporizadores do realmente é!

Me passe o seu exemplo que dai eu tento simular aqui, lembrando que dependendo do tempo de WaitMs ele retorna erro na simulação.

Postado
V6.73, baxei na net, não foi no site. Não tinha percebido que possui uma versão mais nova. O meu PC é WinXP 32 bits e Processador 32 Bits, a cada simulação o proc vai a 100% deve estar contando um tempo maior para para os temporizadores do realmente é!

Me passe o seu exemplo que dai eu tento simular aqui, lembrando que dependendo do tempo de WaitMs ele retorna erro na simulação.

rafael.luc, acho que matamos a charada, o problema é mesmo da versão 6.91,.

Porque tambem uso o winxp32 bits,mas o PSI é V6.91, já a versão v6.73 parece nao ter este problema.

Veja o exemplo, é so omitir um dos valores "LED=" que o problema aparece.

Como faço pra colocar o codigo em destaque???

Define CONF_WORD = 0x3f79

Define CLOCK_FREQUENCY = 4

AllDigital

TRISB = 0x00

Symbol led = PORTB.0

inicio:

led = 1

WaitMs 10 '0

led = 0

WaitMs 10 '0

Goto inicio

jfeliciano

Postado
Como faço pra colocar o print screen é o codigo em destaque???
Basta você aumentar a janela do códico, e apertar "Print Scm" no teclado, depois cola no Paint e salva como imagem, não sei se é esta sua dúvida?
Veja o exemplo, é so omitir um dos valores "LED=" que o problema aparece.

Não entendi muito bem, omitir por exemplo:

led = 0

???

Fiz isso e não deu erro!

Postado

Não entendi muito bem, omitir por exemplo:

led = 0

???

Fiz isso e não deu erro!

Rafael, não esqueça o AllDigital no seu código.

Meu problema com o erro já foi resolvido, só comentei aqui para que se algum usuário do PSI, viesse a enfrentar o mesmo erro, já ter como base a minha experiência.

A "omissão" do nível lógico no meu caso foi gerada por erro ao digitar, como mencionado anteriormente, eu não digitei o "1". Realmente é uma besteira, mas gera o erro, aí num programa grande a gente se perde procurando o "fantasma".

O Programa foi eu que fiz, e já está finalizado.

Jfeliciano, nesse projeto enfrentei o mesmo problema que você mencionou em posts anteriores, o reset dos posts durante o funcionamento do PIC.

Vou descrever como eu fiz, veja o que você acha:

------------------------------

...

gosub resetports'

...

end

resetports

led1=1

led2=1'' daí você estabelece o nível lógico de cada port

...

Return

--------------------------------

Dessa forma toda vez que precisar de "resetá-los" é só buscar "gosub resetports", note que não coloquei (entre o led1 e o led2) o waitus que o Paulo citou anteriormente, estou nos testes finais da placa, como não houve nenhum mal funcionamento, vou deixar assim. Tá uma beleza!:D

PS: Em muitos exemplos citamos em nossos códigos um port sendo "led", mas isso é para facilitar a compreensão, na prática pode ser um NPN, PNP, fotoacoplador,..., acionando/interropendo o que desejar.

Espero ter contribuído de alguma forma.

Abraço.

Postado

A "omissão" do nível lógico no meu caso foi gerada por erro ao digitar, como mencionado anteriormente, eu não digitei o "1". Realmente é uma besteira, mas gera o erro, aí num programa grande a gente se perde procurando o "fantasma".

.

O problema é tipo de erro que está retornado a vocês nesta versão, na minha versão ele diz em que linha está o erro.

Postado
Jfeliciano, nesse projeto enfrentei o mesmo problema que você mencionou em posts anteriores, o reset dos posts durante o funcionamento do PIC.

Vou descrever como eu fiz, veja o que você acha:

------------------------------

...

gosub resetports'

...

end

resetports

led1=1

led2=1'' daí você estabelece o nível lógico de cada port

...

Return

--------------------------------

Nao entendi a logica do que voce quis dizer com reset dos ports?

O que eu falei é que se deve inicializar os ports ou variaveis, porque se isto nao for definido na inicializção o circuit "pode assumir" aleatoriamente quaquer valor que nao seja o esperado e provocar um funcionameto errado.

Por ex. quando ligar o cicuito o "LED x" deve começar apagado, mas se isto nao estiver definido na inicialização pode acontecer dele começar aceso.

:confused:

Postado

Por ex. quando ligar o cicuito o "LED x" deve começar apagado, mas se isto nao estiver definido na inicialização pode acontecer dele começar aceso.

:confused:

Exatamente!

Quando o circuito é ligado o programa vai direto para subrotina e, dependendo do projeto, isto é feito várias vezes, é uma forma de assegurar sempre o estado dos ports desejados.

Abraço.

Postado

Olá pessoal

Estou tentando fazer um função de setar valores para um variável (SetPoint), mas não estou conseguindo, seria mais menos isso:

Aciona 5 vezes a chave_1 e uma variável recebe o valor de 5, a função que procuro é um "Stop" para atribuir o valor a variável pela chave_1 e dai rodar o programa.

A única função que conheço incrementa uma variavel por pulso é a "Count entrada(RA), tempo(Ms), variável(x)" não é bem que procuro, visto que tenho certo tempo para atribuir os pulsos na variável e também preciso esperar o termino do tempo setado para o "Cont". Alguem tem alguma solução?

Não sei se estou sendo claro, no que é SetPoint um exemplo real, seria um controlador de temperatura onde posso ajustar a temperatura de controle que desejo por uma chave incrementando a temperatura em °C. Na pratica precisa de um Display pra saber que valor está o SetPoint ajustado, mas o que procuro no momento é somente incrementar uma variável por chave

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!