Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

23/11/2014 #1

Avatar de locodelafonola

Problema en sentencia DO-while en C
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
23/11/2014 #2

Avatar de Dr. Zoidberg

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.
23/11/2014 #3

Avatar de ruben90

creo que te falta un corchete para cerrar tu rutina y la variable color_number no la tienes declarada
23/11/2014 #4

Avatar de locodelafonola

Dr. Zoidberg dijo: Ver Mensaje
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
}
23/11/2014 #5

Avatar de Dr. Zoidberg

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 */
....
23/11/2014 #6

Avatar de TRILO-BYTE

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
23/11/2014 #7

Avatar de Dr. Zoidberg

TRILO-BYTE dijo: Ver Mensaje
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...
23/11/2014 #8

Avatar de TRILO-BYTE

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))
23/11/2014 #9

Avatar de ruben90

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??
24/11/2014 #10

Avatar de TRILO-BYTE

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
24/11/2014 #11

Avatar de locodelafonola

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 ...... 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
Imágenes Adjuntas
Tipo de Archivo: jpg capture.jpg (170,8 KB (Kilobytes), 116 visitas)
26/11/2014 #12

Avatar de ruben90

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
26/11/2014 #13

Avatar de locodelafonola

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 .. ....como ya dije .... probe varias maneras ..... pero no encuentro la correcta
Imágenes Adjuntas
Tipo de Archivo: jpg capture_11262014_210108.jpg (86,4 KB (Kilobytes), 102 visitas)
Tipo de Archivo: jpg capture_11262014_210148.jpg (113,2 KB (Kilobytes), 102 visitas)
27/11/2014 #14

Avatar de TRILO-BYTE

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;

}
27/11/2014 #15

Avatar de ruben90

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
27/11/2014 #16

Avatar de TRILO-BYTE

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
27/11/2014 #17

Avatar de locodelafonola

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
......
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
Imágenes Adjuntas
Tipo de Archivo: png diagrama electrico.png (162,5 KB (Kilobytes), 89 visitas)
12/12/2014 #18

Avatar de locodelafonola

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
Código 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=0TRUE=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=0PWM_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
Código PHP:

/***************************************************************************/

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

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

enum {IDLE, BREAK, STARTBSTARTADR};        //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
DDRC0;        //establecer DIPs
PORTC0xFF;
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);
gDmxStateIDLE;

uint8_t i;
for (
i=0i<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);
    
DmxAddressTemp;
    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)))
    {
    
TempTemp +256;        //9th bit
    
}

 
 
if (
Temp != 0)
    {
    
DmxAddressTemp;
    if (!(
UCSRB &(1<<RXCIE)))//si el receptor se ha desactivado -> enable y esperar descanso
        
{
        
gDmxStateIDLE;
        
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=0i<sizeof(DmxRxField); i++)
        {
        
DmxRxField[i]= 0;
        }
    }
 
#endif 
}
 
 
 
// *************** DMX Reception ISR  ****************
ISR (USART_RX_vect)
{
static  
uint16_t DmxCount;
uint8_t  USARTstateUCSRA;     //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 == 0gDmxStateSTARTB;//código de arranque normal detecta
    
else              gDmxStateIDLE;
    }
 
else if (
DmxState == STARTB)
    {
    if (--
DmxCount == 0)    //Dirección de inicio alcanzada?
        
{
        
DmxCount1;//establecer contador para canales necesarios
        
DmxRxField[0]= DmxByte;//obtener primero el canal DMX del dispositivo
        
gDmxStateSTARTADR;
        }
    }
 
else if (
DmxState == STARTADR)
    {
    
DmxRxField[DmxCount++]= DmxByte;//obtener canal 
    
if (DmxCount >= sizeof(DmxRxField)) //ALL CH recibido?
        
{
        
gDmxStateIDLE;//esperar para el próximo descanso
        
}
    }                            

y esta es la de complemento., esta todo el proyecto completo
Código 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
Código PHP:
Build started 12.12.2014 at 01:59:48
avr
-gcc.exe  -mmcu=atmega8515 -Wall -gdwarf--Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT DMX_audirit_led.-MF dep/DMX_audirit_led.o.d  -c  ../DMX_audirit_led.c
../DMX_audirit_led.cIn function '__vector_7':
../
DMX_audirit_led.c:157errorexpected expression before ')' token
../DMX_audirit_led.c:172errorexpected expression before '==' token
make
: *** [DMX_audirit_led.oError 1
Build failed with 2 errors 
and 0 warnings... 
espero que alguno me pueda dar una idea de como solucionarlo
13/12/2014 #19

Avatar de Dr. Zoidberg

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)
15/12/2014 #20

Avatar de locodelafonola

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
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.