hola gente del foro
este es mi primer post ., espero con agrado su guia y consejos.
he realizado una compilacion en avrstudio4., guiandome por las librerias de H.Hölscher (
www.hoelscher-hi.de)
hasta ahora logre armar 3 canales PWM ., funcionan perfecto
ademas cuenta con la señalizacion (por intermedio de dos led ) del estdo de DMX
esto es ., el rojo indica la ausencia de señal DMX., tambien la direccion incorecta asignada en las llaves MINI-DIPS ., y la coneccion inversa de D+ y D-en la entrada
el led verde indica cuando se recibe una señal DMX correcta en los canales ( por consola virtual o manual )
trabaja con las direcciones de hasta 512 canales
tambien esta previsto (pero no implemtado) que trasmita en modo autonomo ., o sea al colocar la llave MINI-DIPS 10 en OFF habilite la transmicion P-seudoDMX (master)
adjunto las librerias del proyecto completo por si alguno le interesa o les son utiles
aca publico mi "MAIN" que hasta aqui funciona perfecto., porque esa ya probado en mi prototipo y manejado con FREESTYLER
#include<util\delay.h>
#include<stdio.h>
#include<stdlib.h>
#include <avr/wdt.h>
#include "lib_dmx_in.h"
#include "lib_indicator.h"
uint8_t count= 1; // Counter for soft PWM
uint8_t IndCnt= 1; // Counter for LED indicator
uint8_t DmxBuf[DMX_CHANNELS];
void init_system(void)
{
//Watchdog
wdt_reset();
//Ports
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2);
PORTB= 0;
DDRD= 0b10000110; //DMX, spare, LED1
PORTD= 0b01111010;
//Timer0
TCCR0= (1<<CS00);
TIMSK= (1<<TOIE0);
init_DMX(); // Initialize DMX channels
init_ind(); // Initialize LED indicator
}
int main(void)
{
cli();
init_system();
sei();
int PWM_timer;
while(1)
{
for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) // Timer applied right through a series of fill
{
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 (Flags &(1<<EVAL_DMX)) // DMX universe was refreshed
{
Flags &= ~(1<<EVAL_DMX);
IndFlags |= (1<<VALID_DMX); // Valid DMX signal arrived
uint8_t i;
for (i=0; i<DMX_CHANNELS; i++)
{
if (DmxRxField[i] != DmxBuf[i]) // A DMX value has changed?
{
DmxBuf[i]= DmxRxField[i];
IndFlags |= (1<<DATA_REFRESHED); // Yes -> blink!
}
}
}
}
if (Flags &(1<<IND)) // LED indicator, DIPs
{
Flags &= ~(1<<IND);
wdt_reset(); //reset watchdog
get_dips();
if (--IndCnt == 0)
{
IndCnt= 8;
indicate();
}
}
}
}
// *************** Soft PWM ****************
ISR (TIMER0_OVF_vect)
{
if (count == 0xFF)
{ // Called with 122Hz
count= 1;
Flags |= (1<<IND);
}
else count++;
}
aca el diagrama de conecciones
bueno espero con muchisimas ganas sus observacione o dudas