Hola MLO
La verdad es que avazno muyy despacio, porque entre que soy bastante novato con esto de los PIC, y que el ensamblador me parece bastante lioso, no se si lo que estoy haciendo lo hago bien. He escrito algo de codigo de cara a generar los 40 KHz, pero no se si estara bien; al final tenias razon, tenia que usar el oscilador interno, el cual he visto que puede funcionar a 8MHz, entonces, de cara a generar la secuencia, se me habia ocurrido utiliza un juego de instrucciones, teniendo en cuenta lo que cada instruccion gasta en ciclos de reloj.
Intenté hacerlo en lenguaje C, pero me obligan a que sea en ensamblador; además, no sé como conseguir que la onda me dure 30seg, y dspues parar; por cierto, por mucho que he investigado, sigo sin entender lo de los chirps, asi que si me pudieses explicar un poco como va, te lo agradeceria.
En cuanto al segundo de los casos, tengo la impresión que es hacerlo con una PWM, es así???
Muchas gracias por toda la ayuda que me estás prestando!!!!!
Un saludo!!!!!
El codigo que he hecho de momento es el siguiente
include <P12F683.inc>
__CONFIG _IntRC_OSC & _WDT_OFF & _CP_OFF & _MCLRE_OFF
MOVLW b'00111010' ;GP5,GP4,GP1 inputs; GP2,GP0 outputs
MOVWF TRISIO
Main
BTFSS GPIO,5 ;Check Switch1, if closed, GOTO wave1
GOTO Wave1
BTFSS GPIO,4 ;Check Switch2, if closed, GOTO wave2
GOTO Wave2
BTFSS GPIO,1 ;Check Switch3, if closed, GOTO wave3
GOTO Wave3
GOTO Main
Timer25
MOVLW b'11000000' ;Clock 8MHz --> Fosc/4 = 2MHz --> Prescaler2--> 1MHz
MOVWF OPTION_REG ;
MOVLW 230 ;Initialising TMR0 to 230 to count 25us.
MOVWF TMR0 ;
BSF INTCON,7 ;Enabling interrupt
BSF INTCON,5 ;Enabling TMR0 interrupt
BCF INTCON,2 ;Cleaning interrupt flag
BTFSC GPIO,1 ;Checking Waveform, if 0, change to 1 and viceversa
BCF GPI0,2
BSF GPIO,2
GOTO Wave1
Hold ; generate 40kHz signal when GPIO.5 = 0;
btfsc gpio,5 ; Is data input at logic 0?
goto next ; Continue
Wave1
bsf gpio,2 ; Yes, so begin 40kHz sequence generation
btfsc gpio,5 ; 2uS
goto Hold ; 3uS
btfsc gpio,5 ; 4uS
goto Hold ; 5uS
btfsc gpio,5 ; 6uS
goto Hold ; 7uS
btfsc gpio,5 ; 8uS
goto Hold ; 9uS
btfsc gpio,5 ; 10uS
goto Hold ; 11uS
btfsc gpio,5 ; 12uS
goto Hold ; 13uS (~52% duty-cycle)
bcf gpio,2 ; 14uS turn off IR LED here
btfsc gpio,5 ; 15uS
goto Hold ; 16uS
btfsc gpio,5 ; 17uS
goto Hold ; 18uS
btfsc gpio,5 ; 19uS
goto Hold ; 20uS
btfsc gpio,5 ; 21uS
goto Hold ; 22uS
btfss gpio,5 ; 23uS If gpio,5 = 1 end sequence, else continue
goto Wave1 ; 25uS, GOTO requires 2uS, 25uS total=40kHz
goto Hold ; return & wait
END
simplemente queria saber si la parte etiquetada como Wave1 es correcta, y si esta bien diseñado (el pin 5 es el correspondiente al switch1, lo que hago es estar continuamente comparando si hay conexion directa con tierra, lo que equivaldria a un 0, y si es asi, sigo generando la secuencia de 40 KHz, pero no se si esta bien del todo; además, no sé donde meter que se ilumine el LED mientras tanto (lo tengo conectado al pin GP0), ni como considerar el factor de los 30seg)
gracias!!!!!