Dev - C++ - Warning conflicting types for...

   
Vista:

Warning conflicting types for...

Publicado por Jose (3 intervenciones) el 14/01/2015 19:47:25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <math.h>
 
#define OFFSET 1.65 
 
uint16_t valorTabla[192];
uint16_t valorRMS  = 0;
 
void adc_init()
{
	ADMUX |= (1<<REFS0);
	ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
	ADCSRA |= (1<<ADPS2) | (1<<ADPS1); // XTAL/64 = 125 kHz
	ADCSRA |= (1<<ADSC); // Start conversion
	sei();
}
 
ISR (ADC_vect){
	static uint8_t index = 0; // variable index, recorre la tabla asignando valores.
	valorTabla[index]=ADC;// Da valor a la tabla de asignacion de valores.
	index++;
 
	if (index == 192){
		index = 0;
		calcularRMS();
		encenderLed();
	}
}
 
int main(void)
{
	adc_init();
 
	DDRC=0xff;//Puerto C como salida
	DDRD=0xff;//Puerto D como salida
 
    while(1)
    {
    }
}
 
void encenderLed (){
 
	if (valorRMS<=0.3)
	{
		PORTD=0b00000000;
	}
	if (valorRMS<=0.6)
	{
		PORTD=0b00000001;
	}
	if (valorRMS<=0.9)
	{
		PORTD=0b00000011;
	}
	if (valorRMS<=1.2)
	{
		PORTD=0b00000111;
	}
	if (valorRMS<=1.5)
	{
		PORTD=0b00001111;
	}
	if (valorRMS<=1.8)
	{
		PORTD=0b00011111;
	}
	if (valorRMS<=2.1)
	{
		PORTD=0b00111111;
	}
	if (valorRMS<=2.4)
	{
		PORTD=0b01111111;
	}
	if (valorRMS<=2.7)
	{
		PORTD=0b11111111;
	}
	if (valorRMS<=3)
	{
		PORTD=0b11111111; PORTC=0b00000001;
	}
	if (valorRMS<=3.3)
	{
		PORTD=0b11111111; PORTC=0b00000011;
	}
}
 
void calcularRMS (){
 
    valorRMS  = 0;
	uint16_t valorCuadrado = 0;
	uint16_t i  = 0;
 
	for (i=0; i<191; i++){
		valorCuadrado = pow( valorTabla[i], 2);
		valorRMS = valorRMS + valorCuadrado;
	}
 
	valorRMS = sqrt((valorRMS / 192) - OFFSET);
}

Para mi punto de vista debería ser un programa sencillo, entra una tensión al adc ya adecuada para no superar los 3,3 y evitar valores negativos... Se calcula el RMS de esa tension y encendemos LED´s segun este valor.

Al compilar no surgen errores, solo los siguientes wanings:

Warning 5 conflicting types for 'calcularRMS' [enabled by default] C:\GccApplication2\GccApplication2\GccApplication2.c 99 6 GccApplication2

Warning 3 conflicting types for 'encenderLed' [enabled by default] C:\GccApplication2\GccApplication2\GccApplication2.c 51 6 GccApplication2

Warning 1 implicit declaration of function 'calcularRMS' [-Wimplicit-function-declaration] C:\GccApplication2\GccApplication2\GccApplication2.c 34 3 GccApplication2

Warning 2 implicit declaration of function 'encenderLed' [-Wimplicit-function-declaration] C:\GccApplication2\GccApplication2\GccApplication2.c 35 3 GccApplication2

Message 6 previous implicit declaration of 'calcularRMS' was here C:\GccApplication2\GccApplication2\GccApplication2.c 34 3 GccApplication2

Message 4 previous implicit declaration of 'encenderLed' was here C:\GccApplication2\GccApplication2\GccApplication2.c 35 3 GccApplication2

En fin, os escribo por desesperación ya no se que mas hacer, y lo debo de entregar mañana.
Un abrazo, y si esto sale adelante... estáis invitados a unas cañas xD
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Warning conflicting types for...

Publicado por vangodp (287 intervenciones) el 14/01/2015 23:48:00
Te faltan los prototipos de las funciones que están después de main. En todo lo que vayas a usar debe estar declarado previamente.
En la funcion ISR (ADC_vect)
llamas a calcularRMS(); y encenderLed(); pero no existe ninguna función con esos nombres antes. para resolver eso ponga los prototipos antes de llamar.
La cabecera deberia quedar asi:

#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <math.h>
#define OFFSET 1.65

uint16_t valorTabla[192];
uint16_t valorRMS = 0;

void calcularRMS (); //<-prototipo de calcularRMS
void encenderLed (); //<-prototipo de encenderLed

aquí sigue la declaración de las funciones, con eso las primeras funciones ya verían las ultimas y todo ok.

Otro problema que es merecedor de su atención es que al hacer esto:
valorCuadrado = pow( valorTabla[i], 2);
valorRMS = sqrt((valorRMS / 192) - OFFSET);

ambas funciones pow como sqrt devuelven double y estas guardando en una variable entera sin signo de 16 bits.

lo mejor seria hacer una conversión: valorRMS = ( uint16_t )sqrt((valorRMS / 192) - OFFSET);

El resultado no va a cambiar pero al menos el compilador no emitiría avisos ya que si haces un cast significa que lo tienes todo bajo control y sabes lo que estas haciendo ;)

Por lo demás no he visto mas cosas. Y no entiendo mucho de encender bombillas y apagadlas, así que espero que el resto lo tengas tu bajo control. =)

Suerte XD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Warning conflicting types for...

Publicado por Jose (3 intervenciones) el 15/01/2015 12:57:18
Muchas gracias tío, con tu comentario resolví los warnings, ya ni errores ni warnings :P. Ahora el problema lo tengo en la configuración del ADC no se porque solo obtengo ceros. Si lo consigo compare el código por aquí. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Warning conflicting types for...

Publicado por vangodp (287 intervenciones) el 15/01/2015 15:00:37
Ni idea compañero... No entiendo nada de electronica =(. Si lo que toca es programación te ayudo en lo que pueda.
Quizás si comentas un poco de que va el tema o en que parte te da error. XDD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Warning conflicting types for...

Publicado por Jose (3 intervenciones) el 16/01/2015 06:33:12
Si comento arriba (después del código) de que va el proyecto. Lo que no entiendo es porque el ADC siempre me mide 0.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar