prototype "LED blink" voor microchip MPLAB 6.15 in assembler

Goedendag allemaal,
Helaas heb ik moeten upgraden van MPLAB version 2.35 naar MPLAB 6.15. Historisch en technisch programmeer ik in assembler. De meeste puzzels voor de upgrade (het converteren van de assembler files in V. 2.35 naar V.6.15) ben ik doorgekomen, maar er zijn er een paar die nog niet opgelost willen worden. Heeft er iemand op dit forum een "LED blink" project in de versie V.6.15 in assembler, zodat ik dat kan importeren op mijn nieuwe computer en kijken welke dingen anders staan in mijn versie. Bij voorbaat dank.

Met vriendelijke groet,

Lastei.

Versie 6.15 is wel heeel erg oud, laatste is 8.92... (en 8.92 is ook al weer ruim 10 jaar oud... ;) )
Welke processor, welke pin moet er blinken?

Hallo Arco,

Dank je wel voor je hulp. MPLAB IDE, dit jaar van Microchip geladen kwam met de versie nummer 6.15??? Processor is de Pic16F767, en dit is de code, die werkt op de versie 3.15: (er zit ook de configuratie van de serielle poort bij, niet nodig voor blink:)


  LIST R=DEC
  #INCLUDE P16F767.inc

SSW             equ     H'0070'   ; Shadow W-register
SSTAT           equ     H'0071'   ; Shadow Status register
SFSR            equ     H'0072'   ; Shadow SFR register
SPCLATH         equ     H'0073'   ; Shadow PCLATH register
IPORTC          equ     H'0074'   ; Old port value port C.
SPIR1     	equ     H'0075'   ; Shadow PIR register
STXREG          equ     H'0076'   ; Shadow transmit register
SRCREG          equ     H'0077'   ; Shadow receive register
COMCNT          equ     H'0078'   ; Communications counter transmission
COMCNR          equ     H'0079'   ; Communication counter receiver
TEMPCNT         equ     H'007A'   ; temporary counter register
SPORTA          equ     H'007B'   ; shadow port A register
SPORTB          equ     H'007C'   ; intermediate portC register
SPORTC          equ     H'007D'   ; shadow port C register
PORTB_CNT       equ     H'007E'   ; debounce counter portB
TMP             equ     H'007F'   ; temp variable


; Timer 1 values 2 ms tick is 2000 (F830) clock cycles with 8 MHz/4
T1_HI_BYTE      equ     0xF0  ; Timer1 high byte
T1_LO_BYTE      equ     0x60  ; Timer1 low byte

    __CONFIG _CONFIG1, _INTRC_IO & _WDTE_OFF & _MCLRE_ON & _BOREN_0 ;internal clock
    __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF & _BORSEN_0

  org		0
  goto		Main		; Main program vector

  org 4
;  goto		INT_MAIN		; Interupt vector
INT_MAIN 		               ; Interrupt handling routine
	                           ; implementation of software stack
                               ; First preserve status
          MOVWF    SSW         ; Save W-register
          SWAPF    STATUS,W    ; Load status register in W
          MOVWF    SSTAT       ; Store status
          MOVF     FSR,W       ; Save SFR register
          MOVWF    SFSR
          MOVF     PCLATH,w    ; Save PCLATH register
          MOVWF    SPCLATH

          banksel  0           ; Make sure to be in bank 0

; Interupt handler here
; Only transmit, receive and TMR1 interrupts
          BTFSS     PIR1,RCIF   ; check if byte received
          GOTO      no_RCV
          BSF       SPIR1,RCIF  ; Set bit in shadow register
          MOVF      RCREG,W     ; if so, copy to shadow receive register
          MOVWF     SRCREG
          GOTO      EO_INT

no_RCV    BSF       STATUS,RP0
          BTFSS     PIE1,TXIE   ; check if transmit interrupt is enabled
          GOTO      no_TRM
          BCF       STATUS,RP0  ; now check if it is this interrupt
          BTFSS     PIR1,TXIF   ; check if transmit interrupt
          GOTO      no_TRM
          BSF       SPIR1,TXIF  ; set flag, transmission done in back ground
          BSF       STATUS,RP0
          BCF       PIE1,TXIF   ; stop interrupt, wait for next
          BCF       STATUS,RP0  ; interupt when background send char
          GOTO      EO_INT

no_TRM    ; the only other interrupt is TMR1
          ; High byte has not had a roll-over, so adding to low byte is working
          BCF       STATUS,RP0      ; ensure to be back in bank 0
          BTFSS     PIR1,TMR1IF
          GOTO      EO_INT
          MOVLW     T1_HI_BYTE
          MOVWF     TMR1H
          MOVLW     T1_LO_BYTE
          ADDWF     TMR1L,F
          BCF       PIR1,TMR1IF
          BSF       SPIR1,TMR1IF

EO_INT
          MOVF     SFSR,w     ;Restore SFR register
          MOVWF    FSR
          MOVF     SPCLATH,w  ;Restore PCLATH
          MOVWF    PCLATH
          SWAPF    SSTAT,W    ;Restore status bits
          MOVWF    STATUS
          SWAPF    SSW,f      ;Restore WReg
          SWAPF    SSW,w

          RETFIE

