Problema en sentencia DO-while en C

#1
hola gente .... bueno tengo problemas con la compilación en avrstudio 4.13 me larga error y no me compila ...
Código:
void change_color()                                                                         																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																									
	{
	int temp;    																																																																																																																																																																																																																																																																																																																																																																																																																																																																																													
   
	do{
	 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																														
	
	temp=color_number;
		temp+=7;
		if (temp>12)
		{
			temp-=12;
		}
 
	}while ((temp>12)|(color_number==temp));	//reloj? El temporizador sea inferior a un valor? de los registros en la tabla, y? por que no? el mismo color
	color_number=temp;			//actualmente mostrar matriz de color
	set_color(color_number);		//limpiar el color de la matriz definida
}
y el error que me marca el compilador es el siguiente
Código:
../AUDIORITMICOPAR648515.c: In function 'change_color':
......../AUDIORITMICOPAR648515.c:126: error: 'color_number' undeclared (first use in this function)
../AUDIORITMICOPAR648515.c:126: error: (Each undeclared identifier is reported only once
../AUDIORITMICOPAR648515.c:126: error: for each function it appears in.)
y la verdad he buscado en la red y en el foro .....y no encuentro solución los ejemplos que vi son con funciones distintas
 

Dr. Zoidberg

Well-known-Papá Pitufo
#2
No tenes declarada la variable color_number. Tenes que declararla al principio de la funcion:
int color_number=0;

De todas formas, esa funcion no pinta nada bien.
 
Última edición:
#4
No tenes declarada la variable color_number. Tenes que declararla al principio de la funcion:
int color_number=0;

