Encender y apagar un led con pulsador en ccs

#1
buenas tardes:

Estoy empezando a estudiar programacion de pics en c y decidi hacer un sencillo programa para empezar, encender y apagar un led con un pulsador, lo simulo en proteus y efectivamende el led enciende pero al soltar el switch el led se queda encendido y no se apaga, aca esta el codigo por si alguien me puede por favor decir si ve algun error o alguna sugerencia ;)

PHP:
#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#use delay(clock=4000000)
#use fast_io(A)
#define LED pin_b2
void main()
{
set_tris_a(0b11111111);
set_tris_b(0b00000000);
while(true){
if(input(pin_a1)==0)
  output_low(LED);
if(input(pin_a1)==1)
  output_high(LED);
}
}
 
#2
PHP:
#include <16F877A.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )   // Reloj  de 4 MHz
#BYTE TRISB = 0x86            // TRISB en 86h.
#BYTE PORTB = 0x06            // PORTB en 06h.
#BYTE OPTION_REG = 0x81      //OPTION_REG en 81h.
void main() {
   bit_clear(OPTION_REG,7);      // Habilitación Pull-up
   bit_set(TRISB,0);            //B0 como entrada
   bit_clear(TRISB,1);         // B1 como salida
   bit_clear(PORTB,1);         // apaga LED
   while (1) {
   if (bit_test(portb,0) == 1 )  //Si RB0 es 1 apaga el LED
      bit_clear(portb,1);                        
   else
      bit_set(portb,1);         //Si RB0=0 enciende el LED
   }
}
Revisa este código.



buenas tardes:

Estoy empezando a estudiar programacion de pics en c y decidi hacer un sencillo programa para empezar, encender y apagar un led con un pulsador, lo simulo en proteus y efectivamende el led enciende pero al soltar el switch el led se queda encendido y no se apaga, aca esta el codigo por si alguien me puede por favor decir si ve algun error o alguna sugerencia ;)

PHP:
#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#use delay(clock=4000000)
#use fast_io(A)
#define LED pin_b2
void main()
{
set_tris_a(0b11111111);
set_tris_b(0b00000000);
while(true){
if(input(pin_a1)==0)
  output_low(LED);
if(input(pin_a1)==1)
  output_high(LED);
}
}
Lo simule en Proteus y esta bien, el LED esta conectado a RB2 y el pulsador esta conectado a RA1, dejas arriba el pulsador a VDC y abajo la resistencia de 10KΩ a tierra.

Saludos.
 
Última edición:
#5
una pregunta y si quisiera agregarle un retardo para que después de encendido dure unos 3 seg así ?¿?¿
 
Última edición por un moderador:
#8
hola gente del foro tengo un problemita en CCS, el programa tendria que apagar y prender un led con un pulsador pero no me funciona y no encuentro el porque, aca se los dejo haber si alguien encuentra el error, gracias

#include <16f88.h>
#FUSES XT,NOWDT
#USE delay (clock =4000000) //frecuencia del cristal 4 Mhz
#USE standard_io(A)
#USE standard_io(B)
#BYTE PORTA = 0x05
#BYTE PORTB = 0x06

void main()
{

while(TRUE)
{ if (bit_test(PORTA,0)==1) //testeo la entrada RA0 pulsador
bit_set(PORTB,0); // enciendo el led en RB0
else
bit_clear(PORTB,0); // apago el led en RB0
}

}
 
#9
Hola Amigo, bueno, simplemente el PIC no funciona o tiene funcionamiento errático?
Los fuses están correctos?. Recuerda que el pin MCLR, debe estar en alto para que funcione. Los condensadores que acompañan al Xtal, son correctos en valor?
 
Última edición:
#10
hola gente del foro tengo un problemita en CCS, el programa tendria que apagar y prender un led con un pulsador pero no me funciona y no encuentro el porque, aca se los dejo haber si alguien encuentra el error, gracias

#USE standard_io(A)
#USE standard_io(B)

...
Si bien es cierto que el CCS configura varias cosas automáticamente, como desactivar el ADC y hacer toos digitales (según el caso) y otros... no configura los registros TRISx de los puertos cuando se accede directamente por medio del registro PORTx declarados con #byte.... asi que falta: set_tris_a(1); y set_tris_b(0);.

Saludos
 
#11
gracias por las respuestas,,, bueno faltaba lo que dijo By Axel con eso ya solucione el problema,,, mi error fue pensar que usando STANDARD_IO los TRIS se configuraban automaticamente, mejor no usar nada y configurar todo ja
 
#12
:unsure:

if (bit_test(PORTA,0)==1) //testeo la entrada RA0 pulsador
{output_toggle(pin_b0); //cambia estado de led
delay_ms(200);//antirrebote}


y declara el tris XD
 
#13
if (bit_test(PORTA,0)==1) //testeo la entrada RA0 pulsador
{output_toggle(pin_b0); //cambia estado de led
delay_ms(200);//antirrebote}


y declara el tris XD
Mejor así:
Código:
#include <16f88.h>
#fuses   nobrownout
#use     delay (internal = 4MHz)

void main (void)
{
   output_low (pin_b0);
   
   while (true)
   {
      while (!input (pin_a0))
      {
         output_toggle (pin_b0);
         
      while (!input (pin_a0));
      }
   }
}
Fuses necesarios para trabajar con el oscilador interno a 4MHz.
No se declara TRIS ni ANSEL y funciona sin usar un retardo antirrebote.

Así como dices se repetirá el ciclo cada 200Ms mientras se mantenga RA0 en 1
Aquí se usa una pull-up y solo existe un ciclo aunque RA0 se mantenga en 1.

Lo interesante sería hacer una función como Button en PICBasic. :)

Saludos.
 
#14
si conozco la tecnica que mencionas,muy efectiva, puse el delay porque es lo mas "comun",
y si estaria interesante hacer una funcion(libreria) igual al button ;)
 
