Secuencias de encendido de leds

Que tal queridos amigos!!!

me estoy inciando en lo que a pic se refiere, he empezado desde abajito, encendiendo un led, el preoyecto "hola mundo", encender y apagar un led con pulsador etc.. Pero en estos momentos estoy estancado con una secuencia de encendidos de led y no puedo hacer que la secuencia se mantenga encendida despues de haber presionado un pulsador.
La secuencia inicia pero se apaga al terminar (la secuencia), y yo necesito que se quede encendida como si yo estuviera presionando el boton.

Les pido de favor si me pueden ayudar en esto. ya que estoy iniciando desde cero y me gustaria aprender un poco mas de esto!!!

el codigo que tengo es el siguiente y esta hecho con pic c :

#include <16f84A.h>
#use delay (clock=4000000)
#define puerto_b
#define puerto_a


void main()
{

set_tris_b(0x00);

while (true)
{
output_b(0x00);
if (input(pin_a0)==1)
{output_high(pin_a2);
delay_ms(500);
output_low(pin_a2);
delay_ms(50);
output_b(0b00000001);
delay_ms(500);
output_b(0b00000010);
delay_ms(500);
output_b(0b00000100);
delay_ms(500);
output_b(0b00001000);
delay_ms(500);
output_b(0b00010000);
delay_ms(500);
output_b(0b00100000);
delay_ms(500);

}
}
}

de paso si encuentran algun error en el codigo me avisan y asi aprendo un poco.:D:D:D


gracias!!!!!
 
Que es lo quieres que siga haciendo la secuencia indefinidamente después de presionar el botón?
Si es eso lo que quieres ponle otro while después de la entrada del pin_a0 de esta forma cuando preciones el botón ara la secuencia indefinidamente.
algo asi:


while (true)
{
output_b(0x00);
if (input(pin_a0)==1)
{
While(true)
{
output_high(pin_a2);
delay_ms(500);
output_low(pin_a2);
delay_ms(50);
output_b(0b00000001);
delay_ms(500);
output_b(0b00000010);
delay_ms(500);
output_b(0b00000100);
delay_ms(500);
output_b(0b00001000);
delay_ms(500);
output_b(0b00010000);
delay_ms(500);
output_b(0b00100000);
delay_ms(500);
}

}
}
pero ten en cuenta que después de precionar el botón ya no terminara la secuencia hasta apagar la alimentación.
 
Saludos tengo un problema con la programación del pic16f877a ya escribi un programa que hace lo que necesito, encender unos leds en secuencias,(soy nuevo programando) pero aun no logro establecer el tiempo de espera de un segundo ya coloque dos subrutinas seguidas cargadas con .255d en un registro de propósito general pero aun así el tiempo es demasiado corto. si alguien pudiera indicarme como hacerlo se lo agradeceria.
 
Hola soma el lenguaje que utilizo es assembler y el código es el siguiente

Código:
 LIST P=16F877a
 #INCLUDE <P16F877A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
TESP     EQU 20h

 ORG 0X0000


 BCF     STATUS,RP0
 BCF     STATUS,RP0 ;ACCEDE AL BANCO 0
 CLRF    PORTA      ;INICIALIZA EL
                    ;PUERTO1


 


 BSF     STATUS,RP0 ;ACCEDE AL BANCO 1
 MOVLW   0X06      ;ESCRIBE UN 6 EN W
 MOVWF   ADCON1    ;CONFIGURA PINES 
                    ;DIGITALES

 MOVLW   0X01       ;ESCRIBE UN 1 EN W
 MOVWF   TRISA      ;CONFIGURA ENTRADAS 
                    ;Y SALIDAS
                    ;RA0 ENTRADA
                    ;RA1 A RA5 SALIDAS
 BSF     STATUS,RP0 ;ACCEDE AL BANCO 1
 MOVLW   0X00       ;ESCRIBE 0 EN W
 MOVWF   TRISB      ;TODOS LOS PINES 
                    ;SALIDA 
 BCF     STATUS,RP0 ;VUELVE AL BANCO 0
 

