aprendiendo a programar pics

bueno, entonces, con el codigo que tengo y con las conexiones del pic entonces esto deberia funcionar... voya verficar de nuevo cual es el error. gracias.
 
Pues ya hice las pruebas y nada los leds no corren, de hecho no hacen nada como si se quedaran en estado bajo, no hara falta algo en el codigo que no este generando que estos enciendan, un use fast_io o algo por el estilo???
 
Buenas:
Estas probando el código que pusiste último? pues eso es C no Basic y es una muy mala practica usar "GOTO" o 'Labels' en C, entiendo que funcione (en direcciones cortas) pero también toma en cuenta los tremendos Bug's del CCS, es mejor que practiques más usando 'Funciones'. Ahora si lo quieres usar te recomiendo la combinación de "goto_address() y label_address( )".

Respecto al programa:
1) Cuando usas 'set_tris_' para el 16F84 se genera la instrucción 'TRIS' en asm pero este PIC no soporta esa instrucción, es mejor que lo hagas directamente para declarar entradas o salidas.
#byte TRISB = getenv("SFR:TRISB")
...
TRISB = 0;
Con eso al compilar si genera la instrucción apropiada.
Si no usas "fast_io" no hay necesidad de declarar los TRISx ya que cada vez que se usa los pines, el programa siempre modifica los TRISx (eso genera más código asm) pero si lo usas es necesario setear los TRISx ya que el programa no toca los TRISx cada ves que se usan los pines (genera menos código asm).

El resto ya es simple, fíjate en la alimentación (5V), el oscilador + capacitor, el MCLR a 5V (se recomienda usar una resistencia entre 10K y 47K), verificar que los Fuses no estén distintos en el programador, grabar y comprobar que el programa esté grabado en el PIC, etc...

Curso de programación en C para microcontroladores PIC
Programas para Pic C Compiler (Tutorial)

PD: Usas el proteus??, ahí puedes verificar tus programas antes de grabar al PIC.

Un saludo
 
Muy bien hice unos pequeños cambios para la declaracion de entradas y salidas... lo que si es que no se que hago si quito las etiquetas y los "GOTO", en que me afectara a mi programa o como sera el corrimiento de este ya que las uso para leer las entrada en los puertos para mandarlo a realizar alguna instruccion.. gracias va el codigo con los ligeros cambios.
Código:
#include <16f84a.h>

#fuses XT ,NOWDT //¿QUE ME FALTARIA PONER AQUI?????????
#use   delay(clock=4000000) 

#define   LED0   pin_B0 
#define   LED1   pin_B1
   int i=1; 
   int c=1;

   
