Ir ao conteúdo
  • Cadastre-se

PIC - Iniciando pelo basico atraves do BASIC


cavalodf

Posts recomendados

Aproveitando o topico..

estou com dificuldades para programar o 16F84A

quero fazer o seguinte, quero fazer um algorito que eu possa testar as portas de entrada estão ligadas ex:

porta.0 porta.1 porta.2 porta.3

0101

só que preciso fazer um if tipo assim

if (parta=0110) then

portb.1=1

end if

quero ligar a portb.1 somente quando estiver as postas porta.1 e porta.2 ligadas. Só que vou fazer farias seguencias a partir disso mais eu tendo só a base eu me viro.

porém eu não sei como faço para configurar a entrada das portas A eu tentei "trisa=1" "trisa=0xff"

mais acho que não é assim, eu não sei como faço essa chamada e a comparação tambem

se alguem souber...

obrigado!

Link para o comentário
Compartilhar em outros sites

O tris configura a porta como entrada 1 ou saída 0, apenas.

Quem vai acionar suas portas de entradas, botões? alguna coisa tem que coloca-las em nivel alto1 ou baixo 0

caso contrario não rola nada.

Ai voce tem varias opções de comparação...

Se porta.0 and porta.1=1 então...

voce pode comparar usando o que tentou mesmo só que tem que colocar

os oitos bit, se porta=$03 (= 0000 0011) então ....(assim se torna mais pratico)

você pode também usar variáveis tipo var1=porta.0 var2=porta.2

ai fazer comparações ou somas do resultado destas somas usar o "case"

case 1 faça...

case 2 faça..

Espero ter ajudado.

Link para o comentário
Compartilhar em outros sites

O tris configura a porta como entrada 1 ou saída 0, apenas.

Quem vai acionar suas portas de entradas, botões? alguna coisa tem que coloca-las em nivel alto1 ou baixo 0

caso contrario não rola nada.

Ai voce tem varias opções de comparação...

Se porta.0 and porta.1=1 então...

voce pode comparar usando o que tentou mesmo só que tem que colocar

os oitos bit, se porta=$03 (= 0000 0011) então ....(assim se torna mais pratico)

você pode também usar variáveis tipo var1=porta.0 var2=porta.2

ai fazer comparações ou somas do resultado destas somas usar o "case"

case 1 faça...

case 2 faça..

Espero ter ajudado.

eu fiquei tentando depois e consegui fazer.... usando case mesmo

só que agora ja estou com umto probleminha..rsrs não consigo simular o MT8870 no proteus..

essa sequencia é justamente par ausar com o mt8870.... só que não acho no proteus um jeito de simular isso...

Link para o comentário
Compartilhar em outros sites

Fala pessoal!

Preciso de um help:

Como faço em Basic para configurar a entrada an0 do 16f628.

Bom tem exemplo de como demontrar isso em LCD, porém definimos a variável como BYTE, sendo assim quando vario a entrada de 0 a 5V obtenho valores de 0 a 255.

Bom é isso que eu não quero!

Gostaria de fazer isso com escala inteira por ex: 0 a 100 ou a 0 a 50.

Pois preciso usar um pot como divisor de tensão e preciso mostrar isso no LCD.

Segue o exemplo:

'pic 16f877 a 12MHz

Define CONF_WORD = 0x3f72

Define CLOCK_FREQUENCY = 12

AllDigital

ADCON1 = 0x0e

Define LCD_BITS = 8

Define LCD_DREG = PORTD

Define LCD_DBIT = 0

Define LCD_RSREG = PORTE

Define LCD_RSBIT = 0

Define LCD_RWREG = PORTE

Define LCD_RWBIT = 1

Define LCD_EREG = PORTE

Define LCD_EBIT = 2

Define LCD_READ_BUSY_FLAG = 1

Lcdinit

Dim an0 As Byte

loop:

Adcin 0, an0

Lcdcmdout LcdClear

Lcdout "Analog input AN0"

Lcdcmdout LcdLine2Home

Lcdout "Value: ", #an0

WaitMs 250

Goto loop

Retirei o exemplo do próprio PIC simulator IDE, porém não consigo alterar esses valores de 0 a 255, gostaria que fosse de 0 a 50.

