Autor Tema: problema con sincronizacion salidas port  (Leído 1458 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado sonrie69

  • PIC10
  • *
  • Mensajes: 6
problema con sincronizacion salidas port
« en: 05 de Mayo de 2013, 13:38:57 »
hola.
estoy tendiendo un problema.
tengo un conjunto de 8 arrays de 1 y 0. lo que estoy tratando de hacer es usar output_d(); para sacar toda las salidas de las 8 arrays de la manera que esta explicada en el dibujo que agregue.
hasta ahora lo conseguí con el siguiente código:
int1 array0[16],array1[16],array2[16],array3[16],array4[16],array5[16],array6[16],array7[16];

output_bit(PIN_D0,array0[count]);
output_bit(PIN_D1,array1[count]);
output_bit(PIN_D2,array2[count]);
output_bit(PIN_D3,array3[count]);
output_bit(PIN_D4,array4[count]);
output_bit(PIN_D5,array5[count]);
output_bit(PIN_D6,array6[count]);
output_bit(PIN_D7,array7[count]);


pero cuando veo en el osciloscopio de la simulación con proteus veo que las salidas están corridas 260 us mas o menos...
usando alguna función para convertir todos los datos de las array en un binario tipo 0bXXXXXXXX  , siendo las X los valores de array0,array1,array2,array3,array4,array5,array6,array7 donde los valores de i van moviendo los datos de cada array.
o si alguien se le ocurre algún método , bienvenido sea.

gracias y espero que alguien me ayude..
saludos.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: problema con sincronizacion salidas port
« Respuesta #1 en: 05 de Mayo de 2013, 16:53:24 »
  Me parece que deberías cargar una variable con los datos que quieres y luego cargar el puerto -en este caso el D- con el valor de la variable. Así tendrías el cambio de todos los pines sincronizados
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado sonrie69

  • PIC10
  • *
  • Mensajes: 6
Re: problema con sincronizacion salidas port
« Respuesta #2 en: 05 de Mayo de 2013, 17:21:24 »
gracias AngelGris.
es lo que estaba pensando lo que me decis, pero no se como cargar la variable, para que quede en 0s y 1s..
no se mucho del tema.
estuve tratando con struct y union , pero no consegui lo que queria... trate de cargar otra array int1[8] y desp sacar esa por el port D, pero tampoco supe como hacerlo..
si alguien me puede sar una mano,, agradecidisimo..
saludos.

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: problema con sincronizacion salidas port
« Respuesta #3 en: 05 de Mayo de 2013, 19:40:15 »
Hola,

Vengo a dar un poco mi opinión sobre como mejorar el código en general. Ahora mismo estas utilizando un int1 y lo repites 16 veces haciendo una manipulación individual de cada bit. Para optimizar el código lo que yo haría seria lo siguiente:

Definir un array de 16bytes en lugar de 8 arrays de 16 bits cada uno.

Primero:
int8 array[16] = { outputd0, outputd1, outputd2, ... , outputd15 };

(outputd0 seria lo que tienes marcado en rojo en el dibujo)

Luego:
PORTD = array[count];

no se si me he explicado bien. Un saludo.
Share the world !

Blog's

http://www.area0x33.com

Desconectado sonrie69

  • PIC10
  • *
  • Mensajes: 6
Re: problema con sincronizacion salidas port
« Respuesta #4 en: 05 de Mayo de 2013, 19:56:12 »
entiendo lo que decis.. parece una mejor opcion, pero el problema que tengo es que yo tengo que ir cargando los datos en las arrays de a uno con una matriz.. yo no se como hacerlo si estan agrupadas en un byte.. no se como hacer la modificacion bit x bit....


Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con sincronizacion salidas port
« Respuesta #5 en: 06 de Mayo de 2013, 03:46:32 »
Con bit_set(array[count],x) pondrás el bit x de la variable array[count] a 1
Con bit_clear lo pondrás en 0
junto con lo que te ha explicado jim_17 podrías hacerlo,
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado sonrie69

  • PIC10
  • *
  • Mensajes: 6
Re: problema con sincronizacion salidas port
« Respuesta #6 en: 06 de Mayo de 2013, 16:00:19 »
Con bit_set(array[count],x) pondrás el bit x de la variable array[count] a 1
Con bit_clear lo pondrás en 0
junto con lo que te ha explicado jim_17 podrías hacerlo,

si pero cual de los 8 bit de esa array estaria modificando ???

ahora estoy intendando con este codigo:
#include "C:\Users\QxxxQ\Desktop\seq\programas pic\array2\main.h"
#include <stdio.h>

#BYTE TRISA = 0x85
#BYTE PORTA = 0x05
#BYTE TRISB = 0x86
#BYTE PORTB = 0x06
int8 i;
int8 read0,read1,read2,read3;
typedef union {
   struct{
   int8 b;
   };
   struct{
   int1 bits[8];
   };
 }ports[4];
 ports port;
   /*
   typedef union {
   struct {
      unsigned ALL:8;    // by calling something.ALL, you get the whole bitfield as 8-bit number
   };
   struct {
      unsigned led1:1;   // by calling something.led1 you get one bit-state (1 or 0)
      unsigned led2:1;
      unsigned led3:1;   
      unsigned led4:1;
      unsigned free:4;
   };
} something_t;
   
   */
void main()
{
    bit_set(TRISA,0);
   bit_set(TRISA,1);
   bit_set(TRISA,2);
   bit_set(TRISA,3);
   bit_clear(TRISB,0);
   bit_clear(TRISB,1);
   bit_clear(TRISB,2);
   bit_clear(TRISB,3);
 
   
 port[0].bits[0]=1;
 port[0].bits[1]=1;
 port[0].bits[2]=1;
 port[0].bits[3]=1;
 port[0].bits[4]=1;
 port[0].bits[5]=1;
 port[0].bits[6]=1;
 port[0].bits[7]=1;
 
  port[1].bits[0]=1;
 port[1].bits[1]=0;
 port[1].bits[2]=0;
 port[1].bits[3]=0;
 port[1].bits[4]=0;
 port[1].bits[5]=0;
 port[1].bits[6]=0;
 port[1].bits[7]=0;
  port[2].bits[0]=1;
 port[2].bits[1]=0;
 port[2].bits[2]=0;
 port[2].bits[3]=0;
 port[2].bits[4]=0;
 port[2].bits[5]=0;
 port[2].bits[6]=0;
 port[2].bits[7]=0;
  port[3].bits[0]=0;
 port[3].bits[1]=0;
 port[3].bits[2]=0;
 port[3].bits[3]=0;
 port[3].bits[4]=0;
 port[3].bits[5]=0;
 port[3].bits[6]=0;
 port[3].bits[7]=0;
 //int8 chan =0;
 read0=port[0].b;
 read1=port[1].b;
 read2=port[2].b;
   
 read3=port[3].b;
 while(1){
      for(i=0;i<4;i++){
    //  output_bit(PIN_B0,port_bits[chan].bits);
      output_toggle(PIN_B4);
      switch (i){
      case 0:
  //   read=port[0].b;
     output_d(read0);
     
      break;
      case 1:
   //   read=port[1].b;
     output_d(read1);
      break;
      case 2:
   //   read=port[2].b;
     output_d(read2);
      break;
      case 3:
     
     output_d(read3);
      break;
      }
      delay_ms(5);
      }
     
   
   }
   
}




pero la salida del port D todavia no sale como las arrays estan definidas..


 

anything