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

Jfeliciano,

O seu problema é o código, ele simplesmente não trata tudo o que pode acontecer simultaneamente com enc1 e enc2 !

voce tem de fazer a decodificação correta, que é manter na memória a posição anterior de enc1 e de enc2, e caso houver uma mudança, tem de olhar numa tabelinha para saber se o movimento foi no sentido horário ou no anti-horário !

Dá uma olhada neste link, no tópico INCREMENTAL ROTARY ENCODER, tem como podem evoluir os sinais de enc1 e de enc2, e as formas de onda deles :

http://en.wikipedia.org/wiki/Rotary_encoder

Paulo

Link para o comentário
Compartilhar em outros sites

Jfeliciano,

O seu problema é o código, ele simplesmente não trata tudo o que pode acontecer simultaneamente com enc1 e enc2 !

voce tem de fazer a decodificação correta, que é manter na memória a posição anterior de enc1 e de enc2, e caso houver uma mudança, tem de olhar numa tabelinha para saber se o movimento foi no sentido horário ou no anti-horário !

Dá uma olhada neste link, no tópico INCREMENTAL ROTARY ENCODER, tem como podem evoluir os sinais de enc1 e de enc2, e as formas de onda deles :

http://en.wikipedia.org/wiki/Rotary_encoder

Paulo

Ola,

Paulo

E obrigado mais uma fez por sua atençao.

Vou dar uma olhada no link que voce indicou.

Mas o codigo do jeito que esta eu testei ele na pratica me pareceu que fuciona certo, incremetado e decremetado , eu so limetei acontagem em "0" e em "50" porque o encoder que eu estou usando vai de "0" ate 255" e ai quando chega no final,se continuar a girar ele recomeça a contagem de forma inversa , ex. se ja chegou em "255" ele começa em "0" e vise-versa, sendo que o certo e parar a contagem, no inicio ou no final.

Mas o que eu observei que o problema acontece quando chega no laço "waile wend".

por que se nao movementar o encoder ele fica travado ai,e nao da pra fazer mais nada com o resto do progragama, eu nao soube resolver isto.

Nao entendi o lace da tabelinha que voce disse.

"tem de olhar numa tabelinha para saber se o movimento foi no sentido horário ou no anti-horário !".

Vou fazer as modificaçoes sugeridas pra ver como fica.

Ate breve

Um abraço

jfeliciano

Link para o comentário
Compartilhar em outros sites

aphawk

Baixei o tutorial que escreveu e achei excelente, estou tentando fazer o frequencimetro/tacometro baseado no tutorial, a duvida é como estou usando o RB0 para varredura nos displays, como posso capturar o trem de pulso no PIC.

O comando Count serve?

Tenho na entrada a cada volta 8 pulsos que variam conforme velocidade do rotor.

minha duvida é quando do comando Count capturar os pulsos em 1 segundo, dentro da variavel do comando, faço a lógica que explicou para achar a dezena e unidade, como posso calcular a razão de entrada que é de 8 pulsos por volta?

Agradeço

JCDS

Link para o comentário
Compartilhar em outros sites

JCDS,

Bem-vindo ao Fórum, estamos todos aqui para ajudar no seu aprendizado.

Primeiro, qual é a frequência que voce quer trabalhar ? Digo isto por que o Count só serve para uma frequência baixa de pulsos. Se for mais que uns 20.000 Hz acho que terá de fazer usando interrupção.

Para calcular a frequência, tem de fazer umas continhas .... mas a ideia principal é que o comando Count permite que seja feita uma contagem de pulsos durante um período que vai de 1 a 10.000 milisegundos, ou seja, de 1 ms a 10 segundos.

E a variável que recebe essa contagem é do tipo WORD, que pode armazenar uma contagem de até 65.535.

Suponha que a frequência máxima será de 10.000 RPM, significa que teremos 80.000 pulsos em um minuto ( 8 pulsos por volta, né ? ) , e seu display tenha 2 dígitos apenas.

Então, se usar o comando :

COUNT Portb.1, 120, CONTAGEM

a variável CONTAGEM deve ter o valor aproximado de ( 80000/60*120/1000) = 159 , basta dividir por 16 e assim voce pode mostrar no display diretamente. Mas o erro de arredondamento vai fazer aparecer 9 no display em vez de 10.