INICIO

 BCF     PORTA,1    ;ASEGURA OFF PIN1
 BCF     PORTA,2    ;ASEGURA OFF PIN2
 BCF     PORTA,3    ;ASEGURA OFF PIN3
 BCF     PORTA,4    ;ASEGURA OFF PIN4
 BCF     PORTA,5    ;ASEGURA OFF PIN5

 BCF     PORTB,0    ;ASEGURA OFF PIN0
 BCF     PORTB,1    ;ASEGURA OFF PIN1
 BCF     PORTB,2    ;ASEGURA OFF PIN2


 BTFSS   PORTA,0    ;PREGUNTA BIT 0 ES
                    ;1
 GOTO    INICIO     ;VA A INICIO
 MOVLW   0X02       ;ESCRIBE UN 2
 MOVWF   PORTA      ;PONE EL 2 EN 
                    ;PORTA
 CALL    UJU       ; LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X06       ;ESCRIBE UN 6 EN
 MOVWF   PORTA      ;PORTA

 CALL    UJU       ; LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0XE          ;ESCRIBE UN 14
 MOVWF   PORTA        ;EN PORTA       

 
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X1E          ;ESCRIBE UN 1E
 MOVWF   PORTA        ;EN PORTA 

 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA

 

 MOVLW   0X3E       ;ESCRIBE UN  0 EN W
 MOVWF   PORTA      ;ESCRIBE EL 0 EN 
                    ;EL PUERTO A
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW   0X01        ;ESCRIBE UN 80 HEX
 MOVWF  PORTB       ;PONE EL 1 HEX EN
                    ;PORTB

 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW   0X3          ;ESCRIBE UN 3H
 MOVWF   PORTB        ;EN PORTAB
 
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X7         ;ESCRIBE UN 7H
 MOVWF   PORTB        ;EN PORTB 
  
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW   0X3          ;ESCRIBE UN 3H
 MOVWF   PORTB        ;EN PORTAB 

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X1          ;ESCRIBE UN 1
 MOVWF   PORTB        ;EN PORTB

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X00       ;ESCRIBE UN 0 A W
 MOVWF   PORTB      ;PONE EL 0 A PORTB

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW    0X1E       ;ESCRIBE UN 1Eh 
 MOVWF   PORTA       ;ESCRIBE UN 1Eh
                     ;PORTA

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW    0XE       ;ESCRIBE UN Eh 
 MOVWF   PORTA       ;ESCRIBE UN Eh EN
                     ;PORTA
 

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW    0X6       ;ESCRIBE UN 6h 
 MOVWF   PORTA       ;ESCRIBE UN 6h EN
                     ;PORTA

 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA

 
 MOVLW    0X2       ;ESCRIBE UN 2h 
 MOVWF   PORTA       ;ESCRIBE UN 2h EN
                     ;PORTA


 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA

 MOVLW   0X00       ;ESCRIBE UN 0
 MOVWF   PORTA      ;LO MUEVE AL PUERTO A

UJU
 
 MOVLW  0XEE       ;ESCRIBE UN 255 EN W
 MOVWF TESP         ; Y LO PONE EN TESP
REP                    ;PARA DEJAR LISTO PROXIMO CALL
 DECFSZ TESP,1      ;DECREMENTA EN UNO
                    ;Y PREGUNTA SI ES 0
 GOTO REP           ;SI NO ES 0 VA A REP


 MOVLW .255
 MOVWF TESP

REP2
 DECFSZ TESP,1      ;DECREMENTA EN UNO
                    ;Y PREGUNTA SI ES 0
 GOTO REP2           ;SI NO ES 0 VA A REP
 BTFSS   PORTA,0    ;SI SI ES O PREGUNTA SI
                     ;EL BIT 0 EN PUERTO A
 GOTO INICIO
                    ;ES IGUAL A 1
 RETURN             ;RETORNA
                   
 END
 
Última edición por un moderador:
Saludos tengo un problema con la programación del pic16f877a ya escribi un programa que hace lo que necesito, encender unos leds en secuencias,(soy nuevo programando) pero aun no logro establecer el tiempo de espera de un segundo ya coloque dos subrutinas seguidas cargadas con .255d en un registro de propósito general pero aun así el tiempo es demasiado corto. si alguien pudiera indicarme como hacerlo se lo agradeceria.
Saludos gullermovasben1
Unos detalles acerca de tu código...
Para no repetir las rutinas de tu programa, puedes usar las instrucciones RRF y RLF
para ir rotando los bits de los puertos sin necesidad de tanto código.

Después de esta parte del código te hace falta un goto

CALL UJU ;LLAMA TIEMPO DE ESPERA

MOVLW 0X00 ;ESCRIBE UN 0
MOVWF PORTA ;LO MUEVE AL PUERTO A
GOTO INICIO ; <-- Ponerlo aquí

Para ahorrarte el cálculo de los tiempos de retardo, puedes usar el programa PIC DELAYER
Más conocido como PDEL, PicDel o Pic Delay.
Te dará un código como este...
Código:
;-------------------------------------------------------------
; Generado con PDEL ver SP  r 1.0  el 16/05/2012 Hs 12:09:37 a.m.
; Descripcion: Delay 1000000 ciclos
;-------------------------------------------------------------
DEMORA  movlw     .14       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------

