Muchas gracias, la q verdad es q sí que sirve. Y la verdad es que lo había hecho yo ya, pero te lo agradezco igualmente. Mi problema es cuando quiero usar una variable definida en main como variable global en una función del archivo .h. Dirás que lo pase como parámetro, pero mi problema es q esa variable cambia en una rutina de interrupción que está en el archivo principal (.c) y la función q está en el .h debe ser capaz de usarla. Si pongo la rutina de interrupción en el .h funcionará? Y si quiero tener varios archivos .h (es un programa bastante largo y debo tenrlo ordenado para presentarlo) basta con que lo ponga la rutina de interrupción en uno, o tiene q estar en el .c? Espero haberme explicado más o menos. Te pongo el código (q es más largo todavía de lo q aparece aqui), aunq lo único q sirve para mi pregunta del main.c es la rutina de interrupción de Timer.
/* ARCHIVO MAIN.C*/
#include <18F452.h>
#include <string.h>
#include <stdlib.h>
#include <on_off.h>
#fuses HS,NOCPD,NOCPB,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOSTVREN,NOEBTR,NOEBTRB,NOWRTB,NOWRTC,NOWRTD
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
//int seno[64][9]={{1,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1},{1,0,0,1,1,0,0,1,0},{1,0,1,0,0,1,0,1,1},{1,0,1,1,0,0,0,1,1},{1,0,1,1,1,1,0,1,0},{1,1,0,0,1,0,0,0,0},{1,1,0,1,0,0,1,0,0},{1,1,0,1,1,0,1,1,1},{1,1,1,0,0,1,0,0,0},{1,1,1,0,1,0,1,1,1},{1,1,1,1,0,0,1,0,0},{1,1,1,1,0,1,1,1,0},{1,1,1,1,1,0,1,1,0},{1,1,1,1,1,1,1,0,0},{1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,0,1},{1,1,1,1,1,1,0,0,1},{1,1,1,1,1,0,0,1,0},{1,1,1,1,0,1,0,0,0},{1,1,1,0,1,1,1,0,0},{1,1,1,0,0,1,1,1,0},{1,1,0,1,1,1,1,1,0},{1,1,0,1,0,1,1,0,0},{1,1,0,0,1,1,0,0,1},{1,1,0,0,0,0,0,1,1},{1,0,1,1,0,1,1,0,1},{1,0,1,0,1,0,1,0,1},{1,0,0,1,1,1,1,0,1},{1,0,0,1,0,0,1,0,0},{1,0,0,0,0,1,0,1,0},{0,1,1,1,1,0,0,0,1},{0,1,1,0,1,0,1,1,1},{0,1,0,1,1,1,1,1,0},{0,1,0,1,0,0,1,1,0},{0,1,0,0,0,1,1,1,0},{0,0,1,1,1,1,0,0,0},{0,0,1,1,0,0,0,1,1},{0,0,1,0,0,1,1,1,1},{0,0,0,1,1,1,1,1,0},{0,0,0,1,0,1,1,1,0},{0,0,0,1,0,0,0,0,0},{0,0,0,0,1,0,1,0,1},{0,0,0,0,0,1,1,0,0},{0,0,0,0,0,0,1,0,1},{0,0,0,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,1,0},{0,0,0,0,1,0,0,1,0},{0,0,0,0,1,1,1,0,1},{0,0,0,1,0,1,0,1,0},{0,0,0,1,1,1,0,1,0},{0,0,1,0,0,1,0,1,1},{0,0,1,0,1,1,1,1,0},{0,0,1,1,1,0,0,1,1},{0,1,0,0,0,1,0,0,1},{0,1,0,1,0,0,0,0,0},{0,1,0,1,1,1,0,0,0},{0,1,1,0,1,0,0,0,1},{0,1,1,1,0,1,0,1,0},{1,0,0,0,0,0,1,0,0}};
long int sin[64]={256,281,305,330,353,376,397,418,436,453,468,481,492,500,506,510,511,510,506,500,492,481,468,453,436,418,397,376,353,330,305,28,255,230,206,181,158,135,114,93,75,58,43,30,19,11,5,1,0,1,5,11,19,30,43,58,75,93,114,135,158,181,206,230};
long int tri[64]={0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,271,287,303,319,335,351,367,383,399,415,431,447,463,479,495,511,495,479,463,447,431,415,399,383,367,351,335,319,303,287,271,256,240,224,208,192,176,160,144,128,112,96,80,64,48,32,16};
int tipo_s=0,opcion=1,canal=1, tiempo=0x80,n=1;
int trojo=0;
int tverde=0;
int y;
int reloj=0,cont12=0,cont64=0;
#INT_RDA
void rsis(void)
{
char string[20];
gets(string);
opcion=atol(string); //Leemos la opcion introducida
switch(opcion)
{
case 1:
printf("
1 -> Seno
2 -> Triangular
3 -> Cuadrada
0 -> Salida nula"
;
printf("
Tipo senal numero: "
;
gets(string);
tipo_s=atol(string);
output_d(tipo_s|0b10110000);
if(tipo_s>3){
printf("
Opcion incorrecta. Tipo de señal fijada: Salida nula."
;
tipo_s=0;
}
break;
case 2:
printf("
Introduzca número entre 128 y 255
Frecuencia: "
;
gets(string);
tiempo=atol(string);
if(tiempo<128||tiempo>255){
printf("
Opcion incorrecta. Tiempo fijado a 128."
;
tiempo=128;
}
break;
case 3:
printf("
Elija Canal (1, 2, 3 o 4): "
;
gets(string);
canal=atol(string);
output_d(canal|0b10100000);
if(canal>4){
printf("
Opcion incorrecta. Canal fijado a 1."
;
canal=1;
}
break;
default:
printf("
Opción incorrecta. Introduzca 1 o 2"
;
}
printf("
Que desea cambiar?"
;
printf("
1 -> Tipo de senal
2 -> Frecuencia
3 -> Canal de salida"
;
printf("
Opcion numero: "
;
}
#int_timer2 //Funcion a la que se llama periodicamente
clock_isr() { // the RTCC (timer0) overflows (255->0).
if (reloj == 0){
reloj = 1;
output_high(PIN_A3);}
else{
reloj = 0;
output_low(PIN_A3);
if(cont12<12)
cont12++;
else{
output_high(PIN_A2); //Pulso de LOADIN
output_low(PIN_A2);
cont12=0;
if(cont64==64)
cont64=0;
else
cont64+=n;
}
}
}
void retardo(int n) { // retardo de n x 100ms ; 0 <= n => 255
for (; n!=0; n--)
delay_ms(100);
}
void seno()
{
enciende(tiempo,canal);
while (input(PIN_E2)==1)
{
if(cont12<9)
{
if(bit_test(sin[cont64],8-cont12))
output_high(PIN_A4); //Debe coger el dato
else
output_low(PIN_A4);
}
else
output_low(PIN_A4); //Debe coger 4 ceros. Canal 1 y para indicar que son datos
}
}
void triang()
{
enciende(tiempo,canal);
while (input(PIN_E2)==1)
{
if(cont12<9)
{
if(bit_test(tri[cont64],8-cont12))
output_high(PIN_A4); //Debe coger el dato
else
output_low(PIN_A4);
}
else{
output_low(PIN_A4); //Debe coger 4 ceros. Canal 1 y para indicar que son datos
}
}
}
void cuad()
{
int cuad=0;
int cambio=0;
enciende(tiempo,canal);
cuad=cont12;
while (input(PIN_E2)==1)
{
if(reloj==1&&cuad!=cont12)
{
if(cambio==0){
output_high(PIN_A4);
cambio=1;
}
else{
output_low(PIN_A4);
cambio=0;
}
cuad=cont12;
}
}
}
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_tris_a(0x00);
set_tris_b(0xFF);
set_tris_c(0b10111111);
set_tris_d(0x00);
set_tris_e(0b101);
output_a(0x20);
output_low(PIN_E1);
while(1)
{
y=0,cont12=0,cont64=0;
while (input(PIN_E2)==1)
{
output_low(PIN_A1);
output_high(PIN_A0);
switch(tipo_s)
{
case 1:
output_high(PIN_A0);
output_d(1);
seno(); break;
case 2:
output_high(PIN_A1);
output_d(2);
triang(); break;
case 3:
output_d(3);
cuad(); break;
case 0:
output_d(0);
output_low(PIN_A4); break;
}
}
while (input(PIN_C0)==1)
{
apaga();
output_low(PIN_A0);
output_high(PIN_A1);
if (input(PIN_C2)==0)
tipo_s=1;
if (input(PIN_C4)==0)
tipo_s=2;
if(input(PIN_C3)==0)
tipo_s=3;
if(input(PIN_C5)==0){
tipo_s=0;
}
output_d(tipo_s);
}
while(input(PIN_C1)==1)
{
apaga();
output_low(PIN_A0);
output_high(PIN_A1);
if(input(PIN_C3)==0){
if(tiempo<254)
tiempo++;
n=1;
}
if(input(PIN_C5)==0){
if(tiempo>0x40)
tiempo--;
else
n++;
}
if (input(PIN_C2)==0)
if(tiempo<245)
tiempo+=10;
if (input(PIN_C4)==0)
if(tiempo>0x80)
tiempo-=10;
output_d(canal|0b10100000); //Indicamos el canal en el display
retardo(4);
output_d(tipo_s|0b10110000);
retardo(6); //Indicamos el tipo de señal en el display
if(y==0){
printf("
Que desea cambiar?"
;
printf("
1 -> Tipo de senal
2 -> Frecuencia
3 -> Canal de salida"
;
printf("
Opcion numero: "
;
}
y=1;
}
}
}
/*ARCHIVO ON_OFF.H*/
void enciende(tiempo,canal)
{
int fin=0;
enable_interrupts(INT_TIMER2);
setup_timer_2(T2_DIV_BY_1,tiempo,1);
set_timer2(0);
cont12=0;
ouput_low(PIN_A4);
switch(canal)
{
case 1:
while(fin==0)
{
if(cont12<2) //Se deja el primer paso del contador por seguridad
output_high(PIN_A4); //1º bit a 1
else
if(cont12>1&&cont12<5)
ouput_low(PIN_A4); //3 bits a 0
else
if(cont12<7)
output_high(PIN_A4); //2 bits a 1
else
{
output_high(PIN_A2); //Pulso de LOADIN
output_low(PIN_A2);
fin=1;
cont12=0;
}
}
break;
case 2:
while(fin==0)
{
if(cont12<2) //Se deja el primer paso del contador por seguridad
output_low(PIN_A4); //1º bit a 0
else
if(cont12==2)
ouput_high(PIN_A4); //2º bit a 1
else
if(cont12>2&&cont12<5)
output_low(PIN_A4); //2 bits a 0
else
if(cont12<7)
ouput_high(PIN_A4); //2 bits a 1
else
{
output_high(PIN_A2); //Pulso de LOADIN
output_low(PIN_A2);
fin=1;
cont12=0;
}
}
break;
case 3:
while(fin==0)
{
if(cont12<3) //Se deja el primer paso del contador por seguridad
output_low(PIN_A4); //2 bits a 0
else
if(cont12=3)
ouput_high(PIN_A4); //3º bit a 1
else
if(cont12==4)
output_low(PIN_A4); //1 bit a 0
else
if(cont12<7)
ouput_high(PIN_A4); //2 bits a 1
else
{
output_high(PIN_A2); //Pulso de LOADIN
output_low(PIN_A2);
fin=1;
cont12=0;
}
}
break;
case 4:
while(fin==0)
{
if(cont12<4) //Se deja el primer paso del contador por seguridad
output_low(PIN_A4); //3 bits a 0
else
if(cont12==4)
ouput_low(PIN_A4); //4º bit a 0
else
if(cont12<7)
output_high(PIN_A4); //2 bits a 1
else
{
output_high(PIN_A2); //Pulso de LOADIN
output_low(PIN_A2);
fin=1;
cont12=0;
}
}
break;
}
}
void apaga()
{
disable_interrupts(INT_TIMER2);
cont12=0,cont64=0;
}