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

Dehsantana,

Bem-vindo ao Fórum, meu amigo, e valeu pela sua observação sobre o clock interno !

Dani,

Hehehehe agora voce vai ter trabalho ..

Não, o PSI não atende cálculo com ponto flutuante, mas voce pode usar truques para isso.

Veja o meu tutorial, a primeira parte, nas páginas 30 - 33 inclusive !

A dica é voce sempre aumentar o fator de escala ....

Por exemplo, se voce quer arredondar o seu resultado, voce iria somar 0.5 e depois pegar apenas a parte inteira, certo ?

No PSI, voce tem de fazer assim :

contagem_final = (10 * contagem) +5

contagem_final = contagem_final / 10

Entendeu ?

Leia a apostila, siga os exemplos, Dani, te garanto que vai ficar bem mais fácil voce fazer o seu programa, eu já passei por esses mesmos problemas um montão de vezes ...

Quanto ao restante da pergunta, as contagens, procura um post que eu respondí, com um código para tratar exatamente esse problema de botões para UP e para Down, se não me engano é este aqui :

http://forum.clubedohardware.com.br/showpost.php?p=3850352&postcount=53

Veja se agora ficou mais fácil ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Dani, não é bem isso, cuidado !!!!!!!

Use o fator de escala, do jeito que eu te passei, isso sempre funciona !

Se voce tentar fazer na mesma escala, e usar 1/2 , o PSI sempre vai dizer que 1/2 é ZERO !!!!!

Hehehehe parece fácil, não é ???? São truques demais para a gente aprender !

Paulo

Link para o comentário
Compartilhar em outros sites

Extraido do tutorial :

Um comando extremamente útil para mostrar valores armazenados em uma variável é este aqui :

LCDOUT #DADO

Este comando mostra o conteúdo decimal da variável de nome DADO .

Embora não tenha tratado aqui neste programa, existem também funções que definem em qual posição do display você quer escrever. Por exemplo, LCDCMDOUT LcdLine2Pos(7) faz com que a próxima saída LCDOUT escreva na linha 2, a partir da coluna 7 do display.

Heheheh Dani, nem vou falar de novo, voce já entendeu né :D:D:D ?

Paulo

Link para o comentário
Compartilhar em outros sites

Dehsantana,

Tem algumas "feras" aqui no Fórum que estão escrevendo um tutorial em Assembler, e olha que a turma aqui entende bem disso !

Teremos de esperar mais algum tempo, até ficar pronto, mas vaivaler a pena !

Eu não entendo quase nada de Assembler, porisso que faço tudo em Basic, usando o PIC SIMULATOR IDE, se quiser dar uma olhada, quem sabe te ajuda , veja aqui as duas partes :

http://www.4shared.com/file/117938802/8f95b920/INTRODUO_AO_USO_DE_PIC.html

http://www.4shared.com/file/134451544/3759fe56/INTRODUO_AO_USO_DE_PIC_-_PARTE_2.html

Boa sorte meu amigo!

Paulo

Link para o comentário
Compartilhar em outros sites

pessoal,olhem como e importante aprende assembly tbem e usar as duas linguagem em conjunto.Fiz esse programinha so de teste usando um opcode asm,juntamente com o basic

Define CONF_WORD = 0x3f50

Define CLOCK_FREQUENCY = 4

AllDigital

TRISB = 0

Dim cont As Byte

cont = 0

For cont = 0 To 8

PORTB.0 = 1

ASM: rrf portb,f

WaitMs 1

Next cont

End

Link para o comentário
Compartilhar em outros sites

Paulo, você pode dar uma olhada no código?

Queria saber se tem algo pra melhorar ou já tá bom.


Define CONF_WORD = 0x3f50
AllDigital

TRISA = 00000111b

'lcd
TRISB = 0x00

Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_READ_BUSY_FLAG = 1

'botões
Symbol botao_up = PORTA.0
Symbol botao_down = PORTA.1
Symbol botao_sp = PORTA.2

'Variáveis
Dim contador As Word
Dim valors As Word
Dim restante As Word
Dim cont_int As Byte

Dim habilitado As Bit
Dim selecionando As Bit

valors = 5 'teste.....
contador = 0
cont_int = 0

habilitado = 0
selecionando = 1

Lcdinit 'iniciar lcd
Lcdcmdout LcdClear 'limpar lcd
Lcdout "Escolha um valor."

Gosub configura_timer

loop:
Gosub teclaup
Gosub tecladown
Gosub teclasp
Goto loop
End

On Interrupt
Save System

