Ir ao conteúdo

Programar PIC em C


CIS

Posts recomendados

Postado

beleza shunt, entendi a vejo que preciso prestar mais atenção né...rsrsrs

mas você sabe dizer porque o compilador não aceita uma variavel do tipo float??? to querendo usar tempos diferentes, mas to com dificuladades nos calculos e na declaração dessa variavel... o exemplo citado deu certo agora, mas ele apenas faz um tempo ligado e o mesmo tempo desligado, ja testei outros numeros e funcionou, mas como fazer por exemplo 2 segundos ligados e 20 segundos desligados, e por ai vai....

sua dicas estão sendo de grandíssimo valor cara, obrigado mesmo. Deus a de te recompensar!!! e como o Fabio, aquele do tutorial que você me passou, fala, quem ensina aprende duas vezes!!!!

Postado

Use o tipo de variavel >>> long ao contrario de float.

Continuando com seu código, poderia ser algo como 22 segundos de contagem.

Considere já ter os calculos para as interrupções. Uma variável ira contar as interrupções. Depois de x interrupções (e incrementos nesta variavel auxiliar) temos 1 segundo, então executa-se o bloco em pseudocodigo abaixo:


//===== os trechos abaixo ficam dentro da interrupção ==========
// limita contador até 22 (0 à 22).
contador ++
se contador >= 23
contador = 0

// abaixo faz o que você precisa com o led.
se contador <=2
led = 1
senão led = 0
//==============================================================

Agora é codificar no compilador a ideia e ver como funciona.

Abç.

Postado
Use o tipo de variavel >>> long ao contrario de float.

Continuando com seu código, poderia ser algo como 22 segundos de contagem.

Considere já ter os calculos para as interrupções. Uma variável ira contar as interrupções. Depois de x interrupções (e incrementos nesta variavel auxiliar) temos 1 segundo, então executa-se o bloco em pseudocodigo abaixo:


//===== os trechos abaixo ficam dentro da interrupção ==========
// limita contador até 22 (0 à 22).
contador ++
se contador >= 23
contador = 0

// abaixo faz o que você precisa com o led.
se contador <=2
led = 1
senão led = 0
//==============================================================

Agora é codificar no compilador a ideia e ver como funciona.

Abç.

eu tentei assim

contador ++

if ( contador >= 23) {

contador = 0

}

if ( contador <= 2 ) {

led = 1 ;

else

led = 0

}

mas não compilou e deu erro na linha void main() , não entendi mas acho que essa parte do codigo ficou certo, ou errei em algum lugar???

Postado
eu tentei assim

 contador ++
if ( contador >= 23) {
contador = 0
}
if ( contador <= 2 ) {
led = 1 ;
else
led = 0
}

A única coisa que faltou foram alguns ponto e vírgula no final de algumas instruções.

mas não compilou e deu erro na linha void main() ... ou errei em algum lugar?

Manda o código inteiro.

Abç.

Postado

#define led GPIO.F0

//Se o define acima der erro, comente-o e descomente abaixo:

//#define led GPIO.B0

volatile unsigned short contador = 0;

void interrupt()

{

if (INTCON.TMR0IF ==1) // checa se a flag é do timer0 (pois pode ser outras se mais interrupções estiverem habilitadas).

{

contador++;

if ( contador >= 23) {

contador = 0;

}

if ( contador <= 2 ) {

led = 1 ;

else

led = 0 ;

}

}

}

INTCON.TMR0IF = 0; // limpa a flag

INTCON.TMR0IE = 1; // reabilita a interrupção

TMR0 = 0; // preload do timer0

}

