[Resuelto]Extraño problema , no se pq me hace lo que me hace
Página 1 de 1.
Extraño problema , no se pq me hace lo que me hace
Bueno, estaba yo probando lo del Timer y partiendo del ejemplo de las interrupciones puesto en el foro, hice este codigo :
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 ???
- 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 ???
Re: [Resuelto]Extraño problema , no se pq me hace lo que me hace
Me auto-respondo :
Creo que era esto
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.
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.
Temas similares
» [Resuelto]Problema con SDCC y PIKLAB
» Problema con KTechLab
» [Resuelto]Ayuda XORLW
» [Resuelto]Led y Pulsador reveldes.
» [Resuelto]Programador PICKIT2
» Problema con KTechLab
» [Resuelto]Ayuda XORLW
» [Resuelto]Led y Pulsador reveldes.
» [Resuelto]Programador PICKIT2
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|