Autor Tema: Como hacer corrimiento en Registro 74HC595  (Leído 2476 veces)

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Como hacer corrimiento en Registro 74HC595
« en: 19 de Diciembre de 2016, 22:50:11 »
Hola amigos programadores, quien de ustedes puede echarme una ayudadita con el tema de los registros de dezplazamiento de 8 bits 74HC595 usando un array en la memoria ram del PIC, uso CCS compiler, Les cuento lo que quiero hacer, mi idea es controlar una tira de 24 leds conectados en anodo a la salida del registro, todos los led estan conectados a VCC con resistencias independientes, el led se encendera escribiendo un cero en el bit que corresponda, ( 0 -- 24 ), aqui escribo mi codigo, para realizar hacer esta tarea...

Mi problema radica en que si los registros no los conecte correctamente,si no que los inverti aver si me explico correctamente.  El led 0 es bit 0 y el led 7 es bit 7, para el siguiente registro el bit 0 debera ser la posicion 8 del array y el led 15 la posicion 15 del array, asi trabajaria correctamente mi codigo que expongo, pero que paso aqui, que conecte el led 0 al bit 8 del registro MSB (posicion del array 7) y el led 7 al bit 0 LSB ( posicion del array 0 ) del registro, me causa un poco de confusion como arreglar esto por que para el siguiente registro la posicion 8 del array es el led 15, y entonces la posicion 15 del array es el led 8, todo esto lo he dicho si tubiesemos de frente la tira de led y contando el led 0 del lado de la izquierda y el led 7 del lado de la derecha, alguien que me pueda explicar mejor este desplzamiento de los bits, para que no tenga que espejear los datos de la memoria RAM.. o Como es que funciona esto, que me ha confundido,,   :shock:

#include <16f88.h>
#fuses   intrc_io,nowdt,nobrownout,nolvp,nocpd,noprotect
#fuses   nowrt,nodebug,nofcmen,noieso,mclr,noput
#use     delay(clock= 8mhz)

#use    fast_io(a)

#define data             pin_a0      //pin 14
#define cloc            pin_a1      //pin 11
#define strobe         pin_a2      //pin 12

int8 fila1 = 1,fila2 = 0,buffer[24];    //array con 24 pos

//cargamos todos los bits con el valor 255 y se apagaran todos los leds
void inicializa_buffer(void)
{
 int8 i;
 for(i =0; i < 24; i++)  {  buffer = 255;  }
}

//==============================================//
//==============================================//
//aqui  solo calcula y carga el valor en el timer0 para generar la interrupcion

#define tira  8
#define hertz  70
#define timer0 (256 - 1000000 / hertz / tira / 128 * (4000000 / 4000000))

#int_timer0
void timer0_isr(void)
{
 signed int8 w;
 set_timer0(timer0);                  //cargamos el valor para interrupcion
 output_low(strobe);
  for(w = 24; w >= 0;w--)  {
      if(buffer[w] & fila1)
          output_high(data);
       else
          output_low(data);
          output_low(cloc);
         output_high(cloc);
 }
 output_high(strobe);
 fila1 <<= 1;
 fila2 = fila2 + 1;
 if(fila2 >= 8)
   {
    fila2 = 0;     //variable auxiliar que cuenta los 8 bits del registro
    fila1 = 1;
   }
}

void main (void)
{
  set_tris_a(0b11111000);                             
  setup_timer_0(t0_internal | t0_div_8 | t0_8_bit); 
  enable_interrupts(int_timer0);                     
  enable_interrupts(global);                       
  set_timer0(timer0);                             
  inicializa_buffer();
 while(true)
{
  for(int8 k=0;  k<48; k++)
  {
    buffer[k] = 0;
    delay_ms(100);
    output_toggle(pin_a3);   //led indicador
    buffer[k] = ~0;
   }
  }
 }

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re:Como hacer corrimiento en Registro 74HC595
« Respuesta #1 en: 20 de Diciembre de 2016, 00:48:19 »
Yo me respondo ;) Gracias a las personas que visitaron mi tema, los registros comparten el mismo latch y el mismo clock, el problema estaba en la forma en como se envian los datos, el rpgrama funciona, todo esta bien aunque casi nunca el hardware se debe adaptar al software en esta ocacion me di por vencido y cambie el sentido de alambrado del DATA del registro y con eso se soluciona, ahora si el array en posicion cero es cero led y 24 led array 24... nos vemos y hasta la proxima....   8)  :-/