Requerimientos   
-----------------
- Declaracion de PDel0 (registro)
- Declaracion de PDel1 (registro)
- Declaracion de PDel2 (registro)
- 1 nivel Stack

Ejemplo de uso
--------------
call DEMORA      ; Delay 1000000 ciclos (incluyen  call+return)
Este código genera un retardo de 1 segundo con un oscilador a 4MHz.

PD. Estas usando el puerto A para encender LED's, pero recuerda que RA4 es Open Drain.
En ese Bit no podrás encender un LED con cátodo a tierra, a menos que inviertas la lógica y los LED.
Te recomiendo usar otro puerto o poner un transistor
con sus respectivas resistencias para controlar el encendido del LED por RA4

Suerte y hasta luego.
 
Última edición:
Gracias sin embargo la instruccion RLF y RRF no me permite mantener encendidos los leds lo intentare con el programa para el retardo gracias de nuevo Darkbytes(y)



Gracia de igula forma Soma
 
Última edición:
hola como dice el titulo necesito hacer 3 secuencias de led con un microcontrolador pues yo tengo ya 2 secuencias lo que no puedo hacer es integrar la tercera secuencia como sabrán existen solo dos estados para electrónica digital y esos dos estado son para mi el case1 y el case2 (utilice un SWITCH)entonces si alguien pues ayudarme con este problema para integrar ese tercer estado mi profesor me había hablado de hacer una bandera (no se que significa)
GRACIAS DE ANTEMANO
esta claro que utilizo proteus para simular le dejo la programación
Código:
#include <main.h>


void main()
{
   int16 i;
   int16 a;
   int16 b;
   int16 c;
   int16 d;
   int16 e;
   int16 f;
   int16 g;
   int16 h;
   int16 j;
   set_tris_b(0x00);
   set_tris_a(0x01);
   set_tris_c(0x00);
  
   while(TRUE)
   {
      
      i=100;
      a=100;
      b=100;
      c=100;
      d=100;
      e=100;
      f=100;
      g=100;
      h=100;
      j=100;
    
    switch(input(PIN_A0),input(PIN_C0))
      {
   
   //para cambiar de secuencia
     case 0:
     output_high(PIN_C1);
      delay_ms(h);
      output_low(PIN_C1);
      delay_ms(h);
      output_high(PIN_B7);
      delay_ms(j);
      output_low(PIN_B7);
      delay_ms(j);
      output_high(PIN_C2);
      delay_ms(i);
      output_low(PIN_C2);
      delay_ms(i);
      output_high(PIN_B6);
      delay_ms(a);
      output_low(PIN_B6);
      delay_ms(a);
      output_high(PIN_B0);
      delay_ms(b);
      output_low(PIN_B0);
      delay_ms(b);
      output_high(PIN_B5);
      delay_ms(c);
      output_low(PIN_B5);
      delay_ms(c);
      output_high(PIN_B1);
      delay_ms(d);
      output_low(PIN_B1);
      delay_ms(d);
      output_high(PIN_B4);
      delay_ms(e);
      output_low(PIN_B4);
      delay_ms(e);
      output_high(PIN_B2);
      delay_ms(f);
      output_low(PIN_B2);
      delay_ms(f);
      output_high(PIN_B3);
      delay_ms(g);
      output_low(PIN_B3);
      delay_ms(g);
      break;
     
     case 1:
        output_high(PIN_C1);
      delay_ms(h);
      output_low(PIN_C1);
      delay_ms(h);
      output_high(PIN_C2);
      delay_ms(j);
      output_low(PIN_C2);
      delay_ms(j);
      
     output_high(PIN_B0);
      delay_ms(i);
      output_low(PIN_B0);
      delay_ms(i);
      output_high(PIN_B1);
      delay_ms(a);
      output_low(PIN_B1);
      delay_ms(a);
      output_high(PIN_B2);
      delay_ms(b);
      output_low(PIN_B2);
      delay_ms(b);
      output_high(PIN_B3);
      delay_ms(c);
      output_low(PIN_B3);
      delay_ms(c);
      output_high(PIN_B4);
      delay_ms(d);
      output_low(PIN_B4);
      delay_ms(d);
      output_high(PIN_B5);
      delay_ms(e);
      output_low(PIN_B5);
      delay_ms(e);
      output_high(PIN_B6);
      delay_ms(f);
      output_low(PIN_B6);
      delay_ms(f);
      output_high(PIN_B7);
      delay_ms(g);
      output_low(PIN_B7);
      delay_ms(g);
      break;
    
     
      
   }
   }

}
 