Aguardo a ajuda de vocês!

Forte abraço!

Link para o comentário
Compartilhar em outros sites

defina como WORD a variável (acredito que o ADC desse pic seja de 10bits).

Depois faça uma regra de 3 ou uma equação inversa do primeiro grau:

regra de 3:

1023 = 100

atual = Y

100/1023 = 0,09775

porém o pic não trabalha com dizimas, então você multiplica por 10000 e resultado e trabalha com o valor 9775

então a equação fica:

valor_final = 9775*leitura

valor_final = valor_final/10000 'para ter um valor entre 0 e 100

lcdout (valor_final)

Link para o comentário
Compartilhar em outros sites

ADCON1 = $80 ' Configure analogico

veloc1 = Adc_Read(0) ' porta de entrada = AN0

DELAY_US(30)

veloc10 = dword(veloc1) * 5000 ' convert adc reading to mV '(O MULTIPLICADOR SERA A ESCALA DE USO OU SEJA 5000 (SE FOR 100 A ESCALA VAI DE 0 A 100 PARA 0v A 5v E ASSIM POR DIANTE...)

veloc100 = dword(veloc10) div 1023 ' achando a milhar exata do tempo

**************************

Este calculo acima transforma leitura do AD 10bit num valor de milhar exato

onde veloc1 (word) veloc10(dword) e veloc100 (dword)

assim fica para 1V=1000 e 1,75V = 1.750 ....para

Assim teremos 5V = 5000 ou = ao seu multiplicador inicial...

achar os valores a colocar no lcd basta dividir unidade, dezena...e se divertir

:D

Link para o comentário
Compartilhar em outros sites

Alguém ai tem a listra de instruções do PIc basic?

Grato.

Até mais!

Fala mateus, Cara da uma olhada no HELP em bibliotecas e instruçoes.

Não conheço este prog mas deve estar tudo lá.

Se não estiver muda pro MIkroe vale a pena. Abraço.

PS: achei isto:

http://www.melabs.com/products/pbcis.htm

Link para o comentário
Compartilhar em outros sites

vai sim!

SUGESTÃO TÉCNICA

Use um CI da microchip, MCP40 QUALQUER COISA, é um conversor AD de 12 bits, comunicação SPI.

primeiro você enfia o sinal AD num seguidor de tensão para fazer acoplamento de impedancia, depois você joga nesse conversor AD, o conversor AD vai comunicar via SPI com o pic, porém o SPI é o separador físico aqui, você coloca um opto acoplador no clock e no SDO/SDI. a alimentação do pic eu acho que você pode manter com uma bateria de 9V (circuito com LCD 4x20 consome 35mA) e os ADC você alimenta com uma segunda fonte, o terra dos dois não precisa estar em comum por causa do opto.

Link para o comentário
Compartilhar em outros sites

vai sim!

SUGESTÃO TÉCNICA

Use um CI da microchip, MCP40 QUALQUER COISA, é um conversor AD de 12 bits, comunicação SPI.

Valeu pela dica, porém este mcp40 * só achei sendo um POT digital ??

me precipitei achei um MCP3204 12bit/ad...

porém vou ter que usar um opto nele tambem...

Eu não estaria a usar dois MCU para fazer o trabalho de um?

com opto eu não poderia jogar direto no PIC ?.

Link para o comentário
Compartilhar em outros sites

Opa!

Não consegui configurar o ADC do Pic NO basic.

Nem se quer reconhece dword no PIC simulatro IDE.

Eu acessar todas as portas de AN0 a AN7 usando variaveis como word ou byte.

porém usando word tenho valor final de 1023 e byte de 255.

Consigo configurar todas a portas e tal com ADCON1 = 0x00

So não consigo por exemplo ADCON1 = %00000000

o que quero fazer é mudar esse valor que obtenho de 0 a 255 por exzemplo a fazer de 0 100.

Com os comandos que me passaram no tópico anterir não funcionaram em Basic.

o que posso fazer?

Já que com operações lógicas e matemáticas não dá! Ou pelomenus não consegui.

Se quer alterou o valor.

Minha pergunta original esta no post #54!

Obrigado!

Link para o comentário
Compartilhar em outros sites

Opa!

Não consegui configurar o ADC do Pic NO basic.

Nem se quer reconhece dword no PIC simulatro IDE.

Eu acessar todas as portas de AN0 a AN7 usando variaveis como word ou byte.

porém usando word tenho valor final de 1023 e byte de 255.

Até ai normal,você esta tendo ai os valores dos bit's...

ainda nao é o valor lido...

Consigo configurar todas a portas e tal com ADCON1 = 0x00

So não consigo por exemplo ADCON1 = %00000000

Tenta usar "$80" ou seja hexas (veja em conversor, ou utilize a calculadora do win mesmo em hexa).

o que quero fazer é mudar esse valor que obtenho de 0 a 255 por exzemplo a fazer de 0 100.

Com os comandos que me passaram no tópico anterir não funcionaram em Basic.

o que posso fazer?

Já que com operações lógicas e matemáticas não dá! Ou pelomenus não consegui.

Se quer alterou o valor.

Minha pergunta original esta no post #54!

Obrigado!

E`necessario os calculos feitos nos posts anteriores(AD) para obter os resultados das leituras reais (os calculos são os mesmos em qualquer

compilador, muda apenas os "comandos' da biblioteca. (veja em exemplos AD no seu ) ou muda pro mikroe:D

você tem que obter o valor 0/100 da leitura feita, EX: Vamos considerar a leitura sempre com ref. interna então

será de (0V a 5V) em 8/10/16... , os calculos transformam estes valores quebrados em valores exatos até o seu proposito.

No caso 1023(10) sera de 5/1023=0,00488758V por bit

Dai as multiplicações...que no seu caso vai ficar 0V=0 e 5V=5000mV

onde 5000/500= 0 -100..ou seja CEM valores.onde 0V=0 e 5V=100 então 5/100 = seus valores de escala.

são estes os valores a serem usados. Bom este é meu jeito de pensar...espero ter ajudado.

Vou colocar abaixo o exmplo do mikroe p/ ad-lcd

você vai ter uma ideia melhor...

**************************************

program Adc_On_Lcd

dim ch as byte

adc_rd as word

Text as char[17]

tlong as longint

main:

PORTD = 0 ' clear PORTD

TRISD = 0 ' designate PORTD as output (LCD is connected to PORTD)

INTCON = 0 ' disable all interrupts

Lcd_Config(PORTB,3,2,1,0,PORTB,4,7,5) ' Lcd_Init_EP5, see Autocomplete

Lcd_Cmd( LCD_CURSOR_OFF) ' send command to LCD (cursor off)

Lcd_Cmd(LCD_CLEAR) ' send command to LCD (clear LCD)

Text = "mikroElektronika" ' assign text to string a

Lcd_Out(1,1, Text) ' print string a on LCD, 1st row, 1st column

OPTION_REG = $80

ADCON1 = $82 ' configure VDD as Vref, and analog channels

TRISA = $FF ' designate porta as input

Delay_ms(2000)

Text = "Voltage: " ' assign text to string a

Lcd_Out(2, 1, Text) ' print string a on LCD, 2nd row, 1st column

Lcd_Chr(2, 14, "V")

while TRUE

adc_rd = ADC_read(2) ' get ADC value from 2nd channel

tlong = adc_rd*5000

adc_rd = tlong >> 10

ch = adc_rd div 1000 ' prepare value for diplay

Lcd_Chr(2, 9, 48+ch) ' write ASCII at 2nd row, 9th column

Lcd_Chr(2, 10, ".")

ch = (adc_rd div 100) mod 10

Lcd_Chr(2, 11, 48+ch)

ch = (adc_rd div 10) mod 10

Lcd_Chr(2, 12, 48+ch)

ch = adc_rd mod 10

Lcd_Chr(2, 13, 48+ch)

delay_ms(1)

wend

end.

**********************************************************************

Link para o comentário
Compartilhar em outros sites

Valeu fera, bom o endereço $80 aqui não existe!

O problema que eu não consigo fazer essas operações matemáticas com os bits..

Acho que precisa ativar algo no simulador.

Vejamos o que consigo com ele.. O pior que ele não é limitado, mas eu sim :)

Obrigado pelas dicas e torno a postar os resultados.

Forte abraço.

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Colegas vejo que vocês entendem bastante sobre pic...ou ao menos tem um bom conhecimento, queria pedir ajuda pra fazer uma coisa...ao usar o conversor A/D, bem:

Tenho um pic 16f628a e eu queria ligar digamos q dois leds, e fazer com que alternacem de um para o outro em tipo modo de "fading" ou então que eu tivesse 4 botões (dois pares) para poder aumentar ou diminuir o brilho de cada um independentemente.

Como eu poderia escrever isso em basic? alguém pode me ajudar? por favor, e obrigado.

abraço

Link para o comentário
Compartilhar em outros sites

;3540730']

... e fazer com que alternacem de um para o outro em tipo modo de "fading" ou então que eu tivesse 4 botões (dois pares) para poder aumentar ou diminuir o brilho de cada um independentemente.

Como eu poderia escrever isso em basic? alguém pode me ajudar? por favor' date=' e obrigado.

abraço[/quote']

Vou dar uma dica, no momento é só o que estou podendo...

Para usar fade ou dimmer em led você tem que usar o pwm...

assim o ad controlado por um pot vai alterar a frequencia do pwm...

como um fade Ok.

Para controlar o pwm com os botões basta inc/dec o valor do ad.

Tinha um dimmer aqui com estas caracteristicas mais deletei...

Usando os exemplos de PWM e AD vai chegar lá.

Abraço.

PS: (A saida do pwm deve ser jogada num fet...)

Link para o comentário
Compartilhar em outros sites

Bem eu tava vendo o exemplo de PWM da mikroe so que eu não to entendendo como eu faço pra colocar a saída em alguma porta do pic.

tipo lá tem os comandos:

pwm_init

pwm_start

pwm_duty_cycle (1000) "1Mhz"

pwm_stop

Alguém sabe como eu vou usar isso ou pelo menos como eu configuro no inicio do programa ou o que eu tenho que habilitar no PIC 16f628 pra eu poder usar o pwm?

por favor...

Link para o comentário
Compartilhar em outros sites

Fala mano, vou tentar te ajudar, mas minha esperiencia nesta parte ainda é pouca.

Este PIC seu me parece que só tem uma porta PWM, (ccp) claro é entrada mas me parece que é as mesma para saida (Tanto que no mikroe voce vai achar (pwm1_init) pwm2_init... que seria ccp1 ccp2 ....

Neste caso seu apenas PWM_Init(minha_var) onde minha var seria o AD ou inc/dec do botao.

voce vai ter que configurar o I/O ''CMCON'' conforme projeto

trisb<3> como saida (onde esta a saida PWM) etc...

Seria +- assim:

'*********************************

program PWM_Test_01

dim variavel as word

PORTA = 255

TRISA = 255 ' configure PORTA pins as input

PORTB = 0 ' set PORTB to 0

TRISB = 0 ' designate PORTB pins as output

CMCON = 7 ' all ADC pins to digital I/O

PWM_Init(1000) ' Initialize PWM1 module at 01kHz

variavel=1000

main:

while TRUE ' endless loop

if (Button(PORTa, 0,1,0)) then ' button on RA0 pressed

Inc(variavel)

end if ' increment

if (Button(PORTa, 1,1,0)) then ' button on RA1 pressed

Dec(variavel) ' decrement

end if

if 1=1 then

PWM_Change_Duty(variavel) ' set new duty ratio, ou seja freq. de saida=

end if

Delay_us(200)

wend 'loop infinito

'+++++++++++++++++++++++++++++++++++++++++

end.

'**********************

Sua saida seria neste caso o rb3 (CCP1)

Tem também que travar a variavel em um patamar maximo e minimo.

Nao testei, mas compilou...

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

pessoal!

Olah fiz um código, ele está correto mas empaca no ADC-read(1)

olha:


program AD_SERIAL_PIC16F628a

main:
dim temp as word
dim temp1 as string[10]

TRISA=1
TRISB=00000010
Usart_init(2400)
loop:

adc_read(0)=temp
wordtostr(temp, temp1)
usart_write_text(temp1)
delay_ms(1000)
goto loop


end.

olhem o erro:

imagemcdp.th.jpg

Agradeço a reposta..

matheus ryndack

Link para o comentário
Compartilhar em outros sites

Oi Matheus, existem erros de sintaxe, e também faltam ser inicializados alguns parâmetros do programa, como o conversor A/D.

Tomei a liberdade de anexar aqui a listagem de um programa fornecido com o Mikrobasic , só que escrito para o PIC16F877A . Acho que vai te ajudar bastante a esclarecer vários problemas, pois parece que faz função parecida ao que voce está fazendo.

' *

' * Project name

' ADC_on_USART

' * Copyright

' © mikroElektronika, 2008

' * Revision History

' 20080225

' - initial release.

' * Description

' This code demonstrates how to use library functions and procedures

' in mikroBasic, and how to perform AD conversion

' and send conversion result via USART

' * Test configuration

' MCU: PIC16F877A

' Dev.Board: EasyPIC5

' Oscillator: HS, 8.000 MHz

' Ext. Modules: None

' SW: mikroBasic v7.1

' * NOTES

' - Make sure you switch on RC7 and RC6 for correct USART communicaton (board specific)

' - Make sure you put the jumper on RA2 at A/D Converter Input (board specific)

' *

program ADC_on_USART

dim temp_res as byte

main:

USART_Init(9600) ' initalize USART (9600 baud rate, 1 stop bit, ...

ADCON1 = 0 ' all porta pins as analog, VDD as Vref

TRISA = $FF ' all porta pins as inputs

while true ' endless loop

temp_res = ADC_read(2) >> 2 ' read conversion result and push

' upper byte to temp_res

USART_Write(temp_res) ' send temp_res via USART

Delay_ms(100)

wend

end.

Espero que agora consiga resolver ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Oi Matheus, existem erros de sintaxe, e também faltam ser inicializados alguns parâmetros do programa, como o conversor A/D.

Tomei a liberdade de anexar aqui a listagem de um programa fornecido com o Mikrobasic , só que escrito para o PIC16F877A . Acho que vai te ajudar bastante a esclarecer vários problemas, pois parece que faz função parecida ao que voce está fazendo.

' *

' * Project name

' ADC_on_USART

' * Copyright

' © mikroElektronika, 2008

' * Revision History

' 20080225

' - initial release.

' * Description

' This code demonstrates how to use library functions and procedures

' in mikroBasic, and how to perform AD conversion

' and send conversion result via USART

' * Test configuration

' MCU: PIC16F877A

' Dev.Board: EasyPIC5

' Oscillator: HS, 8.000 MHz

' Ext. Modules: None

' SW: mikroBasic v7.1

' * NOTES

' - Make sure you switch on RC7 and RC6 for correct USART communicaton (board specific)

' - Make sure you put the jumper on RA2 at A/D Converter Input (board specific)

' *

program ADC_on_USART

dim temp_res as byte

main:

USART_Init(9600) ' initalize USART (9600 baud rate, 1 stop bit, ...

ADCON1 = 0 ' all porta pins as analog, VDD as Vref

TRISA = $FF ' all porta pins as inputs

while true ' endless loop

temp_res = ADC_read(2) >> 2 ' read conversion result and push

' upper byte to temp_res

USART_Write(temp_res) ' send temp_res via USART

Delay_ms(100)

wend

end.

Espero que agora consiga resolver ok ?

Paulo

obrigado amigo!!

Sabe.. Eu tirei esse exemplo de um livro, Programação em Basic Para o microcontrolador PIC18F1220. Sabe?

Eu vou tentar adaptar. Na verdade, eu tenho outro projeto em mente, eu só fiz esse pra testar o Conversor A/D...

Nessa linha:

  ADCON1 =   0            ' all porta pins as analog, VDD as Vref

No caso, todas as AD disponíveis vão ser AD certo? Mas eu queria só uma delas... E como funciona essa de VDD Vref?

obrigado!

problema:

coloco lá pra PIC16F877 compila de boa.

Coloco pra PIC16F628A diz que ADcon1 não foi declarado!

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!