Upgraded to Fredi's sources from 2012/01/15.
This commit is contained in:
373
firebee1.asm
373
firebee1.asm
@@ -52,7 +52,7 @@ OFF_TIME EQU .20 ;2.5 SEC (EINHEIT IST EIN TICK = 128MS
|
||||
ON_TIME EQU .2 ;0.25 SEC (EINHEIT IST EIN TICK = 128MS
|
||||
TIMER_HB EQU .240 ;256- (32768Hz PRO 1/8SEC = 4096TICKS/256) => 256-16=240 (resp 256-16/4 (wenn osco) = 252)
|
||||
TIME_MAX EQU .160 ;MAXIMALTIME
|
||||
U_ERR_PW_AUS EQU .5 ;5 SEC
|
||||
U_ERR_PW_AUS EQU .40 ;5 SEC
|
||||
;SERIEL
|
||||
SYNC1 EQU 0FFh
|
||||
SYNC1_DATA EQU 'A';
|
||||
@@ -69,6 +69,7 @@ RTCD_FROM_MCF EQU 82h ;RTC AND NVRAM DATEN HEADER UND STATUS
|
||||
U_MIN_TO_MCF EQU 03h ;UNTERSPANNUNGSMITTEILUNG AN PROCESSOR
|
||||
EXT_SUB_GO EQU 04h ;SERIELL CODE UM SUBROUTINEN/INTERRUPTS ZU AKTIVIEREN
|
||||
EXT_SUB_STOP EQU 05h ;SERIELL CODE UM SUBROUTINEN/INTERRUPTS ZU STOPPEN
|
||||
CMD_FROM_MCF EQU 0Ch ;3 BYT COMMANDOS FROM MCF = TOTAL 4 BYT
|
||||
CLK_SLEEP EQU B'00010010' ;125kHz intern, SLEEP MODE
|
||||
CLK_ACTIV EQU B'01110010' ;inTernal CLK=8MHz, SLEEP MODE, SLEEP MODE
|
||||
EXT_CODE EQU 0xFB ;CODE F<>R EXTERNE SUBROUTINEN/INTERRUPTS AUSF<53>HREN (FireBee!)
|
||||
@@ -78,8 +79,9 @@ EXTERN_SUB_ADR EQU 0x2010 ;HIER MUSS 0xFB STEHEN WENN EXTERNE SUBROUTINES AUS
|
||||
EXTERN_SUBROUTINES EQU 0x2012 ;STARTPUNKT EXTERNE SUBROUTINES
|
||||
REQ_BLOCK EQU 0xA0 ;BLOCK DATEN LESEN -> CODE UND 3 BYTS ADRESSE = TOTAL 4 BYTES
|
||||
READ_BLOCK EQU 0xA1 ;PROGRAMM BLOCK PIC->MCF -> CODE, 3 BYTS ADRESSE UND 64 BYTS DATEN = TOTAL 68 BYTES
|
||||
WRITE_BLOCK EQU 0xA2 ;PROGRAMM BLOCK MCF->PIC -> CODE, 3 BYTS ADRESSE UND 64 BYTS DATEN = TOTAL 68 BYTES
|
||||
PRG_OK_PIC EQU 0x22 ;PROGRAMMIERUNG BLOCK FERTIG
|
||||
WRITE_BLOCK EQU 0xA2 ;PROGRAMM BLOCK MCF->PIC -> CODE, 3 BYTS ADRESSE UND 64 BYTS DATEN UND 1 BYT CHECKSUM = TOTAL 69 BYTES
|
||||
PRG_OK EQU 0x00 ;PROGRAMMIERUNG BLOCK FERTIG
|
||||
CHECKSUM_ERROR EQU 0xFE
|
||||
;**********************************************************************************************"""""""""""""
|
||||
; Start at the reset vector
|
||||
Reset_Vector code 0x000
|
||||
@@ -130,9 +132,70 @@ INT_HANDLER
|
||||
CPFSEQ GO_INT ;SKIP WENN JA
|
||||
RETFIE
|
||||
GOTO EXTERN_INTERRUPTS ;REGISTER SICHERN UND STARTEN
|
||||
|
||||
;BLOCK PROGRAMMIEREN **********************************************************************************************"""""""""""""
|
||||
PB CODE 0x0080
|
||||
PROGRAMM_BLOCK
|
||||
LFSR 1,RX_BUFFER ;BYT COUNTER AUF RX BUFFER
|
||||
MOVFF POSTINC1,TBLPTRU ;TABLE POINTER SETZEN
|
||||
MOVFF POSTINC1,TBLPTRH ;TABLE POINTER SETZEN
|
||||
MOVFF POSTINC1,TBLPTRL ;TABLE POINTER SETZEN
|
||||
;EREASE BLOCK
|
||||
BCF INTCON,GIE ; DISABLE INTTERUPT
|
||||
BSF EECON1,EEPGD ; point to Flash program memory
|
||||
BCF EECON1,CFGS ; access Flash program memory
|
||||
BSF EECON1,WREN ; enable write to memory
|
||||
BSF EECON1,FREE ; enable Row Erase operation
|
||||
MOVLW 55h
|
||||
MOVWF EECON2 ; write 55h
|
||||
MOVLW 0AAh ; write 0AAh
|
||||
MOVWF EECON2
|
||||
BSF EECON1,WR ; start erase (CPU stall)
|
||||
BSF INTCON,GIE ; ENABLE INTERRUPT
|
||||
TBLRD*- ; POINTER DUMMY DECREMENT
|
||||
; BLOCK WRITE 1.H<>LFTE
|
||||
MOVLW 23h ; 67 BYT 3 BYT ADR + 64 BYT DATEN
|
||||
WRITE_WORD_TO_HREG1
|
||||
MOVFF POSTINC1,TABLAT ; get byte of buffer data
|
||||
TBLWT+* ; write data, perform a short write to internal TBLWT holding register.
|
||||
CPFSEQ FSR1L ; SCHON BEI 32 BYTES?
|
||||
BRA WRITE_WORD_TO_HREG1 ;NEIN->LOOP
|
||||
; PROGRAMM BLOCK
|
||||
BSF EECON1,EEPGD ; point to Flash program memory
|
||||
BCF EECON1,CFGS ; access Flash program memory
|
||||
BSF EECON1,WREN ; enable write to memory
|
||||
BCF INTCON,GIE ; DISABLE INTTERUPT
|
||||
MOVLW 55h
|
||||
MOVWF EECON2 ; write 55h
|
||||
MOVLW 0AAh
|
||||
MOVWF EECON2 ; write 0AAh
|
||||
BSF EECON1,WR ; start program (CPU stall)
|
||||
BCF EECON1,WREN ; disable write to memory
|
||||
; BLOCK WRITE 2. H<>LFTE
|
||||
MOVLW 43h ; 67 BYT 3 BYT ADR + 64 BYT DATEN
|
||||
WRITE_WORD_TO_HREG2
|
||||
MOVFF POSTINC1,TABLAT ; get byte of buffer data
|
||||
TBLWT+* ; write data, perform a short write to internal TBLWT holding register.
|
||||
CPFSEQ FSR1L ; SCHON BEI 64 BYTES?
|
||||
BRA WRITE_WORD_TO_HREG2 ;NEIN->LOOP
|
||||
; PROGRAMM BLOCK
|
||||
BSF EECON1,EEPGD ; point to Flash program memory
|
||||
BCF EECON1,CFGS ; access Flash program memory
|
||||
BSF EECON1,WREN ; enable write to memory
|
||||
MOVLW 55h
|
||||
MOVWF EECON2 ; write 55h
|
||||
MOVLW 0AAh
|
||||
MOVWF EECON2 ; write 0AAh
|
||||
BSF EECON1,WR ; start program (CPU stall)
|
||||
BCF EECON1,WREN ; disable write to memory
|
||||
BSF INTCON,GIE ; ENABLE INTERRUPT
|
||||
MOVLW PRG_OK ; OK senden
|
||||
MOVWF TXREG
|
||||
CLRF RX_STATUS ; FERTIG
|
||||
RETFIE
|
||||
;**********************************************************************************************"""""""""""""
|
||||
; Start application beyond vector area
|
||||
CODE 0x0100
|
||||
STD CODE 0x0100
|
||||
KALT_START
|
||||
;RESET MODE
|
||||
CLRF BSR ;BANK 0
|
||||
@@ -154,8 +217,9 @@ KALT_START
|
||||
MOVWF OSCCON
|
||||
; div init
|
||||
;SET PORT A: **7:#master/0.409*5V0 **6:PIC_AMKB_RX **5:PIC_SWTICH **4:HIGH_CHARGE_CURRENT **3:2V5 *2:3V3/2 **1:1V25 **0:POWER_IN/11
|
||||
CLRF PORTA ;#master(7)=0, REST=0
|
||||
MOVLW B'11111111' ;DIRECTION: alles auf Input
|
||||
MOVLW B'01000000' ;RA6 auf high
|
||||
MOVWF PORTA ;#master(7)=0, REST=0
|
||||
MOVLW B'11111111' ;alles auf Input
|
||||
MOVWF TRISA
|
||||
;SET PORT B: **7:PGD **6:PGC **5:PGM **4:PIN_INT,1V5 **3:GAME PORT PIN10 **2:GAME PORT PIN11 **1:GAME PORT PIN6 **0: GAME PORT PIN5
|
||||
CLRF PORTB ;ALLES AUF 0
|
||||
@@ -168,9 +232,9 @@ KALT_START
|
||||
CLRF PORTD ;ALLES AUF 0
|
||||
MOVWF TRISD ;ALLES AUF INPUT
|
||||
;SET PORT E: **3:#MCLR **2:#PCI_RESET **1:PCI 3V3 **0:PIC LED (0=ON)
|
||||
MOVLW B'00000001' ;LED OFF
|
||||
CLRF PORTE ;ALLES AUF 0
|
||||
MOVWF TRISE ;ALLES AUF INPUT
|
||||
MOVLW B'00000111' ;tri: PCI RESET; PCI3V3; LED
|
||||
MOVWF TRISE ;direction setzen
|
||||
;--------------------------
|
||||
; set OVERvoltage detekt
|
||||
MOVLW B'10011011' ;INT WENN <20>BER 3.9V
|
||||
@@ -201,9 +265,17 @@ KALT_START
|
||||
MOVWF MONTHS
|
||||
MOVLW .42
|
||||
MOVWF YEARS ;MONTAG 19.7.2010 12:00:00 (JAHR-1968)
|
||||
MOVLW 0x27 ;32kHz TEILER=64
|
||||
MOVWF REGA
|
||||
MOVLW B'00000011' ;24H, SOMMERZEIT
|
||||
MOVWF REGB
|
||||
CLRF REGC
|
||||
CLRF REGD
|
||||
CLRF TASTE_ON_TIME
|
||||
CLRF TASTE_OFF_TIME
|
||||
CLRF POWER_ON_TIME
|
||||
CLRF RX_STATUS
|
||||
CLRF TX_STATUS
|
||||
BSF PIE1,TMR1IE ;Enable Timer1 interrupt
|
||||
;AD WANDLER INITIALISIEREN
|
||||
CLRF AD_KANAL ;BEI 0 BEGINNEN
|
||||
@@ -263,12 +335,14 @@ POWER_EIN
|
||||
BCF TRISD,RD7 ;#RSTI AKTIVIEREN = LOW
|
||||
BCF TRISB,RB4 ;PIC_INT AKTIVIEREN
|
||||
BCF TRISD,RD0 ;POWER ON
|
||||
BCF TRISA,RA6 ;PIC_AMKB_RX auf output
|
||||
BRA LS_ON_POWER ;LADESTROM EINSTELLEN
|
||||
POWER_AUS
|
||||
;CLOCK
|
||||
MOVLW CLK_SLEEP
|
||||
MOVWF OSCCON
|
||||
|
||||
BSF TRISA,RA6 ;PIC_AMKB_RX auf input
|
||||
BSF TRISD,RD0 ;POWER OFF
|
||||
BSF TRISD,RD7 ;#RSTI DEAKTIVIEREN
|
||||
BSF TRISB,RB4 ;PIC INT DEAKTIVIEREN
|
||||
@@ -360,8 +434,8 @@ TG_END
|
||||
INCF TASTE_ON_TIME ;ERH<52>HEN
|
||||
RETURN
|
||||
RESETEN
|
||||
BCF TRISD,RD7 ;NEIN-> #RSTI AKTIVIEREN =LOW -->>>RESET
|
||||
CALL SERIAL_OFF ;SERIELL DEAKTIVIEREN
|
||||
BCF TRISD,RD7 ;NEIN-> #RSTI AKTIVIEREN =LOW -->>>RESET
|
||||
BRA TG_ON_POWER3
|
||||
;**********************************************************************************************"""""""""""""
|
||||
;----------------------------------------- INTERRUPTS
|
||||
@@ -388,7 +462,7 @@ TX_ISR1
|
||||
BRA TX_ISR2 ;NEIN->
|
||||
MOVFF POSTINC0,TXREG ;BYT SENDEN
|
||||
MOVLW 0xC3 ;SCHON LETZTES BYTS?
|
||||
CPFSGT FSR0L ;SKIP WENN FERTIG
|
||||
CPFSEQ FSR0L ;SKIP WENN FERTIG
|
||||
RETFIE ;NEIN WEITERE SENDEN
|
||||
TX_ISR2
|
||||
BRA TX_ISR_FERTIG
|
||||
@@ -400,28 +474,33 @@ RX_ISR ; BYT RECEIVED
|
||||
MOVLW SYNC4 ;IM SYNC STATUS?
|
||||
CPFSLT RX_STATUS ;SKIP WENN NEIN
|
||||
BRA RX_SYNC_START ;JA -> ZUERST SYNC EMPFANGEN
|
||||
;---------------
|
||||
;RTC DATEN EMPFANGEN? -----------------------------------------------------------------------------------
|
||||
MOVLW RTCD_FROM_MCF ; DATEN VOM MCF CODE 0x82?
|
||||
CPFSEQ RX_STATUS ; WENN JA-> SKIP
|
||||
BRA RX_ISR1 ; NEIN->
|
||||
;64 BYT EMPFANGEN -------------------------------------
|
||||
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
|
||||
MOVLW 0x3F ;64 BYT <20>BERTRAGEN?
|
||||
MOVLW 0x40 ;64 BYT <20>BERTRAGEN?
|
||||
CPFSLT FSR1L ;NEIN ->SKIP
|
||||
CLRF RX_STATUS ;JA FERTIG
|
||||
RETFIE
|
||||
;-------------------------------------------------------------------------------------
|
||||
; SETZEN? ---------------------------------------------------
|
||||
RX_ISR1
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG?
|
||||
BRA RX_ISR2 ;JA ->
|
||||
CPFSEQ RX_B ;BLOCK HEADER 0X82?
|
||||
BRA RX_ISR2 ;NEIN->
|
||||
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
|
||||
LFSR 1,.0 ;BYT COUNTER AUF O
|
||||
RETFIE
|
||||
; RTC DATEN SENDEN? -------------------------------------------------------------------------------------
|
||||
RX_ISR2
|
||||
MOVLW REQ_RTCD_FROM_PIC ;DATEN SENDEN?
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG?
|
||||
BRA RX_ISR3 ;JA ->
|
||||
CPFSEQ RX_B ;SKIP WENN JA
|
||||
BRA RX_ISR3 ;SONST NEXT
|
||||
;BLOCK HEADER UND 64 BYT SENDEN -----------------------------------------
|
||||
;BLOCK HEADER UND 64 BYT SENDEN -----------
|
||||
LFSR 0,.0
|
||||
BCF PIR1,TXIF ;INTERRUPT FLAG L<>SCHEN
|
||||
BSF PIE1,TXIE ;Enable interrupt
|
||||
@@ -430,9 +509,11 @@ RX_ISR2
|
||||
MOVWF TXREG ;BLOCK HEADER = 0X81
|
||||
CLRF RX_STATUS ;STATUS R<>CKSETZEN
|
||||
RETFIE ;UND WEG
|
||||
;-------------------------------------------------------------------------------------
|
||||
;EXT SUB INT STARTEN?-------------------------------------------------------------------------------------
|
||||
RX_ISR3
|
||||
MOVLW EXT_SUB_GO ;EXT SUB FREIGEBEN?
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG?
|
||||
BRA RX_ISR4 ;JA ->
|
||||
CPFSEQ RX_B
|
||||
BRA RX_ISR4 ;NEIN->
|
||||
;EXT SUBS FREIGEBEN --------------------------------------------------------------
|
||||
@@ -454,9 +535,11 @@ RX_ISR3
|
||||
MOVFF TABLAT,GO_SUB ;EXTERNE SUBROUTINES AKTIVIEREN WENN OK
|
||||
CLRF RX_STATUS ;STATUS R<>CKSETZEN
|
||||
RETFIE ;UND WEG
|
||||
;-------------------------------------------------------------------------------------
|
||||
;EXT SUB INT STOPPEN? -------------------------------------------------------------------------------------
|
||||
RX_ISR4
|
||||
MOVLW EXT_SUB_STOP ;EXT SUB STOPPEN?
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG?
|
||||
BRA RX_ISR5 ;JA ->
|
||||
CPFSEQ RX_B
|
||||
BRA RX_ISR5 ;NEIN->
|
||||
;EXT SUBS STOPPEN --------------------------------------------------------------
|
||||
@@ -464,36 +547,36 @@ RX_ISR4
|
||||
CLRF GO_SUB ;STOPPEN
|
||||
CLRF RX_STATUS ;STATUS R<>CKSETZEN
|
||||
RETFIE ;UND WEG
|
||||
;-------------------------------------------------------------------------------------
|
||||
;REQ BLOCK? -------------------------------------------------------------------------------------
|
||||
RX_ISR5
|
||||
MOVLW REQ_BLOCK ;REQ BLOCK?
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG? SKIP NON
|
||||
BRA RX_ISR6 ;JA ->
|
||||
CPFSEQ RX_B
|
||||
BRA RX_ISR6 ;NEIN->
|
||||
;REQ BLOCK ----------------------------------------------------------------
|
||||
;REQ BLOCK SETZEN
|
||||
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
|
||||
LFSR 1,TX_BUFFER ;BYT COUNTER AUF TX_BUFFER -> GLEICH EINTRAGEN
|
||||
RETFIE
|
||||
RX_ISR6
|
||||
CPFSEQ RX_STATUS ;REQ BLOCK ADRESSE EMPFANGFEN?
|
||||
BRA RX_ISR7 ;NEIN->
|
||||
;3 BYT EMPFANGEN -------------------------------------
|
||||
;3 BYT EMPFANGEN ---------------------------
|
||||
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
|
||||
MOVLW 0x82 ;3 BYT <20>BERTRAGEN? (BUFFER BEGINNT BEI 0x180
|
||||
CPFSLT FSR1L ;NEIN ->SKIP
|
||||
BRA RX_RB3BOK
|
||||
RETFIE
|
||||
RX_RB3BOK
|
||||
MOVLW 0x83 ;3 BYT <20>BERTRAGEN? (BUFFER BEGINNT BEI 0x180
|
||||
CPFSEQ FSR1L ;NEIN ->SKIP
|
||||
RETFIE ;NEXT ->
|
||||
LFSR 1,TX_BUFFER ;BYT RX COUNTER AUF TX_BUFFER
|
||||
MOVFF POSTINC1,TBLPTRU ;ADRESSE EINTRAGEN
|
||||
MOVFF POSTINC1,TBLPTRH
|
||||
MOVFF POSTINC1,TBLPTRL
|
||||
MOVLW 0xC2 ;67 BYT <20>BERTRAGEN? (BUFFER BEGINNT BEI 0x180
|
||||
MOVLW 0xC3 ;67 BYT <20>BERTRAGEN? (BUFFER BEGINNT BEI 0x180
|
||||
RX_RB3B2
|
||||
TBLRD *+ ;LESEN UND NEXT
|
||||
MOVFF TABLAT,POSTINC1 ;UND EINTRAGEN
|
||||
CPFSEQ FSR1L ;WENN FERTIG ->SKIP
|
||||
BRA RX_RB3B2 ;SONST LOOP
|
||||
;BLOCK HEADER 3 BYTS ADRESSE UND 64 BYT SENDEN STARTEN -----------------------------------------
|
||||
;BLOCK HEADER 3 BYTS ADRESSE UND 64 BYT SENDEN STARTEN
|
||||
LFSR 0,TX_BUFFER ;TX COUNTER AUF TX_BUFFER
|
||||
BCF PIR1,TXIF ;INTERRUPT FLAG L<>SCHEN
|
||||
BSF PIE1,TXIE ;Enable interrupt
|
||||
@@ -502,66 +585,129 @@ RX_RB3B2
|
||||
MOVWF TXREG ;BLOCK HEADER = 0XA1
|
||||
CLRF RX_STATUS ;STATUS R<>CKSETZEN
|
||||
RETFIE ;UND WEG
|
||||
;-------------------------------------------------------------------------------------
|
||||
;PROGRAMM BLOCK? -------------------------------------------------------------------------------------
|
||||
RX_ISR7
|
||||
MOVLW WRITE_BLOCK ;WRITE BLOCK 0xA2 BYT EMPFANGEN?
|
||||
CPFSEQ RX_STATUS ;WENN JA-> SKIP
|
||||
BRA RX_ISR8 ;NEIN->
|
||||
;WRITE BLOCK ----------------------------------------------------------------------------
|
||||
;67 BYT EMPFANGEN -------------------------------------
|
||||
;WRITE BLOCK ------------------------
|
||||
;68 BYT EMPFANGEN: 3 BYT ADRESSE; 64 BYT DATEN; 1 BYT CHECKSUM -------------------
|
||||
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
|
||||
MOVLW 0x42 ;67 BYT <20>BERTRAGEN?
|
||||
CPFSLT FSR1L ;WENN FERTIG ->SKIP
|
||||
MOVLW 0x44 ;68 BYT <20>BERTRAGEN?
|
||||
CPFSEQ FSR1L ;WENN FERTIG ->SKIP
|
||||
RETFIE
|
||||
; ADRESSE UND DATEN SIND DA -> PROGRAMMING FLASH
|
||||
; ADRESSE UND DATEN und CHECKSUM SIND DA -> PROGRAMMING FLASH
|
||||
; TEST CHECKSUM
|
||||
LFSR 1,RX_BUFFER ;BYT COUNTER AUF RX BUFFER
|
||||
MOVFF POSTINC1,TBLPTRU ;TABLE POINTER SETZEN
|
||||
MOVLW (EXTERN_INT_ADR & 0xFF0000)>>16
|
||||
CPFSLT TBLPTRU ;TEST OB WENIGER ALS ERLAUBT
|
||||
BRA NO_PROG ;JA->
|
||||
MOVFF POSTINC1,TBLPTRH ;TABLE POINTER SETZEN
|
||||
MOVLW (EXTERN_INT_ADR & 0x00FF00)>>8
|
||||
CPFSLT TBLPTRU ;TEST OB WENIGER ALS ERLAUBT
|
||||
BRA NO_PROG ;JA->
|
||||
MOVFF POSTINC1,TBLPTRL ;TABLE POINTER SETZEN
|
||||
;EREASE BLOCK
|
||||
BSF EECON1,EEPGD ; point to Flash program memory
|
||||
BCF EECON1,CFGS ; access Flash program memory
|
||||
BSF EECON1,WREN ; enable write to memory
|
||||
BSF EECON1,FREE ; enable Row Erase operation
|
||||
MOVLW 55h
|
||||
MOVWF EECON2 ; write 55h
|
||||
MOVLW 0AAh ; write 0AAh
|
||||
MOVWF EECON2
|
||||
BSF EECON1,WR ; start erase (CPU stall)
|
||||
MOVLW 0x42 ;67 BYT
|
||||
WRITE_WORD_TO_HREGS
|
||||
MOVFF POSTINC1,TABLAT ; get byte of buffer data
|
||||
TBLWT+* ; write data, perform a short write to internal TBLWT holding register.
|
||||
CPFSLT FSR1L ;SCHON BEI 67 BYTES?
|
||||
BRA WRITE_WORD_TO_HREGS ;NEIN->LOOP
|
||||
PROGRAM_MEMORY
|
||||
BSF EECON1,EEPGD ; point to Flash program memory
|
||||
BCF EECON1,CFGS ; access Flash program memory
|
||||
BSF EECON1,WREN ; enable write to memory
|
||||
MOVLW 55h
|
||||
MOVWF EECON2 ; write 55h
|
||||
MOVLW 0AAh
|
||||
MOVWF EECON2 ; write 0AAh
|
||||
BSF EECON1,WR ; start program (CPU stall)
|
||||
BCF EECON1,WREN ; disable write to memory
|
||||
NO_PROG
|
||||
CLRF RX_STATUS ;AUF NORMLA SCHALTEN
|
||||
RETFIE ;UND FERTIG
|
||||
MOVLW 43h ;67 BYTES
|
||||
MOVWF RX_B ;COUNTER
|
||||
MOVLW 0h ;SUM CLEAR
|
||||
LOOP_TEST_CHECKSUM
|
||||
ADDWF POSTINC1,0 ;ADD TO WREG
|
||||
DECFSZ RX_B ;-1 SKIP WENN 0
|
||||
BRA LOOP_TEST_CHECKSUM
|
||||
CPFSEQ POSTINC1 ;SUM = CHECKESUM? SKIP JA
|
||||
BRA CHK_ERR ;NEIN CHECKSUM ERROR
|
||||
BRA PROGRAMM_BLOCK ; OK-> PROGRAMMIEREN
|
||||
CHK_ERR
|
||||
MOVLW CHECKSUM_ERROR ; ERROR senden
|
||||
MOVWF TXREG;
|
||||
CLRF RX_STATUS ; FERTIG
|
||||
RETFIE
|
||||
;WRITE BLOCK SETZEN?
|
||||
RX_ISR8
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG?
|
||||
BRA RX_ISR9 ;JA ->
|
||||
CPFSEQ RX_B ;BLOCK HEADER COMMANDOE 0XA2?
|
||||
BRA RX_ISR9 ;NEIN->
|
||||
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
|
||||
LFSR 1,RX_BUFFER ;BYT COUNTER AUF RX BUFFER
|
||||
RETFIE
|
||||
;-------------------------------------------------------------------------------------
|
||||
;--------------------------------------------------------------------------------------------
|
||||
RX_ISR9
|
||||
MOVLW CMD_FROM_MCF ;CMD HEADER 0x0C EMPFANGEN?
|
||||
CPFSEQ RX_STATUS ;WENN JA-> SKIP
|
||||
BRA RX_ISR15 ;NEIN->
|
||||
;COMMAND BYT EMPFANGEN
|
||||
;3 BYT EMPFANGEN -------------------------------------
|
||||
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
|
||||
MOVLW 0x3 ;3 BYT <20>BERTRAGEN?
|
||||
CPFSEQ FSR1L ;NEIN ->SKIP
|
||||
RETFIE
|
||||
CMD_AUSWERTEN
|
||||
;RESET?
|
||||
LFSR 1,RX_BUFFER ;ZEIGER AUF RX BUFFER
|
||||
MOVLW 'R'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC2 ;NEIN->
|
||||
MOVLW 'S'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC2 ;NEIN->
|
||||
MOVLW 'T'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC2 ;NEIN->
|
||||
;RESET MCF
|
||||
CALL SERIAL_OFF ;SERIELL DEAKTIVIEREN
|
||||
BCF TRISD,RD7 ;NEIN-> #RSTI AKTIVIEREN =LOW -->>>RESET
|
||||
MOVLW 0FFh
|
||||
LC1_WAIT
|
||||
NOP
|
||||
NOP
|
||||
NOP
|
||||
DECFSZ WREG
|
||||
BRA LC1_WAIT
|
||||
BSF TRISD,RD7 ;JA -> #RSTI DEAKTIVIEREN =HIGH
|
||||
CALL SERIAL_ON ;SERIELL EINSCHALTEN
|
||||
CLRF RX_STATUS ;JA FERTIG
|
||||
RETFIE
|
||||
LC2:
|
||||
;POWER AUS?
|
||||
LFSR 1,RX_BUFFER ;ZEIGER AUF RX BUFFER
|
||||
MOVLW 'O'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC4 ;NEIN->
|
||||
MOVLW 'F'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC4 ;NEIN->
|
||||
MOVLW 'F'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC4 ;NEIN->
|
||||
;POWER OFF
|
||||
CALL POWER_AUS
|
||||
CLRF RX_STATUS ;JA FERTIG
|
||||
RETFIE
|
||||
LC4:
|
||||
;RESET PIC?
|
||||
LFSR 1,RX_BUFFER ;ZEIGER AUF RX BUFFER
|
||||
MOVLW 'R'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC6 ;NEIN->
|
||||
MOVLW 'P'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC6 ;NEIN->
|
||||
MOVLW 'I'
|
||||
CPFSEQ POSTINC1 ;=? SIKP JA
|
||||
BRA LC6 ;NEIN->
|
||||
;RESET PIC
|
||||
RESET
|
||||
;HIER SOLLTE ER NICHT HINKOMMEN
|
||||
BRA KALT_START
|
||||
LC6
|
||||
;NO REAL CMA
|
||||
CLRF RX_STATUS ;JA FERTIG
|
||||
RETFIE
|
||||
;END CDM AUSWERTEN
|
||||
RX_ISR15
|
||||
TSTFSZ RX_STATUS ;TASK H<>NGIG?
|
||||
BRA RX_ISR20 ;JA ->
|
||||
CPFSEQ RX_B ;CMD?
|
||||
BRA RX_ISR20 ;NEIN->
|
||||
;CMD SETZEN
|
||||
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
|
||||
LFSR 1,RX_BUFFER ;ZEIGER AUF RX BUFFER
|
||||
RETFIE
|
||||
RX_ISR20
|
||||
RX_ISR_END
|
||||
CLRF RX_STATUS
|
||||
RETFIE
|
||||
;-------------------------------------------------------------------------------------
|
||||
@@ -612,24 +758,24 @@ RX_WAIT1
|
||||
BTFSS TXSTA,TRMT
|
||||
BRA RX_WAIT1
|
||||
MOVLW 'O' ;SENDE OK!
|
||||
MOVWF TXREG;
|
||||
MOVWF TXREG
|
||||
RX_WAIT2
|
||||
BTFSS TXSTA,TRMT
|
||||
BRA RX_WAIT2
|
||||
MOVLW 'K' ;SENDE OK!
|
||||
MOVWF TXREG;
|
||||
MOVWF TXREG
|
||||
RX_WAIT3
|
||||
BTFSS TXSTA,TRMT
|
||||
BRA RX_WAIT3
|
||||
MOVLW '!'
|
||||
MOVWF TXREG;
|
||||
MOVWF TXREG
|
||||
CLRF RX_STATUS ;OK START NORMAL
|
||||
RETFIE
|
||||
;**********************************************************************************************"""""""""""""
|
||||
;SPANNUNGS<47>BERWACHUNGS INTERRUPT
|
||||
HLVD_ISR
|
||||
BTFSS U_ERR,1 ;WARTEN AUF GELADEN?
|
||||
BRA HLVD_LE ;NEIN UNTERSPANNUNG DETEKT->
|
||||
BRA HLVD_LE ;NEIN UNTERSPANNUNG DETEKT->
|
||||
BCF U_ERR,0 ;SPANNUNGSFEHLER AUS
|
||||
BCF U_ERR,1 ;WARTEN AUF GELADEN=AUS
|
||||
MOVLW U_ERR_PW_AUS+2 ;POWER AUS <20>BERSPRINGEN
|
||||
@@ -682,15 +828,15 @@ POWER_OFF_I
|
||||
BNZ PINGS ;NICHT MODULO4 ->
|
||||
MOVLW .7
|
||||
CPFSEQ TICKS ;7. TICK?
|
||||
BRA POWER_OFF_I2 ;NEIN->
|
||||
BRA POWER_OFF_I2 ;NEIN->
|
||||
BCF TRISE,RE0 ;JA->LED=ON
|
||||
POWER_OFF_I2
|
||||
MOVLW .30 ; WENIGER ALS 30 SEC SEIT LETZTEM SPANNUNGSFEHLER?
|
||||
CPFSLT U_ERR_TIME
|
||||
BRA PINGS ;NEIN->
|
||||
BRA PINGS ;NEIN->
|
||||
MOVLW .5
|
||||
CPFSEQ TICKS ;5. TICK?
|
||||
BRA PINGS ;NEIN->
|
||||
BRA PINGS ;NEIN->
|
||||
BCF TRISE,RE0 ;JA->LED=ON
|
||||
PINGS
|
||||
CALL TASTE ;UP TASTE
|
||||
@@ -763,6 +909,20 @@ SEK_3
|
||||
SEK_4
|
||||
CLRF TICKS
|
||||
INCF SECS ; Increment seconds
|
||||
|
||||
;?????????????????????????????????????????????????????
|
||||
;test pic ps2 keyboard
|
||||
; MOVLW 0f9h ;2
|
||||
; CALL send
|
||||
; nop
|
||||
; nop
|
||||
; MOVLW .10
|
||||
; CALL send
|
||||
; nop
|
||||
; nop
|
||||
; MOVLW .10
|
||||
; CALL send
|
||||
;--------------------------------------------------------------
|
||||
MOVLW .59 ; 60 seconds elapsed?
|
||||
CPFSGT SECS
|
||||
RETFIE ;RETURN
|
||||
@@ -840,6 +1000,61 @@ NOT_SEP
|
||||
; ENDE MAIN
|
||||
;**********************************************************************************************"""""""""""""
|
||||
;**********************************************************************************************"""""""""""""
|
||||
; EXTERN_SUBOUTINES FOGEN AB 0x1000 DIE SP<53>TER EINPROGRAMMIERT WERDEN
|
||||
; EXTERN_SUBOUTINES FOGEN AB 0x2000 DIE SP<53>TER EINPROGRAMMIERT WERDEN
|
||||
;**********************************************************************************************"""""""""""""
|
||||
EXT_INT CODE 0x2000
|
||||
EXT_INT_MAGIC DB 0
|
||||
EXT_INT_START
|
||||
|
||||
EXT_SUB CODE 0x2010
|
||||
EXT_SUB_MAGIC DB 0
|
||||
EXT_SUT_START
|
||||
|
||||
clockrate equ .8000000 ;Xtal value (8Mhz in this case)
|
||||
fclk equ clockrate/4
|
||||
;baudrate equ ((fclk/.7812.5)/3-2) ;7812.5 is the baud rate
|
||||
baudrate equ .83 ;7812.5 is the baud rate
|
||||
|
||||
txreg equ 10
|
||||
delay equ 11
|
||||
count equ 12
|
||||
txchar equ 13
|
||||
|
||||
send
|
||||
movwf txreg
|
||||
movlw baudrate
|
||||
movwf delay
|
||||
movlw .9
|
||||
movwf count
|
||||
bcf PORTA,6 ;send start bit
|
||||
nop ;even out bit times
|
||||
next
|
||||
decfsz delay,f
|
||||
goto next
|
||||
movlw baudrate ;rest of program is 9 instructions
|
||||
movwf delay
|
||||
decfsz count,f
|
||||
goto sendnextbit
|
||||
bcf PORTA,6 ;send stop bit
|
||||
movlw baudrate ;Delay for line to settle
|
||||
movwf delay ;Delay for line to settle
|
||||
p1
|
||||
decfsz delay,f ;Delay for line to settle
|
||||
goto p1 ;Delay for line to settle
|
||||
bsf PORTA,6
|
||||
p2
|
||||
decfsz delay,f
|
||||
goto p2
|
||||
return
|
||||
sendnextbit
|
||||
rrcf txreg,F
|
||||
btfss STATUS,C ;check next bit to tx
|
||||
goto setlo
|
||||
bsf PORTA,6 ;send a high bit
|
||||
goto next
|
||||
setlo
|
||||
bcf PORTA,6 ;send a low bit
|
||||
goto next
|
||||
|
||||
|
||||
end
|
||||
|
||||
BIN
firebee1.mcw
BIN
firebee1.mcw
Binary file not shown.
Reference in New Issue
Block a user