Daniel Stolfi's web page
EspañolEnglish

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
   ;;;;;;;;;;;;;;;;;;;;;;;;;  
Código de Inicialización
LA PAGINA DE DANIEL STOLFI - Version 5.09 - 1993-2024 - Cookies Policy
Creative Commons License