Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

09/12/2011 #1

Avatar de johanfer12

Encender y apagar un led con pulsador en ccs
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

Código 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);
}

09/12/2011 #2

Avatar de gcgiron

Código 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) == )  //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.

---------- Actualizado después de 16 minutos ----------

johanfer12 dijo: Ver Mensaje
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

Código 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.
10/12/2011 #3

Avatar de johanfer12

Si, el error estaba en mi montaje en proteus, muchas gracias por la ayuda
10/12/2011 #4

Avatar de gcgiron

johanfer12 dijo: Ver Mensaje
Si, el error estaba en mi montaje en proteus, muchas gracias por la ayuda
Para eso estamos para servirnos y ayudarnos mutuamente.
02/09/2012 #5


una pregunta y si quisiera agregarle un retardo para que después de encendido dure unos 3 seg así ?¿?¿
02/09/2012 #6

Avatar de electroconico

usa delay_ms(3000);

el valor es equivalente a milisegundos!
05/09/2012 #7


gracias por la respuesta me fue muy util
17/04/2014 #8

Avatar de ilcapo

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
}

}
17/04/2014 #9

Avatar de Gudino Roberto duberlin

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?
17/04/2014 #10

Avatar de ByAxel

ilcapo dijo: Ver Mensaje
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
17/04/2014 #11

Avatar de ilcapo

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
17/04/2014 #12

Avatar de papirrin



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
17/04/2014 #13
Moderador

Avatar de D@rkbytes

papirrin dijo: Ver Mensaje
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.
17/04/2014 #14

Avatar de papirrin

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
16/10/2014 #15


Controlar encendido de Leds mediante botones
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
Imágenes Adjuntas
Tipo de Archivo: jpg PROTEUSCONTROLLEDS.jpg (52,3 KB (Kilobytes), 52 visitas)
16/10/2014 #16

Avatar de TRILO-BYTE

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);
}
08/08/2016 #17


Encender y apagar un led con pulsador en ccs
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. ...
Archivos Adjuntos
Tipo de Archivo: rar Nueva carpeta (2).rar (49,0 KB (Kilobytes), 24 visitas)
08/08/2016 #18

Avatar de roberttorres

manuleaniz dijo: Ver Mensaje
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);} 

}
}
08/08/2016 #19


Hola roberttorres, gracias por responder, me hace exactamente la misma secuencia
08/08/2016 #20

Avatar de roberttorres

manuleaniz dijo: Ver Mensaje
Hola roberttorres, gracias por responder, me hace exactamente la misma secuencia
Eso pasa porque no estas poniendo la resistencia Pull_up en tu simulación:
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.