Generador de señal cuadrada PIC18F4550 Lenguaje Ensamblador a C

Hola que tal a todos !!!!

Tengo este codigo en Assembler, quisiera ayuda para poder traducirlo a Lenguaje C, todo esto para MPLAB IDE.

El codigo siguiente fue comentado por
JoaquinFerrero.

Código:
#INCLUDE <P18F4550.INC>



ORG 0X00                            ; vector de RESET

GOTO INICIO



ORG 0X08                            ; vectores de interrupción
GOTO IntT0_ISR



INICIO:

    MOVLW 0XFE                ; definir entradas y salidas (1:entrada, 0:salida)

    MOVWF TRISD                ; en PORTD



    BSF PORTD,0                ; activar bit 0 de PORTD



    MOVLW 0XFB                ; inicializar temporizador 0

    MOVWF TMR0H                ; con 0XFB1E = 64 286

    MOVLW 0X1E

    MOVWF TMR0L



    MOVLW B'10001000'        ; activar temporizador 0

    MOVWF T0CON                ; 16 bit, reloj interno, no preescalado



    BSF INTCON,TMR0IE        ; activar indicador interrupción de sobrepaso

    BSF INTCON,GIE            ; activar todas las interrupciones



Bucle:

    GOTO Bucle                ; no hacer nada más que esperar una muerte placentera



IntT0_ISR:                    ; ¡Oops! Tenemos una interrupción...



    BTFSS INTCON,TMR0IF        ; ¿es una interrupción por sobrepaso?

    GOTO Fin_intT0            ; no, terminamos



    BCF INTCON, TMR0IF        ; desactivamos indicador de interrupción por sobrepaso



    MOVLW 0XFB                ; inicializar temporizador 0

    MOVWF TMR0H                ; con 0XFB1E = 64 286

    MOVLW 0X1E

    MOVWF TMR0L



    BTG PORTD,0                ; cambia el bit 0 de PORTD



Fin_intT0:

  RETFIE                    ; retorno de interrupción



    END


Gracias de antemano, O espero algun texto de referencia para poder lograr mi objetivo que es realizar este codigo en C.
 
Última edición:
M

Miembro eliminado 356005

Pon el texto con marcas de código para que se pueda leer mejor. En la caja de edición del mensaje, está la opción Código en el menú desplegable «···».
 
M

Miembro eliminado 356005

Según el manual del compilador XC8, las subrutinas que despachan interrupciones se deben declarar así:
Código:
void __interrupt () my_isr_routine (void) {

}
pero... depende de la versión de XC8 y del MPLAB instalado. Por ejemplo, también podría ser así:
Código:
void interrupt my_isr(void) {

}
En la primera forma puedes indicar el nombre del vector de interrupción a la que le quieres asignar esta subrutina.
 
Última edición por un moderador:
Estoy manejando mplab ide 8,4 y no xc8 sino, c18.
realmente he manejado siempre pic c, y este cambio me dio muy duro no he podido ni empezar. :(
 
M

Miembro eliminado 356005

No pasa nada, con tranquilidad, paciencia y Google, todo sale.

Por ejemplo, entrando en Google, y buscando por las palabras interrupt y C18, la primera búsqueda sale esto:

C++:
//---------------------------------------------------------------------
// High priority interrupt routines
//---------------------------------------------------------------------
#pragma interrupt high_isr save=section(".tmpdata"),PROD,section("MATH_DATA")
void high_isr(void) {
    unsigned int Period;

    if (INTCONbits.TMR0IF)    {    // ¿es una interrupción por sobrepaso?
         INTCONbits.TMR0IF = 0;    // desactivamos indicador de interrupción por sobrepaso
         TMR0H = 0xFB;             // reiniciar temporizador 0
         TMR0L = 0x1E;

         PORTDbits.0 ^= 1;         // cambia el bit 0 de PORTD
         // _asm BTG PORTD,0  _endasm              // otra forma: escribiendo directamente en ensamblador
    }
}

//---------------------------------------------------------------------
// High priority interrupt vector
//---------------------------------------------------------------------
#pragma code high_vector=0x08
void high_interrupt(void) {
     _asm GOTO high_isr _endasm
}
#pragma code                    /* return to the default code section */
Como ves hay dos partes. La de abajo coloca el vector de interrupción para que salte a nuestra rutina de interrupción, que está en la primera parte. Lo que hay dentro del if() me lo he inventado y seguro que está mal, pero seguro que la solución real es muy similar. Solo te queda comprobarlo y añadir la parte de arranque del temporizador, y listo.
 
Arriba