Autor Tema: Invertir pwm en Atmega 8515 asembler  (Leído 34880 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #15 en: 10 de Agosto de 2015, 03:00:09 »
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

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #16 en: 10 de Agosto de 2015, 08:41:27 »
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


Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #17 en: 10 de Agosto de 2015, 17:19:55 »
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 pasrlo 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 
« Última modificación: 10 de Agosto de 2015, 17:51:15 por locodelafonola »
yo solo se que ...nose nada

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #18 en: 19 de Agosto de 2015, 11:59:15 »
Disculpa que por la falta de tiempo solo me limite a contestar algunas preguntas rapidas. Si podes poner los errores que te dan es mas facil solucionarlo.

Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #19 en: 19 de Agosto de 2015, 20:36:09 »
ok amigo y muchas gracias
Disculpa que por la falta de tiempo solo me limite a contestar algunas preguntas rapidas. Si podes poner los errores que te dan es mas facil solucionarlo.
bueno aqui va ., aclaro que lo que arme es pensando usar esta finciones de fading y rainbow.,  en dmx y standalone (que seria esta) 
es reparado los errores del armado  ., de la compilacion hasta donde yo se ., y como veras los errores que me larga son del agregado de estas funiones .,
Código: [Seleccionar]
//#define F_CPU 8000000
#include<util\delay.h>

#include<stdio.h>
#include<stdlib.h>

#include <avr/wdt.h>
 // *** establecer valor de WHILE  ***//
enum {FALSE=0, TRUE=1};
//*********************************//  
uint8_t count= 1; // contador del soft PWM
enum {FADING,RAINBOW_FADER,} mode; //funciones de muestr                                                                                                                                                                                                                                                                                                                                                                                                                                                           
Short int velocidad,Rojo,Verde,Azul,V_out,R_out,A_out; //
 //*********************************//
const short int arraydimmer[256]={0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1.1,1,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
                                   
 // ****** 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 |= (1<<PE0);
    }     
// ***** 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);
Address= Temp;
if (!(PINE &(1<<PE2))) // MODO FADING / OFF RAINBOW_FADER
     {
mode= FADING;
}else{
mode= RAINBOW_FADER;

     }
return;
}
//mode= xxx; // ACA PUEDE IR OTRA FUNCION CON LOS DIPS
//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)
// {
// Address= 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(!PINC6){ fading();}
    // if(!PINC5){ disco();}
    /*
    Aca mas codigo que realmente no influye en nada
    */
    }
     
     
     
    void fading() {
     
    Velocidad = 127;
     
    while(!PINC6)
    {
    Rojo = 255;
    Verde = 0;
    Azul = 0;
     
    DimmerCurva()
    PORTE0 = 0;
     
    //rojo_amarillo
    while(Verde!=255 && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);
    PORTE0 = 1;
    Verde++;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //amarillo_verde
    while(Rojo && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Rojo--;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //verde_cyan
    while(Azul!=255 && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Azul++;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //cyan_azul
    while(Verde && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Verde--;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //azul_magenta
    while(Rojo!=255 && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Rojo++;
    DimmerCurva();
    }
    PORTE0 = 0;
   
    //magenta_rojo
    while(Azul && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Azul--;
    DimmerCurva();
    }
    PORTE0 = 0;
    }
    }
     
    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();
    PORTE0 = 0;
     
    //rojo_verde
    while(Verde!=255 && PINC7)
    {
    delay(velocidad);
    PORTE=1;
    Rojo--;
    Verde++;
    DimmerCurva();
    }
    PORTE0=0;
     
    //verde_azul
    while(Azul!=255 && PINC7)
    {
    delay(velocidad);
    PORTE=1;
    Verde--;
    Azul++;
    DimmerCurva();
    }
    PORTE0=0;
     
    //azul_rojo
    while(Rojo!=255 && PINC7)
    {
    delay(velocidad);
    PORTE=1;
    Azul--;
    Rojo++;
    DimmerCurva();
    }
    PORTE0=0;
    }
     
    Rojo = Temp_R;
    Azul = Temp_A;
    Verde = Temp_V;
     
    }
     
    void DimmerCurva(){
     
    R_out=arraydimmer[Rojo];
    V_out=arraydimmer[Verde];
    A_out=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 + Address;
break;
case FADING :
count = OV_COUNT + Address * 10;
break;
default:
count = OV_COUNT;
}
if(timer_counter>=count){
timer_counter=0;

if (mode==FADING){

}
 
}else{ timer_counter++; }

{

}
}
los errores que me larga el compilador son estos
Código: [Seleccionar]
Build started 19.8.2015 at 20:21:43
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:1:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c: In function 'main':
../fading_raibow.c:97: warning: implicit declaration of function 'cli'
../fading_raibow.c:101: warning: implicit declaration of function 'sei'
../fading_raibow.c: In function 'fading':
../fading_raibow.c:122: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:122: error: (Each undeclared identifier is reported only once
../fading_raibow.c:122: error: for each function it appears in.)
../fading_raibow.c:126: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:127: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:128: error: 'Azul' undeclared (first use in this function)
../fading_raibow.c:130: warning: implicit declaration of function 'DimmerCurva'
../fading_raibow.c:131: error: expected ';' before numeric constant
../fading_raibow.c:136: warning: implicit declaration of function 'rainbow_fader'
../fading_raibow.c:137: warning: implicit declaration of function 'delay'
../fading_raibow.c:137: error: 'velocidad' undeclared (first use in this function)
../fading_raibow.c:138: error: lvalue required as left operand of assignment
../fading_raibow.c:142: error: lvalue required as left operand of assignment
../fading_raibow.c:149: error: lvalue required as left operand of assignment
../fading_raibow.c:153: error: lvalue required as left operand of assignment
../fading_raibow.c:160: error: lvalue required as left operand of assignment
../fading_raibow.c:164: error: lvalue required as left operand of assignment
../fading_raibow.c:171: error: lvalue required as left operand of assignment
../fading_raibow.c:175: error: lvalue required as left operand of assignment
../fading_raibow.c:182: error: lvalue required as left operand of assignment
../fading_raibow.c:186: error: lvalue required as left operand of assignment
../fading_raibow.c:193: error: lvalue required as left operand of assignment
../fading_raibow.c:197: error: lvalue required as left operand of assignment
../fading_raibow.c: In function 'delay':
../fading_raibow.c:203: warning: implicit declaration of function 'delay_ciclos'
../fading_raibow.c: In function 'rainbow_fader':
../fading_raibow.c:231: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:232: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:233: error: 'Azul' undeclared (first use in this function)
../fading_raibow.c:234: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:242: error: lvalue required as left operand of assignment
../fading_raibow.c:247: error: 'velocidad' undeclared (first use in this function)
../fading_raibow.c:253: error: lvalue required as left operand of assignment
../fading_raibow.c:264: error: lvalue required as left operand of assignment
../fading_raibow.c:275: error: lvalue required as left operand of assignment
../fading_raibow.c: In function 'DimmerCurva':
../fading_raibow.c:286: error: 'R_out' undeclared (first use in this function)
../fading_raibow.c:286: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:287: error: 'V_out' undeclared (first use in this function)
../fading_raibow.c:287: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:288: error: 'A_out' undeclared (first use in this function)
../fading_raibow.c:288: error: 'Azul' undeclared (first use in this function)
../fading_raibow.c: At top level:
../fading_raibow.c:300: warning: return type defaults to 'int'
../fading_raibow.c: In function 'ISR':
../fading_raibow.c:300: warning: type of '__vector_7' defaults to 'int'
../fading_raibow.c:304: error: 'Address' undeclared (first use in this function)
make: *** [fading_raibow.o] Error 1
Build failed with 36 errors and 20 warnings...
con los "WARNINGS" no hay problema .,  si no son graves .,  compila igual.,  pero son solo advertencias de forma.,  nada mas
he tratado de hacerlo solo.,  pero sinceramente me confudi mas ., son los "ERROR" ., los que hay que tener en cuenta ( pero me parece que falta definir las funciones o funcion de cad cosa
gracias y perdona la molestia
« Última modificación: 19 de Agosto de 2015, 22:43:00 por locodelafonola »
yo solo se que ...nose nada

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #20 en: 20 de Agosto de 2015, 08:43:13 »
Voy a hacer un resumen, disculpa si no me explayo mucho en la explicacion:


Citar
../fading_raibow.c:1:1: warning: "F_CPU" redefined

Esto es por que tenias el #define F_CPU y en otro lado tenes escrito lo mismo, es decir solo necesitas ponerlo 1 sola ves

Citar
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')
../fading_raibow.c:14: warning: excess elements in array initializer
../fading_raibow.c:14: warning: (near initialization for 'arraydimmer')

Esto es por que el arraydimmer tiene cerca de 270 y algo mas valores y vos intenta ponerlo en un array de 256 valores, aca hay valores de mas, si observas el archivo ASM ni siquiera hay tantos ceros.

Citar
../fading_raibow.c:97: warning: implicit declaration of function 'cli'
../fading_raibow.c:101: warning: implicit declaration of function 'sei'

Mas claro que nunca, basicamente esas funciones no existen, no se si tenes que agregar algun archivo para usarlas. Creo que es:

#include <avr/interrupt.h>   

Citar
../fading_raibow.c:122: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:122: error: (Each undeclared identifier is reported only once
../fading_raibow.c:122: error: for each function it appears in.)
../fading_raibow.c:126: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:127: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:128: error: 'Azul' undeclared (first use in this function)
../fading_raibow.c:231: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:232: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:233: error: 'Azul' undeclared (first use in this function)
../fading_raibow.c:234: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:247: error: 'velocidad' undeclared (first use in this function)
../fading_raibow.c:286: error: 'R_out' undeclared (first use in this function)
../fading_raibow.c:286: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:287: error: 'V_out' undeclared (first use in this function)
../fading_raibow.c:287: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:288: error: 'A_out' undeclared (first use in this function)
../fading_raibow.c:288: error: 'Azul' undeclared (first use in this function)

Otro error muy simple... una cosa a notar que existe la variable "velocidad" y Velocidad" intenta hacer que sea una u otra y no ambas. es decir poneles a todos "Velocidad" o todos "velocidad"
Luego hay que declararlas. Aunque las veo declaradas:

Short int Velocidad,Rojo,Verde,Azul,V_out,R_out,A_out;

Citar
../fading_raibow.c:138: error: lvalue required as left operand of assignment
../fading_raibow.c:142: error: lvalue required as left operand of assignment
../fading_raibow.c:149: error: lvalue required as left operand of assignment
../fading_raibow.c:153: error: lvalue required as left operand of assignment
../fading_raibow.c:160: error: lvalue required as left operand of assignment
../fading_raibow.c:164: error: lvalue required as left operand of assignment
../fading_raibow.c:171: error: lvalue required as left operand of assignment
../fading_raibow.c:175: error: lvalue required as left operand of assignment
../fading_raibow.c:182: error: lvalue required as left operand of assignment
../fading_raibow.c:186: error: lvalue required as left operand of assignment
../fading_raibow.c:193: error: lvalue required as left operand of assignment
../fading_raibow.c:197: error: lvalue required as left operand of assignment

Corresponde a estas lineas:

PORTE0 = 0;
PORTE0 = 1;

Tal ves no se modifican asi, es como que no reconociera el PORTE0, asi que lo mas seguro es que tengas que reemplazarlo por un PORTE |= 0x01 ( Para ponerlo en 1 ) y un PORTE &=0xFE ( Para ponerlo en 0 ).

Citar
../fading_raibow.c:130: warning: implicit declaration of function 'DimmerCurva'
../fading_raibow.c:131: error: expected ';' before numeric constant
../fading_raibow.c:136: warning: implicit declaration of function 'rainbow_fader'
../fading_raibow.c:137: warning: implicit declaration of function 'delay'
../fading_raibow.c:203: warning: implicit declaration of function 'delay_ciclos'

Los mensajes es por que no se crearon los prototipos de las funciones, y el error es por que falta un punto y coma en el codigo
Tambien notar que en un lado usamos el nombre "delay" y en otro lado "delay_ciclos", Cuando solo deberia haber el "delay" que es la funcion que nosotros creamos

Citar
../fading_raibow.c:300: warning: return type defaults to 'int'
../fading_raibow.c:300: warning: type of '__vector_7' defaults to 'int'

Por que no se declaro el tipo de funcion

Código: C
  1. ISR(TIMER0_OVF_vect){
  2.                          ....
  3. }

por

Código: C
  1. void ISR(TIMER0_OVF_vect){
  2.                        ......
  3. }


Citar
../fading_raibow.c:304: error: 'Address' undeclared (first use in this function)

Obviamente no definio esa variable tampoco, esta usada en la interrupcion, asi que por eso el error.


-------------

Solucionado todo esto deberia compilar o salir nuevos errores

Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #21 en: 20 de Agosto de 2015, 17:04:35 »
Bueno amigo ., esto va por muy buen camino.,  gracias a usted ¡¡¡¡ infinitas Gracias !!!!
bueno alli acomode un poco las cosas
Agregue la libreria #include"fading_raibow.h" ., repare lo del ocilador ( estaba definido 2 veces en la optimizacion de codigo)., y el potE0 ., yo creo que va a funcionar.,  como estaba.,  desde un pricipio ., tenia mal dedinido el port en "pinouts" ., por eso largaba error
Bueno lo que larga ahora., creo que son errores de forma., no de funcionamiento
yo creo que para mi ver., son la formas que estan escritas las funciones nada mas que eso
por ejemplo :
Código: [Seleccionar]
while(Verde && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
Bien yo esa funcion la defini en el array de llaves PINE2., ahora la duda que tengo es que al parecer ., PINC6 y PINC7 ., trabajen en conjunto o separadamente .,  no lo defini ni cambie para confirmar eso
Tal vez.,  no presto atencion.,  a lo que yo arme (!!! ojo ¡¡¡¡ puede estar mal )  ., porque ya esta definido la funcion de la llave OFF/ON ., que lee GET_DIPS() ., en cada ciclo del While
Por eso digo ., que talvez entendi mal el funcionamiento
En el array de llaves esta con valores de  DMX ., pero alli se pueden poner valores del delay (esta armado par que se sumen las llaves.,  y tome el total en DMXADRRDES = Temp
Como lo que esta puesto aca :
Código: [Seleccionar]
//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
    */
Otra cosa que hice fue ., declarar las salidas de los LED R,G,B   
Ahora lo que no se ., es que valor toma de la compilacion para el PWM ., como tampoco entiendo como se ejecuta la salida en la compilacion ASM
Esto como dije .,  aparte de aprender como funciona un fading por software ., quiero aplicarlo al DMX
En la configuracion fisica.,  que tengo armada ., solo usa los tres puertos  de B y tengo los puertos libres de A
Yo pesaba agregar mas llaves en  puertos A ( las que sean necesarias) y que trabajen en conjunto con las de los puetos C y E
Por eso las forma del bosquejo., pero por ahora ., esta armado de acuerdo al esquema fisico que ya tengo construido y asi probar
Bueno ahora lo que quedo es asi
Código: [Seleccionar]
//#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

Short int velocidad,Rojo,Verde,Azul,V_out,R_out,A_out; //
 //*********************************//
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
                                   
 // ****** 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 FADING / OFF RAINBOW_FADER
     {
mode= FADING;
}else{
mode= RAINBOW_FADER;

     }
return;
}
//mode= xxx; // ACA PUEDE IR OTRA FUNCION CON LOS DIPS
//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)
// {
// Address= 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 (R_out>PWM_timer) //red
{
PORTB &= ~(1<<PB0); //LED OFF
}else{
PORTB |= (1<<PB0); //LED ON
}
 
if (V_out>PWM_timer)         //green
{
PORTB &= ~(1<<PB1); //LED OFF
}else{
PORTB |= (1<<PB1); //LED ON
}
 
if (V_out>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 fading(); {
     
    Velocidad = 127;
     
    while(!PINC6)
    {
    Rojo = 255;
    Verde = 0;
    Azul = 0;
     
    DimmerCurva();
    PORTE0 = 0;
     
    //rojo_amarillo
    while(Verde!=255 && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);
    PORTE0 = 1;
    Verde++;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //amarillo_verde
    while(Rojo && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Rojo--;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //verde_cyan
    while(Azul!=255 && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Azul++;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //cyan_azul
    while(Verde && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Verde--;
    DimmerCurva();
    }
    PORTE0 = 0;
     
    //azul_magenta
    while(Rojo!=255 && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Rojo++;
    DimmerCurva();
    }
    PORTE0 = 0;
   
    //magenta_rojo
    while(Azul && !PINC6)
    {
    if(PINC7) { rainbow_fader();}
    delay(velocidad);  //esperar
    PORTE0 = 1;
    Azul--;
    DimmerCurva();
    }
    PORTE0 = 0;
    }
    }
     
    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();
    PORTE0 = 0;
     
    //rojo_verde
    while(Verde!=255 && PINC7)
    {
    delay(velocidad);
    PORTE=1;
    Rojo--;
    Verde++;
    DimmerCurva();
    }
    PORTE0=0;
     
    //verde_azul
    while(Azul!=255 && PINC7)
    {
    delay(velocidad);
    PORTE=1;
    Verde--;
    Azul++;
    DimmerCurva();
    }
    PORTE0=0;
     
    //azul_rojo
    while(Rojo!=255 && PINC7)
    {
    delay(velocidad);
    PORTE=1;
    Azul--;
    Rojo++;
    DimmerCurva();
    }
    PORTE0=0;
    }
     
    Rojo = Temp_R;
    Azul = Temp_A;
    Verde = Temp_V;
     
    }
     
    void DimmerCurva(){
     
    R_out=arraydimmer[Rojo];
    V_out=arraydimmer[Verde];
    A_out=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++; }

{

}
}

La libreria H que arme es esta
Código: [Seleccionar]
#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)
 
enum {RAINBOW_FADER,FADING,} mode;

volatile uint16_t DmxAddress; // Dirección inicial


extern void    get_dips(void);


Ahora lo que me larga error
Código: [Seleccionar]
Build started 20.8.2015 at 15:17:31
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:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'int'
../fading_raibow.c: In function 'main':
../fading_raibow.c:112: error: 'R_out' undeclared (first use in this function)
../fading_raibow.c:112: error: (Each undeclared identifier is reported only once
../fading_raibow.c:112: error: for each function it appears in.)
../fading_raibow.c:119: error: 'V_out' undeclared (first use in this function)
../fading_raibow.c:143: error: 'Velocidad' undeclared (first use in this function)
../fading_raibow.c:147: error: 'Rojo' undeclared (first use in this function)
../fading_raibow.c:148: error: 'Verde' undeclared (first use in this function)
../fading_raibow.c:149: error: 'Azul' undeclared (first use in this function)
../fading_raibow.c:151: warning: implicit declaration of function 'DimmerCurva'
../fading_raibow.c:152: error: lvalue required as left operand of assignment
../fading_raibow.c:157: warning: implicit declaration of function 'rainbow_fader'
../fading_raibow.c:158: warning: implicit declaration of function 'delay'
../fading_raibow.c:158: error: 'velocidad' undeclared (first use in this function)
../fading_raibow.c:159: error: lvalue required as left operand of assignment
../fading_raibow.c:163: error: lvalue required as left operand of assignment
../fading_raibow.c:170: error: lvalue required as left operand of assignment
../fading_raibow.c:174: error: lvalue required as left operand of assignment
../fading_raibow.c:181: error: lvalue required as left operand of assignment
../fading_raibow.c:185: error: lvalue required as left operand of assignment
../fading_raibow.c:192: error: lvalue required as left operand of assignment
../fading_raibow.c:196: error: lvalue required as left operand of assignment
../fading_raibow.c:203: error: lvalue required as left operand of assignment
../fading_raibow.c:207: error: lvalue required as left operand of assignment
../fading_raibow.c:214: error: lvalue required as left operand of assignment
../fading_raibow.c:218: error: lvalue required as left operand of assignment
../fading_raibow.c: In function 'delay':
../fading_raibow.c:224: warning: implicit declaration of function 'delay_ciclos'
../fading_raibow.c: In function 'main':
../fading_raibow.c:249: warning: conflicting types for 'rainbow_fader'
../fading_raibow.c:157: warning: previous implicit declaration of 'rainbow_fader' was here
../fading_raibow.c:263: error: lvalue required as left operand of assignment
../fading_raibow.c:274: error: lvalue required as left operand of assignment
../fading_raibow.c:285: error: lvalue required as left operand of assignment
../fading_raibow.c:296: error: lvalue required as left operand of assignment
../fading_raibow.c: In function 'DimmerCurva':
../fading_raibow.c:309: error: 'A_out' undeclared (first use in this function)
../fading_raibow.c: In function '__vector_7':
../fading_raibow.c:324: error: expected ':' or '...' before ';' token
../fading_raibow.c:325: error: 'DMXAddress' undeclared (first use in this function)
../fading_raibow.c:327: error: expected ':' or '...' before ';' token
make: *** [fading_raibow.o] Error 1
Build failed with 31 errors and 6 warnings...
Bueno espero tus comentarios e ideas (estan buenisimas para mi)  cuando puedas con tu tiempo y desde ya gracias
« Última modificación: 20 de Agosto de 2015, 17:22:51 por locodelafonola »
yo solo se que ...nose nada

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #22 en: 23 de Agosto de 2015, 19:55:29 »
Bueno no voy a profundizar en el tema de los DIPS que agregaste. Ya que realmente no se que hacen, solo me limite a pasarte el ASM de la funcion que me diste a C.

Pero Voy a decirte 2 cosas sobre eso ( esto nomas incluye el codigo que te pase).

1 - PORTE1 , PORTE2 se utilizan para la rapidez con que cambian los colores (fading), eso tenes que tenerlo en cuenta.
2 - PORTC6, PORTC7 se utilizan para seleccionar los modos, es decir entre fading y ademas agregarle el rainbow_fading, PC6 te habilita a que se produzca el fading. SI ademas tenes habilitado PC7 se produce lo "rainbow" ademas del fading.

- El codigo de tus pines, funcion init_pinout() , le falta un #else, sino cuando pones el define USE_DIP, se ejecuta ambos codigos: y deberia ser asi:

Código: C
  1. void init_pinouts(){                                                                   
  2.     #ifdef USE_DIP
  3.  
  4.     DDRC  = 0;                  // establecer DIPs
  5.     PORTC  = 0xFF;
  6.     DDRE  &= ~((1<<PE2)|(1<<PE1));
  7.     PORTE |=   (1<<PE2)|(1<<PE1);
  8.  
  9.         #else          
  10.    
  11.         DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); // Salida pin LED                                                                                              
  12.         PORTB = 0;             
  13.         DDRE  |= (1<<PE0);      //LED2 azul indicador
  14.     PORTE = 0;
  15.         #endif
  16. }

- Tenes un problema en la definicion de las variables, decia Short int, estaba en mayusculas, directamente podes reemplazarlo por:

Código: C
  1. uint8_t velocidad,Rojo,Verde,Azul,V_out,R_out,A_out;

- Reemplaza todos los PINC7 y PINC6 por sus correspondientes, estos no daban errores pero mejor asegurarse.

Código: C
  1. (PINC & (1<<PC6))
  2. (PINC & (1<<PC7))

- Reemplaza lso PORTE0 =0 y PORTE = 1 por sus correspondientes, claramente esta dando errores, asi que mejor cambiarlos:

Código: C
  1. PORTE &= ~(1<<PE0);
  2. PORTE |= (1<<PE0);

- La funcion de delay te la habia pasado ya. Deberia quedar:

Código: C
  1. void delay(uint8_t Velocidad) {
  2.      
  3.         uint16_t tiempo;
  4.         switch((PINE&0x06))
  5.         {
  6.         case 0x00:
  7.                 tiempo=((362 * (velocidad-1)+3)/1000);
  8.                 _delay_ms(tiempo);
  9.                 break;
  10.         case 0x02:
  11.                 tiempo=((568 * (velocidad-1)+3)/1000);
  12.                 _delay_ms(tiempo);
  13.                 break;
  14.         case 0x04:
  15.                 tiempo=((1430 * (velocidad-1)+3)/1000);
  16.                 _delay_ms(tiempo);
  17.                 break;
  18.         case 0x06:
  19.                 tiempo=((2287 * (velocidad-1)+3)/1000);
  20.                 _delay_ms(tiempo);
  21.                 break;
  22.         }
  23. }

- Tenes un error en el switch...case en la interrupcion

Le pusiste un ; en ves de un :

- Tenes tal ves un error al tener una coma de mas aca (luego del FADING):

Código: C
  1. enum {RAINBOW_FADER,FADING,} mode;

- Lo mas importante:

 Sigo sin entender por que estas poniendo el for() en el main, sigo sin entender por que estas tocando la interrupcion del timer. A pesar que te pase como deberia ser y te dije como era un PWM por software, seguis implementando un concepto equivocado.
La idea de un PWM por software es que las porciones de tiempo sean fijas y que ademas tenga un periodo fijo, vos con tu for estas evitando todo eso. Por eso dije que las comparaciones deberian ir en la interrupcion y sin el for.
No se para que el switch case que agregaste en la interrupcion. realmente no se. por que esa interrupcion es del timer. la que te genera ese PWM.

Corrigiendo eso deberia creo yo eliminar todos los errores que tenes.
« Última modificación: 23 de Agosto de 2015, 20:06:03 por KILLERJC »

Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #23 en: 24 de Agosto de 2015, 23:56:44 »
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
Código: [Seleccionar]
//***** 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
Código: [Seleccionar]
   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  
Código: [Seleccionar]
//#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
Código: [Seleccionar]
#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)
Código: [Seleccionar]
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 ]
« Última modificación: 25 de Agosto de 2015, 02:55:42 por locodelafonola »
yo solo se que ...nose nada

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #24 en: 25 de Agosto de 2015, 04:47:36 »
Primero que nada pedirte disculpas si me excedi de tono.
Me encontre confundido, por que un tema es el codigo del primer post, y el otro es el codigo que me pasaste.