Neste caso o comando Count está contando os pulsos por apenas 120 milisegundos, e isto já faz a nossa conversão automáticamente.

Como podemos ter um erro devido ao baixo tempo de amostragem, eu sugiro que se faça o seguinte :

COUNT Portb.1, 480, CONTAGEM

E o valor em CONTAGEM será 8 vezes maior que o anterior, assim bastaria dividir por 64 e mostrar no display.

Veja se te ajudou, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

JCDS,

voce pode usar o COUNT em qualquer um dos pinos dos Ports.... use um pino que está livre e pronto !

voce pode ler frequências de até uns 20 Khz ( na teoria .... tem de ver na prática.... ) ou seja, 20.000 pulsos por segundo. Acima disto tem de fazer um teste mesmo. Use um cristal oscilador no limite de velocidade do seu PIC, e creio que voce pode chegar até uns 100 Khz, ok ? Mas só esperimentalmente que pode ser determinado.

O que voce pode fazer é utilizar um contador divisor, como se fosse um Prescaler, antes de chegar ao PIC, por exemplo, use o famoso CD4040, ele tem saidas divisoras desde por 2 até por 8192 , assim voce pode se adequar fácilmente à sua necessidade.

Sem usar algo como o que eu disse acima, a maneira correta é utilizar interrupção, o PSI suporta sem nenhum problema, voce tem de implementar uma interrupção para o timer, e outra interrupção que fará a contagem dos pulsos, assim voce pode calcular quantos pulsos recebeu num determinado tempo, e pode calcular tanto a frequência como o RPM .

Paulo

Link para o comentário
Compartilhar em outros sites

aphawk

Bom dia

coloquei a função Count no programa do tutorial, acho que fiz alguma coisa errada!

Segue:digito = dezena

Gosub getmask

dezmask = mask

digito = unidade

Gosub getmask

unimask = mask

WaitMs 5

'Next contagem

Goto loop

End

On Interrupt

Save System

If phase = 1 Then Gosub mostradezena

If phase = 2 Then Gosub mostraunidade

phase = phase + 1

If phase = 3 Then phase = 1

TMR0 = 0x3d

INTCON.T0IF = 0

Resume

getmask:

mask = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x49), digito

Return

mostradezena:

enabledezena = False

enableunidade = False

PORTB = dezmask

enabledezena = True

Return

mostraunidade:

enabledezena = False

enableunidade = False

PORTB = unimask

enableunidade = True

Return

Esta correto a posição da função COUNT?

Grato

JCDS

Aphawk

Cortou

envio novamente

Define CONF_WORD = 0x0001

Define CLOCK_FREQUENCY = 4

AllDigital

TRISA = 11001b

TRISB = 0x00

Dim contagem As Word

Dim digito As Byte

Dim dezena As Byte

Dim unidade As Byte

Dim mask As Byte

Dim dezmask As Byte

Dim unimask As Byte

Dim phase As Byte

'Dim chave As Bit

Symbol enabledezena = PORTA.2

Symbol enableunidade = PORTA.1

enabledezena = False

enableunidade = False

unimask = 0

dezmask = 0

phase = 1

OPTION_REG.T0CS = 0

OPTION_REG.PSA = 0

OPTION_REG.PS2 = 1

OPTION_REG.PS1 = 0

OPTION_REG.PS0 = 1

TMR0 = 0x3d

INTCON.T0IE = 1

INTCON.GIE = 1

Enable

digito = 10

Gosub getmask

unimask = mask

dezmask = mask

'espera:

'chave = PORTA.0

'If chave = 1 Then Goto espera

loop:

count PORTA.0, 480, contagem

'loop:

contagem = contagem / 64

dezena = contagem / 10

unidade = contagem - (10 * dezena)

digito = dezena

Gosub getmask

dezmask = maskdigito = unidade

Gosub getmask

unimask = mask

WaitMs 5

'Next contagem

Goto loop

End

On Interrupt

Save System

If phase = 1 Then Gosub mostradezena

If phase = 2 Then Gosub mostraunidade

phase = phase + 1

If phase = 3 Then phase = 1

TMR0 = 0x3d

INTCON.T0IF = 0

Resume

getmask:

mask = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x49), digito

Return

mostradezena:

enabledezena = False

enableunidade = False

PORTB = dezmask

enabledezena = True

Return

mostraunidade:

enabledezena = False

enableunidade = False

PORTB = unimask

