Hola Tisco, ante todo muchas gracias por responder tan rápido.
Lo de la pwm tienes razón sale una señal muy limpia de 2,5 MHz, ya la hice pero no me vale porque necesito antes de de la señal cuadrada un pulso de comienzo que mantenga a 1 la señal durante un tiempo y luego genera la señal cuadrada y despues otra vez el pulso y asi sucesivamente. Tambien estoy intentando algo por ese lado, creando primero una señal de ciclo de trabajo del 100& y luego otra de frecuencia 2,5 MHZ y 50& de ciclo de trabajo, pero de esta manera no consigo que se repita en el tiempo. Te pongo también este código para que lo veais.
Respecto al programa de la interrupción decirte que he cambiao el bit de asignación como me has dicho, he añadido el while(1) al final del main y he introducido el writetimer también despues de comprobar el flag. Aqui te muestro como está ahora el código después de los cambios,pero ahora me genera la señal de 38 Hz ponga el valor que ponga en writeTimer1. Por más vueltas que le doy no se que puede estar mal,estoy desesperado con esto, muchas gracias,
Un saludo
Código:
#include <usart.h>
#include <p18f2580.h>
#include <p18cxxx.h>
#include <timers.h>
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>
#include <pwm.h>
#pragma config OSC =HS ,FCMEN = OFF,IESO = OFF //CONFIG1H
#pragma config PWRT = ON,BOREN =OFF ,BORV = 3 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF//CONFIG3H
#pragma config STVREN = ON,LVP = OFF,XINST = OFF,DEBUG = ON //CONFIG4L
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF//CONFIG5L
#pragma config CPB = OFF,CPD = OFF//CONFIG5H
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF//CONFIG6L
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF//CONFIG6H
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF//CONFIG7L
#pragma config EBTRB = OFF//CONFIG7H
#pragma config BBSIZ = 1024 // 1K words (2K bytes) Boot Block
volatile int tiempo;
void temporizador(void);
//
//******************************************************//
// Vector de Interrupcion
//******************************************************//
//
#pragma code interrupcion = 0X0008 // Creamos una nueva seccion de codigo a partir de la direccion 0x08.
void vectorinterrupcion (void){
_asm goto temporizador _endasm
}
#pragma code // Cerramos seccion.
// **********Rutina de Interrupcion******************
#pragma interrupt temporizador
void temporizador(void){
if (PIR1bits.TMR1IF=1){
WriteTimer1(65532);
tiempo++;
if (tiempo<6){
PORTCbits.RC2 =1;
}
else{
if (tiempo==48){
PORTCbits.RC2 =~PORTCbits.RC2;
tiempo=0;
}
else{
PORTCbits.RC2 =~PORTCbits.RC2;
}
}
WriteTimer1(65532);
PIR1bits.TMR1IF=0;
}
}
void main(void) {
TRISCbits.TRISC2 = 0; //configuramos l pin RC2 como salida.
RCONbits.IPEN=0; // Deshabilitamos Prioridades
INTCONbits.PEIE=1; // Habilitamos interrupcion de perifericos.-
INTCONbits.GIE=1; // Habilitamos interrupcion Global.
OpenTimer1( TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_OFF );
WriteTimer1(65532);
while(1);
}
///Código de las señales PWM////
void main (void)
{
TRISCbits.TRISC2 = 0; //el pin CCP1 como salida
OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
OpenPWM1(0x08); // configuramos período/frecuencia de la señal PWM a 625 KHz, ya que quiero que esté a 1 durante 1,6 us.
SetDCPWM1(
; // elegimos ciclo de trabajo de la señal PWM al 100%. es un 8.
OpenPWM1(0x01); // configuramos período/frecuencia de la señal PWM a 2,5 Mhz.
SetDCPWM1(4); //50% ciclo de trabajo
return 0;
}