Ir ao conteúdo
  • Cadastre-se

Leitura Analogica PIC 12F675


adalberto.maicon

Posts recomendados

Boa noite

Estou precisando desenvolver um projeto em que com dois potenciômetros eu consiga aumentar e diminuir o tempo ligado e desligado do pino 5 do PIC 12F675.

Bom e assim no canal AN0 eu faço a leitura e seleção de tempo de 0 a 5 minutos quando o potenciômetro 1 estiver em 0 volts ele não liga a porta 5 e quando estiver em 5 volts ele fica ligado por 5 minutos, no canal AN1 eu faço a seleção de tempo desligado de 0 a 5 minutos quando o potenciômetro 2 estiver em 0 a porta 5 não desliga quando estiver em 5 volts a porta 5 fica 5 minutos desligada. Agora que vem o problema, primeiro estou acostumado a programar com o 16f877a que tratamos as portas como TRISA B C D E ja neste é GP0 GP1 e assim por diante, não sei como fazer a leitura de dois canais no PIC e a partir dai transformar isso em tempo. segue em anexo o esquema que estou pretendendo fazer.

:wacko:

post-945277-13884965876844_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Você vai fazer o programa em Assembly?

Em assembly eu não conheço muita coisa, estou mais habituado em C, ccs compiler.

Estava lendo em um outro tópico aqui mesmo no Clube do Hardware e vi que este PIC tem calibrar o oscilador, pelo que entendi deve ser lido ele antes de gravar e inserir o ultimo valor da memoria no programa. Como eu não sabia disso eu ja gravei um programa nele para testes e não funcionou isso quer dizer que eu ja perdi este pic por não ter feito este procedimento?

Link para o comentário
Compartilhar em outros sites

Se a última localidade da memória de programa foi apagada, você perdeu o valor de calibração do oscilador interno, mas pode usar o PIC com oscilador externo.

Veja o que consta no datasheet:

9.2.5 INTERNAL 4 MHZ OSCILLATOR
When calibrated, the internal oscillator provides a fixed
4 MHz (nominal) system clock. See Electrical
Specifications, Section 12.0, for information on
variation over voltage and temperature.
Two options are available for this Oscillator mode
which allow GP4 to be used as a general purpose I/O
or to output FOSC/4.
9.2.5.1 Calibrating the Internal Oscillator
A calibration instruction is programmed into the last
location of program memory. This instruction is a
RETLW XX, where the literal is the calibration value.
The literal is placed in the OSCCAL register to set the
calibration of the internal oscillator. Example 9-1
demonstrates how to calibrate the internal oscillator.
For best operation, decouple (with capacitance) VDD
and VSS as close to the device as possible.
Note: Erasing the device will also erase the preprogrammed
internal calibration value for
the internal oscillator. The calibration value
must be saved prior to erasing part as
specified in the PIC12F629/675 Programming
specification. Microchip Development
Tools maintain all calibration bits to
factory settings.

Leia a memória de programa dele para ver o valor da última localidade da memória.

Link para o comentário
Compartilhar em outros sites

Se a última localidade da memória de programa foi apagada, você perdeu o valor de calibração do oscilador interno

Perdeu não. Esse valor é 3460. Você lê o PIC, escreve 3460 lá no último endereço usando o mouse e o teclado e depois regrava isso no mesmo PIC. Tenta aí que vai dar certo.

Você pode também ler um PIC12F675 virgem e depois usar essa leitura e gravar no PIC cujo valor foi apagado. Fica novinho em folha.

Agricio

Link para o comentário
Compartilhar em outros sites

Ok vou ver se não der certo ai coloco cristal externo ou compro outro pic, e quando as entradas analogicas segue um programa que fiz no 18F4520

while (1){
{
medido_set = Adc_Read(0); // le canal analogico 0
ajustado_set = ((medido_set*5.00*20)/1023);
floatToStr (ajustado_set, texto1);
Lcd_Out(1,30, texto1);

medido_agua = adc_read(1);
ajustado_agua = (medido_agua*5.00*100)/1023; // le canal analogico 1
floatTostr(ajustado_agua, texto2);
Lcd_Out(2,6, texto2);
}
}

onde esta Lcd_out que neste programa e para escrever o valor num lcd eu queria variar o tempo da porta GP2 ou pino 5.

Link para o comentário
Compartilhar em outros sites