El codigo del primer post es de DMX pero que yo realmente no tengo la menor idea de como es el DMX. Por eso simplemente me limite a modificar la salida luego de estudiar el codigo por encima.
Es mas en el primer codigo todo lo de DMX esta en una libreria que no se incluye.

Por otro lado el codigo que me pasaste hace uso de un PWM por software tal cual lo hace el primer codigo,  no hay libreria ni se aplica DMX, y pense que tu problema era que no podias pasar el programa de ASM a C.
El principal desencuentro que tuvimos es que vos pensabas agruparlo con el DMX y yo seguia pensando en el programa tal como estaba (Solamente PWM por soft). Entonces mientras vos ibas para un lado yo iba para el otro. Uno intentaba hacer una cosa y el otro otra.

Como no se DMX, nunca lo use, aunque no creo que sea complicado no puedo ayudarte mucho en esa parte, por eso mismo me limite a pasar el codigo de ASM a C. Con lo cual te voy a poder ayudar a resolver algunas dudas, pero no voy a poder con todas.

Citar
sigo sin poder entender las "case " con valores exadecimales ., (no entiendo a que puertos se refiere ni a que BITS afecta

switch((PINE&0x06))

PINE & 0000 0110

Ejemplo si PINE es 1010 0101 al hacerle una AND con 0000 0110 queda:

1010 0101
0000 0110
--------------
0000 0100

Es decir solo dejo los pines PINE1 y PINE2, los valores de esa operacion (recorda que una AND con un 0 logico es 0 siempre, y una AND con 1 logico es 1 o 0 segun el estado que tenia) puede darme 4 formas
0000 0000 - Caso que PINE1=0 y PINE2=0 - En hexa 0x00 - case 0x00
0000 0010 - Caso que PINE1=1 y PINE2=0 - En hexa 0x02 - case 0x02
0000 0100 - Caso que PINE1=0 y PINE2=1 - En hexa 0x04 - case 0x04
0000 0110 - Caso que PINE1=1 y PINE2=1 - En hexa 0x06 - case 0x06

Los demas bits quedan en 0 por que al hacerle justamente una AND van a quedar en 0 sea cual fuese su valor anterior.

Citar
En cuanto al "FOR" del PWM ., si no lo coloco ., no me funciona con los potenciometros virtuales de DMX ( DmxRxField[DMX_CHANNELS] )

Es por que seguro que tenes mal hecho el codigo. Como te digo no podes tener un for ahi, un for es muy aleatorio en tiempos, a pesar que pueda parecer un PWM por soft no lo es, es muy inconsistente. Yo imagino a DMX como algo que le envia los valores y el micro debe usar esos valores. Si vamos a que se necesita un PWM por software no podes tenerlo en el main, vuelvo a repetir que es un error de concepto/implementacion, deberias tenerlo en la interrupcion ( para eso es esa interrupcion, me refiero a la del timer ) y sin for() obviamente.

Citar
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

Tal ves me confundi con eso, al ver los 2 valores asignados a un mismo registro me parecio que habias cometido un error. Estoy mas acostumbrado a ver algo como:

Código: C
  1. #ifdef xxxx
  2.     //conf Puertos si tuviera DIP
  3. #else
  4.     //conf de Puertos si no tuviera DIP
  5. #endif
Tal ves un poco de locura de parte mia

Citar
, estas sentencias V_out,R_out,A_out;  las cambie por estas  DmxRxField[0] , DmxRxField[1] , DmxRxField[2]

Ahi hay un error, en si todo el programa como creo que vos dijiste es imposible aplicarlo, no se cuales son las entradas de datos de DMX, ya que el fading modifica siempre esos valores que luego son usados en el PWM por soft. los colores ya estan preseleccionados en el codigo, es decir no tenes ninguna "variable" que puedas modificar. Si vos por ejemplo queres que por DMX llegue los valores de los colores y se produzca el fading, entonces eso es una cosa distinta a lo que el codigo estaba haciendo(que me pasaste). Reemplazar lo que reemplazaste no creo que sea lo correcto.

La seleccion de modo imagino tambien que vendra por algun comando. asi que no se por que esta hecho en la interrupcion del timer.
Si llegan los datos por UART entonces deberia haber una interrupcion de la UARt y ahi producirse el cambio de modo.

Con respecto a los errores que obtuviste es por que:

Velocidad no es lo mismo que velocidad, es case-sensitive asi que para quitarlo le cambias la V mayuscula por la minuscula.

Esto te va a solucionar los errores de sintaxis, pero esto no quiere decir que el codigo funcione. Ya que como dije el codigo esta realizado para hacer una cosa y yo recien ahora me entero que estas pidiendo otra totalmente distinta.
« Última modificación: 25 de Agosto de 2015, 04:51:03 por KILLERJC »

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #25 en: 25 de Agosto de 2015, 06:13:38 »
yo hace tiempo leo estos mensaje y debo decir que es una sopa de letras, creo que el amigo locodelafonola no ha leido lo que es el Protocologo DMX512, el codigo en si es para hace una funcion comandada por otros DMX512 Transmisor, recordar que el protocolo se compone de DMX512 Maestros y Esclavo, los Esclavos como es logico reciben Comando del Maestros , pero hay casos Tambien donde el Maestros hace las dos funciones.
Esta imagen le ha dado la vuelta a internet para aquellos que desconocen el protocologo.

El amigo locodelafonola quiere cambiar un protocologo que no tiene nada que ver con DMX512 y es por eso que he dicho que abra un temas nuevos en el Subforo correspondiente.
Amigo Killerjc como ver en la imagen no es nada dificil y si te fija de algunos projectos de DMX512 en este Subforos lo Capta enseguidas.
otras aclaracion el Master o lo que hacen DMX512 como Maestros , programan la mesa con muchas secuencias de comandos.
Espero que me hayan comprendido. ;-)
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #26 en: 25 de Agosto de 2015, 15:18:24 »
Gracias stk500, yo me imaginaba algo asi. Ya que en fin era recibir un dato y hacer algo con ese dato. Sea cual sea el protocolo eso no cambiaba.
No tenia claro como es que se enviaba.
Por cierto aca el AN
http://ww1.microchip.com/downloads/en/AppNotes/01076A.pdf


