Ir ao conteúdo
  • Cadastre-se

erro no delay_us


Leobisgui

Posts recomendados

Estou rodando um programa que mais tarde será um alimentador automático de animais, o problema é que sempre que eu tento rodar em microsegundos (delay_us)  em qualquer lugar, dá erro.

 

Se alguém puder ajudar a me explicar o por que está dando erro, ou me der a resposta, ficaria agradecido.

 

Segue a programação abaixo: 

Citação

#include <16F877a.h>
#device adc=8
#include <ds1307.c>
#use delay(clock=4000000)
#include <LCD.C>
#include <I2c.c>
int tempo=50,sim=0;

main()
{
   lcd_init();
   while(true)
   {
   while (input(pin_b0))
   {
   if (tempo>>0)
    tempo=tempo-1;
    lcd_gotoxy(1,1);
    printf(lcd_putc,"TEMPO=%u",tempo);
    delay_ms(100);
   }
   sim=0;
   while (input(pin_b1))
   {
   if (sim==0)
    tempo=tempo+1;
    lcd_gotoxy(1,1);
    printf(lcd_putc,"TEMPO=%u",tempo);
    delay_ms(100);
   if (tempo==50)
   sim=1;
   }
   
   if (input(pin_b2))
   {
    output_c(1);
    delay_ms(tempo);
    output_c(2);
    delay_ms(tempo);
    output_c(4);
    delay_ms(tempo);
    output_c(8);
    delay_ms(tempo);
   }
   else
   {
   output_c(8);
   delay_ms(tempo);
   output_c(4);
   delay_ms(tempo);
   output_c(2);
   delay_ms(tempo);
   output_c(1);
   delay_ms(tempo);
   }
   }
}

///////////////////////////////////////////////////////////////////////////////

void main()
{
  BYTE sec; 
  BYTE min; 
  BYTE hrs; 
  BYTE day; 
  BYTE month; 
  BYTE yr; 
  BYTE dow; 
  
  ds1307_init(); 
  
  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55 
  ds1307_set_date_time(15,6,5,2,15,20,55); 
  
  lcd_init();
  
  while(1) 
  { 
    output_high(pin_a0);
    delay_ms(5);
    output_low(pin_a0);
    delay_ms(5);
    
    ds1307_get_date(day,month,yr,dow); 
    ds1307_get_time(hrs,min,sec); 
    
    lcd_gotoxy(1,1); 
    printf(lcd_putc,"\f\%02d/\%02d/\%02d\r\n",day,month,yr);
    printf(lcd_putc,"\%02d:\%02d:\%02d", hrs,min,sec); 

    delay_ms(5);     

  } 
}

 

Bibliotecas dando erro:

Citação

/***************************************/
/* DS1307.C */
/* Biblioteca para o RTC DS1307 */
/* */
/* autor: Alysson Machado */
/***************************************/

#include <I2C.c>
//importante: A biblioteca I2C.c deve estar incluída antes desta bibioteca!
const byte slave_ad_write=0xD0;
const byte slave_ad_read= 0xD1;
byte seg,min,hor,d,dat,a;