De todas formas, esa funcion no pinta nada bien.
gracias " maestro Zoidberg " y ruben90 ...... bueno allí lo cambie ..... se elimino el error..... (no se si funcionara ... me falta cambiar varias cosas .... yo lo hice así .... no se si estará bien
Código:
void change_color()                                                                         																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																									
	{
	int temp;    																																																																																																																																																																																																																																																																																																																																																																																																																																																																																													
   int color_number=0;
	do{
	 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																														
	
	temp=color_number;
		temp+=7;
		if (temp>12)
		{
			temp-=12;
		}
 
	}while ((temp>12)|(color_number==temp));	//reloj? El temporizador sea inferior a un valor? de los registros en la tabla, y? para que no? el mismo color
	color_number=temp;							//recordando barato actualmente mostrar en contra de color
	set_color(color_number);					//que aclarar el color de la matriz definida
}
:oops::oops::oops::oops:
 

Dr. Zoidberg

Well-known-Papá Pitufo
#5
Ya veo...
La variable que te dije que agregaras no es una variable local sino un parámetro formal de la función change_color, por que si no lo hacés así no vas a poder pasarle el valor que querés poner en temp.
Cambialo así como te lo paso ahora:
Código:
void change_color( int color_number ) {
int temp;
do{
    temp=color_number;
    .....
Y de esta forma vas a poder hacer algo como:
Código:
....
change_color( COLOR_ROJO );    /* o algo por el estilo */
....
 
#6
bueno en mi estado etilico detecto este error garraafal


}
while ((temp>12)|(color_number==temp));


xi estas aciendo un OR

en C debes hjacer un ORR bopble

while ((temp>12)||(color_number==temp));

y eso que eando borracho
 

Dr. Zoidberg

Well-known-Papá Pitufo
#7
whiile ((temp>12)|(color_number==temp));

xi estas aciendo un OR

en C debes hjacer un ORR bopble

while ((temp>12)||(color_number==temp));
Si.... estas bastante borracho jajajaja
La unica diferencia entre | y || es que la segunda hace una "evaluacion en cortocircuito" con un incremento marginal de velocidad, pero eso no da un error de compilacion...
 
#8
ya se me anda bajando pero

(temp>12) cuando se hace esto es por que declaramos temp con signo

ejemplo

signed char temp;

no me da error de compilacion pero me genera error en el proyecto real si lo declaro asi;

char temp

y si
en el while

hago esto:
((temp>12)|(color_number==temp))

el temp que no se si fue declarado signed aunque por default el compilador lo toma como signed pero mi experiencia me dice que aveces hace bugs va habver un problema asi que yo lo haria asi:

((temp>=12)||(color_number==temp))
 
#9
creo que el error esta en esta sección del codigo:

}while ((temp>12)|(color_number==temp));

porque no se que quieres hacer aquí, yo mismo entre en ERROR.....

además te falta declarar color_number, y que es, una varianle tipo entero, flotante, cadena de caracteres, etc??
 
Última edición:
#10
yo he visto los trabajos de loco de la x cosa

el chiste es que el color creo que lo toma en formato RGB que es 255,255,255

asi que supongo que no es flotante
 
#11
hola gente ...... yyyyyyyyy gracias ....... !!!!!! por enseñarme ¡¡¡¡¡ ..... bueno .... el amigo
TRILO-BYTE ..... el doctor y maestro Dr. Zoidberg ...y también al amigaso ruben90 .. que aporto lo suyo ..... a ver si explico un poco ... si amigaso usa una tabla de valores ..y la supocion de trilo-byte es correcta pero para que se saquen de dudas pongo el proyecto completo
Código:
//#define F_CPU   8000000 
#include<util\delay.h>
#include"lib_dmx_in.h"
#include<stdio.h>
#include<stdlib.h>
#include "lib_indicator.h" 
#include <avr/wdt.h> 
 //#include "lib_dmx_in.h"
#include <avr/interrupt.h>
// ********************* definiciones locales *********************
 
enum {IDLE, BREAK, STARTB, STARTADR};			//DMX states
 
volatile uint8_t 	 gDmxState;
 
const char colors[][3]={
	{255,0,0},
	{0,255,0},
	{0,0,255},
	{255,128,0},
	{255,0,128},
	{128,255,0},
	{128,0,255},
	{0,255,128},
	{0,128,255},
	{255,255,0},
	{255,0,255},
	{0,255,255},
	{255,255,255}		
	};
 
//Vuelva a escribir el valor del final de la tabla de colores de la Ilustración
void set_color(int color){
	while(color>12){
		color-=12;
	}
	DmxRxField[0]=colors[color][0];
	DmxRxField[1]=colors[color][1];
	DmxRxField[2]=colors[color][2];
 
}
 
//Inicialización salida por o cualitativa
void init_pinouts(){
	DDRB |= (1<<PB5) | (1<<PB6) | (1<<PB7);		//Pin de salida LED
	DDRD |= (1<<PD2);							//La colocación del selector de la transmisión de salida
	PORTD |= (1<<PD2);							//Ajuste de estatus para RX 0 - venida de transmisión
}
 
//Inicializar el puerto y romper? para el sonido de control en cs
void init_Sound(){
	DDRD &= ~(1<<PD3);							//Configuración de 4 pines del puerto D como la entrada
	PORTD |= (1<<PD3);							//establecer resistencia socavó alcanzando dual. Importante para la Q3 polaridad
	MCUCR |= (1<<ISC11);						//Configuración de interrupción INT1
	GICR |= (1<<INT1);							//la conexión INT1 interrumpir ??
}
 
//Inicializar el temporizador para evitar cortar efecto estroboscópico
#define OV_COUNT	14							//161 metros, 7 no repleta? = 0.25ms
#define OV_SIZE		161							//vale ?? comenzando Contador inicial
volatile int timer_counter=0;					//contador del temporizador
 
void init_timer(){
		TCCR0	|= (1<<CS02) ;					//prescaler 256
		TIMSK	|= (1<<TOIE0);					//en? desbordamientos de interrupción
		TCNT0	= OV_SIZE;						//vale ?? comenzando Contador inicial
}
//devolver el cronómetro
void reset_timer(){
		TCNT0	= OV_SIZE;						//vale ?? comenzando Contador inicial
		timer_counter=0;
}
 
enum {FALSE=0, TRUE=1};
volatile char sound_time=TRUE;
 
 
//programa de primordial
int main(void)
{
	cli();

	init_DMX_RX();	//Inicialización recibir DMX 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																											
	init_pinouts();	//Establece los puertos de E / S
	init_timer();	//Ajuste del temporizador
	init_Sound();	//inicializar la entrada para controlar el sonido bastante.
	sei();			//en relación ?? ¡romper?
	int PWM_timer;
	while(1)		//el centro principal bucle
	{
		get_dips();	//Cheque Dipswitch y descargar la dirección DMX
		for (PWM_timer=0; PWM_timer<255 ; PWM_timer++)  //soga explicar a través de una serie de relleno
		{
			if (DmxRxField[0]>PWM_timer) //rojo
			{
				PORTB &= ~(1<<PB5);		 //LED apagado
			}else{
				PORTB |= (1<<PB5);		 //LED prendido		
			}
 
			if (DmxRxField[1]>PWM_timer)  //verde
			{
				PORTB &= ~(1<<PB6);		  //LED apagado				
			}else{
				PORTB |= (1<<PB6);		  //LED prendido
			}
 
			if (DmxRxField[2]>PWM_timer)	//azul
			{
				PORTB &= ~(1<<PB7);			//LED apagado					
			}else{
				PORTB |= (1<<PB7);			//LED prendido
			}
 
		}
	}
}
 
void change_color()                                                                         																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																									
	{
	int temp;    																																																																																																																																																																																																																																																																																																																																																																																																																																																																																													
   int color_number=0;
	do{
	 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																														
	
	temp=color_number;
		temp+=7;
		if (temp>12)
		{
			temp-=12;
		}
 
	}while ((temp>12)|(color_number==temp));	//reloj? El temporizador sea inferior a un valor? de los registros en la tabla, y? para que no? el mismo color
	color_number=temp;							//recordando barato actualmente mostrar en contra de color
	set_color(color_number);					//que aclarar el color de la matriz definida
}
 
//comenzar la función manual que interrumpe el sonido
ISR(INT1_vect)
{	
    if(sound_time==FALSE){return;}						//como no hacia arriba molino ?? tiempo mínimo luminoso, salir
	change_color();
	reset_timer();								//devolver el cronómetro en un tiempo mínimo luminosa
	sound_time=FALSE;							//el establecimiento de una bandera para el temporizador
} 
 
ISR(TIMER0_OVF_vect){							//interrupción del temporizador
	int count; 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																											
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
    
	switch (mode){
		case SOUND:
			count = OV_COUNT + DmxAddress;
			break;
		case MANUAL:
			count = OV_COUNT + DmxAddress * 4;
			break;
		default:
			count = OV_COUNT;
	}							
	if(timer_counter>=count){
		timer_counter=0;
		sound_time=TRUE;			//tiempo mínimo deducible luminoso, puede cambiar? color
		if (mode==MANUAL){
			change_color();
		}
 
	}else{ timer_counter++; }
}

 
// *************** DMX recepción de inicialización ****************
void init_DMX_RX(void)
{
#ifdef USE_DIP
 
DDRA   = 0;										//establecer Dips
PORTA  = 0xFF;
DDRB  &= ~((1<<PB0)|(1<<PB1));
PORTB |=   (1<<PB0)|(1<<PB1);
 
#endif
 
DDRD  |= (1<<2);
PORTD &= ~(1<<2);								
UBRRH  = 0;										//habilitar la recepción
UBRRL  = ((F_OSC/4000)-1);						//250kbaud, 8N2
UCSRC  = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);
UCSRB  = (1<<RXEN)|(1<<RXCIE);
gDmxState= IDLE;
}
 
 
 