Última edición por un moderador:
hey amigo primero gracias por responder si me pudieras dar alguno indicacion o un pequeña ayuda te la agardeceria mucho
yo se que incrementrlos es con dos mas pero que estructura utilizo
GRACIAS
 
Viene siendo algo así...

Si botón = (presionado)
Contador++

Switch (Contador)
Case 1:
Secuencia1
Case 2:
Secuencia2
Case 3:
Secuencia3

Nota:
Para cambiar de secuencia tienes que esperar a que termine y así poder pasar a la otra.

Mira el ejemplo que adjunto, es sencillo pero te dará una idea de como hacerlo.

Suerte.
 

Adjuntos

  • Secuencias con Switch.rar
    10.7 KB · Visitas: 224
Última edición:
Hola a todos soy Juan José.
Tengo un secuenciador con efectos pero no se como agregarle control de velocidad con potenciómetro o con 2 botones de suma y baja. Mi correo es





Estoy usando Pic Simulator Ide.

Mi programación es esta:

Código:
TRISA.4 = 1  'Configuramos el pin 3 (PORTA.4) como entrada
TRISB = 0  'Configuramos todo el puerto B (PORTB) como salida
Symbol boton = PORTA.4  'Nombramos boton al pin 3
Dim contador As Byte  'Definimos una variable para a medida que mantengamos apretado el boton vaya incrementandose y asi seleccionar el efecto correspondiente
contador = 0  'Inicializamos el contador
empieza:  'Etiqueta para saber donde empieza el programa, aqui retornaremos una vez seleccionado el efecto
If boton = 1 Then  'Si el boton es presionado hacer lo siguiente,1(positivo) 2(negativo),boton
contador = contador + 1
If contador = 50 Then contador = 50  'El numero puede variar dependiendo de los efectos

Endif

If contador = 0 Then  '1er efecto
efecto1:

Endif

If contador = 5 Then  '2do efecto
efecto2:

Endif

If contador = 10 Then  '3er efecto
efecto3:

Endif

If contador = 15 Then  '4to efecto
efecto4:

Endif

If contador = 20 Then  '5to efecto
efecto5:

Endif

If contador = 25 Then  '6to efecto
efecto6:

Endif

If contador = 30 Then  '7to efecto
efecto7:

Endif

If contador = 35 Then  '8to efecto
efecto8:

Endif

If contador = 40 Then  ' 9to efecto
efecto9:

Endif

If contador = 45 Then 10mo efecto
efecto 10:


Endif

Goto empieza  'volvemos a empezar de nuevo el ciclo
-------------------------------------------------------------

Como ven, no están incluidos los efectos pero los tengo en block de notas,
solo hay que copiar y pegar el efecto¿?:

Si hay alguien que pueda ayudarme lo agradecería mucho.
 
Última edición por un moderador:
Hola. Soy nuevo en la programación de PIC. Necesito volver repetitiva la siguiente secuencia:
C:
#bit led=0x06.5

//#define pin_A0 2

void main(void)
{
trisa=0xff;

portb=0; // Configuración de puertos
trisb=0;
trisc=0;
portc=1;
portb=1;
cont=0;
contu=1;

for (cont=1;cont<=8;cont++)
{
   delay_ms(200);
   portb=portb<<contu;
}
}

Se prenden secuencialmente los 8 led pero quiero que quede en un bucle infinito.
¿Dónde pongo el while? Me sale error con el compilador.

Gracias.
 
Se prenden secuencialmente los 8 led pero quiero que quede en un bucle infinito.
¿Dónde pongo el while? Me sale error con el compilador.
Saludos. Lee por favor.gif
C:
#include <16F877A.h>
#use delay (CRYSTAL = 4 MHz)

#byte portb = getenv("SFR:PORTB")

void main (void)
{
    int i;
    
    set_tris_b(0x00);
    
    portb = 1;
    delay_ms(250);
    
    while (TRUE)
    {
        for(i = 1; i < 8; i++)
        {    // Desplazamiento hacia la izquierda.
            portb <<= 1;
            delay_ms(250);
        }
        
        for(i = 1; i < 8; i++)
        {    // Desplazamiento hacia la derecha.
            portb >>= 1;
            delay_ms(250);
        }
    }
}
 
En lugar del FOR
Código:
for (cont=1;cont<=8;cont++)
{
   delay_ms(200);
   portb=portb<<contu;
}

Usas un WHILE con ROTATE_LEFT (CCS)
Código:
    portb=1;
    while(1){
        delay_ms(200) ;
        rotate_left(&portb,1) ;     // o rotate_right
    }
 
Atrás
Arriba