void main()
{   

#byte    TRISB =0b0000000;    //pin de Rb se declaran como salidas.
#byte    TRISA =0b11111;        //pin de Ra se declaran como entradas

   
Inicio:  //inicio de programa

 
SECUENCIA1:  //inicio secuencia 1

      if (input_state(PIN_A0)==1){

      for(i=0; i<1; i++){

         output_high(LED0)   ; // Encender LED en salida B0. 
         delay_ms(300)      ; // Esperar 300msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0. 
         delay_ms(10)      ; // Esperar 10msegundos.
      }
      
         delay_ms(1)      ; // Esperar 1msegundos de retraso.

      for(c=0; c<1; c++){
         output_high (LED1)   ; // Encender LED en salida B1.
         delay_ms(300)      ; // Esperar 300msegundos.
         output_low(LED1)   ; // Apagar LED en salida B1.
         delay_ms(10)      ; // Esperar 10msegundos.


      }//fin de for.
if (input_state(PIN_A0)==1){ GOTO SECUENCIA1; }
      }//fin de if

      else{
         GOTO SECUENCIA2;  //pasa a la siguiente secencia

      }

SECUENCIA2:  //inicio de secuencia 2

      if (input_state(PIN_A1)==1){
      // debes hacerlo con un input_state(*pin);
      for(i=0; i<5; i++){
         output_high (LED0)   ; // Encender LED en salida B0. 
         delay_ms(50)      ; // Esperar 50msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0.
         delay_ms(50)      ; // Esperar 50msegundos.
      }   


      for(c=0; c<5; c++){
         output_high (LED1)   ; // EEncender LED en salida B1.
         delay_ms(50)      ; // Esperar 50msegundos.
         output_low(LED1)   ; // Apagar LED en salida B1.
         delay_ms(50)      ; // Esperar 50msegundos.

      }//fin de for.
if (input_state(PIN_A1)==1){ GOTO SECUENCIA2; }
      }//fin de if

      
      else{
         GOTO SECUENCIA3;  //pasa a la secuencia 3

      }

SECUENCIA3:  //inicio de secuencia 3
      if (input_state(PIN_A0)==0){
       if (input_state(PIN_A2)==1){
   

      for(c=0; c<5; c++){
         output_high (LED0)   ; // Encender LED en salida B0.
         output_high (LED1)   ; // Encender LED en salida B1. 
         delay_ms(50)      ; // Esperar 50msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0.
         output_low (LED1)   ; // Apagar LED en salida B1. 
         delay_ms(50)      ; // Esperar 50msegundos.

      }//fin de for.

         delay_ms(100)      ; // Esperar 100msegundos de retraso.

      for(i=0; i<3; i++){

         output_high (LED0)   ; // Encender LED en salida B0.
         output_high (LED1)   ; // Encender LED en salida B1. 
         delay_ms(100)      ; // Esperar 150msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0.
         output_low (LED1)   ; // Apagar LED en salida B1. 
         delay_ms(100)      ; // Esperar 150msegundos.
      }//fin de for
if (input_state(PIN_A2)==1){ GOTO SECUENCIA3;}
      }//fin de segundo if
 
}//fin de primer if y termina la sentencia 3
      
      delay_ms(10)      ; // Esperar 350msegundos que sumados al
                    // anterior me da medio segundo de retraso
      
               GOTO SECUENCIA4;  //pasa a la secuencia 4

         

SECUENCIA4:  //inicio de secuencia 4
     if (input_state(PIN_A0)==0){
      if (input_state(PIN_A3)==1){
      
      for(c=0; c<5; c++){
         output_high (LED0)   ; // Encender LED en salida B0.
        
      output_high (LED1)   ; // Encender LED en salida B1. AQUI TENGO PROBLEMAS
                        // YA QUE UNA DE ESTAS DOS SALIDAS NO SE ENCIENDEN AL
                        //SIMULARLA EN PROTEUS, QUIERO QUE SE ENCIENDAN LAS DOS AL MISMO TIEMPO 
      delay_ms(100)      ; // Esperar 100msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0.
         output_low (LED1)   ; // Apagar LED en salida B1. 
         delay_ms(100)      ; // Esperar 100msegundos.

      }//fin de for.
        if (input_state(PIN_A3)==1){ GOTO SECUENCIA4; }

       delay_ms(400)      ; // Esperar 450msegundos que sumados al
                    // anterior me da medio segundo de retraso

     
      }//fin de segundo if
      }//fin de primer if y fin de secuencia 4
       
         GOTO Inicio;  //pasa a Inicio

     
      
}// fin de void main.
 
No, vas mal.
El #byte TRISB = getenv("SFR:TRISB") es una declaración, le está diciendo al compilador que estás usando el nombre "TRISB" para escribir en ese registro, luego dentro del programa solo usas el nombre "TRISB"; es lo mismo si usas otro nombre #byte TrsPORTB = getenv("SFR:TRISB") o simplemente #byte TrsPORTB = 0x86, ahí indicas manualmente en que dirección se encuentra dicho registro que dentro del programa solo lo vas a conocer con el nombre "TrsPORTB".

Código:
#byte TrisPORTB = 0x86
#byte TrisPORTA = 0x85

void main (void){
   TrsPORTB = 0b0000000; // Al hacer esto, pone cero en la dirección 0x86 del registro que es donde se ubica el TRISB. 
...
...
}
Estudia un poco el datasheet del PIC16F84A

Te lo sugerí porque al usar set_tris_b() genera un código en ASM incompatible con ese PIC (no digo que eso es para todos).

Sobre el código más las declaraciones #byte TRISB.... para los pines, funciona bien en la simulación.
Con el tiempo intenta usar menos los label o goto...

Un saludo
 
Última edición:
Muy bien, entendido y anotado.

