DESCRIPCIÓN DE LA RUTINA DE INICIALIZACIÓN
La inicialización comprende la configuración del microcontrolador y de los dispositivos que se van a utilizar y la asignación de los valores iniciales a las variables globales del programa. El código de esta sección se puede consultar en el listado que se presenta más abajo en esta misma página, en donde realiza primero la configuración del reloj interno de microcontrolador escogiendo un valor de 8MHz que es el mayor admitido por el dispositivo. La utilidad de una frecuencia alta es la de ejecutar toda la rutina controladora antes del siguiente ciclo de control para evitar solapamientos ya que la transmisión por el puerto serie prolonga su duración al formar parte de la rutina de control y nunca el tiempo de espera para la transmisión debe penalizar a la rutina de control.
Posteriormente se inicializa el puerto B configurándolo como salida para ser utilizado (sus 4 bits menos significativos) para enviar las señales de control del motor paso a paso al manejador. El puerto E también se configura como salida para excitar el LED de calibración a través de su bit 0. Luego le toca el turno al puerto A pero en este caso la configuración será de todas sus líneas como entradas y por último el puerto C se configurará también como entrada ya que es un requisito para utilizar la EUSART con la que comparte algunos de sus pines.
Además del puerto, la EUSART requiere configurar los registros que se utilizarán para generar la señal de transmisión de 57.600 Baudios. Una vez configurada se procede a habilitar este dispositivo.
La sección siguiente se encarga de configurar el conversor A/D seleccionando como entrada la menos significativa del puerto A (AN0) y configurando el modo en que se volcará el valor leído en los registros ADRESH:ADRESL.
Otro paso necesario es la inhabilitación del comparador ya que este comparte el puerto A con el conversor A/D y no se pueden utilizar al mismo tiempo.
Por último se inicializa el gestor de interrupciones habilitando sólo la correspondiente al temporizador que será la encargada de iniciar la ejecución cíclica de la rutina de control.
Sólo resta asignar los valores iniciales a las variables que se utilizarán dentro del programa para que el microcontrolador esté listo para ejecutar el bucle principal.
CÓDIGO DE LA RUTINA DE INICIALIZACIÓN
; Clock
bsf OSCCON,IRCF0
bsf OSCCON,IRCF1
bsf OSCCON,IRCF2 ; 8 MHz
bsf OSCCON,SCS1 ; Internal Oscilator
; Initialize PORT B: Drive the motor
clrf PORTB
clrf LATB
clrf TRISB ; all outputs
; Initialize PORT E: Calibrating LED
clrf PORTE
clrf LATE
clrf TRISE ; all outputs
; Initialize PORT A: Error, Cal, Kp & Kd
clrf PORTA
clrf LATA
setf TRISA ; all inputs
; Initialize EUSART (Port C): Telemetry
setf TRISC ; all inputs
bcf TXSTA,TX9 ; 8-bit transmission
bcf TXSTA,SYNC ; Asynchronous mode
bsf TXSTA,BRGH ; High speed
bsf BAUDCON,BRG16 ; 8-bit Baud Rate Generator
movlw .34 ; Internal counter
movwf SPBRG ; 57600 Bauds
bsf RCSTA,SPEN ; Enable EUSART
bsf TXSTA,TXEN ; Enable the transmission
; Initialize ADC
movlw b'00000000'
movwf ADCON0 ; select channel 0 (AN0)
movlw b'00001110'
movwf ADCON1 ; Only input AN0 is analog
movlw b'10000110' ; Read Right justified
movwf ADCON2 ; Clock: FOSC/64
bsf ADCON0,ADON ; converter enabled
; Initialize Comparator: Turn off
movlw 0x07
movwf CMCON ; comparator disabled
; Initialize timer0: Control cycle
; 8 bits mode
movlw b'01010011' ; Internal clock
movwf T0CON ; prescaler (divides by 16)
; Interruption
bcf RCON,IPEN ; disable priority levels
bsf INTCON,GIE ; enable all unmasked interrupts
bcf INTCON,PEIE ; disable all unmasked peripheral interrupts
bcf INTCON,TMR0IF ; clear flag timer int.
bsf INTCON,TMR0IE ; activate timer overflow interruption
; Initialize vars
movlw _SEQ_1 ; Motor sequence Literal
movwf SEQ ; Initialize Sequence
movlw _DIR_STOP ; Direction Literal
movwf DIRECTION ; Stopped
clrf ACTION ; Controler Action
movlw 0xFF
movwf DELAY ; Initial Delay
movlw 0x01
movwf COUNT ; Initial Count
clrf ENDS ; not in left end, not in right end
clrf ERR_1 ; Initial E(k-1)
clrf ERR ; Initial E(k)
;;;;;;;;;;;;;;;;;;;;;;;;; Telemetry
clrf TEL_ACT ; Control
movlw 'S'
movwf HEAD ; Head stopped
clrf ANGLE ; Initial angle
;;;;;;;;;;;;;;;;;;;;;;;;;