Problema en codigo CCS PIC 16F84A

#1
Hola a todos, soy nuevo en programacion de micros con CCS, y tengo el siguiente problema, hice un codigo para encender una serie de de 4 led a traves del puerto B del pic 16F84. Al hacerlo manualmente con OUTPUT_HIGH(PIN_xx) para cada secuencia no hay problemas, pero al querer hacerlo mas automatizado, creando un registro de 8 bit y ponerlo en el puerto B, no me funciona bien, no me prenden los led como dice el codigo. Alguien podria ayudarme e indicarme que estoy haciendo mal? copio el codigo en CCS:

Código:
#include "C:\Program Files\PICC\Examples\Proyectos\led1.h"
#byte port_a = 0x05
#byte port_b = 0x06
#byte set_tris_a = 0x85
#byte set_tris_b = 0x86
#byte dato1 = 0x0C
#byte dato2 = 0x0F
#byte dato3 = 0x10
#byte dato4 = 0x11

void main()
{
set_tris_a=0b00000000;
set_tris_b=0b00000000;
dato1=0b10000000;
dato2=0b01000000;
dato3=0b00100000;
dato4=0b00010000;
while(true){
port_b=dato1;
delay_ms(200);
port_b=dato2;
delay_ms(200);
port_b=dato3;
delay_ms(200);
port_b=dato4;
delay_ms(200);
}
}

Codigo con el cual me funciona perfecto:

Código:
#include "C:\Program Files\PICC\Examples\Proyectos\led1.h"
#byte port_a = 0x05
#byte port_b = 0x06
#byte set_tris_a = 0x85
#byte set_tris_b = 0x86
#byte dato1 = 0x0C
#byte dato2 = 0x0F
#byte dato3 = 0x10
#byte dato4 = 0x11

void main()
{
set_tris_a=0b00000000;
set_tris_b=0b00000000;
dato1=0b10000000;
dato2=0b01000000;
dato3=0b00100000;
dato4=0b00010000;
while(true){
output_high(PIN_B7);
output_low(PIN_B6);
output_low(PIN_B5);
output_low(PIN_B4);
output_low(PIN_B3);
output_low(PIN_B2);
output_low(PIN_B1);
output_low(PIN_B0);
delay_ms(200);
output_low(PIN_B7);
output_high(PIN_B6);
output_low(PIN_B5);
output_low(PIN_B4);
output_low(PIN_B3);
output_low(PIN_B2);
output_low(PIN_B1);
output_low(PIN_B0);
delay_ms(200);
output_low(PIN_B7);
output_low(PIN_B6);
output_high(PIN_B5);
output_low(PIN_B4);
output_low(PIN_B3);
output_low(PIN_B2);
output_low(PIN_B1);
output_low(PIN_B0);
delay_ms(200);
output_low(PIN_B7);
output_low(PIN_B6);
output_low(PIN_B5);
output_high(PIN_B4);
output_low(PIN_B3);
output_low(PIN_B2);
output_low(PIN_B1);
output_low(PIN_B0);
delay_ms(200);
}
}
 
Última edición por un moderador:
#4
el problema no es c, es no saber usarlo correctamente :LOL: o por lo menos desde mi punto de vista.
si pruebas a poner en vez de:
port_b=dato1
OUTPUT_B(dato1);
y una pregunta... por que les pones valor cuando los defines, y luego otro viaje valor? o has copiado algun programa sin saber muy bien como funciona?
 
#5
Gracias por su ayuda!!! voy a probar si me funciona. El programa lo hice yo investigando y leyendo, en CCS, tutoriales y ejemplos en la web.
 
#6
Al montarlo en el protoboard no me funciona.
Una ayuda. ¿Cual es la razón?
Código:
/*
Este programa  permite controlar 4 leds con 4 pulsadores
*/
#include <16f84a.h>
#use delay (clock=4M)
#fuses xt,nowdt

//#include <stdio.h>
//#byte pa=0x05
#byte pa=0x05
#byte pb=0x06

/*
int push=pin_b4; 
int pusha=pin_b5; 
int pushb=pin_b6; 
int pushc=pin_b7; 
*/