despues de todas las sugerencias de Pablet, ByAxel y sammaael siento que casi e llegado a terminar mi primer programa, ya lo compile, y lo grabe en el pic nada mas que pasa algo curioso que de seguro sabran cual es el problema. Al momento de hacer las pruebas con el PIC este no me da nada, sin embargo al pensar yo que podria ser alguno de los componentes perifericos al PIC desconecte los capacitores del reloj y ZAZ!!! el pic empezo a trabajar todo fenomenal , pero y los capacitores que onda.... son de 22pF cada uno...
 
Muy extraño eso de los capacitores, pero no te confíes que en una placa real ese PIC no trabaja sin el cristal + sus capacitores o un resonador de 3 patas (este no requiere capacitor). estás seguro que son de 22pf, tal vez prueba con los de 27pf.

Un saludo
 
De nuevo aqui posteando...¿A qué se debe esto que hace el pic?

Se supone que tengo el programa para cuando yo ponga 5 volts por alguna de las patitas que programé como entrada haga determinado ciclo en las salidas, pero, pasa que cuando tengo todas las entradas a tierra el pic no hace nada pero cuando desconecto la tierra en alguna de las entradas este comienza a hacer el ciclo determinado como si yo aplicase los 5 volts por esa entrada, siendo que no es asi lo unico que hago es desconectar la tierra y ya el pic comienza el ciclo. lo mismo pasa con las demas entradas.
Lo mismo si cambio la programacion para que detecte tierra por las entradas para funcionar... todas las tengo que conectar a 5 volts.

Yo lo que quiero es que indeterm¡nadamente las entradas deben de esperar los 5 volts en alguna de la entrada para hacer el ciclo correspondiente. Help me please.
 
Por lo que comprendo... estas dejando sueltas las patas que son entrada?, pues las patas que son entrada siempre deben de tener un estado de reposo.
Suponiendo que el programa hace algún proceso cuando el pin RA0 = 1, solo se debe de cerrar el interruptor y para detener/pausar/no hacer nada, solo se debe de abrir el interruptor donde RA0 = 0. Revisa la imagen...

Un saludo
 

Adjuntos

  • 1.jpg
    1.jpg
    42.4 KB · Visitas: 4
Haber si el logrado entender el circuito, osea cada una de las entradas deben de estar conectadas a una resistencia de 10k y para poner a funcionar esa entrada deberé de aplicar 5 volts. eso creo es lo que me dice el circuito....

Entonces puedo usar un switch y conforme vaya yo seleccionando este activara diferente entrada y al mismo tiempo desactivara otra, ¿No es asi?
 
Pues si quieres un '0' lógico en una entrada del PIC, lo debes de dejar solo conectado a la resistencia pull-down (conectado a GND) y cuando quieres un '1' lógico, solo accionas el interruptor que está conectado a 5V. Nunca al aire, si no el PIC hace lo que sea.

Entonces si las entradas están todas a '0' no hace nada.
Si la entrada RA0 = 1 (switch cerrado) => hace la secuencia 1;
si la entrada RA1 = 1 (switch cerrado) => hace la secuencia 2;
si RA1 y RA2 = 1 (ambos switch cerrados) => hace la secuencia 3; etc...
eso ya lo acondicionas en el programa, como quieras que responda el PIC.

PD: Si comprendes esta parte ya podemos hablar sobre el rebote (Debounce) que es un efecto que provocan las partes mecánicas del pulsador/interruptor al accionarse, haciendo que el chip haga cosas raras (depende) pero hay métodos para eliminar eso...

Un saludo
 
Última edición:
Ok ya entendi esa parte entonces es cuestion de acondicionar el programa como dices tu, luego hacer las conexiones con algun switch digamos de 4 patillas para tal caso, lo del rebote no lo habia considerado, habia leido algo asi. cuando use un switch para la seleccion de la entrada éste dispositivo puede hacer que por el efecto rebote de malas señales al pic haciendo que este tome otras entradas y no la que yo quiero, algo asi tengo en mente...

por otra parte tengo un regulador de voltaje "L7805CV" andube buscando información de como se conecta para su buen funcionamiento, encontré que se puede conectar usando la patilla de entrada conectada al lado positivo de 5V y al mismo tiempo con un capacitor que se conecta a tierra, de igual manera se hace la patilla de salida que tambien se debe de poner a un capacitor y este a tierra y pues la patilla de enmedio a tierra, lo que nadie dice es que si son capacitores de cerámica o de los electrolíticos,.

oye enserio muchas gracias por la tomarte tiempo de contestar.
 
Atrás
Arriba