Autor Tema: Ayuda! Programa para encender varios led  (Leído 1389 veces)

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

Desconectado adesduende

  • PIC10
  • *
  • Mensajes: 2
Ayuda! Programa para encender varios led
« en: 03 de Marzo de 2015, 13:29:35 »
Hola amigos, soy nuevo en el foro. Se que hay temas para encender leds y mas cosas. Mi problema no radica en no saber hacerlo, sino en que no entiendo que parte del codigo esta mal por la cual no funciona un programa tan simple. Por mas vueltas que le doy no llego a la solucion. El compilador es XC8 , programado en MPLAB. el pic es el 12f683.

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h> // Librería XC8
#include <pic12f683.h>

#define _XTAL_FREQ 4000000 // Indicamos a que frecuencia de reloj esta funcionando el micro

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Detect (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode is enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

void led3(int arg);

void main() {

    TRISIObits.TRISIO0 = 0x00;// Configurado como Salida
    TRISIObits.TRISIO1 = 0x00;// Configurado como Salida
    TRISIObits.TRISIO2 = 0x00;// Configurado como Salida
    TRISIObits.TRISIO4 = 0x00;// Configurado como Salida
    TRISIObits.TRISIO5 = 0x01;// Configurado como Entrada

    GPIObits.GP0 = 0x00;//Pin desactivado
    GPIObits.GP1 = 0x00;//Pin desactivado
    GPIObits.GP2 = 0x00;//Pin desactivado
    GPIObits.GP4 = 0x00;//Pin desactivado
    GPIObits.GP5 = 0x00;//Pin desactivado


    while (1) {



        int sw = GPIObits.GP5; //declaro la varia "sw" con el valor de GP5


        led3(sw); //llamo a la funcion led3()



    }
}

void led3(int arg) {

    int A;

    switch (arg) { //cuando arg=sw


       
        case 0x01: // Sea 0x01

                GPIObits.GP0 = 0x01; // Activo el GP0 (enciende un led2)


               
                for(A=1;A<10;A++){ //Creo un bucle de 1 a 10
                   
                GPIObits.GP1 =! GPIObits.GP1; //Enciendo y apago GP1 (led1)
                __delay_ms(1000);
                }

                break;

        case 0x00: // Sea 0x00

               GPIObits.GP1 = 0x01; // Enciendo GP1 (led1)
                       
               break;
           
    }
}


Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Ayuda! Programa para encender varios led
« Respuesta #1 en: 03 de Marzo de 2015, 14:22:13 »
buenas, a ver primero te diría que actives el MCLR y lo depures, o lo simules y mires lo que realmente esta pasando en tus puertos y en tus variables, mplab x te permite hacerlo facilmente.

tambien te dire que en vez de utilizar GPIO utilices los tradicionales LAT y PORT, prueba eso y a ver que tal

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda! Programa para encender varios led
« Respuesta #2 en: 03 de Marzo de 2015, 14:45:33 »
Te olvidaste de configurar los registros ANSEL ( ya que al reset comienzan todos como digitales )

un
ANSEL = 0x00;

Y como consejo en micros de gama baja como 12f,16f cambia el estado de las salidas todas juntas:

GPIO = 0x00;

Otra cosa no se como toma esto el compilador:

GPIObits.GP1 =! GPIObits.GP1;
si igual a:
GPIObits.GP1 = !GPIObits.GP1;
o a:
GPIObits.GP1 != GPIObits.GP1;