enableunidade = True

Return

Está correto a posição da Função Count ?

Grato

JCDS

Link para o comentário
Compartilhar em outros sites

Existem uns errinhos, mas acho que foi erro na cópia.

Tem de acertar o CONF_WORD, e quando voce simular, tem de tirar a função COUNT, pois ela não aceita simulação e fica travado num loop.

Ah, cuidado quando voce fazer contas envolvendo variáveis tipo WORD e querer armazenar em uma variável tipo Byte. Tem de usar aquele truque do .LB para fazer a conversão. Veja o que eu fiz com CONTAGEM e CONTAGEM1 .

Bom, eu coloquei valores aleatórios para CONTAGEM, presumindo que seria o valor retornado pela função COUNT, e funcionou no display sem nenhum problema.

voce vai ter mesmo de gravar o PIC para ver funcionar, ok ?

Segue o código que acredito que vai funcionar sem erro :

Define CONF_WORD = 0x3f41
Define CLOCK_FREQUENCY = 4
AllDigital
TRISA = 11001b
TRISB = 0x00

Dim contagem As Word
Dim contagem1 As Byte
Dim digito As Byte
Dim dezena As Byte
Dim unidade As Byte
Dim mask As Byte
Dim dezmask As Byte
Dim unimask As Byte
Dim phase As Byte
'Dim chave As Bit
Symbol enabledezena = PORTA.2
Symbol enableunidade = PORTA.1

enabledezena = False
enableunidade = False
unimask = 0
dezmask = 0
phase = 1
OPTION_REG.T0CS = 0
OPTION_REG.PSA = 0
OPTION_REG.PS2 = 1
OPTION_REG.PS1 = 0
OPTION_REG.PS0 = 1
TMR0 = 0x3d
INTCON.T0IE = 1
INTCON.GIE = 1
Enable

digito = 10
Gosub getmask
unimask = mask
dezmask = mask
'espera:
'chave = PORTA.0
'If chave = 1 Then Goto espera
loop:
Count PORTA.0, 480, contagem
contagem = contagem / 64
contagem1 = contagem.LB
dezena = contagem1 / 10
unidade = contagem1 - (10 * dezena)
digito = dezena
Gosub getmask
dezmask = mask
digito = unidade
Gosub getmask
unimask = mask
WaitMs 5
'Next contagem
Goto loop
End
On Interrupt
Save System
If phase = 1 Then Gosub mostradezena
If phase = 2 Then Gosub mostraunidade
phase = phase + 1
If phase = 3 Then phase = 1
TMR0 = 0x3d
INTCON.T0IF = 0
Resume
getmask:
mask = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x49), digito
Return
mostradezena:
enabledezena = False
enableunidade = False
PORTB = dezmask
enabledezena = True
Return
mostraunidade:
enabledezena = False
enableunidade = False
PORTB = unimask
enableunidade = True
Return

Bons testes !

Paulo

Link para o comentário
Compartilhar em outros sites

Aphawk

Obrigado novamente.

Montei o hardware como no tutorial, sem a função Count ou seja simulando um valor para contagem ou implementado um contador, os displays funcionam normalmente.

Quando ativo a função Count, os displays nao apresentam nada (ficam apagados).

Peço ajuda novamente.

Pequisei na NET esta função Count do PSI e não tive nenhum exemplo.

Grato

JCDS

Link para o comentário
Compartilhar em outros sites

JCDS,

Achei o problema ....

É o seguinte, a função COUNT utiliza o Timer0, que é o mesmo timer que eu utilizei para fazer o multiplex dos displays !!!! Portanto, se utilizar essa função, não poderemos utilizar o Timer0 em nosso programa.

voce terá de mudar o programa para usar o Timer1 ou até Timer2 em vez do Timer0. Na própria apostila tem as informações para voce mudar o programa, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

amigo paulo,

amigos do forum,

penso que não soube me explicar direito, eu quis dizer o seguinte, com um unico botão

eu acendo o led, e apago ao mesmo tempo.

um pulso acende o led,

com outro pulso apago o mesmo led,

tudo isso fazendo com o mesmo botão,

sendo um pulso acende,

outro pulso com o mesmo botão apaga,

certo da compreenção de todos,

aguardo retorno.

obrigado.

Código:

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 = 00000010b 'essa e a maneira correta desse comando!

Symbol led = GP0