Ya con eso me queda claro cuales son los valores de dimming. Es decir con la direccion que se le asigna al receptor este toma el byte que le corresponde de la trama (512bytes).
Ahora como es que se pueden enviar 3 valores o por ejemplo elegir el modo. Ejemplo yo quisiera elegir los 3 valores de RGB y elegir entre fading/fijo/rainbow_fading , como se discriminan los comandos ( como para cambiar el modo ) y los 3 datos de los colores?

O se envian todos en secuencia

512bytes con el comando
512bytes con  R
512bytes con  G
512bytes con  B

Asi ? y eso se repite ?

O los 512 bytes pertenece a un solo receptor y el Start Code es el que selecciona el "esclavo(receptor)" ?
« Última modificación: 25 de Agosto de 2015, 15:22:07 por KILLERJC »

Desconectado locodelafonola

  • PIC10
  • *
  • Mensajes: 43
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #27 en: 25 de Agosto de 2015, 16:11:45 »
hola y gracias de nuevo
yo hace tiempo leo estos mensaje y debo decir que es una sopa de letras, creo que el amigo locodelafonola no ha leido lo que es el Protocologo DMX512, el codigo en si es para hace una funcion comandada por otros DMX512 Transmisor, recordar que el protocolo se compone de DMX512 Maestros y Esclavo, los Esclavos como es logico reciben Comando del Maestros , pero hay casos Tambien donde el Maestros hace las dos funciones.
Esta imagen le ha dado la vuelta a internet para aquellos que desconocen el protocologo.