// ************* Ver DMX dirección de inicio **************
void get_dips(void)
{
#ifdef USE_DIP
uint16_t Temp;

if (!(PINB &(1<<PB1))){							//modo manual / sonido
	Temp=										//DMXAdress = tiempo de retardo
		(!(PINA &(1<<PA7)) *1) +
		(!(PINA &(1<<PA6)) *2) +
		(!(PINA &(1<<PA5)) *4) +
		(!(PINA &(1<<PA4)) *8) +
		(!(PINA &(1<<PA3)) *16) +
		(!(PINA &(1<<PA2)) *32) +
		(!(PINA &(1<<PA1)) *64) +
		(!(PINA &(1<<PA0)) *128);
	DmxAddress= Temp;
	if (!(PINB &(1<<PB0)))						//manual, sin sonido
	{
		mode=MANUAL;
	     } 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																														
    else                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            																																																																																																																																																																																																																																																																																																																																																																															
	{
       mode=SOUND;
		GICR |= (1<<INT1);							//activación de sonido trigger INT1
	}
		UCSRB &= ~(1<<RXCIE);						//Receptor desactivar si la dirección de inicio = 0
		set_color(color_number);
		return;	
}
      mode=DMX;
      Temp= 
	(!(PINA &(1<<PA7)) *1) +
	(!(PINA &(1<<PA6)) *2) +
	(!(PINA &(1<<PA5)) *4) +
	(!(PINA &(1<<PA4)) *8) +
	(!(PINA &(1<<PA3)) *16) +
	(!(PINA &(1<<PA2)) *32) +
	(!(PINA &(1<<PA1)) *64) +
	(!(PINA &(1<<PA0)) *128) +
	(!(PINB &(1<<PB0)) *256);
 
 
if (Temp != 0)
	{
	DmxAddress= Temp;
	if (!(UCSRB &(1<<RXCIE)))					//receptor es desabilitado -> enable y esperar break
		{
		gDmxState= IDLE;
		UCSRB |= (1<<RXCIE);					
		GICR &= ~(1<<INT1);						//desabilitar activación de sonido trigger INT1 
		}
	}
else
	{
	UCSRB &= ~(1<<RXCIE);						//desabilitar Receptor si la dirección de inicio = 0
	GICR &= ~(1<<INT1);						//desabilitar activación de sonido trigger INT1 
	uint8_t i;
	for (i=0; i<sizeof(DmxRxField); i++)
		{
		DmxRxField[i]= 0;
		}
	}
 
#endif 
}
 
 
 
