Académique Documents
Professionnel Documents
Culture Documents
Onda cuadrada
simtrica mediante INTRTCC
C.- Implementacin en C:
anterior.
#int_rtcc
void handle_rtcc_int(){
/////////////////////////////////////////////////////////////////////////////////////
//
// generando_un_pulso_5_intrtcc.c
//
// SERIE: "Tcnicas en C" para el Foro TODOPIC
//
// (c) 10.2006 by RedPic
//
// Propsito: Generar un pulso de 2 Khz (0.5 ms de periodo)
//
// Tcnica Empleada: Habilitar INTRTC para conmutar un PIN cada
semiperiodo
//
////////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>
#fuses
HS,MCLR,CCP2B3,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPB
ADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
////////////////////////////////////////////////////////////////////////////////////
//
// Defines y Constantes
//
////////////////////////////////////////////////////////////////////////////////////
#define LED PIN_E0 // Defino el Pin del Led
#define OUT PIN_B3
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupcin por Externa por Cambio de Flanco en RB0
//
////////////////////////////////////////////////////////////////////////////////////
#int_rtcc
void handle_rtcc_int(){
Output_Toggle(OUT); // Conmuto PIN de Salida;
Set_timer0(177);
Output_Toggle(LED); // Conmuto PIN de Led;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Main
//
////////////////////////////////////////////////////////////////////////////////////
void main() {
} while (TRUE);
C.- Implementacin en C:
setup_ccp2(CCP_COMPARE_SET_ON_MATCH); // Configura
CCP2 en modo COMPARE cambiando a Alto
enable_interrupts(int_ccp2);
// Habilito la interrpcin
INT_CCP2
enable_interrupts(global);
// Habilito las
interrupciones necesarias
#int_ccp2
void handle_ccp2_int(){
if(++flagConmuta==1){
setup_ccp2(CCP_COMPARE_CLR_ON_MATCH); //
Configura CCP2 modo COMPARE cambiando a Bajo
} else{
setup_ccp2(CCP_COMPARE_SET_ON_MATCH); //
Configura CCP2 modo COMPARE cambiando a Alto
}
CCP_2=0;
// Pongo a cero el valor a
comparar ...
set_timer1(0);
// y el TMR1.
CCP_2 = 1250;
// Quiero que se dispare
cada 0.25 ms ...
// luego pongo los Ticks de
TMR1 para ese tiempo.
}
/////////////////////////////////////////////////////////////////////////////////////
//
// generando_un_pulso_6_intccp.c
//
// SERIE: "Tcnicas en C" para el Foro TODOPIC
//
// (c) 11.2006 by RedPic
//
// Propsito: Generar un pulso de 2 Khz (0.5 ms de periodo)
//
// Tcnica Empleada: Habilitar INTCCP para conmutar el PIN CCP2
cada semiperiodo
// utilizando el recurso CCP en modo compare.
//
////////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>
#fuses
HS,MCLR,CCP2B3,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPB
ADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
////////////////////////////////////////////////////////////////////////////////////
//
// Defines y Constantes
//
////////////////////////////////////////////////////////////////////////////////////
#define LED PIN_E0 // Defino el Pin del Led
#define OUT PIN_B3
////////////////////////////////////////////////////////////////////////////////////
//
// Variables en RAM
//
////////////////////////////////////////////////////////////////////////////////////
int1 flagConmuta=0;
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupcin CCP por Compare TMR1
//
////////////////////////////////////////////////////////////////////////////////////
#int_ccp2
void handle_ccp2_int(){
if(++flagConmuta==1){
setup_ccp2(CCP_COMPARE_CLR_ON_MATCH); // Configura CCP2
modo COMPARE cambiando a Bajo
} else{
setup_ccp2(CCP_COMPARE_SET_ON_MATCH); // Configura CCP2
modo COMPARE cambiando a Alto
}
CCP_2=0;
// Pongo a cero el valor a comparar ...
set_timer1(0);
// y el TMR1.
CCP_2 = 1250;
// Quiero que se dispare cada 0.25
ms ...
// luego pongo los Ticks de TMR1 para ese
tiempo.
Output_Toggle(LED);
// Monitorizo visualmente con el
PIN de Led;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Main
//
////////////////////////////////////////////////////////////////////////////////////
void main() {
////////////////////////////////////////// INICIALIZACIONES GENERALES
delay_ms(333);
// Espero a que todo se estabilice e ...
disable_interrupts(global);
// Inicializo el Micro y ...
disable_interrupts(int_timer1); // deshabilitando todo lo no
necesario ...
disable_interrupts(int_rda);
disable_interrupts(int_ext);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
delay_ms(333);
/////////////////////////////////////////// INICIALIZACIONES PERTINENTES A LA
APLICACION
setup_ccp2(CCP_COMPARE_SET_ON_MATCH); // Configura CCP2
modo COMPARE cambiando a Alto
enable_interrupts(int_ccp2);
// Habilito la interrpcin INT_CCP2
enable_interrupts(global);
// Habilito las interrupciones
necesarias
printf("\r\nGenerando un pulso : INTCCP Compare\r\n");
printf("By Redpic para Foro TODOPIC\r\n\n");
do {
} while (TRUE);
int8 miFuncion(void){
return 100
}
void main(void){
int8 n;
}
n = miFuncion();
void main(void){
int8 n;
}
n = miFuncion();
int8 miFuncion(void){
return 100
}
int8 miFuncion(void);
void main(void){
int8 n;
}
n = miFuncion();
int8 miFuncion(void){
return 100
// Cabecera //////////////
int8 miFuncion(void);
// Fin de Cabecera ////////
// Main ///////////////////
void main(void){
int8 n;
n = miFuncion();
}
// Fin de Main ////////////
// Desarrollo /////////////
int8 miFuncion(void){
return 100
}
// Fin de Desarrollo //////
#include "Lib_utils.h"
// Main ////////////////////////
void main(void){
int8 n;
n = miFuncion();
}
// Fin de Main /////////////////
#include "lib_utils.c"
lib_utils.c
*/
int8 bits_string_to_int8(char* pF){
int8 i,j,ret=0;
for(i=0,j=7;i<8;i++,j--){
if(pF[i]=='1'){
bit_set(ret,j);
}
}
return ret;
}
/** \brief Funcin que lee el valor de un bit del byte en la posicin
dada \c pbit.
*
* Lee un Bit en la posicin \c pbit del Byte.
* \param byte_for_bits Byte contenedor de los bits.
* \param pbit Posicin en el Byte del bit a leer.
* \return bit ledo.
*/
int1 get_bit_in_byte(int8 byte_for_bits, int8 pbit){
int1 r;
r=bit_test(byte_for_bits,pbit);
return r;
}
/** \brief Funcin que guarda un bit de valor \c vbit en el Byte en la
posicin dada \c pbit.
*
* Guarda un bit de valor \c vbit en la posicin \c pbit del Byte dado.
* \param byte_for_bits Puntero al Byte contenedor de bits.
* \param vbit Valor del bit a escribir.
* \param pbit Posicin en el Byte del bit a escribir.
* \return byte con el bit cambiado.
*/
int8 set_bit_in_byte(int8 byte_for_bits, int1 vbit, int8 pbit){
bit_clear(byte_for_bits,pbit);
if(vbit==1) bit_set(byte_for_bits,pbit);
return byte_for_bits;
}
/** \brief Funcin que rellena con un caracter dado un string a partir
de NULL hasta una longitud dada.
*
* \param c Carcter de relleno.
* \param maxlen Longitud mxima del string.
* \param[out] pF Puntero a string_null_ended a rellenar.
*
* \return void
*/
void fill_end_with_char(char c, int8 maxlen,char* pF){
int8 i;
int1 start=0;
for(i=0;i<maxlen;i++){
if(start==0){
if(pF[i]=='\0'){
start=1;
}
}
if(start==1){
pf[i]=c;
}
}
pF[maxlen]='\0';
}
/** \brief Funcin que convierte un string numrico decimal ASCII
NULL-END a su valor entero (8 bits).
*
* \param pF Puntero al buffer que contiene el string numrico ASCII.
*
* \return int8 Valor numrico.
*/
int8 str_to_int8(char* pF){
int8 ret=0,i,l,m=1;
l=strlen(pF)-1;
for(i=l;i<255;i--){
if(isdigit(pF[i])){
ret+= m * (pF[i]-'0');
m = m * 10;
} else break;
}
//printf("StrToInt %s (%u)\r\n",pF,ret);
return ret;
}
/** \brief Funcin decodifica una variable TimeStamp extrayendo sus
componentes.
*
* Acepta una variable TimeStamp y devuelve valores enteros de Ao,
Mes, Da, Hora, Minuto, y Segundo.
* \param pF Puntero a string TimeStamp
* \param[out] day Dia
* \param[out] mth Mes
* \param[out] year Ao (4 dgitos, int16)
* \param[out] hr Hora
* \param[out] min Minuto
* \param[out] sec Segundo
* \see encode_timestamp()
*/
void decode_timestamp(char *pF, int8 &day, int8 &mth, int16 &year,
int8 &hr, int8 &min, int8 &sec){
char sval[]="00";
sval[2]='\0';
sval[0]=pF[2]; sval[1]=pF[3]; year= 2000+str_to_int8(sval);
sval[0]=pF[5]; sval[1]=pF[6]; mth = str_to_int8(sval);
sval[0]=pF[8]; sval[1]=pF[9]; day = str_to_int8(sval);
sval[0]=pF[11]; sval[1]=pF[12]; hr = str_to_int8(sval);
sval[0]=pF[14]; sval[1]=pF[15]; min = str_to_int8(sval);
sval[0]=pF[17]; sval[1]=pF[18]; sec = str_to_int8(sval);
}
/** \brief Funcin codifica una variable TimeStamp dando sus
componentes.
*
* Acepta variables de valores enteros de Ao, Mes, Da, Hora, Minuto,
y Segundo y devuelve puntero a variable de tipo Timestamp.
* \param[out] pF Puntero a string TimeStamp
* \param day Dia
* \param mth Mes
* \param year Ao (4 dgitos, int16)
* \param hr Hora
* \param min Minuto
* \param sec Segundo
* \see encode_timestamp()
*/
void encode_timestamp(char *pF, int8 day, int8 mth, int16 year, int8
hr, int8 min, int8 sec){
sprintf(pF,"%Lu-%2u-%2u_%2u:%2u:
%2u\0",year,mth,day,hr,min,sec);
replace_char(' ','0',pF);
replace_char('_',' ',pF);
}
/** \brief Reemplaza carcter en string null-terminated.
*
* \param c Carcter a sustituir.
* \param p Carcter nuevo a insertar.
* \param[out] pF Puntero a string null-terminated.
*
* \return void
*/
void replace_char(char c, char p, char* pF){
int8 i;
char x;
x=pF[0];
for(i=0;i<255,x!='\0';i++){
x=pf[i];
if(x==c){
pF[i]=p;
}
}
}
/** \brief Funcin que convierte un carcter Hexadecimal ASCII NULLEND a su valor entero de 8 bits.
*
* \param d Caracter Hexadecimal a convertir.
*
* \return int8 Valor numrico.
*/
int8 ascii_to_hex(char d){
int r=0x00;
if(isxdigit(d)){
if(isdigit(d)){
r=d-'0';
}
if(isalpha(d)){
d=toupper(d);
r=10+(d-'A');
}
}
return(r);
}
/** \brief Funcin que convierte un string numrico Hexadecimal
ASCII NULL-END a su valor entero de 8 bits.
*
* \param pF Puntero al buffer que contiene el string numrico ASCII
Hexadecimal de 2 digitos (00h a FFh).
*
* \return int8 Valor numrico.
*/
int8 hex_to_int8(char* pF){
int8 i,ret;
ret=0;
for(i=1;i!=255;i--){
ret+=ascii_to_hex(pF[i])*((15*(1-i))+1);
}
return ret;
}
/** \brief Funcin que convierte un string numrico Hexadecimal
ASCII NULL-END a su valor entero de 16 bits.
*
* \param pF Puntero al buffer que contiene el string numrico ASCII
Hexadecimal de 4 digitos (0000h a FFFFh).
*
* \return int16 Valor numrico.
*/
int16 hex_to_int16(char* pF){
int8 i, p2, p1;
int16 ret;
p1=hex_to_int8(&pF[2]);
p2=hex_to_int8(&pF[0]);
ret=make16(p2,p1);
//printf("hex_to_int16 recibe: %s p2: %LX p1 %LX valor: %LX
(%Lu)\r\n",pF,p2,p1,ret,ret);
return ret;
}
/** \brief Funcin que convierte un string numrico Hexadecimal
ASCII NULL-END a su valor entero de 32 bits.
*
* \param pF Puntero al buffer que contiene el string numrico ASCII.
*
* \return int32 Valor numrico.
*/
int32 hex_to_int32(char* pF){
int32 ret;
int16 p1,p2;
p1=hex_to_int16(&pF[4]);
p2=hex_to_int16(&pF[0]);
ret = make32(p2, p1);
//printf("hex_to_int32 recibe: %s p2: %LX p1 %LX valor: %LX
(%Lu)\r\n",pF,p2,p1,ret,ret);
return ret;
}
/** \brief Funcin que descarta los espacios en blanco por la derecha
de una cadena.
*
* \param[out] pF Puntero a string_null_ended a procesar.
*
* \return void
*/
void right_trim(char* pF){
int8 i,L;
for(i=0;i<255;i++){
if(pF[i]=='\0'){
L=i-1;
break;
}
}
for(i=L;i>0;i--){
if(pF[i]==' '){
pF[i]='\0';
}
else{
break;
}
}
}
/** \brief Comprueba si todos los caracteres del string NULLTerminated son imprimibles ('0'..'9','A'..'Z' ' ') y hay al menos uno.
*
* \param pF Puntero al string a investigar.
*
* \return int1 1 si todos los carcteres son vlidos, 0 en caso
contrario.
*/
int1 are_all_char_code_printable(char *pF){
int1 ret=1;
int8 i;
for(i=0;i<255;i++){
if(pF[i]=='\0'){ break;}
if(!isdigit(pF[i]) && !isupper(pF[i]) && pF[i]!=' ') ret=0;
}
if(i==0) ret=0;
return ret;
}
/** \brief Funcin que inserta un caracter en un string.
*
*/
void insert_char_in_string_in_position(char *pF, char c, int8 position,
int8 len){
int8 i;
char tmp1,tmp2;
for(i=0;i<len;i++){
if(i>position){
tmp2=pF[i];
pf[i]=tmp1;
tmp1=tmp2;
}
if(i==position){
tmp1=pF[i];
pF[i]=c;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// End of lib_utils
//
///////////////////////////////////////////////////////////////////////////////////////////////////
void main() {
printf("\r\nLibrerias de Funciones Main 1\r\n");
printf("By Redpic para Foro TODOPIC\r\n");
printf("Recibe CHAR y convierte a BINARIO\r\n\n");
recFlag=0; // Desactivo el Flag de Recepcin
enable_interrupts(int_rda); // Habilito la interrpcin
INT_RDA
enable_interrupts(global); // Habilito las interrupciones
do {
if(recFlag==1){
recFlag=0;
int8_to_bits_string(rec,respuesta);
printf("Recibido : %c En bits : %s\r\n",rec,respuesta);
}
} while (TRUE);
void main() {
printf("\r\nLibrerias de Funciones Main 2\r\n");
printf("By Redpic para Foro TODOPIC\r\n");
printf("Recibe HEX y convierte a INT8\r\n\n");
recFlag=0; // Desactivo el Flag de Recepcin
enable_interrupts(int_rda); // Habilito la interrpcin
INT_RDA
enable_interrupts(global); // Habilito las interrupciones
do {
if(recFlag==1){
recFlag=0;
tmp[1]=toupper(rec);
respuesta = hex_to_int8(tmp);
printf("Recibido HEX : %c En Decimal :
%u\r\n",rec,respuesta);
}
} while (TRUE);
}