Symbol botao = GP1

led = 0

main:

If botao = 0 Then

led = Not led

Else

Goto main

Endif

main1:

WaitMs 50

If botao = 0 Then Goto main1

WaitMs 50

Goto main

End

Link para o comentário
Compartilhar em outros sites

Pessoal,

Acabei de postar um circuito novo no Tutorial em Basic para AVR's, mas percebí que o mesmo pode interessar para muitos aqui.

É um Frequencímetro bem preciso, de baixíssimo custo, que pode ser feito com PIC em vez de AVR's, e programado com o PSI. É só cuidar da parte matemática, pois envolve cáculos com numeros grandes e resultados que podem chegar em 50.000.000 , porisso teria de implementar umas subrotinas para cálculo de multiplicação e soma com numeros que ocupariam 4 bytes em vez de 2 bytes, e posterior conversão para mostrar no display LCD.

Mas vale a pena ler sobre o funcionamento do aparelho, o quel é muito engenhoso, e ver o software em Basic. Compilado, não chega a 2.6 Kytes !

Só como curiosidade, baixem o Tutorial e leiam sobre este projeto. O conhecimento vai compensar em muito !

Um abraço a todos.

Paulo

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Oi Formigoni,

A menos que o site do PSI tenha mudado a política, se voce baixar a última versão do site, ela roda full por 30 dias e depois pára de rodar.

Se voce estiver usando uma versão antiga, desisntale ela , faça um reboot, e instale a última, que vai compilar sem problemas.

Paulo

Link para o comentário
Compartilhar em outros sites

Olá pessoal,

Esses dias tava quebrando a cabeça para aumentar o valor do WaitMs, precisava de uma temporização de 2 horas para manter um LED aceso, resolvi da seguinte forma:

'-----------

Dim inicio As Byte

Dim final As Byte

final = 0

'-----------

led:

RB4 = 1

For inicio = 1 To 120

final = final + inicio

WaitMs 60000

Next inicio

RB4 = 0

End

'------------

Pergunta: Tem outra forma de aumentar o WaitMs mais resumida?

Estou trabalhando num projeto com o PIC 16F877, vou precisar de reproduzir mensagens de voz, serão quatro frases gravadas, alguém saberia indicar algum chip de voz com bom custo benefício?

Abraços...

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

aphawk, estou lendo seu tutorial... não entendi a função do Cristal oscilador no PIC, que no caso você usou no 1º Circuito que fez, com os LEDs. Pra que preciso de um cristal de 4Mhz em um circuito de dois LEDs se alternando e frequencia mais baixa?

Outra dúvida que tenho é quanto o datasheet dos PICs, meu inglês é precário... e não consigo ler os datasheets, tem alguma forma de interpreta-los ou até se existem datasheets em português ou espanhol...

Grato!

Link para o comentário
Compartilhar em outros sites

Binho,

Os Pics mais genéricos da família PIC16F não possuem oscilador interno, portanto temos de ter um oscilador a cristal. O valor de 4 Mhz é apenas um dos que podem ser usados, na verdade qualquer cristal, desde o famoso 32768 Khz até 16 Mhz podem ser usados.

Lembre-se, voce pode utilizar qualquer cristal, desde que respeite os limites acima. E não se esqueça de dizer ao compilador qual é a frequência desse cristal, ou um monte de coisas podem dar errado, ok ?

Quanto aos datasheets, realmente não tem jeito, só em Inglês mesmo. Mas existem muitos sites tanto em português como em espanhol que dão muitas informações sobre os Pics.

Paulo

Link para o comentário
Compartilhar em outros sites

Entendi!

Quanto aos datasheets e totoriais, realmente minha saída está sendo o espanhol!

aphawk, fica mais simples me aprofundar mais nos PICs em outras linguagens se eu iniciar pelo Basic? Pois já ouvi algumas controvérsias, mas nada como a opinião de alguém que entende!