void data_escreve_rtc(byte word_ad, byte dado)
// envia comando de escrita no rtc 
{
//Converte Decimal para BCD
dado=((dado/10)<<4)+(dado%10);
I2C_start();
I2C_escreve_byte(slave_ad_write);
delay_us(3);
I2C_le_ack();
I2C_escreve_byte(word_ad);
I2C_le_ack();
I2C_escreve_byte(dado);
I2C_le_ack();
I2C_stop();
}
unsigned char data_le_rtc(byte word_ad_read)
//le um byte enviado pelo rtc do barramento I2C
{
byte rtc_byte;
I2C_start();
I2C_escreve_byte(slave_ad_write);
delay_us(3);
I2C_le_ack();
I2C_escreve_byte(word_ad_read);
I2C_le_ack();
I2C_start();
I2C_escreve_byte(slave_ad_read);
I2C_le_ack();
rtc_byte=I2C_le_byte();
delay_us(2);
I2C_nack();
I2C_stop();
//Converte BCD para decimal
rtc_byte=((rtc_byte>>4)*10)+rtc_byte%16;
return rtc_byte;
}
unsigned byte converte_decimal_to_BCD(byte info)
//converte o dado para BCD
{
info=((info/10)<<4)+(info%10);
return info;
}
void grava_alldata_rtc(seg,min,hor,d,dat,m,a)
//grava todos os dados no RTC
{
seg=converte_decimal_to_BCD(seg);
min=converte_decimal_to_BCD(min);
hor=converte_decimal_to_BCD(hor);
d=converte_decimal_to_BCD(d);
dat=converte_decimal_to_BCD(dat);
m=converte_decimal_to_BCD(m);
a=converte_decimal_to_BCD(a);
I2C_start();
I2C_escreve_byte(slave_ad_write);
delay_us(3);
I2C_le_ack();
I2C_escreve_byte(0x00);
I2C_le_ack();
I2C_escreve_byte(seg);
I2C_le_ack();
I2C_escreve_byte(min);
I2C_le_ack();
I2C_escreve_byte(hor);
I2C_le_ack();
I2C_escreve_byte(d);
I2C_le_ack();
I2C_escreve_byte(dat);
I2C_le_ack();
I2C_escreve_byte(m);
I2C_le_ack();
I2C_escreve_byte(a);
I2C_le_ack();
I2C_stop();
}
void desativa_clock_rtc()
//desativa o clock do RTC
{
byte aux_seg;
aux_seg=data_le_rtc(0x00);
data_escreve_rtc(0x00,(0x50+aux_seg));
}
void ativa_clock_rtc()
//ativa o clock do RTC
{
byte aux_seg;
aux_seg=data_le_rtc(0x00)-0x50;
data_escreve_rtc(0x00,aux_seg);
}
void zera_segundos_rtc()
//zera a contagem dos segundos
{
data_escreve_rtc(0x00,0);
}
void seleciona_clockout_rtc(int1 OUT,int1 SQWE,int1 RS1,int1 RS0)
//seleciona o estado do pino SQW/OUT
{
if(SQWE==0)
{
if(OUT==0)
{
data_escreve_rtc(0x07,0);
}
else if(OUT==1)
{
data_escreve_rtc(0x07,80);
}
}
else if(SQWE==1)
{
if((RS0==0)&&(RS1==0))
{
data_escreve_rtc(0x07,10);
}
else if((RS0==1)&&(RS1==0))
{
data_escreve_rtc(0x07,11);
}
else if((RS0==1)&&(RS1==1))
{
data_escreve_rtc(0x07,13);
}

}

 

I2c.c

Citação

/*************************************************************/
/* I2C.C */
/* Biblioteca de comunicação I2C por software com suporte a memórias */
/* EEPROM */
/* autor: Fábio Pereira */
/*************************************************************/

#ifndef scl
//Definições dos pinos de comunicação
#define scl pin_b1 //pino de clock
#define sda pin_b0 //pino de dados
#define EEPROM_SIZE 32768 //tamanho dem bytes da memória eeprom
#endif

#define seta_scl output_float(scl) //seta o pino scl
#define apaga_scl output_low(scl) //apaga o pino scl
#define seta_sda output_float(sda) //seta o pino sda
#define bit_sda output_high(sda) //coloca nivel no barramento
#define apaga_sda output_low(sda) //apaga o pino sda

void I2C_start(void)
//coloca o barramento na condição de start
{
apaga_scl;
delay_us(3);
seta_sda;
delay_us(3);
seta_scl;
delay_us(3);
apaga_sda;
delay_us(3);
apaga_scl;
delay_us(3);
}
void I2C_stop(void)
//coloca o barramento na condição de stop
{
delay_us(3);
apaga_scl;
delay_us(3);
apaga_sda;
delay_us(3);
seta_scl;
delay_us(4);
seta_sda;
delay_us(3);
}
void I2C_ack()
//coloca o sinal de reconhecimento no barramento
{
apaga_sda;
delay_us(3);
seta_scl;
delay_us(3);
apaga_scl;
delay_us(3);
seta_sda;
delay_us(3);
}
void I2C_nack()
//coloca no barramento o sinal de não reconhecimento
{
seta_sda;
delay_us(3);
seta_scl;
delay_us(3);
apaga_scl;
delay_us(3);
}
boolean I2C_le_ack()
//efetua a leitura do sinal de ack/nack
{
boolean estado;
seta_sda;
delay_us(3);
seta_scl;
delay_us(2);
do{
estado=input(sda);
delay_us(3);
apaga_scl;
delay_us(3);
return estado;
delay_us(3);
}while(estado!=0);

}
void I2C_escreve_byte(unsigned byte dado)
{
//envia um byte pelo barramento I2C
int conta=8;
delay_us(2);
apaga_scl;
while(conta)
{
//envia primeiro o MSB
if(shift_left(&dado,1,0)) {seta_sda; delay_us(3);} else { apaga_sda;delay_us(3);}
//dá um pulso em scl;
seta_scl;
delay_us(3);
conta--;
apaga_scl;
delay_us(3);
}
//ativa sda
seta_sda;
delay_us(3);
}
unsigned char I2C_le_byte()
//recebe um byte pelo barramento I2C
{
unsigned char bytelido,conta=8;
bytelido=0;
apaga_scl;
delay_us(3);
seta_sda;
delay_us(3);
while(conta)
{
//ativa scl
seta_scl;
delay_us(3);
//lê o byte em sda, deslocando em byte lido
shift_left(&bytelido,1,input(sda));
conta--;
// desativa scl
delay_us(3);
apaga_scl;
delay_us(3);
}
return bytelido;
}
void escreve_eeprom(byte dispositivo,long endereco,byte dado)
//escreve em um endereço do dispositivo
//dispositivo - é o endereço do dispositivo escravo
//endereco - é o endereço de memória a ser escrito
//dado - é a informação a ser guardada
{
if(dispositivo>7) dispositivo=7;
I2C_start();
I2C_escreve_byte(0xA0|(dispositivo<<1));
I2C_le_ack();
I2C_escreve_byte(endereco>>8);
I2C_le_ack();
I2C_escreve_byte(endereco);
I2C_le_ack();
I2C_escreve_byte(dado);
I2C_le_ack();
I2C_stop();
delay_ms(10);
}
byte le_eeprom(byte dispositivo,long int endereco)
//lê um dado de um endereço específico no dispositivo
//dispositivo - é o endereço do dispositivo escravo (0 - 7)
//endereco - é o endereço da memória a ser lida
{
byte dado;
if(dispositivo>7) dispositivo=7;
I2C_start();
I2C_escreve_byte(0xA0|(dispositivo<<1));
I2C_le_ack();
I2C_escreve_byte(endereco>>8);
I2C_le_ack();
I2C_escreve_byte(endereco);
I2C_le_ack();
I2C_start();
//envia comando de leitura
I2C_escreve_byte(0xA1|(dispositivo<<1));
I2C_le_ack();
dado=I2C_le_byte();
I2C_nack();
I2C_stop();
return dado;

}

 

problema.png

Link para o comentário
Compartilhar em outros sites

Boa noite, esse erro é devido a uma mal interpretação do código, você não declarou a função delay_us(). Mesmo que o SDL contenha essa função, ela não foi encontrada nem declarada. Abraço

 

EDIT

A resolução seria procurar essa função e declarar antes de usa-la.

// ---  Errado  ----
int main()
{
delay_us(33);
}

void delay_us(int us){
...
}
//#########################
// ---  Certo  ----
void delay_us(int us){
...
}

int main()
{
delay_us(33);
}

//#########################
// ---  Certo  ----
void delay_us(int us);

int main()
{
delay_us(33);
}

void delay_us(int us){
...
}
//#########################

 

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...
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...