void main(){

int estado=0;
int estadoa=0; 
int estadob=0; 
int estadoc=0; 
int salida=0; 
int salidaa=0; 
int salidab=0; 
int salidac=0; 
int estadoant=0; 
int estadoanta=0; 
int estadoantb=0; 
int estadoantc=0;

 set_tris_a(0b00000);
 output_a(0b00000);
 
 set_tris_b(0b11111111);
 output_b(0b00000000);
 
 while(true){
 
 estado=input(pin_b4);
 estadoa=input(pin_b5);
 estadob=input(pin_b6);
 estadoc=input(pin_b7);

 if((estado==0)&&(estadoant==1)) {   //1 //Operador logico AND(&&;
    salida=1-salida;   //1                      //HIGH=1 y LOW=0
    delay_ms(20); 
  }
    estadoant=estado;  //0

  if((estadoa==0)&&(estadoanta==1)) {  //1 0
    salidaa=1-salidaa;  //1
    delay_ms(20);                              //Espera de 20ms para evitar el efecto rebote del pulsador
  }
  estadoanta=estadoa;  //1

  if((estadob==0)&&(estadoantb==1)) {  //1 0
    salidab=1-salidab;  //1
    delay_ms(20);                              //Espera de 20ms para evitar el efecto rebote del pulsador
  }
  estadoantb=estadob;  //1

  if((estadoc==0)&&(estadoantc==1)) {  //1 0
    salidac=1-salidac;  //1
    delay_ms(20);                              //Espera de 20ms para evitar el efecto rebote del pulsador
  }
  estadoantc=estadoc;  //1
  
    if((salida==0)&&(salidaa==0)&&(salidab==0)&&(salidac==0)){  //1
    output_low(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
  
    if((salida==0)&&(salidaa==0)&&(salidab==0)&&(salidac==1)){  //2
    output_low(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==0)&&(salidaa==0)&&(salidab==1)&&(salidac==0)){  //3
    output_low(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==0)&&(salidaa==0)&&(salidab==1)&&(salidac==1)){  //4
    output_low(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==0)&&(salidaa==1)&&(salidab==0)&&(salidac==0)){  //5
    output_low(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==0)&&(salidaa==1)&&(salidab==0)&&(salidac==1)){  //6
    output_low(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==0)&&(salidaa==1)&&(salidab==1)&&(salidac==0)){  //7
    output_low(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==0)&&(salidaa==1)&&(salidab==1)&&(salidac==1)){  //8
    output_low(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==0)&&(salidab==0)&&(salidac==0)){  //9
    output_high(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==0)&&(salidab==0)&&(salidac==1)){  //10
    output_high(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==0)&&(salidab==1)&&(salidac==0)){  //11
    output_high(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==0)&&(salidab==1)&&(salidac==1)){  //12
    output_high(PIN_a0);
    delay_ms(10);
    output_low(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==1)&&(salidab==0)&&(salidac==0)){  //13
    output_high(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==1)&&(salidab==0)&&(salidac==1)){  //14
    output_high(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_low(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
    }
    if((salida==1)&&(salidaa==1)&&(salidab==1)&&(salidac==0)){  //15
    output_high(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_low(PIN_a3);
    delay_ms(10);
  }
    
    if((salida==1)&&(salidaa==1)&&(salidab==1)&&(salidac==1)){  //16
    output_high(PIN_a0);
    delay_ms(10);
    output_high(PIN_a1);
    delay_ms(10);
    output_high(PIN_a2);
    delay_ms(10);
    output_high(PIN_a3);
    delay_ms(10);
  }
  }
 
#7
Al montarlo en el protoboard no me funciona.
Una ayuda. ¿Cual es la razón?
Seguramente no colocaste resistencias pull-up en el los pines RB7<>RB4
Te convendría utilizar las resistencias internas del puerto B.

Mira este programa, es similar a lo que estás haciendo, pero más sencillo.
Este programa utiliza las resistencias pull-up internas del puerto B.
PHP:
#include <16f84a.h>
#use     delay(crystal = 4MHz)
#use     fast_io(a)

void main (void)
{
   port_b_pullups(true);
   set_tris_a(0xF0);             // RA3<>RA0 como salidas.
   output_a(0x00);               // Pines de salida en 0
   
   while (true)
   {
      if(!input(pin_b7))         // Si RB7 = 0...
      {
         output_toggle(pin_a3);  // Cambia de estado RA3
         while(!input(pin_b7));  // Esperar a que se suelte el pulsador.
      }
      
      if(!input(pin_b6))         // Se repite, pero con los otros pines...
      {
         output_toggle(pin_a2);
         while(!input(pin_b6));
      }
      
      if(!input(pin_b5))
      {
         output_toggle(pin_a1);
         while(!input(pin_b5));
      }
      
      if(!input(pin_b4))
      {
         output_toggle(pin_a0);
         while(!input(pin_b4));
      }
   }
}
Este es el esquema: 16F84A 4 Toggle LED's.jpg
 
Arriba