Tenho 15 anos... e gostaria de saber se há algum curso que você conheça, ou se tem alguma dica para poder aprender mais sobre Microcontroladores! Já estou providenciando uma placa de gravação para começar. Iria usar a que você desenvolveu, mas infelizmente só posso usar o notebook, e só tem entrada USB =(

Achei na NET um circuito que me pareceu bom, porém ele precisava de um PIC pra fazer um gravador de PICs ¬¬'.

Até mais! E obrigado pela ajuda!

Link para o comentário
Compartilhar em outros sites

Binho,

Pode aprender com o Basic mesmo, e depois migre para a linguagem C.

voce tem 15 anos, e é capaz de aprender muita coisa nova, o caminho natural será voce migrar do Basic para o C.

E caso voce vire um profissional na área de microprocessadores, talvez voce ainda vai aprender o Assembler.

Mas hoje em dia 99% das aplicações são escritas em C mesmo. Apenas casos muito específicos precisam de Assembler.

Agora, vou te dar uma dica : compre um desses adaptadores de USB para RS232, é muito mais fácil conversar com o seu micro usando RS232. Tem muitos programas prontos, e muitas aplicações prontas também.

Olha, conversar usando USB é um trabalho danado de software, e fica meio "pesado" para um PIC16F.

Se seu objetivo é mesmo utilizar comunicação via USB, voce vai ter de migrar para a família PIC18F, que oferece suporte nativo para ela.

Ah, e voce terá de utilizar o PSI para família PIC18F, é quase idêntico ao ao PSI do PIC16F.

Agora, programador tem de ser via USB mesmo, voce pode fazer o seu, ou comprar pronto, qualquer um compatível com PICKIT2 servirá perfeitamente.

Boa sorte, e se precisar de alguma coisa é só chamar a turma aqui do Fórum, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Obrigado amigo! E pretendo sim me tornar um dia profissional nesta área!

Sempre gostei de eletrônica, desmontava as coisas des dos 5 anos hehe, mas agora estou me interessando bastante pelo lado de processadores, e eletrônica digital!

O objetivo real meu não é usar o USB, o problema é que não tenho disponível aqui um computador com porta serial ou paralela =/.

O PSI só simula em BASIC ou também em C? Pois estou pensando em adquiri-lo.

Hoje de manha estava lendo o tutorial, e resolvi fazer um teste, então fiz o seguinte código baseado no do tutorial:

Define CONF_WORD = 0x0001

Define CLOCK_FREQUENCY = 4

TRISA = 0xff

TRISB = 0x00

Dim botao As Bit

PORTB = 0xff

WaitMs 40

PORTB = 0x00

espera:

botao = PORTA.0

If botao = 0 Then Goto espera

PORTB.0 = 1

PORTB.1 = 1

PORTB.2 = 1

PORTB.3 = 1

PORTB.4 = 1

PORTB.5 = 1

PORTB.6 = 1

PORTB.7 = 1

WaitMs 20

PORTB.7 = 0

PORTB.6 = 0

PORTB.5 = 0

PORTB.4 = 0

PORTB.3 = 0

PORTB.2 = 0

PORTB.1 = 0

PORTB.0 = 0

Goto espera

End

Funcionou! Os LEDs ascendem, e apagam em sequencia, porém deve ter alguma forma mais simples de se fazer isso, sem ser colocando PORTB por PORTB, e depois apagando um por um...

Tentei fazer algo com o comando LookUp, mas deu erro =/!

Grato!

Link para o comentário
Compartilhar em outros sites

Binho11,

Esta é a grande vantagem do Basic, é muito intuitivo e voce aprende bem depressa a desenvolver programas que realmente funcionam na hora !

Quanto á sua pergunta sobre o PSI, ele é feito para trabalhar diretamente com o programa-fonte em Basic, mas nada te impede de carregar o código executável feito em outra linguagem e compilado, mas tem algumas limitações que dificultam bastante o uso fora do Basic do PSI. Mas tem algumas pessoas que já fizeram isto com sucesso !

Minha opinião : Aprenda bem o BASIC do PSI, e só depois mude para o C, ok ?

Legal, vá mandando bala , e siga o Tutorial, voce vai aprender logo um montão de coisas , fora a satisfação de ver as coisas funcionando, não é ?

Quanto ao seu programa, mude para isto :

[COLOR=Blue]Define CONF_WORD = 0x0001[/COLOR]
Define CLOCK_FREQUENCY = 4

TRISA = 0xff
TRISB = 0x00

Dim botao As Bit

PORTB = 0xff
WaitMs 40
PORTB = 0x00

espera:
botao = PORTA.0
If botao = 0 Then Goto espera

PORTB=0xff
WaitMs 20
PORTB= 0

Goto espera

End

Agora, se me permite uma observação, se voce for realmente programar o PIC, tem de utilizar a Conf_Word correta para o seu PIC, ok ?

Ela muda conforme o modelo que voce estiver usando, veja no tutorial sobre as funções do Conf_Word no PSI.

Boa diversão !

Paulo

Link para o comentário
Compartilhar em outros sites

Ok, pelo que vi o Basic realmente é simples! Já tenho material sobre C para PICs no computador, vou abri-los depois de aprender bem o BASIC!

Essa do conf Word eu não sabia! Pretendo sim semana que vem estar passando algumas coisas para a Protoboard... Obrigado pela ajuda! Vou terminar de ler o Tuto sim.

Abraço!

Link para o comentário
Compartilhar em outros sites

Pessoal, estava relendo alguns pontos do tutorial do Aphawk, e no primeiro programa, o que faz dois LEDs alternarem piscando, me surgiu uma dúvida:

O programa é o seguinte:

Define CONF_WORD = 0x0001

Define CLOCK_FREQUENCY = 4

TRISA = 0x00

TRISB = 00000001b

Dim led1 As Bit

Dim led2 As Bit

inicio:

led1 = 0

led2 = 1

Gosub saida

WaitMs 10

led1 = 1

led2 = 0

Gosub saida

WaitMs 10

Goto inicio

End

saida:

PORTB.6 = led1

PORTB.7 = led2

Return

Não entendi o uso de variáveis neste caso, não poderiamos fazer simplesmente isso:

Define CONF_WORD = 0x0001

Define CLOCK_FREQUENCY = 4

TRISA = 0xff

TRISB = 0x00

sempre:

PORTB.0 = 1

PORTB.1 = 0

WaitMs 30

PORTB.0 = 0

PORTB.1 = 1

WaitMs 30

Goto sempre

End

Os LEDs se alternaram da mesma maneira, e não usei variáveis, aliás, minha dúvida foi realmente quanto o uso de variáveis neste programa, que ao meu ver eram desnecessárias...

Grato!

EDIT: Não entendi as notações hexadecimais que você usou (acho que é isso), por exemplo no LookUp...

saída = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f),digito

