Autor Tema: PIC 16F84. Ejercicio con leds.  (Leído 6877 veces)

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

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
PIC 16F84. Ejercicio con leds.
« en: 03 de Julio de 2019, 21:06:41 »
Hola a todos.
Tengo este ejercicio y no se como resolverlo si me podrían ayudar por favor se los agradecería.

Realizar un programa utilizando un microcontrolador (PIC 16F84) con un puerto de 8 salidas digitales, cada una conectada a un led, y otro puerto con una entrada conectada a un switch.
Al pulsar el switch se debe realizar un desplazamiento de los leds de derecha a izquierda cada 250 ms  utilizando para ello el modulo timer() y su interrupción respectiva.
Cuando se vuelve a digitalizar el switch se reanuda la secuencia.
« Última modificación: 04 de Julio de 2019, 16:31:33 por Pepunya »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #1 en: 03 de Julio de 2019, 23:36:47 »
 
Suponiendo que sabes como configurar puertos, timers e interrupciones, el planteamiento del programa es sencillo.

Pon en bucle la lectura del puerto del pulsador, o mejor vincula el puerto a una interrupción. Cuando detectes el cierre del pulsador, activa el timer ligado a la interrupción (que debes haber configurado al principio del programa para esos 100ms). En la rutina a la que salte la interrupción, lleva un contador con una variable global, para deteminar el led a encender, cuando llegues al final de la cuenta desactivas el timer y vuelves al principio.

Todo con interrupciones (dos), dejaría el main() con un simple bucle eterno vacío, ya que las funciones serían llamadas por interrupciones, tanto la que detecta el cierre del pulsador, como la que se activa con el timer cada 100ms para encender los LED.


PD: No obstante, desde la intuición que dan los años, me parece que te vas a quedar igual que estabas. Cuando alguien plantea un problema de la manera que lo has hecho, sin presentar algún código sobre el que preguntar por cosas puntuales, es porque espera que alguien le de los deberes hechos. Es como cuando los estudiantes copian en los exámenes, no se dan cuenta que la finalidad de un examen no es aprobarlo, sino demostrar que sabes, si lo apruebas con trampas cuando salgas al mundo laboral no sabrás nada.
« Última modificación: 03 de Julio de 2019, 23:42:41 por planeta9999 »

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #2 en: 04 de Julio de 2019, 01:32:15 »

Suponiendo que sabes como configurar puertos, timers e interrupciones, el planteamiento del programa es sencillo.

No, no se es la primera vez lo que veo mi carrera no es electronica, y estoy aprendiendo todo sobre la marcha.
Código: [Seleccionar]
#include <htc.h>

#define _XTAL_FREQ 1000000 //reloj del sistema de 1MHz

void interrupt timer(void)
{
PORTB = PORTB ^ 0b00110000; // invierte bits, necesario para encender y apagar los leds

//ciclosTimer=tiempo(250000microseg)/[tiempoInstruccion(4microseg)*cicloPreescales(256)]
//TMR0=(256-ciclos(244))=12
TMR0 = 12; //El timer interrumpe cada 12 incrementos.

T0IF = 0; //Flag de estado de interrupción por desborde del Timer0. (0 = El registro TMR0 no ha desbordado. 1 = El registro TMR0 ha desbordado (requiere limpiado por soft)).
}

