Ir ao conteúdo
  • Cadastre-se

PIC - Iniciando pelo basico atraves do BASIC


cavalodf

Posts recomendados

Vou ver isso... O registrador pode ter que nome?? Eu sô mal pra Datasheets..

E entrada analógica ele tem isso é certeza..

Matheus RYndack

Olha:

PORTA is an 8-bit wide latch. RA4 is a Schmitt Trigger

input and an open drain output. Port RA4 is multiplexed

with the T0CKI clock input. RA5(1)

is a Schmitt Trigger

input only and has no output drivers. All other RA port

pins have Schmitt Trigger input levels and full CMOS

output drivers. All pins have data direction bits (TRIS

registers) which can configure these pins as input or

output.

A ‘1’ in the TRISA register puts the corresponding

output driver in a High-impedance mode. A ‘0’ in the

TRISA register puts the contents of the output latch on

the selected pin(s).

Reading the PORTA register reads the status of the

pins whereas writing to it will write to the port latch. All

write operations are read-modify-write operations. So a

write to a port implies that the port pins are first read,

then this value is modified and written to the port data

latch.

The PORTA pins are multiplexed with comparator and

voltage reference functions. The operation of these

pins are selected by control bits in the CMCON

(Comparator Control register) register and the VRCON

(Voltage Reference Control register) register. When

selected as a comparator input, these pins will read

as ‘0’s.

Usar CMCon ou CRCON??

Link para o comentário
Compartilhar em outros sites

Caramba pessoal .... estamos ficando velhos hihihihihihih !!!

O PIC16F628A NÃO TEM CONVERSOR A/D !!!!!!!!!!!!!!!!!!!!

( o pior é que eu só percebí isso agora.......)

Porisso que o compilador aponta esse erro ok ?

Mude de PIC para um que tenha o conversor A/D, eu sugiro o próprio PIC16F877A , pois tá custando menos de R$ 15,00 no Mercado Livre ....

Boa sorte meu amigo !

Paulo

Link para o comentário
Compartilhar em outros sites

Eu tava lendo isso, onten pesquisei no google...

Mas Porque a Microchip coloca lá AN0 AN1 AN2??

Eu precisava de um PIC pequeno, usar um com 40 pinos é deperdício no meu projeto!

Matheus Ryndack

EDIT___

Pessoal, mais uma dúvida...

Assim:

Os valores retornados pelo AD vão de 0 a 1023 certo?? Então. eu vou converter isso em uma escala de 0 a 99.

Eu queria mostrar esses valores de 0 a 99 em um Display de 7 segmentos... alguma ideia?

Matheus Ryndack

Link para o comentário
Compartilhar em outros sites

Eu precisava de um PIC pequeno, usar um com 40 pinos é deperdício no meu projeto!

Use esse : PIC16F818 / 819 é o sucessor mais proximo do 628A e tem conversor A/D (sete canais)

sim o pic ira retornar de 0 a 1023, apos fazer a conversao pra escala desejada, faça uma rotina de ajuste decimal

exemplo em C:


int dezena, unidadade;

