YO SIGO SIN QUE ME VAYA...
PERO AUNQUE SEA UN ENGORRO, POSTEO EL PROGRAMA COMPLETO, POR SI VEIS ALGO.
El programa, en si es en el que voy practicando a hacer cosas con el 16f1937., por ello en el trabajo con el LCD, y existen rutinas de RS-232 (ya probadas). y lo ultimo fue conseguir hechar andar el mtouch (que funciona).
la pega es que cuando esta sin pulsar la tecla o pulsando, quiero que en pantalla aparezca la frecuencia, pero no me va...
el resto de texto que pongo en pantalla si va.
yo el reloj lo he subido a 16mhz, por lo del touch, pero la pantalla va ok. lo que no me hace es el itoa, pues me lo deja en blanco....
saludos
/*
**********************************************************************
* PROGRAMA DE PRUEBAS *
**********************************************************************
* SOFTWARE CREADO POR J.L. LAFUENTE *
**********************************************************************
* Date INIC: 2011 *
* Date END: *
* File Version: 1.0 *
**********************************************************************
**********************************************************************
* Files required: *
* *
**********************************************************************
* Notes: *
* *
**********************************************************************
*/
//********************************************************************
//INCLUDES
//********************************************************************
#include <htc.h>
#include <pic16f1937.h>
#include <stdio.h>
#include <stdlib.h>
//#include "delayhd.h"
//#include "delay.h"
//
//********************************************************************
//PALABRAS DE CONFIGURACION
//********************************************************************
__CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_OFF);
__CONFIG( WRT_OFF & VCAPEN_OFF & PLLEN_OFF & LVP_OFF & STVREN_OFF & 0xFBFF & 0xEFFF ); // EL PEULTIMO ES EL BORV_27...Y EL ULTIMO EL DEBUG ON
__INTERRUPT();
//
//********************************************************************
//DEFINEs PRINCIPALES
//********************************************************************
#define _XTAL_FREQ 16000000
//CONFIGURACION DE LA LCD
#define LcdControlPort PORTA // Uso el puerto A para los bits de control
#define LcdRWBit 2 // El bit 2 del puerto A para RW
#define LcdRSBit 3 // El bit 3 del puerto A para RS
#define LcdENBit 1 // El bit 1 del puerto A para EN
#define LcdDataPort PORTD // Uso el puerto D para los datos
#define LcdD4 0 // Solo utilizar para protocolo de 4 Bits
//CONFIGURACION DE LA LCD
//para el puerto serie
#define PIC_CLK 16000000
#define TxPin RC6
#define RxPin RC7
#define BaudRate 9600
//para el puerto serie
//#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
//#define STROBE() ((RB0=0),(RB0 =1))
//#define STROBE2() ((RB3=0),(RB3 =1))
//
//********************************************************************
//OTROS INCLUDEs
//********************************************************************
#include <LIB_LCD.H>
#include <LIB_UART.H>
//
// CONSTANTES
char PRESSTHRESHOLD_H, PRESSTHRESHOLD_L;
char RELEASETHRESHOLD_L;
//
//variables
char PASSARG1;
char COUNT_H,COUNT_L;
char CAPCH15_H, CAPCH15_L;
unsigned short CAPCH15;
int COUNT;
int BASETIEMPO;
int FRECUENCIA;
char TEXT[10];
//
//********************************************************************
//CONFIGURACION DE PUERTOS
//********************************************************************
void INIT(void)//OSCILADOR CON OSCON Y TIMER CON OPTION_REG
{
OSCCON = 0b11111011;//OSCCON = 0b11101011; //RELOJ INTERNO
OSCTUNE = 0b00000000;
INTCON=0b00000000; //DESABILITA TODAS LAS INTERRUPCIONES
//INICIALIZACION DE VAR.
CAPCH15_H = 0;
CAPCH15_L = 0;
COUNT_L =0;
COUNT_H=0;
COUNT=0;
CAPCH15=0;
//INIC PORTA
//IOCA = 0x00; WPUA = 0x00;
PORTA = 0x00; LATA = 0x00; ANSELA = 0b00000000; TRISA = 0b00000000;
//INIC PORTB
//IOCB = 0x00;
WPUB = 0X00;
PORTB = 0x00; LATB = 0x00; ANSELB = 0x00; TRISB = 0b00000000;
//INIC PORTC
PORTC = 0x00; LATC = 0x00; TRISC = 0b10000000;
//INIC PORTD
PORTD = 0x00; LATD = 0x00; ANSELD = 0b10000000; TRISD = 0b10000000;
//CONFIGURA EL TIMER0
OPTION_REG = 0b11000101;
//CONFIGURA EL TIMER0
TMR0IE =1;
//CONFIGURA EL TIMER1
T1CON=0b11000100; //TIMER1 CONTROL REGISTER
T1GCON=0b01100001; //CONFIGURA EL GATE
//CONFIGURA EL TIMER1
//el cap sensing
//T0XCS = 0;
//TMR0CS=0;
CPSCON0=0b10001100;
CPSCON1=0b00001111;
//
TMR1GE = 1; //EL GATE
//OTROS
BASETIEMPO = 243;
}
//
//********************************************************************
//RUTINA DE INTERRUPCIONES
//********************************************************************
static void interrupt isr(void)
{
di();
if (TMR0IF==1)
{
//if (RB0 == 0) {RB0 = 1;} else {RB0 = 0;}//MARCA
if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}
if (T1GVAL == 0)
{
TMR1ON = 0; //STOP TIMER1 - NOT REALLY NECESARY
COUNT_L = TMR1L; //SAVE ITS CONTENTS
COUNT_H = TMR1H;
switch (CPSCON1) //VEMOS QUE CANAL ES EL ACTIVO
{
case 0x0F:
{
CPSCON1 = 0b00001111; //AQUI PREPARAS EL REGISTRO PARA EL SIGUIENTE CANAL PARA LA PROXIMA VEZ
if ((CAPCH15_L == 0x00) && (CAPCH15_H == 0x00))
{
//ISFIRSTTIME_15:
CAPCH15_L = TMR1L;
CAPCH15_H = TMR1H;
CAPCH15 = CAPCH15_H;
CAPCH15 = CAPCH15 << 8;
CAPCH15 = CAPCH15 | CAPCH15_L;
goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
}
else
{
//if (RB1 = 0) {RB1 = 1;__delay_us(10);RB1 = 0;} else {RB1 = 1;__delay_us(10);RB1 = 0;}
COUNT = COUNT_H;
COUNT = COUNT <<8;
COUNT = COUNT | COUNT_L;
if (COUNT < CAPCH15)
{ //AL SER MAS PEQUEÑO ACTUAMOS
RB2 = 1;
//PRESENTA EN PANTALLA
FRECUENCIA = (COUNT * BASETIEMPO);
GotoxyLcd (5,2);
itoa(TEXT,FRECUENCIA,10);
WriteStrLcd (TEXT);
__delay_ms(200);
//FIN PRESENTA EN PANTALLA
goto BUTTONCHEKEND;
}
else
{ //ES QUE ESTA NO PULSADO (RELEASE)
//CHECAMOS DE NUEVO PERO AÑADIENDO EL RELEASE THRESHOLD PARA TENER HYSTERESYS
//CAPCH15_L= COUNT_L;
// CAPCH15_H = COUNT_H;
RB2 = 0;
//PRESENTA EN PANTALLA
FRECUENCIA = (COUNT * BASETIEMPO);
GotoxyLcd (5,2);
itoa (TEXT,FRECUENCIA,10);
WriteStrLcd (TEXT);
__delay_ms(200);
//FIN PRESENTA EN PANTALLA
goto BUTTONCHEKEND;
}
}
// break;
}
//break;
// }
//aqui chequear mas canales si quieres
default://la opcion por defecto
{
}
}//fin del switch
BUTTONCHEKEND:
// TMR1ON = 1; //nota de truco de graham
TMR0 = 0xFF;
mm: if (T1GVAL == 1)
{
TMR1L=0;
TMR1H = 0;
TMR0 = 0;
TMR1ON = 1;
TMR0IF = 0;
ei();
return; //sale de la interrupción
}
else
{
// if (RB3 = 0) {RB3 = 1;__delay_us(10);RB3 = 0;} else {RB3 = 1;__delay_us(10);RB3 = 0;}
goto mm;//BUTTONCHEKEND;
}
}
else
{
goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
}
//ei();
}
else //si no es por timer0
{
TMR1L=0;
TMR1H = 0;
TMR0IF = 0;
TMR0 = 0;
TMR1ON = 1;
ei();
return;
}
}//fin de isr
//
//
void main(void)
{
INIT();
//const char * pantalla = "PRUEBAS LCD EN C";
InitLcd();
WriteStrLcd (" PRUEBAS "); // escribe en la primer linea la palabra Hola
GotoxyLcd (1,2);
WriteStrLcd ("Fr: "); // escribe en la segunda linea la palabra apuntada por la variable pantalla
//InitSoftUart();
/* Putst_s ("Hola"); // envia el string "Hola" al puerto serie
Putst_s ("\n"); // envia el salto de linea al puerto serie
Putst_s (pantalla); // envia el string apuntado por pantalla al puerto serie
*/
//CONSTANTES DE SENSIBILIDAD Y HYSTERESIS
PRESSTHRESHOLD_H = 0b00000000;
PRESSTHRESHOLD_L = 0b00010110;
RELEASETHRESHOLD_L = 0b00000101;
//
RB0 = 0;
RB1=0;
//****************************************************
//SECCION PARA PREPARAR EL T1GVAL A NUESTRO GUSTO
//QUE EMPIECE EN 1 CONTANDO
//if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//MARCA
if (T1GVAL == 0)
{
TMR0 = 0xFF;
T: if (T1GVAL == 0)
{
goto T;
}
else
{
TMR0IE = 1;
TMR0IF = 0;
TMR1L=0;
TMR1H=0;
TMR0 = 0;
TMR1ON=1;
ei();
}
}
//****************************************************
//if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//MARCA
while (1) //BUCLE INFINITO
{
//if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//MARCA
}
}