LaStei
carpe cerevisi
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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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?
LaStei
carpe cerevisi
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%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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)
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
LaStei
carpe cerevisi
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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De bank level warnings kun je onderdrukken door aan het begin van de code " Errorlevel -302 " toe te voegen.