//aca no se como seguir
void main ()
{

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #3 en: 04 de Julio de 2019, 10:54:45 »
 
Mira aquí para el timer y la interrupción:
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-temporizador.html
http://picfernalia.blogspot.com/2012/06/uso-de-temporizadores-timers.html

Y aquí para la interrupción vinculada a un puerto, para el pulsador:
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/interrupcion-cambio-de-estado-rb4-rb7.html


En cuanto tengas configurado el timer con su interrupción, el resto es muy sencillo.
« Última modificación: 04 de Julio de 2019, 11:49:03 por planeta9999 »

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #4 en: 04 de Julio de 2019, 19:41:12 »

Mira aquí para el timer y la interrupción:
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-temporizador.html
http://picfernalia.blogspot.com/2012/06/uso-de-temporizadores-timers.html

Y aquí para la interrupción vinculada a un puerto, para el pulsador:
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/interrupcion-cambio-de-estado-rb4-rb7.html


En cuanto tengas configurado el timer con su interrupción, el resto es muy sencillo.
Código: [Seleccionar]
#include <htc.h>

#define _XTAL_FREQ 1000000 //reloj del sistema de 1MHz

void interrupt timer(void)
{
PORTB = PORTB ^ 0b00110000; // invierte bits, necesario para encender y apagar los leds

//ciclosTimer=tiempo(250000microseg)/[tiempoInstruccion(4microseg)*cicloPreescales(256)]
//TMR0=(256-ciclos(244))=12
TMR0 = 12; //El timer interrumpe cada 12 incrementos.

T0IF = 0; //Flag de estado de interrupción por desborde del Timer0. (0 = El registro TMR0 no ha desbordado. 1 = El registro TMR0 ha desbordado (requiere limpiado por soft)).
}

void main ()
{
TRISB = 0b11001111;  //Config puerto B /habilita las salidas de los LED
TRISA = 0b00011; //Config puerto A /habilita como entradas los pulsadores
         
        RB8 = 1; //enciendo los 8 leds
        RB7 = 1;
RB6 = 1:
        RB5 = 1;
RB4 = 1;
        RB3 = 1;
        RB2 = 1;
        RB1 = 1;


Hola planeta gracias por esos links voy entiendo de a poco pero ahi estaria bien asi? como lo estoy planteando

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #5 en: 04 de Julio de 2019, 20:24:47 »
Que tal pepunya,

¿Cuál compilador estás usando?

elreypic.

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #6 en: 04 de Julio de 2019, 20:46:24 »
Hola bien y tu como estas?
Estoy usando el compilador C PICC y para la simulacion el ISIS (Proteus).
« Última modificación: 04 de Julio de 2019, 21:04:44 por Pepunya »

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #7 en: 05 de Julio de 2019, 04:22:14 »
Hola Pepunya, en cuanto al compilador que usar realmente no podré ayudarte demasiado con el código, yo siempre he usado XC8 por lo tanto más allá de lo que te ha puesto ya planeta no te podría indicar, lo único que no se si te lo ha mencionado una vez detectes el  botón ignóralo hasta que pasen por lo menos 50mS por aquello del antirebote… si entras en la rutina de los led y  durante ese tiempo solo haces caso a los leds y a las interrupciones del timer con eso te bastará.

Por otro lado como suelo hacer cada vez que lo leo, acostumbro a recomendar no usar Proteus como simulador o cualquier simulador por regla general porque si no es por una cosa es por la otra… pueden falsearte los resultados, por lo tanto si lo usas y ves que las luces se te encienden cada 300ms en vez de 100ms es posible que sea por el software de simulación y que tu programación sea correcta, por lo tanto siempre que puedas y tengas posibilidad mejor montar el circuito real en protoboard y si puedes mejor aun montar PCB, como estás empezando solo te dejo el comentario como consejo para que lo tengas en cuenta en un futuro ;-)

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #8 en: 05 de Julio de 2019, 09:29:54 »
sere curioso, busque "compilador C PICC" y me aparecen referencias vagas a varios compiladores, ¿que compilador estás empleando?

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #9 en: 05 de Julio de 2019, 10:32:50 »
Creo que está usando el antiguo y obsoleto compilador PICC de Hi-Tech.
Si es así podría decirnos cuál versión estás usando? Lite, Standard, Pro?

elreypic.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #10 en: 05 de Julio de 2019, 14:32:05 »
Es simple.... en ves de seguir soportando compiladores obsoletos y posibles problemas, exijan que se utilice alguno un poco mas actualizado. Si fue capaz de instalar ese compilador. No creo que tenga problemas en instalar el MPLABX y XC8

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #11 en: 05 de Julio de 2019, 16:17:21 »
Creo que está usando el antiguo y obsoleto compilador PICC de Hi-Tech.
Si es así podría decirnos cuál versión estás usando? Lite, Standard, Pro?

elreypic.
Si es ese mismo estoy usando el Hi-tech C compiler for pic10/12/16 MCUs y estoy usando la version Lite, quieres que lo comparte con un link de mega? no se si los moderadores me dejarian hacer eso, es que estoy obligada a usar ese compilador y simulador. por eso quiero resolver el problema con esa herramienta.

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #12 en: 05 de Julio de 2019, 16:18:37 »
sere curioso, busque "compilador C PICC" y me aparecen referencias vagas a varios compiladores, ¿que compilador estás empleando?
Hi-tech C compiler for pic10/12/16 MCUs y estoy usando la version Lite

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #13 en: 05 de Julio de 2019, 18:13:45 »
 
Es uno de los tantos problemas del mundo PIC, hay unos cuantos compiladores de C, y cada uno escribe las instrucciones como le da la gana, no hay unanimidad. En el mundo ARM eso no pasa, todos con GCC y además gratis.

Tendrás que buscar ejemplos de código fuente para ese compilador, e ir sacando las instrucciones básicas que necesitas para tu proyecto. Configuración y uso de los puertos de entrada/salida, configuración de un timer vinculado a una interrupción, y si quieres (parece que no te lo exigen) usar una interrupción para leer el estado del pulsador.

Busca por Google  +"Hi-Tech PICC " +"PIC16F84"  +"interrupts"  +"timer" +"source example", o algo así, y ve extrayendo de cada ejemplo lo necesario para montar tu programa. Aquí, en el foro, también creo que hay posts sobre ese compilador, con fuentes que te pueden servir, usa la opción de búsqueda.

Lo que no haría es esto que pusiste arriba.
Código: C
  1. RB8 = 1; //enciendo los 8 leds
  2.         RB7 = 1;
  3.         RB6 = 1:
  4.         RB5 = 1;
  5.         RB4 = 1;
  6.         RB3 = 1;
  7.         RB2 = 1;
  8.         RB1 = 1;

Seguro que con una sola instrucción puedes activar o desactivar los 8bit de un puerto, sin necesidad de hacerlo uno a uno. También se pueden usar operadores Bitwise de desplazamiento (>>, <<)  para ir barriendo el encendido de los LED, con una sola y única instrucción, sin necesidad de usar IF para determinar que LEDs hay que activar o desactivar.
« Última modificación: 05 de Julio de 2019, 22:08:03 por planeta9999 »

Desconectado Pepunya

  • PIC10
  • *
  • Mensajes: 7
Re:PIC 16F84. Ejercicio con leds.
« Respuesta #14 en: 05 de Julio de 2019, 22:49:17 »

Es uno de los tantos problemas del mundo PIC, hay unos cuantos compiladores de C, y cada uno escribe las instrucciones como le da la gana, no hay unanimidad. En el mundo ARM eso no pasa, todos con GCC y además gratis.

Tendrás que buscar ejemplos de código fuente para ese compilador, e ir sacando las instrucciones básicas que necesitas para tu proyecto. Configuración y uso de los puertos de entrada/salida, configuración de un timer vinculado a una interrupción, y si quieres (parece que no te lo exigen) usar una interrupción para leer el estado del pulsador.

Busca por Google  +"Hi-Tech PICC " +"PIC16F84"  +"interrupts"  +"timer" +"source example", o algo así, y ve extrayendo de cada ejemplo lo necesario para montar tu programa. Aquí, en el foro, también creo que hay posts sobre ese compilador, con fuentes que te pueden servir, usa la opción de búsqueda.

Lo que no haría es esto que pusiste arriba.
Código: C
  1. RB8 = 1; //enciendo los 8 leds
  2.         RB7 = 1;
  3.         RB6 = 1:
  4.         RB5 = 1;
  5.         RB4 = 1;
  6.         RB3 = 1;
  7.         RB2 = 1;
  8.         RB1 = 1;

Seguro que con una sola instrucción puedes activar o desactivar los 8bit de un puerto, sin necesidad de hacerlo uno a uno. También se pueden usar operadores Bitwise de desplazamiento (>>, <<)  para ir barriendo el encendido de los LED, con una sola y única instrucción, sin necesidad de usar IF para determinar que LEDs hay que activar o desactivar.
Gracias me genera mas confusion lo que dices ahora :( pero supongo que con practica entedere un poco mas estos conceptos.
Respecto a subir un link con el compilador que estoy usando se puede?porque el que estoy usando en la web no se encuentra, lo subi a mediafire y sin publicidades ni cosas molestas.