Main

; Initialize Variables

    clrf        STATUS            ;Be sure in bank 0

; Setup I/O ports / Timers

    clrf        PORTA           ;clear port A
    clrf        PORTB           ;clear port B
    clrf        PORTC           ;clear port C
	bsf			STATUS, RP0		;Select Bank1
    movlw       B'00001111'     ;Port A configuration digital
    movwf       ADCON1          ;Port A is digital

	movlw		B'00000000'		;Set portA as outputs note: RA4 is open collector
	movwf		TRISA           ; resistor to be added
	movlw		B'1100000'		;Port B0 input, B1..B5 outputs, B6..B7 program
	movwf		TRISB           ;
    clrf        TRISC
    bsf         STATUS,RP0      ; continue to configure bank 1

    movlw       B'01110000'     ; set clock to 8 MHz
    movwf       OSCCON


;disable TMR0:
;RBPU   = 1, no pull-ups
;INTEDG = d, no interupt on change on RB port, edge does not matter
;T0CS   = 0, internal instruction clock cycle for TMR0
;T0SE   = d, increment on external disabled, so edge does not matter
;PSA    = 1, watchdog and TMR0 are not used, so prescaler assignment does not matter
;PS2-PS0 = 111 1:128 watchdog prescaler, in the case we think we need it.
    movlw       B'11011111'
    movwf       OPTION_REG
;Interupts settings:
;PSPIE  = 0, No parallel slave port interrupt
;ADIE   = 0, No A/D converter interrupt
;RCIE   = 1, UART receive interrupt
;TXIE   = 0, UART transmit interrupt disabled (stil)
;SSPIE  = 0, No Synchronous Serial port interrupt
;CCP1IE = 0, No capture/compare interrupt
;TMR2IE = 0, No timer2 interrupt
;TMR1IE = 1, Timer1 overflow interrupt
    movlw       B'00100001'
    movwf       PIE1
;no interupts from PIE2

; Bank1 configured
; Bank0 configuration
; Timer1 is correct after reset:
; Timer1:
; T1RUN   = 0,  System clock is derived from another source
; T1CKPS  = 00, Prescale = 1
; T1OSCEN = 0,  no external clock.
; T1SYNC  = 0,  Don?t care as TMR1CS = 0
; TMR1CS  = 0,  Fosc/4 = clock source equals 2 MHz.
; TMR1ON  = 0,  for the time being, set just before loop.
; Load timer 1:
	bcf			STATUS, RP0		;Select Bank0
    movlw       0x5A
    movwf       PORTA



    clrf        PIR1            ; ensure no outstanding
    clrf        PIR2            ; interrupts
    clrf        SPIR1           ; and shadow register
    clrf        TXREG

    clrf        TMR1L ; Clear Low byte, Ensures no rollover into TMR1H
    movlw       T1_HI_BYTE ; Value to load into TMR1H
    movwf       TMR1H ; Write High byte
    movlw       T1_LO_BYTE ; Value to load into TMR1L
    movwf       TMR1L ; Write Low byte

    bsf         T1CON,TMR1ON    ; get timer 1 running
    movlw       B'11000000'     ; enable global and peripheral interrupt
    movwf       INTCON
    bsf         STATUS,RP0      ;enable for next char
    bsf         PIE1,TXIF       ;transmit interrupt
    bcf         STATUS,RP0
    clrf        COMCNT



Loop

    movf        SPIR1,F         ;check if an iterrupt ocurred
    btfsc       STATUS,Z        ; if PIR1 = 0, no interupts, check again..
    goto        Loop
    btfsc       SPIR1,TMR1IF
    goto        TMR1_OV
    clrf        SPIR1           ;wrong interrupt, do nothing
    goto        Loop


TMR1_OV
    movlw       0xff
    bcf         SPIR1,TMR1IF    ;reset interrupt
    incf        COMCNT,F
    btfsc       STATUS,Z
    xorwf       PORTA,F
    Goto        Loop

 end

[Bericht gewijzigd door Henry S. op (0%)]

Da's MPLabX, niet MPLab. (da's een heel andere versie van hetzelfde programma)

Onder MPLAB 8.92 compileert de boel zonder problemen. (alleen honderden warnings door de ontbrekende indentering... :+)
MPLabX gebruik ik nooit, is een draak van een programma...

Proberen kan ik niet, ik heb geen 16F767 (zie je zelden)

Dank je wel, ik ga kijken of ik MPlab kan vinden en installeren.

Goedemiddag, Arco. Dank je voor de link, ik had hem ook al gevonden. I owe you one, they say over here. Uninstalled the "dragon" MPLaBX en installed de "laatste" versie van MPLab en inderdaad, apart van de warnings over the wrong bank, de eerste keer door gecompileerd. Heel hartelijk dank voor de oplossing!

LaStei

De bank level warnings kun je onderdrukken door aan het begin van de code " Errorlevel -302 " toe te voegen.