Microcontroladores PIC en Linux.
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

[Resuelto]Extraño problema , no se pq me hace lo que me hace

Ir abajo

[Resuelto]Extraño problema , no se pq me hace lo que me hace Empty Extraño problema , no se pq me hace lo que me hace

Mensaje por Zardoz Vie 25 Dic 2009 - 14:56

Bueno, estaba yo probando lo del Timer y partiendo del ejemplo de las interrupciones puesto en el foro, hice este codigo :

Código:

/* ----------------------------------------------------------------------- */
// Frecuencia de 4 Mhz
#define FREQ 4000

#include <pic12f629.h>
#include "delay.h"

/* ----------------------------------------------------------------------- */
/* Bits de configuración: Oscilador interno sin salida , Sin WathcDog, Sin timer on Power, Sin Reset, Sin BrodenOut, Sin Proteccion de codigo y de datos  */
typedef unsigned int word;
word at 0x2007 CONFIG = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _BODEN_OFF & _CP_OFF & _CPD_OFF;


unsigned char Mierda2;


// Rutina que se ejecutar cuando hay int. de TMR0//
void AtenderTmr0();

void isr() interrupt 0
{  /* rutina de servicio de interrupciones */
   if (T0IF==1)  //Fue por TMR0??
   {
      AtenderTmr0();
   }
   
   T0IF=0;      // Borro Bandera de Desborde del TMR0
   // INTF=0;// Borro Bandera de Int RBO
   TMR0=0;      // cargo valor en TMR0
   GIE=1;      // REactivo las interrupciones
}

void main()
{
   OSCCAL = 0x58; // Valor de calibracion 0x3458
   
   // Preescaler : PS0, PS1 y PS2
   // Asignacion de Preescaler a WDT o a TMR0 -> PSA
   //  1 = Prescaler -> WDT
   //  0 = Prescaler -> TIMER0
   // Que flanco aumenta TMR0 -> T0SE
   //  1 = Flanco de bajada (High to Low) en GPIO2/T0CKI
   //  0 = Flanco de subida (Low to High) en GPIO2/T0CKI
   // Fuente de reloj de TMR0 -> T0CS
   //  1 = pata GP2/T0CKI
   //  0 = Reloj interno de instrucciones (FREQ /4 )
   // Flanco que provoca la interrupcion -> INTEDG
   //  1 = Interrupcion en el flanco de subida en la pata GP2/INT
   //  0 = Interrupcion en el flanco de bajada en la pata GP2/INT
    // Pull-up activo en GPIO -> NOT_GPPU
   //  1 = GPIO pull-up desactivado
   //  0 = GPIO pullups activos por latch individuales
   
   // Descomentar para 12f675
   /*CMCON = 0b00000111;      // Pines como entrada/salida digital   
   ANSEL = 0b00000000;       // Idem */
   
   TRISIO = 1;      // Define los pines de I/O como salidas, excepto GPIO_0
   GPIO = 0;      // Pongo todas las salidas a 0
   
   // Configuracion de TMR0
   // Antes borro el WDT (precaucion indicada en el PDF del pic antes detocar el preescaler)
   _asm
         clrwdt
   _endasm;
   PS0 = 0; PS1 = 1; PS2 = 0;   // Preescaler de 8
   PSA = 0;                // Preescaler a TMR0
   T0CS = 0;               // Uso el reloj interno
   
   TMR0=0;  // cargo valor en TMR0 (durante 2 ciclos de instruccion, el TMR no va a aumentar nada)
   
   T0IE = 1; // Interrupcion por Overflow de TMR0
   // INTE = 1; // Interrupcion por cambio de estado en alguan pata de GPIO
   GIE = 1;   // ACtivar interrupciones
   
   Mierda2 = 0;
   
   while(1)
   {}

}


// Rutina que se ejecutar cuando hay int. de TMR0//
void AtenderTmr0()
{
   static unsigned char CiclosTMR0 = 0; // Aqui alamcenamos cuantos ciclos de TMR0 llevamos
         
   // GP1 lo hago cambiar de estado al ritmo de TMR0   
   /*if (GP1 == 1 )
   {
      GP1 = 0;
   }
   else
   {
      GP1 = 1;      
   } */
   
   if (Mierda2)
   {
      Mierda2 =0;
      GPIO=0b00010010;
   }else
   {
      Mierda2 =1;
      GPIO=0b00010000;
   }   
   
   
   
   if (CiclosTMR0 >= 49)
   {
      // A 4 Mhz de reloj con el preescaler a 8 , cuando el TMR0 se desborde 49 veces, habran pasado 100,352 ms
      CiclosTMR0 = 0;
      
      // GP2 lo hago cambiar de estado a aproximadamente 10 Hz
      if  (GP2 == 1)
      {
         GP2 = 0;
         
      }
      else
      {
         GP2 = 1;
         
      }
   }else
      CiclosTMR0++;
      
}

El problema esta en AtenderTmr0 . El codigo que deberia de poner GP1 en on o en off, el comentado no funciona, deja siempre GP1 en ON, como si siempre leyese GP1 como 0 .... ídem con GP2. Al final tuve que inventarme una variable para almacenar el estado y que efectivamente me haga encender y apagar GP1 ... pero el tema es que en el propio ejemplo de interrupciones, lo hicieron tal como lo tengo en el codigo comentado .... ¿¿¿ Que diablos pasa ???
Zardoz
Zardoz
Nuevo Usuario
Nuevo Usuario

Mensajes : 4
Fecha de inscripción : 19/12/2009
Edad : 40
Localización : Madrid

http://zardoz-technomage.es

Volver arriba Ir abajo

[Resuelto]Extraño problema , no se pq me hace lo que me hace Empty Re: [Resuelto]Extraño problema , no se pq me hace lo que me hace

Mensaje por Zardoz Sáb 26 Dic 2009 - 0:47

Me auto-respondo :

Creo que era esto

Código:

  /*CMCON = 0b00000111;      // Pines como entrada/salida digital 
  ANSEL = 0b00000000;      // Idem */

Que crei que en los 12F629 no hacia falta hacerlo y por lo visto si hace falta. Ahora me va perfectamente y hace exactamente lo que tiene que hacer.
Zardoz
Zardoz
Nuevo Usuario
Nuevo Usuario

Mensajes : 4
Fecha de inscripción : 19/12/2009
Edad : 40
Localización : Madrid

http://zardoz-technomage.es

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.