// *************** DMX recepción ISR ****************
ISR (USART_RX_vect)
{
static  uint16_t DmxCount;
		uint8_t  USARTstate= UCSRA;				//obtener el estado antes del dato!
		uint8_t  DmxByte   = UDR;				//obtener el dato
		uint8_t  DmxState  = gDmxState;			//sólo tienes que cargar una vez de SRAM Aumentar la velocidad
 
if (USARTstate &(1<<FE))						//comprobar si hay break
	{
	UCSRA &= ~(1<<FE);							//reset bandera (Necesario para la simulación en AVR Studio)
	DmxCount =  DmxAddress;						//reset contador de canales (contar los canales antes de la dirección de inicio)
	gDmxState= BREAK;
	}
 
else if (DmxState == BREAK)
	{
	if (DmxByte == 0) gDmxState= STARTB;		//código de arranque normal detectado
	else			  gDmxState= IDLE;
	}
 
else if (DmxState == STARTB)
	{
	if (--DmxCount == 0)						//alcanzado con la dirección de inicio?
		{
		DmxCount= 1;							//establecer contador para canales necesarios
		DmxRxField[0]= DmxByte;					//Ver primera canal DMX de dispositivo
		gDmxState= STARTADR;
		}
	}
 
else if (DmxState == STARTADR)
	{
	DmxRxField[DmxCount++]= DmxByte;			//leer canales
	if (DmxCount >= sizeof(DmxRxField)) 		//canales recibidos todos?
		{
		gDmxState= IDLE;						//esperar para el próximo break
		}
	}							
}
bueno ese es el archivo .C y este el archivo .H
Código:
#include <stdint.h>
#include <avr/interrupt.h>
 
#define  USE_DIP
#define  F_OSC			(8000)	//oscillator freq. in kHz (typical 8MHz or 16MHz)
 
 
volatile uint8_t	 DmxRxField[8]; //array of DMX vals (raw)
volatile uint16_t	 DmxAddress;	//start address
volatile int  color_number;	//actual sound color
 
extern void init_DMX_RX(void);
extern void get_dips(void);
extern void set_color(int color);
extern void indicate(void);
extern void init_ind(void);
..y yo las sentencias que lei por alli todas usan la funcion pintf ..y asi no me sirve.. por eso use temp acá una captura de pantalla ... en esa sentencia es donde se me originan los problemas ...... capture.jpg bueno perdonen mi ignoracia sobre estas cosas pero algo en .C ..me enseño cosmefulanito04 ..pero por lo demas he aprendido solo ...y puedo estar muy equivocado ....... en los comceptos y implementacion ... gracias a todos
 
#12
Hola de nuevo, viendo tu programa y observando el mensaje de error de tu compilador, sigo insistiendo, tienen muchas variabels sin declarar, como en este pedazo de codigo:

switch (mode){
case SOUND:
count = OV_COUNT + DmxAddress;
break;
case MANUAL:
count = OV_COUNT + DmxAddress * 4;
break;

me imagino que mode, SOUND, y MANUAL son del tipo númerico sin signo ya que las ocupas en una sentencia CASE.

prueba colocando unsigned short mode, SOUND, MANUAL; al inicio de tu rutina main.
Tambien observe que declaras lo siguiente:

#define F_OSC (8000) //oscillator freq. in kHz (typical 8MHz or 16MHz).

no será: (8000000) porque todo compilador que eh utilizado acepta el valor en Hz.

Yo igual no se mucho en C, pero te comparto mis puntos de vista, Saludos
 
#13
hola ruben90 ...........gracias por tu ayuda ...... nop con el cristal no hay problema ...esta especificado bien en otra parte ..... con eso quedate tranquilo ..... fijate la primer linea de los errores (punto verde ) ..marca correcto .... alli lo cambie pero me larga otro error mas tenia 10 ahora tengo 11 .. capture_11262014_210108.jpg capture_11262014_210148.jpg ....como ya dije .... probe varias maneras ..... pero no encuentro la correcta
 
#14
TACHE a ruben 90

eso se lo explique a loco en otra pregunta que hiso en otro lado curioso no lo borraron o me lo envio en mensaje la verdad no recuerdo pero lo explicare:

hiso un

switch(mode) //solo switch suitchea valores enteros o caracteres NO strings o texto

{
case SOUND: //cambiarlo a un valor numerico o caracter
break;

case MANUAL://cambiarlo a un valor numerico o caracter
break;

}
 
#15
el problema de asignarle valores numericos fijos es que más adelante en el codigo las variables mode, SOUND y MANUAL se siguen utilizando y pues no estan declaradas, me imagino que utilizas SOUND para que cuando suceda el evento algun sonido (buzzer, bocina, etc) se active y te indique lo que quieres y MANUAL para cuando preciones un boton, tu puedas configurar tu proyecto manualmente, o me equivoco.

te recomiendo que vuelvas a escribir tu codigo, porque veo que te hiciste bolas; escribe en una hoja lo que quieres que haga tu codigo, luego identifica todas tus variables, y ves escribiendo tu codigo por segmentos. Eso es lo que yo hago, es un poco laborioso (porque no soy un hacker para que me salga a la primera), pero al final logro que todo funcione.

Te deseo mucha suerte, saludos
 
#16
eso de agarrar el codigo de alguien y usarlo en otro proyecto como que tampoco es lo mio

desensablar un codigo parte por parte es algo que puede llevar dias y semanas
pero apoyarte de hacer un codigo funcional basado en lo que uno comprendio de uno ya funcional es otra cosa.

yo diria que lo estudies bien como funciona parte a parte y trata de hacer que funcionen los modulos de codigo y una vez que todo funciona unirlo en ya sea librerias o en el main
 
#17
hola amigo rubem90 bueno te explico como es esto.....y ya confirme que sacando la parte que me genera error
.​
en mode DMX funciona correctamente .
ahora agrego el esquema para que lo puedan comprender​
...... diagrama electrico.png
bueno todo el problema comienza aqui if (!(PINB &(1<<PB1))){//modo manual / sonido al activar el mini-dips 10 (que como veran no tiene ningun valor asignado )​
solo se usa a modo de llave ., desabilito la resepcion DMX ., y supuestamene (si todo funcionara )​
habilito el modo manual y el audio​
bien si quiero que trabaje en manual solamente ., uso el mini-dips 9 (que en DMX tiene el valor de 256​
pero como yo use para conmutar el mini-dips 10 ya me encamina a una nueva tabla de valores donde el valor mas alto es 128​
entonces el programa hace esto nuevamente if (!(PINB &(1<<PB0)))//manual, sin sonido
bien ahora se usa esa llave que no tiene ningun valor asignado como conmutador CON SONIDO/sin sonido ., esto tiene que seguir cierto protocolo que es el DMX ., no se puede poner cualquier sentencia sin que afecte la deteccion o el manejo del DMX .,se que el conjunto de programa esta bien ., solo que las formas en que declaro las sentencias es lo que esta mal​
son definiciones mas que todo .,​
como me lo remarco el Dr. Zoidberg.. y tenia razon ."si yo empiezo una cuenta le tengo que espesificar desde donde la comienzo..por logica es el cero ....​
lo coloque como el dijo y funciono esa parte salio el error ...esto es en C .... en ASM no he logrado ponerle el audio pero sip la parte manual ..... gracias a todos por la buena honda y el interes​
 
Última edición:
#18
hola gente ., bueno sigo enrredado con esto., puesto que no me queda otra que insitir hasta que me salga .,​
si o si., hice algunas reformas y sobre todo reescribi todo agregue una libreria mas .,
que no viene al caso porque cumple otras funciones.,​
pero sigo teniendo el mismo problema que antes y la verdad que no se como encontrarle solucion .,​
aca pongo las librerias nuevas​
PHP:
//***************** Parche 1 Dr. Zoidberg ***************************// 
// Modos de operacion 
#define  SOUND 1							           																																																																																																																																																																																																																																																																																																																																																																																																																																																																																															
#define  MANUAL 0																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																					
//volatile unsigned char mode  
#define mode 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																					
//************* Fin Parche 1 Dr. Zoidberg *************************// 								
																				

#define F_CPU 8000000UL
#include <util\delay.h>
#include "lib_dmx_in.h"
#include <stdio.h>
#include <stdlib.h>
#include "lib_indicator.h"

 
 
const char colors[][3]={
	{255,0,0},
	{0,255,0},
	{0,0,255},
	{255,128,0},
	{255,0,128},
	{128,255,0},
	{128,0,255},
	{0,255,128},
	{0,128,255},
	{255,255,0},
	{255,0,255},
	{0,255,255},
	{255,255,255}		
	};
 
//establecer el valor del final de la tabla de colores de la salida
void set_color(int color){
	while(color>12){
		color-=12;
	}
	DmxRxField[0]=colors[color][0];
	DmxRxField[1]=colors[color][1];
	DmxRxField[2]=colors[color][2];
 
}
 
// ********* Inicialización recepcion y salida led ******** //
void init_pinouts(){
	DDRA |= (1<<PA0) | (1<<PA1) | (1<<PA2);	//Pin de salida LED
	DDRD |= (1<<PD2);	//La colocación del selector de la transmisión de salida
	PORTD |= (1<<PD2);//Ajuste de estatus para RX 0 - venida de transmisión
}
 
//********** Inicializar el puerto y romper? para el sonido de control en cs *********//
void init_Sound(){
	DDRD &= ~(1<<PD3);//Configuración de 4 pines del puerto D como la entrada
	PORTD |= (1<<PD3);//establecer resistencia pull-up alcanzando estado dual. Importante para la polaridad de Q3
	MCUCR |= (1<<ISC11);//Configuración de interrupción INT1
	GICR |= (1<<INT1);//la conexión INT1 interrumpir ??
}
 
//********Inicializar el temporizador para evitar cortar efecto estroboscópico ********//
#define OV_COUNT	14			//161 metros, 7 no repleta? = 0.25ms
#define OV_SIZE		161			//¿¿es valido?? comenzando Contador inicial
volatile int timer_counter=0;	//contador del temporizador
 
void init_timer(){
		TCCR0	|= (1<<CS02) ;	//prescaler 256
		TIMSK	|= (1<<TOIE0);	//¿habilitado? desbordamientos de interrupción
		TCNT0	= OV_SIZE;		//¿¿es valido?? comenzando Contador inicial
}
//******** restablecer el timer de la cuenta de color *********//
void reset_timer(){
		TCNT0	= OV_SIZE;	//¿¿es valido?? comenzando Contador inicial
		timer_counter=0;
}
 
enum {FALSE=0, TRUE=1};
volatile char sound_time=TRUE;
 
 
//programa de principal
int main(void){

//modo seleccionar, SOUND, MANUAL;
cli();

	init_ind();																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																															
	init_pinouts();	//Establece los puertos de E / S
	init_timer();	//Ajuste del temporizador
	init_Sound();	//inicializar la entrada para controlar el sonido .
	init_DMX_RX();	//Inicialización recibir DMX
	sei();			//en relación ?? ¡romper?
	int PWM_timer;
	while(1)	//el centro principal de la cadena de sentencias
	{
		get_dips();	//leer Dip_switch y descargar la dirección DMX
		for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) //sentencias en cadena para ejecucion
		{
			if (DmxRxField[0]>PWM_timer)		//rojo	
			{
				PORTA &= ~(1<<PA0);				//LED OFF
			}else{
				PORTA |= (1<<PA0);				//LED ON		
			}
 
			if (DmxRxField[1]>PWM_timer)		//verde
			{
				PORTA &= ~(1<<PA1);				//LED OFF				
			}else{
				PORTA |= (1<<PA1);				//LED ON
			}
 
			if (DmxRxField[2]>PWM_timer)		//azul
			{
				PORTA &= ~(1<<PA2);				//LED OFF					
			}else{
				PORTA |= (1<<PA2);				//LED ON
			}
 
		}
	}
}
 
void change_color(){
	int temp; 																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																									

	do{
		temp=color_number;// valor numerico de TEMP = a numero de color
		temp+=7;
		if (temp>12)
		{
			temp-=12;
		}
 
	}while ((temp>12)|(color_number==temp));//¿contador? lectura TEMP sea inferior a un valor? de los registros en la tabla, y? si no es ? el mismo color
	color_number=temp;// asociando valor color a el guardado en TEMP
	set_color(color_number);//limpiar el color de la tabla elegido
}
 
//************ comenzar la función que interrumpe por sonido ***************//
ISR(INT1_vect)
{	
    if(sound_time==FALSE){return;}	//valor alto de entrada ?? tiempo mínimo iluminado, salir
	change_color();
	reset_timer();	//devolver el cronómetro en un tiempo mínimo iluminado
	sound_time=FALSE;//el establecimiento de una bandera para el temporizador
} 
//**************** temporizador de interupcion de sonido *************** //
ISR(TIMER0_OVF_vect)	//interrupción del temporizador
{																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																													
	int count;
		
	
		
		
     switch(mode)                                                                                                                                                         																																																																																																																																																																																																																																																																																																																																																																																																																																																																																						
	{
		case SOUND:
			count = OV_COUNT + DmxAddress;
			break;
		case MANUAL:
			count = OV_COUNT + DmxAddress * 4;
			break;
		default:count = OV_COUNT;
			
	}							
	if(timer_counter>=count){
		timer_counter=0;
		sound_time=TRUE;	//tiempo mínimo deducible iluminado, puede cambiar? color
																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																												
    if (mode==MANUAL){
			change_color();
		}
 
	}else{ timer_counter++; }
}
esta esta hecha completamente nueva​
PHP:
/***************************************************************************/

#include "lib_dmx_in.h"
#include "lib_indicator.h"

// ********************* definiciones locales *********************

enum {IDLE, BREAK, STARTB, STARTADR};		//Estados DMX

		 uint8_t 	 gDmxState;
		 uint8_t 	*gDmxPnt;
		 uint16_t	 DmxCount;


// *************** inicialización de recepción DMX ****************
void init_DMX_RX(void)
{
#ifdef USE_DIP
DDRC= 0;		//establecer DIPs
PORTC= 0xFF;
DDRE &= ~((1<<2)|(1<<1));
PORTE |= (1<<2)|(1<<1);
#endif


DDRD  |= (1<<2);
PORTD &= ~(1<<2);//permitir la recepción
UBRRH  = 0;
UBRRL  = ((F_OSC/4000)-1);	//250kbaud, 8N2
UCSRC  = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);
UCSRB  = (1<<RXEN)|(1<<RXCIE);
gDmxState= IDLE;

uint8_t i;
for (i=0; i<sizeof(DmxRxField); i++)
	{
	DmxRxField[i]= 0;
	}
}



// ************* obtener dirección de inicio DMX **************
void get_dips(void)
{
#ifdef USE_DIP
uint16_t Temp;
 
if (!(PINE &(1<<PE1))){	//modo manual / sonido
	Temp=				//DMXAdress = tiempo de retardo en modo manual y sonido
		(!(PINC &(1<<PC0)) *1) +
		(!(PINC &(1<<PC1)) *2) +
		(!(PINC &(1<<PC2)) *4) +
		(!(PINC &(1<<PC3)) *8) +
		(!(PINC &(1<<PC4)) *16) +
		(!(PINC &(1<<PC5)) *32) +
		(!(PINC &(1<<PC6)) *64) +
		(!(PINC &(1<<PC7)) *128);
	DmxAddress= Temp;
	if (!(PINE &(1<<PE2)))	//manual, sin sonido	
	{
		MANUAL;
	}else{
		SOUND;
		GICR |= (1<<INT1); //permitir INT1 activación de sonido
	}
		UCSRB &= ~(1<<RXCIE);//desactivar receptor si la dirección start = 0
		set_color(color_number);
		return;																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																													
   }
   get_dips();
   #ifdef USE_DIP
   uint16_t Temp= (255-PINC);	//estado DIP invertido
																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																
	
   if (!(PINE &(1<<2)))
	{
	Temp= Temp +256;		//9th bit
	}

 
 
if (Temp != 0)
	{
	DmxAddress= Temp;
	if (!(UCSRB &(1<<RXCIE)))//si el receptor se ha desactivado -> enable y esperar descanso
		{
		gDmxState= IDLE;
		UCSRB |= (1<<RXCIE);					
		GICR &= ~(1<<INT1);	//desactivar INT1 y activación de sonido
		}
	}
else
	{
	UCSRB &= ~(1<<RXCIE);//desactivar receptor si la dirección start = 0
	GICR &= ~(1<<INT1);	//desactivar INT1 y activación de sonido
	uint8_t i;
	for (i=0; i<sizeof(DmxRxField); i++)
		{
		DmxRxField[i]= 0;
		}
	}
 
#endif 
}
 
 
 
// *************** DMX Reception ISR  ****************
ISR (USART_RX_vect)
{
static  uint16_t DmxCount;
uint8_t  USARTstate= UCSRA;	 //obtener estado antes de los datos!
uint8_t  DmxByte   = UDR;	//obtener datos
uint8_t  DmxState  = gDmxState;	//sólo tienes que cargar una vez de SRAM para aumentar la velocidad
 
if (USARTstate &(1<<FE))//comprobar si hay ruptura
	{
	UCSRA &= ~(1<<FE);//restablecer la bandera (necesaria para la simulación en AVR Studio)
	DmxCount =  DmxAddress;//cero en el contador del canal (contar los canales antes de dirección de inicio)
	gDmxState= BREAK;
	}
 
else if (DmxState == BREAK)
	{
	if (DmxByte == 0) gDmxState= STARTB;//código de arranque normal detecta
	else			  gDmxState= IDLE;
	}
 
else if (DmxState == STARTB)
	{
	if (--DmxCount == 0)	//Dirección de inicio alcanzada?
		{
		DmxCount= 1;//establecer contador para canales necesarios
		DmxRxField[0]= DmxByte;//obtener primero el canal DMX del dispositivo
		gDmxState= STARTADR;
		}
	}
 
else if (DmxState == STARTADR)
	{
	DmxRxField[DmxCount++]= DmxByte;//obtener canal 
	if (DmxCount >= sizeof(DmxRxField)) //ALL CH recibido?
		{
		gDmxState= IDLE;//esperar para el próximo descanso
		}
	}							
}
y esta es la de complemento., esta todo el proyecto completo​
PHP:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
 
#define  USE_DIP
#define  F_OSC	(8000) //oscillator freq. in kHz (typical 8MHz or 16MHz)
 
 
volatile uint8_t	 DmxRxField[8]; 	//array of DMX vals (raw)
volatile uint16_t	 DmxAddress; //start address
volatile int		color_number; //actual sound color

extern void    init_DMX_RX(void);
extern void    get_dips(void);
extern void    set_color(int color);
los errores que me sigue indicando son​
PHP:
Build started 12.12.2014 at 01:59:48
avr-gcc.exe  -mmcu=atmega8515 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT DMX_audirit_led.o -MF dep/DMX_audirit_led.o.d  -c  ../DMX_audirit_led.c
../DMX_audirit_led.c: In function '__vector_7':
../DMX_audirit_led.c:157: error: expected expression before ')' token
../DMX_audirit_led.c:172: error: expected expression before '==' token
make: *** [DMX_audirit_led.o] Error 1
Build failed with 2 errors and 0 warnings...
espero que alguno me pueda dar una idea de como solucionarlo​
 
Última edición:

Dr. Zoidberg

Well-known-Papá Pitufo
#19
Juan:
Te está indicando que el error es algo que falta antes del paréntesis que cierra en la línea 157 del archivo DMX_audirit_led.c
Ese archivo no está entre los que has puesto, o estás haciendo referencia a algún otro archivo en el proyecto que es el que tiene el error.
Cuando pongás el código, indicá a que archivo pertenece (el .c)
 
#20
gracias Dr. Zoidberg., bueno a ver la primer libreria del ultimo mesaje ., es el MAIN.C que lo llame asi DMX_audirit_led.c para no confundirlo con otros proyectos .,​
la segunda libreria se llama lib_dmx_in.c
la tercera se llama lib_dmx_in.h bueno la que re -hice completamente ., es la segunda ., tenia un error garafal ., jajajajajaja .,repetia el codigo en el main.c anterior ., eso me generaba problemas​
retire del main el segmento de codigo que repetia ., de esta libreria ., y sobre esa misma agrege las funciones que complementan en el manejo de la USART​
pero son esas tres librerias nada mas .,todo el proyecto​
por ahora hasta que arranque (o yo muera en el intento)​
la cuarta publicacion son los errores que me larga el AVRstudio​
los errores son de la primer libreria alli estan los dos el 157 es aca switch(mode
y el segundo error 172 if (mode==MANUAL){
gracias amigaso por ayudarme ..juan
 
Última edición:

Temas similares

Arriba