Não etendi como ler ou formar estes valores! por exemplo 0x3f... o que significa? Como transfomor estes valores em decimal ou binário?

E por exemplo na hora de escolher quais PORTs serão entrada e saída, se quero todos PORTA como saída, utilizo PORTA = 0x00

Porém, o que significa o 0x00?

Grato!

Link para o comentário
Compartilhar em outros sites

Não etendi como ler ou formar estes valores! por exemplo 0x3f... o que significa? Como transfomar estes valores em decimal ou binário?

Amigo, vá com calma e aprenderá!

Veja, eu não entendo de Basic, mas creio que o lookUp seja o mesmo que uma máscara (array) unidimensional em C. Ele facilita sua vida quando trabalha com matrizes. Um exemplo é o display de 7 segmentos.

Você cria uma mascara para que ela ligue todo um PORT numa sequencia distinta com a finalidade de formar numeros no display. Tudo isto é explicado na apostila que está seguindo.

Qual motivo de usar hexadecimais? Simples, vamos transformar em binário o lookUp que mencionou:

.

saída = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f)

saída = LookUp(0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01101111)

.

Acho que consegue perceber que o código fica meio comprido demais para ler. Tem uma vantagem em binario: você consegue saber quais bits serão ativados. Neste caso todos os que estão em 1.

Use a calculadora do windows/linux para converter os números que tem dificuldade.

O que significa 0x00 ? é o mesmo que 0b00000000 ou mesmo 0.

Exemplo (em C PORTA é o valor escrito no Port e não suas direções):

TRISA = 0x00 todos os pinos são saídas ou

TRISA = 0b0000000 ou mesmo

TRISA = 0

Configurando como entradas:

TRISA = 0xff ou mesmo

TRISA = 0b1111111 ou

TRISA = 255

e por aí vai!

Não entendi o uso de variáveis neste caso, não poderiamos fazer simplesmente isso:

O Paulo já me explicou que em Basic o ideal é criar uma variável e atribuir o valor dela ao pino desejado isso evita problemas. Deixo esta para ele explicar melhor.

Porém em C é permitido o que perguntou.

Estude bastante lógica de programação, com isso aprenderá muito sobre estes tipos de números. Assim poderá criar firmwares muito eficientes.

Abraço.

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!