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, quero fazer uma pequena contribuição aos iniciantes como eu. Em seu tutorial você indicou uma pagina para quem quizesse maiores detalhes de comandos em basic para pic (http://www.oshonsoft.com/picbasiccompiler.html) porém, esta estaria em inglês. Eu estou disponibilizando a tradução em português no endereço http://rapidshare.com/files/285254034/Comandos_basicos_de_Basic.pdf.html. Desculpem por alguns erros. Um abraço aos amigos.

Olá Paulo,

Com referência ao projeto 5 usando display lcd eu comecei a brincar colocando mensagens e observar como se comportaria, e ai vem a pergunta: Como eu faria para a mensagem se deslocar horizontalmente de maneira a caber uma frase maior que a largura do display e esta repetir indefinidamente?

Link para o comentário
Compartilhar em outros sites

Tche, muito obrigado pela sua contribuição, se voce me permite, vou incluir a sua página traduzida junto com o tutorial, realmente ajuda quem não domina bem o Inglês.

Dani, existe a versão do PSI, escrito para a linha PIC18, e ela tem suporte para HID , veja o comentário do autor :

PIC18 Simulator IDE can be used for development of USB generic HID devices

É o mesmo ambiente do PSI , a mesma linguagem, acrescida do suporte USB !!!

Se voce quiser, pode seguir pelo tutorial do PSI, e depois migrar para o PIC18 SIMULATOR IDE, está nesta página :

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

Agrício, não entendí a sua dúvida ....

Paulo

Link para o comentário
Compartilhar em outros sites

Amigo paulo, dei uma olhada e achei isso:


Define CLOCK_FREQUENCY = 20
Define CONFIG1L = 0x24
Define CONFIG1H = 0x0c
Define CONFIG2L = 0x3e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

UsbSetVendorId 0x1234
UsbSetProductId 0x1234
UsbSetVersionNumber 0x1122
UsbSetManufacturerString "OshonSoft.com"
UsbSetProductString "Generic USB HID Device"
UsbSetSerialNumberString "1111111111"
UsbOnIoInGosub usbonioin
UsbOnIoOutGosub usbonioout
UsbOnFtInGosub usbonftin
UsbOnFtOutGosub usbonftout

AllDigital
ADCON1 = 0x0e
TRISB = 0
PORTB = 0xff
UsbStart
PORTB = 0

Dim an0 As Byte

loop:
Adcin 0, an0
If an0 < 50 Then
PORTB = 0
UsbStop
While an0 < 100
Adcin 0, an0
Wend
PORTB = 0xff
UsbStart
PORTB = 0
Endif
UsbService
Goto loop
End

usbonftout:
Toggle PORTB.7
Return

usbonftin:
UsbFtBuffer(0) = UsbFtBuffer(0) - 1
UsbFtBuffer(1) = UsbFtBuffer(1) - 1
UsbFtBuffer(2) = UsbFtBuffer(2) - 1
UsbFtBuffer(3) = UsbFtBuffer(3) - 1
UsbFtBuffer(4) = UsbFtBuffer(4) - 1
UsbFtBuffer(5) = UsbFtBuffer(5) - 1
UsbFtBuffer(6) = UsbFtBuffer(6) - 1
UsbFtBuffer(7) = UsbFtBuffer(7) - 1
Return

usbonioout:
Toggle PORTB.6
Return

usbonioin:
UsbIoBuffer(0) = UsbIoBuffer(0) + 1
UsbIoBuffer(1) = UsbIoBuffer(1) + 1
UsbIoBuffer(2) = UsbIoBuffer(2) + 1
UsbIoBuffer(3) = UsbIoBuffer(3) + 1
UsbIoBuffer(4) = UsbIoBuffer(4) + 1
UsbIoBuffer(5) = UsbIoBuffer(5) + 1
UsbIoBuffer(6) = UsbIoBuffer(6) + 1
UsbIoBuffer(7) = UsbIoBuffer(7) + 1
Return

Achei muito confuso, vocÊ teria algum exemplo de envio e recebimentos de dados pela usb? Nesse PSI18.

Ah e dá pra eu alterar o número de bytes de envio e recebimento? (que nem no mikroc, que tem o descritor).

OFF: Paulo você tem msn?

Link para o comentário
Compartilhar em outros sites

Opa, primeiramente PARABENS Paulo!, não li o tutorial inteiro ainda, por falta de tempo por causa dos estudos e por um pouquinho de priguiça, mas em breve irei ler, só pelo que a galera ta falando deve estar muito bom esse tutorial, e mesmo que não estivesse você já estaria de parabens pela iniciativa de querer ajudar os outros!

Parabéns!!

OBS: Eu acho que esse topico devia ficar fixo, ali no topo da pagina.

Link para o comentário
Compartilhar em outros sites

Dani,

é muito fácil usar os cartões SD, basta ter este pequeno produto :

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

A vantagem é que ele já vem com um relógio RTC !

E a programação em Basic é muito simples, baixe o maual dele e voce vai ver que não é nenhum bicho de 7 cabeças.

Quanto aos HID's, infelizmente eu mesmo ainda não usei, mas sei que o PSI18 suporta comunicação via USB , e o buffer implementado no PSI18 é de 8 bytes para transmissão e 8 bytes para recepção.

Veja um exemplo completo aqui :

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

Quanto ao MSN, eu tenho mas nunca uso .... deixe uma mensagem pessoal aqui no fórum ok ?

Gustavo555 ,

Valeu pelo agradecimento !!!! O tutorial é um trabalho em andamento, conforme eu vou tendo um tempinho livre eu vou escrevendo mais e aumentando a cobertura !!!

TcheCara,

Manda bala, pode postar o link, é muito interessante e eu quero fazer algo parecido no tutorial ( mas em escala MUITO menor heheheh )

Paulo

Link para o comentário
Compartilhar em outros sites

Beleza amigo paulo!

O problema desse esse "pequeno" produto é o preço que não é compátivel com meus projetos hehehe.

Você poderia ver esse código que eu fiz?


Define CONF_WORD = 0x1ec1

'lcd
TRISB = 0x00

Define LCD_RSBIT = 5
Define LCD_EBIT = 4
Define LCD_INITMS = 2

Lcdinit

loop:
Lcdcmdout LcdClear
Lcdout "Teste"
WaitMs 1
Goto loop

Não consegui fazer funcionar...

Link para o comentário
Compartilhar em outros sites

Faz tempo que nao programo em Basic, mas estou pensando em voltar pra ajudar o pessoal com a linguagem, ja que esta crescendo bastante aqui no forum =D.

quanto ao problema :

Define LCD_RSBIT = 5
Define LCD_EBIT = 4

voce deve definir em qual port estarao esses bits, pois o que esta fazendo ai em cima nada mais e do que atribuir uma constante a LCD_RSBIT e LCD_EBIT, tente em vez disso , isso:


Define LCD_RSBIT = PORTB.5
Define LCD_EBIT = PORTB.4

abs.

Link para o comentário
Compartilhar em outros sites

Felipe, segundo o manual é só colocar o pino, pois tem um outro define que define as portas mas o padrão é a B.

Mas vou tentar como você falou, vaí que entendi errado.

EDIT:

Não é assim não felipe.. Pena, pensei que iria resolver o problema.

Mas nem compilou...

..

LCD_BITS - defines the number of data interface lines (allowed values are 4 and 8; default is 4)

LCD_DREG - defines the port where data lines are connected to (default is PORTB)

LCD_DBIT - defines the position of data lines for 4-bit interface (0 or 4; default is 4), ignored for 8-bit interface

LCD_RSREG - defines the port where RS line is connected to (default is PORTB)

LCD_RSBIT - defines the pin where RS line is connected to (default is 3)

LCD_EREG - defines the port where E line is connected to (default is PORTB)

LCD_EBIT - defines the pin where E line is connected to (default is 2)

LCD_RWREG - defines the port where R/W line is connected to (set to 0 if not used; 0 is default)

LCD_RWBIT - defines the pin where R/W line is connected to (set to 0 if not used; 0 is default)

LCD_COMMANDUS - defines the delay after LCDCMDOUT statement (default value is 5000)

LCD_DATAUS - defines the delay after LCDOUT statement (default value is 100)

LCD_INITMS - defines the delay for LCDINIT statement (default value is 100)

Link para o comentário
Compartilhar em outros sites

Pessoal, eu tirei isto do próprio tutorial que eu postei :


' DEFINIÇÃO DO DISPLAY LCD

Define LCD_BITS = 4
Define LCD_DREG = PORTD
Define LCD_DBIT = 4
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 1
Define LCD_EREG = PORTD
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1

Eu uso sempre da maneira acima, que é a recomendada.

Existem comandos que definem qual o PORT do PIC, e comandos que definem qual o Bit do port que vamos usar.

Não esqueçam de colocar todos os comandos acima, claro que adaptados para as suas necessidades, em termos de PORT e de bits disponíveis, assim sempre vai funcionar.

Dani, fala prá gente qual PORT voce está usando para enviar dados ao display, e quais os bits desse PORT que voce está usando.

Pera... melhor ainda, poste o circuito prá gente ver ok ?

Felipe, agradeço muito sua ajuda para podermos difundir mais ainda os microprocessadores para todos que precisarem deles !

Paulo

Link para o comentário
Compartilhar em outros sites

Opa, paulo consegui!!

Agora meu problema é com o timer0...


Define CONF_WORD = 0x1ec1

'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

'Variáveis
Dim contador As Byte
contador = 20

Lcdinit 'iniciar lcd
Lcdcmdout LcdClear 'limpar lcd

Call configura_timer()
End

On Interrupt
Save System

Lcdcmdout LcdClear
Lcdout "valor timer "

TMR0 = 0x3d
INTCON.T0IF = 0
Resume

Proc 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 = 0x3d 'contagem inicial do TIMER0

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

Você pode analisar meu código?

Link para o comentário
Compartilhar em outros sites

Dani,

Este programa pelo que me parece é para gerar uma interrupção a cada 0,5 segundos aproximadamente, certo ?

Mudei algumas coisas , e funcionou. Mas para voe testar no PSI, sugiro mudar o valor de TMR0 para algo bem maior, tipo 0XFE, para voce poder ver a simulação, senão vai esperar por mais de uma hora aparecer uma mísera interrupção , ok ?

Repare que eu mudei algumas coisas, que estão coloridas aqui :


[COLOR=Red]Define CONF_WORD = 0x3f50[/COLOR]
[COLOR=Red]AllDigital[/COLOR]
'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

'Variáveis
Dim contador As Byte
contador = 20

Lcdinit 'iniciar lcd
Lcdcmdout LcdClear 'limpar lcd

[COLOR=Red]Gosub configura_timer[/COLOR]

[COLOR=Red]aqui: ' loop eterno !
Goto aqui[/COLOR]

End

On Interrupt
Save System

Lcdcmdout LcdClear
Lcdout "valor timer "


TMR0 = 0x3d
INTCON.T0IF = 0
Resume


[COLOR=Red]configura_timer:[/COLOR]
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 = 0x3d 'contagem inicial do TIMER0

'isto fornece uma interrupt a cada 0,4992 segundos ... !!!!!

INTCON.T0IE = 1 'habilita interrupções timer0
INTCON.GIE = 1 'habilita todas interrupções mascaradas
Enable
[COLOR=Red]Return[/COLOR]

Repare que voce chamava a rotina de inicialização das interrupts via Call, que é uma chamada de procedure, e portanto EXIGE PASSAGEM DE PARÂMETRO e voce não passava nenhum .... então mudei para a velha e boa GOSUB ok ?

E não esqueça da tall de ALLDIGITAL, a menos que voce esteja querendo usar algo analógico.

Nào entendí a sua conf_word, tomei a liberdade de usar a minha , que é para clock interno, e sem MCLR ok ?

Veja se resolveu.

Paulo

Link para o comentário
Compartilhar em outros sites

Certo, assim que descobrir algo me dê um retorno.

Já li esse datasheet umas 500x e nada..

EDIT: Nem tinha visto o post, vou ler..

PO muito obrigado cara.

Mas, vou te incomodar mais um pouco..

Amigo paulo, preciso fazer isso:

No portA vou ligar três botões, um pra aumentar e outro diminuir, o valor de uma váriavel que será o tempo em que o timer ficará ativo, quando esse tempo estourar ele vaí ter que ligar um bit do portA.

Exemplo, apertei 5 x o botão + e a variável ficou com valor 5, então quando eu apertar no botão start ele vai começar a contar e quando der 5segundos ele aciona uma saída da portA.

Como posso fazer isso?

PS: Com clock interno, não preciso do cristal né?

EDIT 2: To tentando aqui, mas to com um problema... Como usa float no PSI? Preciso somar a uma variavl 0.5, quando ele gerar a interrupção e depois verificar com um if o valor dessa variavel se é igual ao valor da variavel que armazena o tempo.

Link para o comentário
Compartilhar em outros sites

Sim sim, meu problema agora é outro.

Queria saber se existe variaveis flutuante no psi. (exemplo var = 0.5)

edit:

Eu tava pensando em fazer assim...


On Interrupt
Save System
'Lcdcmdout LcdClear
'Lcdout "valor timer "

if controle = contador then porta.7 = 1
contador = contador + 0.5

TMR0 = 0xfe
INTCON.T0IF = 0
Resume

Onde controle seria o valor em segundos do tempo em que o timer ficaria ativo.

Mas não dá certo né?

Link para o comentário
Compartilhar em outros sites

Certo, assim que descobrir algo me dê um retorno.

Já li esse datasheet umas 500x e nada..

EDIT: Nem tinha visto o post, vou ler..

PO muito obrigado cara.

Mas, vou te incomodar mais um pouco..

Amigo paulo, preciso fazer isso:

No portA vou ligar três botões, um pra aumentar e outro diminuir, o valor de uma váriavel que será o tempo em que o timer ficará ativo, quando esse tempo estourar ele vaí ter que ligar um bit do portA.

Exemplo, apertei 5 x o botão + e a variável ficou com valor 5, então quando eu apertar no botão start ele vai começar a contar e quando der 5segundos ele aciona uma saída da portA.

Como posso fazer isso?

PS: Com clock interno, não preciso do cristal né?

EDIT 2: To tentando aqui, mas to com um problema... Como usa float no PSI? Preciso somar a uma variavl 0.5, quando ele gerar a interrupção e depois verificar com um if o valor dessa variavel se é igual ao valor da variavel que armazena o tempo.

ola sou novo aqui não sei se ajudo mais, com clock interno não se usa cristal e nem capacitor, porém tem q tomar cuidado, muitos projetos precisam de clock esterno pois é necessário a precisão como por ex: projeto de relógio.

espero ter ajudado

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