void ajuste()
{
for (i = valorAD ; i = 0; i--)
{
unidade = unidade + 1;
if (unidade = 9)
{
unidade = 0;
dezena = dezena + 1;
}

assim basta voce exibir o valor de unidade em um disply e o valor de dezena em outro display.

espero que ajude

abs.

Link para o comentário
Compartilhar em outros sites

Use esse : PIC16F818 / 819 é o sucessor mais proximo do 628A e tem conversor A/D (sete canais)

sim o pic ira retornar de 0 a 1023, apos fazer a conversao pra escala desejada, faça uma rotina de ajuste decimal

exemplo em C:


int dezena, unidadade;

void ajuste()
{
for (i = valorAD ; i = 0; i--)
{
unidade = unidade + 1;
if (unidade = 9)
{
unidade = 0;
dezena = dezena + 1;
}

assim basta voce exibir o valor de unidade em um disply e o valor de dezena em outro display.

espero que ajude

abs.

Hum... Pior que eu uso basic... Vou tentar traduzir..


Dim dezena as "que tipo?" 'Variaveis dezena e unidade?? int dezena, unidadade;
Dim unidade as "que tipo?"
sub procedure ajuste 'é um sub?? 'void ajuste()
'{
for i=valor ad "não entendi" 'for (i = valorAD ; i = 0; i--)
{
Unidade = unidade +1 'unidade = unidade + 1;
if unidade = 9 then 'if (unidade = 9)
unidade = 0 ' {
dezena = dezena +1
end if ' unidade = 0;
' dezena = dezena + 1;
'}

Algo certo? Poderia explicar o funcionamento do codigo?? Ficaria muito grato!

Matheus Ryndack

Link para o comentário
Compartilhar em outros sites

Como o amigo Lucas disse e pra isso mesmo que ela serve

vamos la faz tempo que nao mexo com Basic:



dim dezena as integer;
dim unidade as integer;
dim valorad as integer;
dim contador as integer;

procedure ajuste()
begin
for contador = valorad downto contador = 0 do
begin
unidade := unidade + 1;
if unidade = 9 then
unidade := 0
dezena := dezena + 1
endif
end;

voce pega um valor e separa ele entre dezena e unidade, cada valor vai pra um dos displays, se fosse em uma escala de 0 a 999 voce iria precisar de mais um display e mais uma variavel no caso centena.

abs.

Link para o comentário
Compartilhar em outros sites

Como o amigo Lucas disse e pra isso mesmo que ela serve

vamos la faz tempo que nao mexo com Basic:



dim dezena as integer;
dim unidade as integer;
dim valorad as integer;
dim contador as integer;

procedure ajuste()
begin
for contador = valorad downto contador = 0 do
begin
unidade := unidade + 1;
if unidade = 9 then
unidade := 0
dezena := dezena + 1
endif
end;

voce pega um valor e separa ele entre dezena e unidade, cada valor vai pra um dos displays, se fosse em uma escala de 0 a 999 voce iria precisar de mais um display e mais uma variavel no caso centena.

abs.



dim dezena as integer; 'ok
dim unidade as integer; 'ok
dim valorad as integer; 'ok
dim contador as integer; 'ok

procedure ajuste() 'no caso da mikro e é sub procedure
begin 'que ´isso??
for contador = valorad downto contador = 0 do
begin
unidade := unidade + 1;
if unidade = 9 then
unidade := 0
dezena := dezena + 1
endif
end;

Não dava pra explicar o funcionamento, eu não quero o codigo pronto eu quero aprender.

Matheus, eu fiz um exemplo exatamente desse tipo no tutorial de PIC em Basic, dá uma olhada, acabou de ser colocado em destaque pelo amigo Bcpetronzio, é o primeiro tópico do Fórum, ve se serve ok ?

Paulo

Vou ver!!

matheus ryndack

edit

amigo...

eu preciso da rotina pra dividir a variavel pros dois numeros... A comunicação com os dysplays não é problema, o problema e esse de dividir tipo na variavel tá 89 vai terque retornar dezena 8 e unidade 9...

Matheus Ryndack

pessoal...

outro problema..

o PIc retorna de 0 a 1023, divido por 10,23 que vai dar na escala de 100. quando o ad está todo "pra cima" ele retorna 1023, e depois da divisao 92.

o que serA? com posso fazer essa conversão direito?

E alguem sabe como colocar um potênciometro no ISIS que seja direito?? Tipo que ele não dê saltos de 10% que "deslise"...

Matheus ryndack

Link para o comentário
Compartilhar em outros sites

Matheus, leia o PROJETO 4 do tutorial, que tem a maneira certinha de se fazer as conversões de escala, e converter os valores decimais para 2 displays de 7 segmentos.

Vou colar aqui o recho onde é feita a conversão da leitura :

_____________________________________________________

Adcin 0, contagem 'lê a entrada analógica e guarda leitura em contagem

' agora, temos de acertar a conversão, pois leitura vai de 0 a 1023

' e no nosso circuito 1023 tem de corresponder a 9,9 volts na entrada

' do circuito, ou 5 volts na entrada RA0.

' para facilitar, faremos contagem variar de 0 até 99 para a tensão

' de 0 até 9,9 volts

contagem = (contagem * 33) / 341

' na verdade a conta exata era ( contagem * 99 ) / 1023

' mas o resultado de contagem * 99 pode ultrapassar 65535, que é

' o limite da variável tipo WORD . Portanto temos de tentar sempre

' usar a matemática para fazer as contas serem sempre menores.

' como tanto 99 como 1023 são divisíveis por 3, simplificamos !

' agora o resultado de contagem * 33 sempre será menor do que 65535 !

' desta maneira sempre teremos contagem entre 0 e 99, e nossa

' conversão de escala está pronta !

' agora, para não termos problemas com o programa, vamos

' converter a variável que é WORD para uma que é BYTE

temp = contagem.LB ' como o valor é menor do que 255, basta pegar

' o byte LOW da variável.

dezena = temp / 10 ' pegamos a dezena

unidade = temp - (10 * dezena) ' e calculamos a unidade

Espero que ajude a encontrar o seu problema.

Paulo

Link para o comentário
Compartilhar em outros sites

Os valores retornados pelo AD vão de 0 a 1023 certo?? Então. eu vou converter isso em uma escala de 0 a 99.

Eu queria mostrar esses valores de 0 a 99 em um Display de 7 segmentos... alguma ideia?

Aí entra a boa e velha matemática e suas regras de três!

1023 é igual à 99

300 é igual à X. ==> Hipotético. Um número qualquer.

x = 99 x 300 / 1023 ==> 29,03 ou 29 mesmo.

Era isso que você queria saber?

A fórmula fica:

RES = 99 x Y / 1023; onde Y é o valor lido do AD.

[]'s

Link para o comentário
Compartilhar em outros sites

Pot no ISIS, eu uso o linear, ele nao da os saltos de 10 em 10%, tenta usar o componente POT-LIN

abs.

uso esse e dá saltos de 10 em 10.

Aí entra a boa e velha matemática e suas regras de três!

1023 é igual à 99

300 é igual à X. ==> Hipotético. Um número qualquer.

x = 99 x 300 / 1023 ==> 29,03 ou 29 mesmo.

Era isso que você queria saber?

A fórmula fica:

RES = 99 x Y / 1023; onde Y é o valor lido do AD.

[]'s

era.. Eu fiz a regra de 3 mas com 1023=100 pois o 99 dava dizima periodica...

Mas o porquçe desse 300??

Matheus Ryndack

Link para o comentário
Compartilhar em outros sites

era.. Eu fiz a regra de 3 mas com 1023=100 pois o 99 dava dizima periodica...

Mas o porquçe desse 300??

Matheus Ryndack

o '300' e um valor que ele supos que o AD leu e retornou.

quanto aquela rotina de ajusate decimal vamos ver se consegigo explicar.

primeiro vamos supor que a sua conversao tenha retornado 23,

-eis a logica, coloque esse valor em uma variavel (vou chama la de cont)

-incremente uma variavel (que irei chama la de unidade)

- verifique se a unidade chegou a 9 , sim --> zera unidade e incrementa a dezena e decrementa contador, nao --> apenas decrementa o contador

- refaca essas duas linhas acima ate que o contador chegue a zero

- quando chegar a zero voce sai da rotina

- agora pegue a dezena e converta o valor para o caractere do display,

- exiba o valor no display da dezena (no caso o da esquerda),

- aguarde 10mS

- apague o display

- faça o mesmo com a unidade,

- espere 10mS

- apague o display,

inicie um novo loop de ajuste decimal com uma nova conversao AD

espero que agora ajude

abs.

Link para o comentário
Compartilhar em outros sites

Eu já fiz uma rotina de achar unidade e dezena mais simples na minha opinião.

olha:

Pega o valor convertido.

Coloca em uma variavel auxiliar

Enquando auxiliar for maior que 10, aux=aux-10.

Quando ficar menor que 10 essa é a unidade.

Pega o valor convertido, diminui a unidade e divide por 10. essa é a dezena. Simples, não?

Olha o codigo:


for contador=0 to 99
aux=contador
while aux>9
aux=aux-10
wend
unidade=aux
Display_7_catodo_write(unidade, 2)
aux=contador
aux=aux-unidade
dezena=aux/10
Display_7_catodo_write(dezena, 1)
delay_ms(500)

next contador

no caso ele vai a cada 0.5 seg incrementar o nº do display.

entendem??

Mas eu fiz regra de 3 e deu que era pra dividi por 10.23!! Não está certo?

Aqui um outro projeto que fiz, faz um tempo mas agora que resolvi postar.

-->http://ledeletronica.blogspot.com/2009/07/controlando-um-led-atraves-do-pc-e-pela.html

Usa a comunicação com o PC.

Espero que gostem.

Matheus Ryndack

Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!