If habilitado = 1 Then
cont_int = cont_int + 1
If cont_int = 2 Then Goto loop1
Goto sailoopt
loop1:
contador = contador + 1
If contador = valors Then
PORTA.3 = 0
PORTA.4 = 1
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "Descarregando cap."
Lcdcmdout LcdLine2Pos(1)
Lcdout "Escolha um valor."

habilitado = 0

Goto sailoopt
Endif
Lcdcmdout LcdLine2Clear
Lcdcmdout LcdLine2Pos(1)
restante = valors - contador
Lcdout "Restando: ", #restante, "s"

cont_int = 0
Else
Goto sailoopt
Endif

Resume

configura_timer:
OPTION_REG.T0CS = 0 'usar clock interno
OPTION_REG.PSA = 0 'prescaler ligado no TIMER0
OPTION_REG.PS2 = 1 'valor prescaler = 256
OPTION_REG.PS1 = 1
OPTION_REG.PS0 = 1
TMR0 = 0xfe 'contagem inicial do TIMER0

INTCON.T0IE = 1 'habilita interrupções timer0
INTCON.GIE = 1 'habilita todas interrupções mascaradas
Enable
Return

teclaup:
If botao_up = 0 Then
Goto apertado_up
Endif

apertado_up: 'Rotina de Debounce
WaitMs 50
If botao_up = 1 Then
Goto botaoconfirmado_up
Else
Goto sailoop
Endif
botaoconfirmado_up:
If selecionando = 1 Then
valors = valors + 1
Lcdcmdout LcdLine2Clear
Lcdcmdout LcdLine2Pos(1)
Lcdout "Valor: ", #valors
Endif
Return

tecladown:
If botao_down = 0 Then
Goto apertado_down
Endif

apertado_down: 'Rotina de Debounce
WaitMs 50
If botao_down = 1 Then
Goto botaoconfirmado_down
Else
Goto sailoop
Endif
botaoconfirmado_down:
If selecionando = 1 Then
valors = valors - 1
Lcdcmdout LcdLine2Clear
Lcdcmdout LcdLine2Pos(1)
Lcdout "Valor: ", #valors
Endif
Return

teclasp:
If botao_sp = 0 Then
Goto apertado_sp
Endif

apertado_sp: 'Rotina de Debounce
WaitMs 50
If botao_sp = 1 Then
Goto botaoconfirmado_sp
Else
Goto sailoop
Endif
botaoconfirmado_sp:
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "Timer habilitado"
Lcdcmdout LcdLine2Pos(1)
Lcdout "Restando: ", #valors, "s"
If habilitado = 1 Then
habilitado = 0
Else
habilitado = 1
Endif
Return

sailoop:
Return

sailoopt:
TMR0 = 0xfe
INTCON.T0IF = 0
Enable
Return

Link para o comentário
Compartilhar em outros sites

Ok, Dani, achei um monte de coisa errada.... já te enviei uma versão que a meu ver está funcionando.

Mas vou te pedir uma coisa, não fique colocando aqui no Fórum esse programa, pois voce está fazendo tipo TENTATIVA E ERRO !

Cara, leia primeiro o TUTORIAL, siga os exemplos, leia as dicas, assim ficará bem mais fácil para voce acertar.

Lembre-se que este tópico é para iniciantes em PIC e programação com o PSI ; se voce continuar com dúvida em seu programa, crie um novo tópico, assim poderemos te ajudar diretamente no seu tópico, evitando aumentar muito as páginas deste tópico enquanto solucionamos o seu problema ok ?

Desculpe pedir isto, mas se continuarmos postando aqui um monte de códigos, fica complicado para o pessoal mais novo seguir as dicas ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

aphawk

Olá Paulo,

Estou pela segunda vez estudando a tua apostila com objetivo agora de partir para a prática, estou lendo de forma mais cautelosa afim de assimilar melhor o conteúdo. No exercício 1 temos 2 leds, nas portas RB6 e RB7 ambas saídas (output) mas, na linha 4 do programa a instrução“TRISB = 00000001b” faz com que RB0 até RB6 sejam saídas e somente RB7 entrada. Alguma coisa não fecha, por favor me esclareça. Um forte abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Olá Jorgeletronico,

Amigo, agora sim os neuronios enlouqueceram, misturou o meio de campo, me ajuda a sair dessa se não for pedir muito. è o seguinte eu sou do tempo da válvula e ai já viu né.

O Paulo colocou assim em sua apostila:

TRISB = 00000001b

Já na linha 0004, usei notação binária ( reparem a letra b !) , assim fica mais fácil

visualizar que eu especifiquei que os bits 0 até 6 ( RB0 até RB6 ) sejam saída, e apenas

o bit 7 ( RB7 ) seja entrada. Simples não é ?

ENTÃO CONCLUI QUE:

Onde o bit=0 ==> port RB = saida

Onde o bit=1 ==> port RB = entrada

Forte abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Oi jorgeletronico,

Muito bom, fiz varias simulações e identifiquei que a ordem dos bits em relação as portas é o inverso isto é, TRISB=00000001b significa da esquerda para direita que o primeiro bit é igual a RB7=0 RB6=0 RB5=0................RB0=1. Então, deve ter havido um erro de digitação na apostila do Paulo pois ali ele afirma o contrário que a sequência seria RB0 RB1 .......RB7.

Fico muito agradecido por ter me ajudado a tirar essa dúvida um bom fim de semana.

Enio.

Link para o comentário
Compartilhar em outros sites

Tche,

Acabei de ler a sua dúvida, e a resposta do Jorge.

voce tem razão, eu errei quando falei dos bits 0 a 6 serem saida e o 7 ser enrtrada !

Na verdade, esse erro o corre porque eu mudei o circuito e esqueci de mudar o programa .... mas o funcionamento do programa não é alterado, mas realmente o comentário está errado.

Vou corrigir o trecho abaixo , e pedir ao amigo BCPetronzio para mudar o tutorial.

O texto correto é o que se segue:

Usamos o PORTB, portanto vamos inicializar o bit 0 como entrada, e todos os outros

como saída.

No PSI, temos uma instrução específica para inicializar um PORT , usando a instrução

TRISA ou TRISB conforme a porta que queremos. Como podem existir PICS de 5

portas, as letras podem ir de A até E, por exemplo, TRISE.

No PSI, podemos usar notação hexadecimal ou binária, e para os PICs suportados, no

caso do comando TRISA se colocarmos um bit em 0 define a porta como SAIDA, e o

bit em 1 define como ENTRADA.

Na linha 0003 o comando TRISA 0x00 usei a notação hexadecimal ( repare o x ! ) , e

isto faz todos os bits do PORT A serem SAIDA.

Já na linha 0004, usei notação binária ( reparem a letra b !) , assim fica mais fácil

visualizar que eu especifiquei que os bits 1 até 7 ( RB1 até RB7 ) sejam saída, e apenas

o bit 0 ( RB0 ) seja entrada. Simples não é ?

Quanto ao que voce falou :

Muito bom, fiz varias simulações e identifiquei que a ordem dos bits em relação as portas é o inverso isto é, TRISB=00000001b significa da esquerda para direita que o primeiro bit é igual a RB7=0 RB6=0 RB5=0................RB0=1. Então, deve ter havido um erro de digitação na apostila do Paulo pois ali ele afirma o contrário que a sequência seria RB0 RB1 .......RB7.

Eu não disse que a sequencia binária de um byte é rb0rb1......rb7 !!!

Como o texto estava errado, voce intuiu isso a partir dos meus comentários. Mas temos sempre de representar um numero, não importa qual a base dele, tendo os maiores pesos colocados à esquerda dos menores pesos.

Para deixar claro, sempre escrevemos um numero binário com o menor bit à direita, e o maior bit à esquerda.

Exemplo : o numero 169 ( em decimal ) se escreve assim em binário :

10101001, e em termos de bits, temos :

b7- 1

b6- 0

b5- 1

b4- 0

b3- 1

b2- 0

b1- 0

b0- 1

Valeu , amigo Tche !!!!!!!!

Isso mostra que voce está mesmo lendo e entendendo os passos corretamente !

Paulo

Link para o comentário
Compartilhar em outros sites

EM TEMPO

Desculpe Paulo, Realmente fui infeliz no uso da palavra, O CORRETO SERIA:

Citação:

Muito bom, fiz varias simulações e identifiquei que a ordem dos bits em relação as portas é o inverso isto é, TRISB=00000001b significa da esquerda para direita que o primeiro bit é igual a RB7=0 RB6=0 RB5=0................RB0=1. Então, deve ter havido um erro de digitação na apostila do Paulo pois ali nos induz a crer o contrário que a sequência seria RB0 RB1 .......RB7.

Link para o comentário
Compartilhar em outros sites

Boa Tarde Paulo,

Professor é o seguinte, o aluno aqui montou o circuito do projeto 1 em um protboard e não teve êxito. Constatei que no esquema na porta RB1 foi colocado um R de 4k7 e uma chave considerando que RB1 fosse uma entrada porém, ela está setada como saida (TRISB=00000001b) então, substitui RB1 por RB0 que esta sim é entrada porém, mesmo assim não funcionou. Usei o watms = 250 ms. Já fiz varias revisões na montagem e na gravação do PIC.

Desde já agradeço a paciência e a dedicação do amigo. Um abraço,

Enio.

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!