#15
Hola! Primer post! a ver si tengo suerte y me pueden echar una mano.
Estoy trabajando en un proyecto en base a programación en PIC y la verdad no me manejo mucho... y en la primera parte debo hacer lo siguiente:
Mediante 6 botones de activación momentánea en el puerto A, debo activar una serie de 6 LEDs a la salida en el puerto B.
La idea es que al activar el boton 1, se encienda el LED1
Si Activo el botón 2, se desactiva el LED 1 y se activa el LED 2
Si Activo cualquier otro botón.. por ejemplo el 5, se desactiva el Led encendido anteriormente y se activa el LED 5.
Este es el código que estoy usando

Código:
#include <16f877A.h>
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)

void main(){
int SwitchA, SwitchB, SwitchC,SwitchD,SwitchE,SwitchF,a,b,c,d,e,f;
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
SwitchA=input(PIN_A0);
SwitchB=input(PIN_A1);
SwitchC=input(PIN_A2);
SwitchD=input(PIN_A3);
SwitchE=input(PIN_A4);
SwitchF=input(PIN_A5);
for(;;){

if (SwitchA==1){
a=1;
b=0;
c=0;
d=0;
e=0;
f=0;
while(a){
output_high(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchB==1){
a=0;
b=1;
c=0;
d=0;
e=0;
f=0;
while(b){
output_high(PIN_B1)&&output_low(PIN_B0)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchC==1){
a=0;
b=0;
c=1;
d=0;
e=0;
f=0;
while(c){
output_high(PIN_B2)&&output_low(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchD==1){
a=0;
b=0;
c=0;
d=1;
e=0;
f=0;
while(d){
output_high(PIN_B3)&&output_low(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B4)&&output_low(PIN_B5);
}
}
if (SwitchE==1){
a=0;
b=0;
c=0;
d=0;
e=1;
f=0;
while(e){
output_high(PIN_B4)&&output_low(PIN_B0)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B5);
}
}
if (SwitchF==1){
a=0;
b=0;
c=0;
d=0;
e=0;
f=1;
while(f){
output_high(PIN_B5)&&output_low(PIN_B1)&&output_low(PIN_B2)&&output_low(PIN_B3)&&output_low(PIN_B4)&&output_low(PIN_B0);
}
}
}
}
cuando echo a correr el simulador debo dejar presionado el boton... darle al MCLR y enciende el LEd.... pero no es la idea..
lo hice con if-else... pero no logro dejar enclavada la luz... Cualquier ayuda bienvenida!
saludos
 

Adjuntos

Última edición por un moderador:
#16
te estas complicando la vida

tan facil que es puerto A = B
no?

usa el index del CCS y veras que dice lo siguiente del input

data = input_b();

y tenemos de la salida

output_b (value);

entonces hacemos esto

while(1);
{
output_b (input_a());

//retardo de unos cuantos mili segundos
delay_ms(100);
}
 
#17
Buenas tardes,soy nuevo en esto de programar pic y tengo un gran problema en un programa. Que se donde está pero no logro resolverlo.
Yo necesito que apretando un pulsador se prenda un led(lo mismo con dos leds distintos) y presionando de vuelta se apague.
Hasta ahi todo bien, pero cuando le agrego un pulsador más, hace una secuencia y se prende el primero, luego el segundo y para apagar el primero tiene que estar prendido el segundo led.

Adjunto el programa en CCS y simulación en proteus.

Agradeceria cualquier recomendación. ...
 

Adjuntos

#18
Buenas tardes,soy nuevo en esto de programar pic y tengo un gran problema en un programa. Que se donde está pero no logro resolverlo.
Yo necesito que apretando un pulsador se prenda un led(lo mismo con dos leds distintos) y presionando de vuelta se apague.
Hasta ahi todo bien, pero cuando le agrego un pulsador más, hace una secuencia y se prende el primero, luego el segundo y para apagar el primero tiene que estar prendido el segundo led.

Adjunto el programa en CCS y simulación en proteus.

Agradeceria cualquier recomendación. ...
Buenas
EL error que veo es en tu simulación, no estas poniendo las resistencias Pull_up a tus botones, tambien es innecesario leer los pines del puerto B.
Prueba con este codigo:
Código:
#include <16f628a.h>
#fuses XT                                    
#fuses PUT                                 
#fuses BROWNOUT                  
#use standard_io(a)
#use delay(clock=4000000)   

void main()
{
set_tris_a(1111);
set_tris_b(00000000);
output_b(0x00);

while (true){ 

if(input(pin_A0)==0){ //presionando boton//  
output_toggle(pin_b0);
while(input(pin_A0)==0);}


if(input(pin_A1)==0){//presionando boton//
output_toggle(pin_b1);
while(input(pin_A1)==0);} 

}
}