void main() {

CMCON = 7;

ANSEL = 0;

TRISIO = 0x08;

GPIO = 0x00;

led = 0;

//Veja no datasheet como ficam as configurações abaixo:

OPTION_REG.T0CS = 0;

OPTION_REG.T0SE = 0;

OPTION_REG.PSA = 0;

OPTION_REG.PS2 = 0;

OPTION_REG.PS1 = 1;

OPTION_REG.PS0 = 0;

TMR0 = 0; // preload do timer0

INTCON = 0;

INTCON.TMR0IE = 1;

INTCON.TMR0IF = 0;

INTCON.GIE = 1;

for(;{}

}

esse é o codigo, não compilou e continua dando erro em VOID MAIN()..

Postado

Só por curiosidade,dei uma lida rápida aquí.

Por acaso o código que funciona não é assim?

#define led GPIO.F0
//Se o define acima der erro, comente-o e descomente abaixo:
//#define led GPIO.B0

volatile unsigned short x = 0;

void interrupt()
{
// Timer0 Interrupção: Frequencia = 18.00 Hz /// Periodo = 0.055552 segundos.
if (INTCON.T0IF==1) // checa se a flag é do timer0 (pois pode ser outras se mais interrupções estiverem habilitadas).
{
x++;
if(x == 18){
led = !led;
x = 0;
}

}
INTCON.T0IE = 0; // limpa a flag
INTCON.T0IE = 1; // reabilita a interrupção
TMR0 = 39; // preload do timer0
}

void main() {
CMCON = 7;
ANSEL = 0;
TRISIO = 0x08;
GPIO = 0x00;
led = 0;

//Veja no datasheet como ficam as configurações abaixo:
OPTION_REG.T0CS = 0;
OPTION_REG.T0SE = 0;
OPTION_REG.PSA = 0;
OPTION_REG.PS2 = 1;
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;
TMR0 = 39; // preload do timer0

INTCON = 0;
INTCON.T0IE = 1;
INTCON.T0IE = 0;
INTCON.GIE = 1;

for(;{}

}

Postado
não compilou e continua dando erro em VOID MAIN()..

Amigo, você precisa se disciplinar um pouco! Sua sintaxe está bem, o problema é falta de atenção. Existem muitas chaves colocadas em lugar invalido.

O erro do void main, você fez:

for(;{}
}

O correto seria:

for(;{}
}

Tente o código abaixo:



volatile unsigned short contador = 0;

void interrupt(){
if (INTCON.TMR0IF ==1) // checa se a flag é do timer0 (pois pode ser outras se mais interrupções estiverem habilitadas).
{
contador++;
if ( contador >= 23) {
contador = 0;
}
if ( contador <= 2 ){
led = 1 ;
}
else
led = 0 ;
}

INTCON.TMR0IF = 0; // limpa a flag
INTCON.TMR0IE = 1; // reabilita a interrupção
TMR0 = 39; // preload do timer0
}

void main() {
CMCON = 7;
ANSEL = 0;
TRISIO = 0x08;
GPIO = 0x00;
led = 0;

//Veja no datasheet como ficam as configurações abaixo:
OPTION_REG.T0CS = 0;
OPTION_REG.T0SE = 0;
OPTION_REG.PSA = 0;
OPTION_REG.PS2 = 1;
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;
TMR0 = 39; // preload do timer0

INTCON = 0;
INTCON.TMR0IE = 1;
INTCON.TMR0IF = 0;
INTCON.GIE = 1;

for(;;){}

}
#define led GPIO.F0

Abç!

Postado

Alguem com exemplos para o PIC 16F877A no mickro C ???

para acender uns leds e começar no timer 1.

se alguem tiver postar aqui por favor...

ainda to com o 12F675, e agora com 16F877A pra começar mais estudos....

valeu pessoal!!!!

  • 4 meses depois...
Postado

Ola a todos.Bom sou novo aqui no forum,portanto já peço desculpas

caso esteja violando alguma regra em postar meu problema aqui deste modo.

O caso é que conheço bem pouco sobre programação C e quero

modificar um projeto de um termostato que peguei na net.Ele esta

funcionando bem no proteus.Tenho o arquivo hex e o arquivo C.

Quando abro o arquivo C no ccs para editar e compilar aparecem varios erros.

O primeiro é não encontrar o #include <regs.h> e os demais parecem ser de sintaxe.Preciso da ajuda de vocês,estou mandando o arquivo para uma analise.Obrigado

--------------------------------------------------------------------------

#include <16F877A.h>

#include <regs.h>
#include <math.h>

//#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=4000000)

#define DATA PORTB
#define RS PORTD_0
#define E PORTD_1

#define UP PORTD_4
#define DOWN PORTD_5

#define OUTINV PORTD_6
#define OUT PORTD_7

#define lcd_seg_lin 0x40

int const tabela[6] = {0x30,0x38,0x0c,0x01,0x06,0x01};

long int
x=0,
y=0,
temp=0,
valor_ad=0;

int val=0;

//Programação do Display LCD 16x2

void lcd_pos_xy(char x ,char y)
{
char endereco;
delay_ms(5);
if(y!=1) endereco = lcd_seg_lin;
else
endereco = 0 ;
endereco = endereco + (x - 1);
RS=0;
endereco = 0x80 | endereco;
DATA = endereco ;
E = 1;
E = 0;
delay_ms(2);
}

void lcd_ini(void)
{
char contador = 0;

RS=0;
E = 0;

for(contador=0;contador<3; contador++){

DATA = tabela[0];
E = 1;
E = 0;
delay_ms(3);

}

for(contador=0;contador<5 ;contador ++ ){

DATA = tabela [ contador + 1] ;
E = 1;
E = 0;
delay_ms(2);
}
}

void lcd_escreve(char caracter)
{
RS = 1 ;
delay_us(100);
DATA = caracter ;
E = 1;
E = 0;
}

//Configuração das portas AD

void config_ad (void)
{
ADIF=0;
ADCON0=0b01000001;
ADCON1=0b10000000;
}

void selecao_AD(char canal)
{
ADCON0 = ADCON0 & 0b11000111;
ADCON0 = (canal << 3 ) | ADCON0;
}


long int ler_AD(char canal)
{
selecao_AD(canal); // chamar a rotina selecao_ad()
ADIF=0; // apagar o flag responsável pelo termino da conversão
GO_DONE = 1; // flag responsável pela inicialização da conversão.
while(!ADIF); // aguardar o final da conversão.
valor_ad=((long int)ADRESH<<8) + ADRESL;
return valor_ad; // retorna o valor lido pelo AD.
}

//Conversão para temperatura

void temperatura (void)
{
ler_ad(0);
temp=valor_ad/2.046;
}

void main(void)
{
char grau=223; // º= 223 na ASCII

TRISB = 0x00 ;
TRISC = 0x00 ;
//TRISD = 0x00 ;

TRISD_0 = 0 ; //RS Display
TRISD_1 = 0 ; //E Display

TRISD_4 = 1 ; //Comand UP input
TRISD_5 = 1 ; //Comand DOWN input

TRISD_6 = 0 ; //OUT
TRISD_7 = 0 ; //OUT INVERT

config_ad();
lcd_ini();

GIE=0;
val=read_eeprom(0x00);
GIE=1;

lcd_pos_xy(1,1);
lcd_escreve(" Termostato ") ;
lcd_pos_xy(1,2);
lcd_escreve(" Versao 1.0 ") ;
delay_ms(2000);
lcd_pos_xy(1,1);
lcd_escreve(" ") ;
lcd_pos_xy(1,2);
lcd_escreve(" ") ;

lcd_pos_xy(1,1);
lcd_escreve("Set Temp: ") ;


lcd_pos_xy(10,2);
printf(lcd_escreve,"RES:");

while (1)
{
temperatura();
lcd_pos_xy(1,2);
printf(lcd_escreve,"%3lu%cC ",temp,grau);

if (UP)
{
delay_ms(100); //Aguarda 100ms antes de verificar se a tecla continua pressionada
while(UP); //Fica nesse laço enquanto a tecla for mantida pressionada
if(val<150)val++; //Só incrementa se o valor atual de val for menor que 150
write_eeprom(0,val);
}
if (DOWN)
{
delay_ms(100); //Aguarda 100ms antes de verificar se a tecla continua pressionada
while(DOWN); //Fica nesse laço enquanto a tecla for mantida pressionada
if(val) val--; //Só decrementa se val for maior que zero.
write_eeprom(0,val);
}

if (temp<=val)
{
OUT=1;
OUTINV=0;
lcd_pos_xy(14,2);
printf(lcd_escreve,"ON ");
}

else
{
OUT=0;
OUTINV=1;
lcd_pos_xy(14,2);
printf(lcd_escreve,"OFF");
}

lcd_pos_xy(11,1);
printf(lcd_escreve,"%3u",val);
lcd_pos_xy(14,1);
printf(lcd_escreve,"%cC",grau);
}
}

  • 1 ano depois...
Postado

Amigo se você desejar posso eu desarolar um outro programa tambem feito em CCS deste seu Thermostato...porém utilizando um Pic 16F876A ou 873A ao invés de usar o Micro Pic 16F877A que no meu ver seria um verdadeiro desperdicio de sua parte utilizar um micro como o 877 para desarolar um Thermostato como este....ok legal se desejar me diga que sim que te desarolo um outro circuito utilizando um Pic 16F876A ou 873A com toda a mesma funcionabilidade deste seu que utiliza um Pic 16F877A ok te mando esquema e o código fonte ja compilado com o seu devido Hexa.....minha ideia seria a seguinte 3 switch sendo um entrada de menú e os demais sedno Up e Down posso desarolar ele para controlar temperaturas de até 550°C ou 586°C ok sendo que o Set Point seria de máximo 580°C no display mostra RES: ON RES:OFF conforme percebi estar sendo usado no seu código fonte esposto por você ok ou seja seria o mesmo porém se utilizando de um micro 876A e não mais o 877A ....Um abraço e aguardo respostas.

O seu código fonte pelo que percebi só contróla temperaturas de no máximo 150°C porém quando você programar o micro pela primeira vez e ligar ele virá em uma temperatura maior porém somente irá abaixar quando calcar em Down somente ira subir quando seu Set Point estiver menor que 150°C ....não esquenta com isso eu te resolvo este problema !!!!

Se desejar tambem te forneço o esquema do (amplificador thermopar) utilizando um operacional LM324N eu desenvolvi este amplificador que me referência muito bem à temperaturas à címa de 150°C com um custo muito baixo devido ao simples amplificador operacional de fácil aquisição tendo um custo de R$1,50 por cada Chip LM324N ok bom meu amigo o que ue você precisar em relação a isso eu tenho de tudo ok !!!

É meu amigo este seu código Fonte tem devários problemas veja que um deles eu nem consigo entender porque o fizeram assim desta forma conforme mostro abaixo.

//Conversão para temperatura

void temperatura (void)
{
ler_ad(0);
temp=valor_ad/2.046;
}

void main(void)
{

e alem de tudo estão usando o adc=8 deveriam estar usando o adc=10 meu amigo e o valro de VAL tambem esta muito baixo esta em 150 note você tambem que 100ms é muita coisa deveria esta em 20ms pois para certos com por exemplo um resistencia ligada de 4000W no caso a temperatura subiria demais devido a demora do ajuste por estar em 100ms qaundo você terminar de acertar a temperatura do Set Point s ua máxima estaria em torno dos 400°C pois note de que seu programa não possue uma proteção em Timer ou seja um tempo para que o ajsute seja efetuado caso contrario ele voltaria em esado de contrôle de temepratura efetuado pelo micro desta forma em que esta você fica sem proteção alguma este seu codigo fonte deveria cair em estado de desarme do calafetador para que a temperatura não venha a subir muito durante o tempo que se leva para adjustar o Set Point segue abaixo um exemplo de ajuste Up Down para este tipo de Thermostato

if(valor_temp < x)  // Se temperatura for MENOR que SET POINT
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Set Temp:%lu\xDFC\n%1.0f\xDFC RES:ON ",x, valor_temp);
delay_ms(20); //Tempo de subida RES x Ref.Thermopar
output_high(esquentando);
output_high(moc3020); //Controlando subida Rampa PWM do PIC12F683
output_low(pronto);
}
delay_ms (2000); // Serve para que variações mostradas no display sejam menores
if(valor_temp > x) // Se temperatura for MAIOR que SET POINT
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Set Temp:%lu\xDFC\n%1.0f\xDFC RES:OFF",x, valor_temp);
delay_ms(20); //Tempo de descida RES x Ref.Thermopar
output_low(esquentando);
output_low(moc3020); //Controlando Descida Rampa PWM do PIC12F683
output_high(pronto);
}


restart_wdt();
}
}
}
}

  • 5 meses depois...
  • Coordenador
Postado

Caso o autor necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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