Agricio,este valor é um ajuste fino,por isso ele existe senão não precisaria te-lo.

Este ajuste é feito na fabricação e é individual para cada componente, se fosse igual a todos não precisaria existir,correto?

CLaro que gravando um valor padrão vai oscilar mais não será de exatidão máxima.

Da uma lida no datasheet página 56 - 9.2.5

Tem um artigo ensinando como recalibrar:

-> Recalibrando oscilador interno <-

Link para o comentário
Compartilhar em outros sites

vtrx

Matéria interessante, gostei, agradeço, vou imprimir e vou fazer testes p/ ver se há diferença assim que sobrar um tempinho.

Você prestou atenção nisso?

IMPORTANT: This code will calculate the correct calibration word but it can't save it back into the PICs program memory - You must do this manually using your PIC programmer.

Só p/ acrescentar algo mais:

Usando a frequência interna desse PIC (4MHz) eu consegui frequências PWM via software nos valores de ±15Hz - ±30Hz - 61Hz - 122Hz - 244Hz - 488Hz, é claro que dá diferença de resolução entre uma frequência e outra. Essas frequências não servem p/ motor nenhum de esteira por serem terrivelmente audíveis; mas, o motor vira normal, dá p/ fazer testes.

O que quero dizer é que no momento de gravar o software no PIC o programa pergunta se desejo manter o oscilador que consta no PIC ou se desejo usar outro valor. Uma distração nesse detalhe e pronto, o programa apaga o valor de 3460 e coloca tudo em FF. E AÍ, a gravação do software no PIC é feita com sucesso; mas, simplesmente não funciona, apagou o identificador interno dos 4MHz do PIC. Para resolver isso eu reescrevo manualmente o valor de 3460 usando o mouse e o teclado, regravo e maravilha, tudo funciona sem alteração nenhuma nas frequências PWMs.

O que já fiz de experiência nesse sentido, apagando e reescrevendo esse valor de 3460, só vendo p/ crer. Nunca perdí nenhum PIC.

Agricio

Link para o comentário
Compartilhar em outros sites

Aqui está um exemplo de como configurar os ports desse PIC em MikroCPro V.4.60.0.0

Peguei aleatóriamente aqui no PC. Espero que ajude.

sbit pin0 at GPIO.B0;
sbit pin1 at GPIO.B1;
sbit pin2 at GPIO.B2;
sbit pin4 at GPIO.B4;
sbit pin5 at GPIO.B5;

void main() {
CMCON |= 7;
GPIO = 0;
TRISIO = 0;

while (1){

pin0 = 1;
Delay_ms(500);
pin0 = 0;

pin1 = 1;
Delay_ms(500);
pin1 = 0;

pin2 = 1;
Delay_ms(500);
pin2 = 0;

pin4 = 1;
Delay_ms(500);
pin4 = 0;

pin5 = 1;
Delay_ms(500);
pin5 = 0;

}
}

Agricio

Link para o comentário
Compartilhar em outros sites

Pessoal,

Fiz um programa aqui gostaria de suas opiniões, para minha aplicação já acho que seja suficiente pois queria através de dois potenciômetro variar o tempo de uma saída ligada e tempo desligada, no meu caso apanhei uma semana desse danado tentando aumentar e diminuir o tempo e foi um erro clássico de iniciantes, " declarei a variável com tamanho menor que era preciso", estava declarando com int8 e numa das tentativas e erros resolvi aumentar o tamanho dela e não é que deu certo!!! Outra coisa que fiz foi multiplicar o valor lido no canal analógico por 5 para aumentar o tempo liga/desliga pois o tempo máximo era de aproximadamente 1 segundo. Bom segue o meu código para quem quiser ver opinar e usar esta a disposição.

#include <12F675.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#use delay(clock=4000000)

#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5

int16 liga, desliga;

void main()
{

setup_adc_ports(sAN0|sAN2|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


while(True){

set_adc_channel(0);
delay_us (10);
liga = read_adc();
liga = liga * 5;

set_adc_channel (2);
delay_us (20);
desliga = read_adc();
desliga = desliga * 5;

output_high(PIN_A1);
delay_ms(liga);

output_low(PIN_A1);
delay_ms(desliga);
}

}

Em anexo coloquei meu circuito para quem quiser ver.

post-945277-13884965967835_thumb.jpg

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!