hola y gracias por tanta deferencia
bueno como dije por aca
hola stk vos fuiste quien trajiste el post a este lugar. Estaba en el subforo de Atmel, te dejo el link para que le veas
http://www.todopic.com.ar/foros/index.php?topic=44884.0
Si lo se, pero el Tema al principio trataba sobre DMX512, por eso lo pase para aca,
lo que aconsejaria al Amigo Locodelafonola que abra un tema en el Subforo de Atmel,
Saludos
gracias a los dos ., basicamente espero poder compilar y que funcione
luego pasarlo a DMX ., en mi libreria base que funciona
En los comandos de recepcion y accionamiento no tengo problema ., por que basicamente trabajamos con valores de 0 a 255
Voy a aclarar un poco la cuestion ., esta funcion que quiero implementar (aprenderla mas que todo )., esta en los equipos DMX profecionales
ya sea que tenga el comando DMX ., o cuando funcionan en manual o audioritmico ., si se fijan el esquematico de mi montaje !!!!! es DMX ¡¡¡¡¡
igual que las funciones de la libreria que dio origen a este hilo., no se desvirtua (al menos eso creo)
asi que no creo que alla problemas ., mientras pueda lograr algo y se comparta ., no importa el lugar ., gracias a los dos
Bueno tal vez esto desoriente un poco ., pero con prestar atencion., uno se da cuenta enseguida de como funcionan esto
Y tal vez la confucion viene dada ., por la libreria que yo subi en asm ., que es para tres led solamente
Por que si nos fijamos en la primer libreria ., que dio origen al hilo
En ella se nota claramente la funcion DMX y MANUAL-PROGRAMADO
Si hubieras traspasado al C esa libreria de ASM ., no hubiera habido problemas ., porque los pin/port y funciones son iguales al montaje que tengo ., y las librerias de USART en DMX son iguales
El problema que radica en esa compilacion ., es que maneja tres gupos de led rgb ., no un fading y rainbow-fader independiente
Ahora lo que desorienta ., es esta libreria que yo subi y comparti ., es que al aplicar las funciones de ASM pasado a C ., no me da la posibilidad de aplicar la funcin alternativa en DMX ., como lo tiene la primera libreria originaria de este hilo
Yo a medida que se fue traduciondo la libreria ., me fui dando cuenta de eso ., es muy simple., las funciones de tiempo ., se ocupa en las dos pociciones ON / OFF del mini dips de puerto PE1
Bueno que problema tengo alli ., si uso ese dips-swich ., para la funcion de tiempo y en sus dos variantes ( ON / OFF ) no puedo despues usar esa funcion para commutar a DMX
aca muestro el circuito esquematico de los dos librerias ASM de este hilo
y como tengo el ARRAY de llaves sin ocupar (por la reforma que hice ) asi con los valores de DMX ., me da como maximo un valor de 256 (puesto que se suman los valores )., no puedo obtener el valor de 512 ., porque uso PE2 (valor de 256 en DMX =TABLA ) para el cambio de funciones
bueno pero eso no es problema ., porque los valores que se maneja en la compilacion., para manejar el PWM es con un maximo de 256 (0 a 255)
Ahora si se da el caso de necesitar valores mas altos para el fading ., tenemos la opcion aca
//***** inicio del ocilador Temporizador de interrupción ****//
ISR(TIMER0_OVF_vect){
int count;
switch(mode){
case RAINBOW_FADER :
count = OV_COUNT + DmxAddress;
break;
case FADING :
count = OV_COUNT + DmxAddress * 10;
break;
default:
count = OV_COUNT;
} Donde tomamos el valor de 0V_COUNT mas el valor de DmxAddress ., en el caso de rainbow fader o como en fading., que aparte de las dos anteriores mutiplica por 10
Bueno alli talvez ., habria que acomodar los valores ., que se suman y los que se multiplican ( tal vez sea al revez )
los valores que me arroja por aca ., la "Velocidad" sigo sin entenderlos
void delay(uint8_t Velocidad) {
uint16_t tiempo;
switch((PINE&0x06))
{
case 0x00:
tiempo=((362 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
case 0x02:
tiempo=((568 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
case 0x04:
tiempo=((1430 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
case 0x06:
tiempo=((2287 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
}
}
sigo sin poder entender las "case " con valores exadecimales ., (no entiendo a que puertos se refiere ni a que BITS afecta
En cuanto al "FOR" del PWM ., si no lo coloco ., no me funciona con los potenciometros virtuales de DMX ( DmxRxField[DMX_CHANNELS] )
En cuanto a la asignacion de pines en PINUT esta corecta ( tengo que declara asi para que funciona las llaves y no podria ir nunca un ELSE ., porque los otros puertos que estan declarados alli son la salida y trabajan al mismo tiempo
aparte con esa configuracion de PWM tan basica ., con el mismo he podido manejar motores PAP y de C.C (obiamente con un poco de electronica asociada)
tambien modifique ( o sea tratar de volver al original de esta libreria ) ., estas sentencias V_out,R_out,A_out; las cambie por estas DmxRxField[0] , DmxRxField[1] , DmxRxField[2]
porque fueron de DMX llevadas a manual solamente ., pero usando la base delesquema electronico de DMX
Bueno con ese cambio de nombre a la sentencia ., ya me funciona ., de las dos maneras la salida , obiamente agregando la libreria usart ., de recepcion DMX
Tratando de que esto funcione ., se lograria que funcione en dos modos .,el programado ., y aqui habria que hacer incapie en algo importante
Hasta ahora no he podido usar la libreria de Tx (transmicion) que poseo ., pues no tengo nada desarrollado (secuencias o cuadros o esenas .o como queran llamarle ) dentro del programa., para que funcione de modo MANUAL AUTOMATICO MASTER ., como lo es en este caso ., el FADING y y el RAINBOW_FADER
Porque si se fijan en el esquema ., este no es solamente un receptor !!!! es un tranceptor ¡¡¡¡ ( puede recibir y emitir) por ahora una funcion a la vez ., pero con una pequeña reforma electronica ., puede hacer las dos cosas al mismo tiempo y tiene grandes ventajas
Estoy tratando de explicarte ., lo mejor que puedo para no causar tu enojo ., y el porque de esto ., si te causa alguna molestia te pido mil disculpas
yo sigo entendiendo las lecciones que encuentro por alli., y de cada uno ., que es mi profesor., pues mi ignorancia y analfabetismo ., me impiden ser critico de nadie ., y menos un maestro
Tal vez es una cuestion de entender ., que no todos tiene conociento en DMX ., y que muchos prefieren armar .,equipos audiortnicos ( que bien podria ser otra opcion mas para esto )
Se va haciendo dificil aprenderlo ., porque no se integra a aquellos que bien podrian usar estos equipos sin DMX
Te pido mil perdones si en algo te confundi y a causado tu enojo .,no es esa mi intencion ., aca te pongo la compilacion nueva
//#define F_CPU 8000000
#include<util\delay.h>
#include<stdio.h>
#include<stdlib.h>
#include"fading_raibow.h"
#include <avr/interrupt.h>
#include <avr/wdt.h>
// *** establecer valor de WHILE ***//
enum {FALSE=0, TRUE=1};
//*********************************//
uint8_t count= 1; // contador del soft PWM
uint8_t velocidad,Rojo,Verde,Azul;
//*********************************//
const short int arraydimmer[256]={0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 149, 150, 151, 152, 154, 155, 156, 158, 159, 160, 161, 162, 164, 165, 167, 168, 169, 171, 172, 173, 174, 176, 177, 178, 180, 181, 182, 184, 185, 187, 188, 189, 191, 192, 193, 195, 196, 197, 199, 200, 202, 203, 204, 206, 207, 208, 210, 211, 213, 214, 216, 217, 218, 220, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 236, 237, 239, 240, 242, 243, 245, 246, 248, 249, 251, 252, 254, 255}; // Lo que aparece como DC_Data
volatile uint16_t DmxAddress; // Dirección inicial
volatile uint8_t DmxRxField[DMX_CHANNELS];
// ****** Temporizador de inicialización para evitar efecto estroboscópico *****//
#define OV_COUNT 14 // 161 , 7 = 0.25ms
#define OV_SIZE 161 // comenzando Contador inicial
volatile int timer_counter=0;// Contador del temporizador
//************* Inicialización pines / port *****************//
void init_pinouts(){
#ifdef USE_DIP
DDRC = 0; // establecer DIPs
PORTC = 0xFF;
DDRE &= ~((1<<PE2)|(1<<PE1));
PORTE |= (1<<PE2)|(1<<PE1);
#endif
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); // Salida pin LED
PORTB = 0;
DDRE |= (1<<PE0); //LED2 azul indicador
PORTE = 0;
}
// ***** inicializacion del timer****//
void init_timer(){
TCCR0|= (1<<CS02) ; // Precontador 256
TIMSK|= (1<<TOIE0); // desbordamientos de la interrupción
TCNT0= OV_SIZE;
}
// ************* obtener DMX dirección de inicio **************
void get_dips(void)
{
#ifdef USE_DIP
uint16_t Temp;
if (!(PINE &(1<<PE1))){ // Modo FADING / RAINBOW_FADER
Temp= // DMXAdress = tiempo de retardo
(!(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))) // MODO : ON FADING / OFF RAINBOW_FADER
{
mode= FADING;
}else{
mode= RAINBOW_FADER;
}
return;
}
mode=DMX; // funcionamiento en DMX
Temp=
(!(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) +
(!(PINE &(1<<PE2)) *256);
if (Temp != 0)
{
DmxAddress= Temp;
}
#endif
}
int main(void)
{
//***** Watchdog *****//
wdt_reset();
wdt_enable(WDTO_500MS); // Habilitar el watchdog (timeout = 0.5s)
wdt_reset();
cli();
init_pinouts(); // Establecer los puertos de E / S
init_timer(); // Establecer el temporizador
sei(); // habilitar las interupciones globales ???
int PWM_timer; // inicializar el timer PWM
while(1) // bucle principal (LOOP)
{
get_dips(); // Comprobar dip-switch y habilitar la funcion
for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) // Loop timer general en un ciclo de llenado
{
if (DmxRxField[0]>PWM_timer) //red
{
PORTB &= ~(1<<PB0); //LED OFF
}else{
PORTB |= (1<<PB0); //LED ON
}
if (DmxRxField[1]>PWM_timer) //green
{
PORTB &= ~(1<<PB1); //LED OFF
}else{
PORTB |= (1<<PB1); //LED ON
}
if (DmxRxField[2]>PWM_timer) //blue
{
PORTB &= ~(1<<PB2); //LED OFF
}else{
PORTB |= (1<<PB2); //LED ON
}
// if(!PINC6){ fading();}
// if(!PINC5){ disco();}
/*
Aca mas codigo que realmente no influye en nada
*/
}
void delay(uint8_t Velocidad) {
uint16_t tiempo;
switch((PINE&0x06))
{
case 0x00:
tiempo=((362 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
case 0x02:
tiempo=((568 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
case 0x04:
tiempo=((1430 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
case 0x06:
tiempo=((2287 * (velocidad-1)+3)/1000);
_delay_ms(tiempo);
break;
}
}
void fading() {
Velocidad = 127;
while(!PINC6)
{
Rojo = 255;
Verde = 0;
Azul = 0;
DimmerCurva();
PORTE &= ~(1<<PE0);
//rojo_amarillo
while(Verde!=255 && !PINC6)
{
if(PINC7) { rainbow_fader();}
delay(velocidad);
PORTE |= (1<<PE0);
Verde++;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//amarillo_verde
while(Rojo && !PINC6)
{
if(PINC7) { rainbow_fader();}
delay(velocidad); //esperar
PORTE |= (1<<PE0);
Rojo--;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//verde_cyan
while(Azul!=255 && !PINC6)
{
if(PINC7) { rainbow_fader();}
delay(velocidad); //esperar
PORTE |= (1<<PE0);
Azul++;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//cyan_azul
while(Verde && !PINC6)
{
if(PINC7) { rainbow_fader();}
delay(velocidad); //esperar
PORTE |= (1<<PE0);
Verde--;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//azul_magenta
while(Rojo!=255 && !PINC6)
{
if(PINC7) { rainbow_fader();}
delay(velocidad); //esperar
PORTE |= (1<<PE0);
Rojo++;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//magenta_rojo
while(Azul && !PINC6)
{
if(PINC7) { rainbow_fader();}
delay(velocidad); //esperar
PORTE |= (1<<PE0);
Azul--;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
}
}
// void delay (int velocidad) {
// delay_ciclos(); // La cantida de ciclos va a depender de los siwthc que estan conectados a PINE2 y PINE1
// Si podes simularlo con velocidad = 1 para saber que valor tenes que multiplicar a velocidad, es por que no se la cantidad de ciclos que consume cada instruccion
//temp2 = 1 si PINE1 = 0 sino temp2=2
//temp1 = 64 si PINE2 = 0 sino temp1=255
/*
Ciclos a esperar
temp2=1 temp1=255
11445 * (velocidad-1) +28
temp2=1 temp1=64
2895 * (velocidad -1) +28
temp2=2 temp1=255
18303 * (velocidad-1) +28
temp2=2 temp1=64
4551 * (velocidad-1) +28
*/
}
void rainbow_fader();{
int Temp_R,Temp_A,Temp_V;
Velocidad = 254;
Temp_R = Rojo;
Temp_A = Azul;
Temp_V = Verde;
while(PINC7)
{
Rojo = 255;
Verde = 0;
Azul = 0;
DimmerCurva();
PORTE &= ~(1<<PE0);
//rojo_verde
while(Verde!=255 && PINC7)
{
delay(velocidad);
PORTE |= (1<<PE0);
Rojo--;
Verde++;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//verde_azul
while(Azul!=255 && PINC7)
{
delay(velocidad);
PORTE |= (1<<PE0);
Verde--;
Azul++;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
//azul_rojo
while(Rojo!=255 && PINC7)
{
delay(velocidad);
PORTE |= (1<<PE0);
Azul--;
Rojo++;
DimmerCurva();
}
PORTE &= ~(1<<PE0);
}
Rojo = Temp_R;
Azul = Temp_A;
Verde = Temp_V;
}
void DimmerCurva(){
DmxRxField[0]=arraydimmer[Rojo];
DmxRxField[1]=arraydimmer[Verde];
DmxRxField[2]=arraydimmer[Azul];
}
if (count == 0xFF)
{ // Llamado con 122Hz
count= 1;
}
else count++;
}
// }
//***** inicio del ocilador Temporizador de interrupción ****//
ISR(TIMER0_OVF_vect){
int count;
switch(mode){
case RAINBOW_FADER :
count = OV_COUNT + DmxAddress;
break;
case FADING :
count = OV_COUNT + DmxAddress * 10;
break;
default:
count = OV_COUNT;
}
if(timer_counter>=count){
timer_counter=0;
if (mode==FADING){
}
}else{ timer_counter++; }
{
}
}
tambien la libreria .H
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#define USE_DIP
#define F_OSC (8000) // Frec oscilador. en kHz (8MHz típico o 16MHz)
#define DMX_CHANNELS (14)
enum {RAINBOW_FADER,FADING,DMX,} mode;
//
extern void get_dips(void);
y estos son los eerores que me larga tan solo 4 ., que creo que seria cuestion de redefinir las formas (creo)
Build started 24.8.2015 at 20:39:54
avr-gcc.exe -mmcu=atmega8515 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT fading_raibow.o -MF dep/fading_raibow.o.d -c ../fading_raibow.c
../fading_raibow.c: In function 'fading':
../fading_raibow.c:166: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:166: error: (Each undeclared identifier is reported only once
../fading_raibow.c:166: error: for each function it appears in.)
../fading_raibow.c:174: warning: implicit declaration of function 'DimmerCurva'
../fading_raibow.c:180: warning: implicit declaration of function 'rainbow_fader'
../fading_raibow.c: In function 'main':
../fading_raibow.c:272: warning: conflicting types for 'rainbow_fader'
../fading_raibow.c:180: warning: previous implicit declaration of 'rainbow_fader' was here
../fading_raibow.c:275: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:291: warning: implicit declaration of function 'delay'
make: *** [fading_raibow.o] Error 1
Build failed with 4 errors and 5 warnings...
[/code ]