El amigo locodelafonola quiere cambiar un protocologo que no tiene nada que ver con DMX512 y es por eso que he dicho que abra un temas nuevos en el Subforo correspondiente.
Amigo Killerjc como ver en la imagen no es nada dificil y si te fija de algunos projectos de DMX512 en este Subforos lo Capta enseguidas.
otras aclaracion el Master o lo que hacen DMX512 como Maestros , programan la mesa con muchas secuencias de comandos.
Espero que me hayan comprendido. ;-) Saludos

a ver ., yo creo a mi entender que alli esta el problema de todo esto  
yo no se si no me explico bien o no me hago enteder .,YO NO QUIERO CAMBIAR EL PROTOCOPLO DMX 512 .,¿¿¿ donde escribi eso o donde lo pedi ????
Yo lo que pedi es pasar esas funciones de comando manual a DMX
no entiendo cual es el enpecinamiento en confundir las cosas ., si lo plantie bien claro ., primero que funcione en MNUAL (llaves mini-dips) y luego en DMX
aca esta el  link  del proyecto de mi libreria  
http://www.ledstyles.de/index.php/Thread/3928-Rainbow-Fader-mit-Zusatzfunktionen-Neu-mit-Dimmerkurve/?pageNo=1&s=bb5cd6c43d7e00c4ba4095728791824bd3ec56ae
alli se nita claramente en una foto el montaje DMX de  Hendrik Hoelscher
y aclaremos algo ., ¿¿¿¿ como puedo usar la funcion de MAESTRO en STANDALONE ., si no tengo nada para enviar ???
Esto es programaion DMX ., donde se tiene que respetar ciertos parametros para que funcione
Yo al poner la llave mini-dips N° 10 en ON desabilito la recepcion .,  y habilito la trasmicion (obiamente hay que colocar una instruccion como init_DMX_RX();  aca muestro las librerias que tengo
Esta es la  lib_dmx_out.C
Código: [Seleccionar]
/**** A P P L I C A T I O N   N O T E   ************************************
*
* Title : DMX512 transmission library
* Version : v1.1
* Last updated : 30.07.07
* Target : Transceiver Rev.3.01 [ATmega8515]
* Clock : 8MHz, 16MHz
*
* written by hendrik hoelscher, www.hoelscher-hi.de
***************************************************************************
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version2 of
 the License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 General Public License for more details.

 If you have no copy of the GNU General Public License, write to the
 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

 For other license models, please contact the author.

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

#include "globals.h"
#include "lib_dmx_out.h"

// ********************* local definitions *********************
uint16_t gCurDmxCh; //current DMX channel

#define TX_BRK  (0xFFFF)
#define TX_SC (0)
#define TX_DATA (1)


// *************** DMX Reception Initialisation ****************
void init_DMX_TX(void)
{
//Ports
DDRD  |= (1<<2)|(1<<1);
PORTD |= (1<<2)|(1<<1); //enable transmission

//USART
UBRRH  = 0;
UBRRL  = ((F_OSC/4000)-1); //250kbaud, 8N2
UCSRC  = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);
UCSRB  = (1<<TXEN)|(1<<TXCIE);
UDR    = 0; //start USART

//Data
gCurDmxCh= TX_BRK; //start with break
}



// ****************** DMX Transmission ISR ********************

ISR (UART_TX_vect)
{
uint16_t DmxCh= gCurDmxCh;

if (DmxCh == TX_BRK) //start break
{
UBRRH  = 0;
if (Flags &(1<<SLOW_TX))
{
UBRRL  = 17;
}
else
{
UBRRL  = 9;
UCSRC  = (1<<URSEL)|(3<<UCSZ0); //8n1
}
UDR    = 0; //send break
gCurDmxCh= TX_SC;
}
else if (DmxCh == TX_SC)
{
UBRRH  = 0;
UBRRL  = ((F_OSC/4000)-1); //250kbaud
UCSRC  = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);
UDR    = 0; //send start byte
gCurDmxCh= TX_DATA;
}
else
{
if (Flags &(1<<SLOW_TX))
{
_delay_us(20); //inter byte gap in slow mode
}

if (DmxCh &(1<<0)) UDR=  TxVal; //send data
else   UDR= (0xFF -TxVal);

gCurDmxCh++;
if (Flags &(1<<SLOW_TX))
{
if (DmxCh == 511) gCurDmxCh= TX_BRK;
}
else
{
if (DmxCh == 48)  gCurDmxCh= TX_BRK;
}
}
}

esta es la lib_dmx_out.H
Código: [Seleccionar]
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>


volatile uint8_t TxVal; //array of DMX vals


extern void init_DMX_TX(void);
 
Ahora bien.,  si se sigue pensando que la programacion de standalone ., no tiene que seguir los protocolos DMX ., !!! alli esta el error ¡¡¡¡
Eso por el lado de la trasmicion ., por el lado de la recepcion ¿¿¿ qque pasaria si yo coloco esta intruccion dentro del WHILE(es donde trabaja el programa sin salir de alli ) ejemplo :  
Código: [Seleccionar]
  if (DmxRxField[3]> 10 < 255)    // comando del FADING
{
int FADING;    // inicio del fading

}
 
if (DmxRxField[4]> 10 < 255)    // comando del RAINBOW_FADER
{                                                                                                      int RAINBOW_FADER;              // inicio del rainbow_fader

}
Tal vez.,  las sentencias esten mal definidas en sus formas pero .,en si tendria que funcionar ., de hecho he probado experimentalmente algo parecido y funciono
Y para aclarar ., el protocolo DMX512 creo que lo entiendo bien (puedo estar equivocado porque aprendi solo )., aca la cuestion es ., hacer funcionar algo y que respete los lineamientos del protocolo de trasmicion y recepcion DMX 512 ., SIN CAMBIAR EL PROTOCOLO
sigo sin entender lo de los numeros binarios y exadecimales
Tambien el hecho de que no se cambien los PIN / PORT PE1 y PE2 ., esos no se pueden usar ., porque me imposibilita el uso de el DMX ., tengo sin usar los puertos con las llaves desde el PC0 a PC7
SI fuera el caso como esto ( esta mal porque no entiendo de alli mi confucion ) ejemplo :
Código: [Seleccionar]
 void get_dips(void)
{
#ifdef USE_DIP
uint16_t Temp;
 
if (!(PINE &(1<<PE1))){ // Modo FADING / RAINBOW_FADER /DMX OUT
              init_DMX_RX();     Temp=  // DMXAdress = tiempo de retardo
(!(PINC &(1<<PC0)) 362 * (velocidad-1)+3)/1000)+
(!(PINC &(1<<PC1)) 568 * (velocidad-1)+3)/1000)+
(!(PINC &(1<<PC2)) 1430 * (velocidad-1)+3)/1000)+
(!(PINC &(1<<PC3)) 2287 * (velocidad-1)+3)/1000)+
(!(PINC &(1<<PC4)) *0) +
(!(PINC &(1<<PC5)) *0) +
(!(PINC &(1<<PC6)) *0) +
(!(PINC &(1<<PC7)) *0);
DmxAddress= Temp=_delay_ms(tiempo);
if (!(PINE &(1<<PE2))) // MODO : ON FADING / OFF RAINBOW_FADER
    {
mode= FADING;
}else{
mode= RAINBOW_FADER;
UCSRB &= ~(1<<RXCIE);// Receptor Desactivar si la dirección de inicio = 0     }
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;

} telf oca 0260 442-5403
  
Y alli agregue (que no viene al caso., de lo que tratamos ) como se habilita la trasmicion y como se desabilita la recepcion ( con el pin PD0) algo que muchos no toman en cuenta ., pero eso es otra historia
Como dije puede ser que este mal la definicion ., en cuanto a funcion velocidad
estuve viendo que se ha compilcado mucho al no entenderme  
Entonces pence .,  que como uso el atmega 8515-16pu ., tengo los puertos libres de A (estan al lado de los puertos E y C colocar aunque sea dos llaves mini-dips alli
el problema que tengo es que no tengo mas llaves mini_DIPS disponibles (aca en mi pueblo no se consiguen ., solo en Bs.As)
Pero buendo dejando de lado  las llaves.,  como veras tampoco me compila .,ni siquiera copiando textualmemte lo  que diseñaste
si le prestas atencion ., a la compilacion que hice esta todo declarado ., igual asi maraca error ., no sera que la funcion velocidad tendria que tener un INIT aparte
como no se ASM ., no me doy cuenta ., si influye algo mas .,  de la compilacion original
en cuanto al autor aca hay un video de lo que hace
http://www.noisepop.de/led-forum/RGB-Fader/Rainbow-Fader-3.mov hola
Gracias stk500, yo me imaginaba algo asi. Ya que en fin era recibir un dato y hacer algo con ese dato. Sea cual sea el protocolo eso no cambiaba.
No tenia claro como es que se enviaba.
Por cierto aca el AN
http://ww1.microchip.com/downloads/en/AppNotes/01076A.pdf


Ya con eso me queda claro cuales son los valores de dimming. Es decir con la direccion que se le asigna al receptor este toma el byte que le corresponde de la trama (512bytes).
Ahora como es que se pueden enviar 3 valores o por ejemplo elegir el modo. Ejemplo yo quisiera elegir los 3 valores de RGB y elegir entre fading/fijo/rainbow_fading , como se discriminan los comandos ( como para cambiar el modo ) y los 3 datos de los colores?

O se envian todos en secuencia

512bytes con el comando
512bytes con  R
512bytes con  G
512bytes con  B

Asi ? y eso se repite ?

O los 512 bytes pertenece a un solo receptor y el Start Code es el que selecciona el "esclavo(receptor)" ?
bueno se envian en secuencia pero quedate tranquilo ., empieza en el 1 DmxRxField[0] , 2 DmxRxField[1] ., 3 DmxRxField[2], la informacion llega desde la consola por la USART.,  del circuito integrado y se aloja en esta variable  uint8_t DmxBuf[DMX_CHANNELS]; (
alli manejamos el valor del bufer total recibido (RAW) ., pero  estan separados  por (de un dmxchanel o otro dmxchanel ) por dos bit de para (que se ve en la trama que mostro STK500 )
tambien esta defino por la cantidad de canales que recibo de acuerdo alas funciones por esta variable  #define DMX_CHANNELS    (5 ) ., que serian en este caso R,G,B, fading y rainbow-fader
aver site aclro un poco ., en un universo de 512 canales se envia la trama des 0 a 511 ., pero en cada canal el valor maximo es 255
ejemplo : el primer canal es la direcion de inicio ., la menor que puede se es 1 (el cero se reserva para desabilitacion de recepcion ) ., a partir de alli tenemos nuestros 5 canales que son los que manejamos  
si tuvieramos otro equipo en la serie(dentro del mismo universo de 512) se tendria que colocar la direccion de inicio en 6 y luego vendrian los 5 canales que se usan y asi susesivamente
Pero quedate tranquilo ., que con eso no estamos trabajando ., lo que hice fue enparejar los comandos para que funcionen en las dos maneras (o al menos el intento  d hacerlo)
la verdad que si funciona lo vamos a saber en lo fisico., cuando lo pueda probar
« Última modificación: 25 de Agosto de 2015, 16:54:05 por locodelafonola »
yo solo se que ...nose nada

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #28 en: 25 de Agosto de 2015, 16:17:51 »
Hola KillerJC,
Las mesas de luces DMX512 algunas llevan muchos parametros para tu asignar a cada canal diferente comandos o individual o en grupos,
por ejemplo, luz que caminan, Flashig,Strobos, secuenciales y un sin fin, para implementar todos esos necesitas de un micro que tenga muchas RAM y claro EEprom para almacenar los parametros.
lo unico que he hecho yo como mesa de luces fue muy simple, usando el ADC de un Atmega8
mira aqui
http://www.todopic.com.ar/foros/index.php?topic=37357.0
eso me llevo muchos meses de trabajos y investigacion ya que nunca lo habia hechos.
para que tenga mas ideas de todos lo que te digo mira esta
estos esta hechos con el programa Madrix.
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Invertir pwm en Atmega 8515 asembler
« Respuesta #29 en: 25 de Agosto de 2015, 16:36:16 »
Bueno para solucionar todo esto..

locodelafonola

Explicame exactamente que necesitas que haga el programa. El efecto de fading esta. Ahora hay que unirlo al DMX, por eso necesito que me expliques como queres hacerlo.

Nombreame uno por uno los parametros que llegan, ejemplo:

DmxRxField[0] -> Modo, de 0 a 120 fijo, de 121 a 255 fading
DmxRxField[1] -> Color R
DmxRxField[2] -> Color G
......

Se que son 512 pero no creo que uses 512 para esto al menos por ahora.