Upgraded to Fredi's sources from 2012/01/15.

This commit is contained in:
Vincent Rivière
2012-03-08 21:16:57 +00:00
parent f2b056404c
commit 5a62da0ea3
2 changed files with 294 additions and 79 deletions

View File

@@ -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 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) 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 TIME_MAX EQU .160 ;MAXIMALTIME
U_ERR_PW_AUS EQU .5 ;5 SEC U_ERR_PW_AUS EQU .40 ;5 SEC
;SERIEL ;SERIEL
SYNC1 EQU 0FFh SYNC1 EQU 0FFh
SYNC1_DATA EQU 'A'; 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 U_MIN_TO_MCF EQU 03h ;UNTERSPANNUNGSMITTEILUNG AN PROCESSOR
EXT_SUB_GO EQU 04h ;SERIELL CODE UM SUBROUTINEN/INTERRUPTS ZU AKTIVIEREN EXT_SUB_GO EQU 04h ;SERIELL CODE UM SUBROUTINEN/INTERRUPTS ZU AKTIVIEREN
EXT_SUB_STOP EQU 05h ;SERIELL CODE UM SUBROUTINEN/INTERRUPTS ZU STOPPEN 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_SLEEP EQU B'00010010' ;125kHz intern, SLEEP MODE
CLK_ACTIV EQU B'01110010' ;inTernal CLK=8MHz, SLEEP MODE, 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!) 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 EXTERN_SUBROUTINES EQU 0x2012 ;STARTPUNKT EXTERNE SUBROUTINES
REQ_BLOCK EQU 0xA0 ;BLOCK DATEN LESEN -> CODE UND 3 BYTS ADRESSE = TOTAL 4 BYTES 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 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 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_PIC EQU 0x22 ;PROGRAMMIERUNG BLOCK FERTIG PRG_OK EQU 0x00 ;PROGRAMMIERUNG BLOCK FERTIG
CHECKSUM_ERROR EQU 0xFE
;**********************************************************************************************""""""""""""" ;**********************************************************************************************"""""""""""""
; Start at the reset vector ; Start at the reset vector
Reset_Vector code 0x000 Reset_Vector code 0x000
@@ -130,9 +132,70 @@ INT_HANDLER
CPFSEQ GO_INT ;SKIP WENN JA CPFSEQ GO_INT ;SKIP WENN JA
RETFIE RETFIE
GOTO EXTERN_INTERRUPTS ;REGISTER SICHERN UND STARTEN 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 ; Start application beyond vector area
CODE 0x0100 STD CODE 0x0100
KALT_START KALT_START
;RESET MODE ;RESET MODE
CLRF BSR ;BANK 0 CLRF BSR ;BANK 0
@@ -154,8 +217,9 @@ KALT_START
MOVWF OSCCON MOVWF OSCCON
; div init ; 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 ;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'01000000' ;RA6 auf high
MOVLW B'11111111' ;DIRECTION: alles auf Input MOVWF PORTA ;#master(7)=0, REST=0
MOVLW B'11111111' ;alles auf Input
MOVWF TRISA 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 ;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 CLRF PORTB ;ALLES AUF 0
@@ -168,9 +232,9 @@ KALT_START
CLRF PORTD ;ALLES AUF 0 CLRF PORTD ;ALLES AUF 0
MOVWF TRISD ;ALLES AUF INPUT MOVWF TRISD ;ALLES AUF INPUT
;SET PORT E: **3:#MCLR **2:#PCI_RESET **1:PCI 3V3 **0:PIC LED (0=ON) ;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 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 ; set OVERvoltage detekt
MOVLW B'10011011' ;INT WENN <20>BER 3.9V MOVLW B'10011011' ;INT WENN <20>BER 3.9V
@@ -201,9 +265,17 @@ KALT_START
MOVWF MONTHS MOVWF MONTHS
MOVLW .42 MOVLW .42
MOVWF YEARS ;MONTAG 19.7.2010 12:00:00 (JAHR-1968) 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_ON_TIME
CLRF TASTE_OFF_TIME CLRF TASTE_OFF_TIME
CLRF POWER_ON_TIME CLRF POWER_ON_TIME
CLRF RX_STATUS
CLRF TX_STATUS
BSF PIE1,TMR1IE ;Enable Timer1 interrupt BSF PIE1,TMR1IE ;Enable Timer1 interrupt
;AD WANDLER INITIALISIEREN ;AD WANDLER INITIALISIEREN
CLRF AD_KANAL ;BEI 0 BEGINNEN CLRF AD_KANAL ;BEI 0 BEGINNEN
@@ -263,12 +335,14 @@ POWER_EIN
BCF TRISD,RD7 ;#RSTI AKTIVIEREN = LOW BCF TRISD,RD7 ;#RSTI AKTIVIEREN = LOW
BCF TRISB,RB4 ;PIC_INT AKTIVIEREN BCF TRISB,RB4 ;PIC_INT AKTIVIEREN
BCF TRISD,RD0 ;POWER ON BCF TRISD,RD0 ;POWER ON
BCF TRISA,RA6 ;PIC_AMKB_RX auf output
BRA LS_ON_POWER ;LADESTROM EINSTELLEN BRA LS_ON_POWER ;LADESTROM EINSTELLEN
POWER_AUS POWER_AUS
;CLOCK ;CLOCK
MOVLW CLK_SLEEP MOVLW CLK_SLEEP
MOVWF OSCCON MOVWF OSCCON
BSF TRISA,RA6 ;PIC_AMKB_RX auf input
BSF TRISD,RD0 ;POWER OFF BSF TRISD,RD0 ;POWER OFF
BSF TRISD,RD7 ;#RSTI DEAKTIVIEREN BSF TRISD,RD7 ;#RSTI DEAKTIVIEREN
BSF TRISB,RB4 ;PIC INT DEAKTIVIEREN BSF TRISB,RB4 ;PIC INT DEAKTIVIEREN
@@ -360,8 +434,8 @@ TG_END
INCF TASTE_ON_TIME ;ERH<52>HEN INCF TASTE_ON_TIME ;ERH<52>HEN
RETURN RETURN
RESETEN RESETEN
BCF TRISD,RD7 ;NEIN-> #RSTI AKTIVIEREN =LOW -->>>RESET
CALL SERIAL_OFF ;SERIELL DEAKTIVIEREN CALL SERIAL_OFF ;SERIELL DEAKTIVIEREN
BCF TRISD,RD7 ;NEIN-> #RSTI AKTIVIEREN =LOW -->>>RESET
BRA TG_ON_POWER3 BRA TG_ON_POWER3
;**********************************************************************************************""""""""""""" ;**********************************************************************************************"""""""""""""
;----------------------------------------- INTERRUPTS ;----------------------------------------- INTERRUPTS
@@ -388,7 +462,7 @@ TX_ISR1
BRA TX_ISR2 ;NEIN-> BRA TX_ISR2 ;NEIN->
MOVFF POSTINC0,TXREG ;BYT SENDEN MOVFF POSTINC0,TXREG ;BYT SENDEN
MOVLW 0xC3 ;SCHON LETZTES BYTS? MOVLW 0xC3 ;SCHON LETZTES BYTS?
CPFSGT FSR0L ;SKIP WENN FERTIG CPFSEQ FSR0L ;SKIP WENN FERTIG
RETFIE ;NEIN WEITERE SENDEN RETFIE ;NEIN WEITERE SENDEN
TX_ISR2 TX_ISR2
BRA TX_ISR_FERTIG BRA TX_ISR_FERTIG
@@ -400,28 +474,33 @@ RX_ISR ; BYT RECEIVED
MOVLW SYNC4 ;IM SYNC STATUS? MOVLW SYNC4 ;IM SYNC STATUS?
CPFSLT RX_STATUS ;SKIP WENN NEIN CPFSLT RX_STATUS ;SKIP WENN NEIN
BRA RX_SYNC_START ;JA -> ZUERST SYNC EMPFANGEN BRA RX_SYNC_START ;JA -> ZUERST SYNC EMPFANGEN
;--------------- ;RTC DATEN EMPFANGEN? -----------------------------------------------------------------------------------
MOVLW RTCD_FROM_MCF ; DATEN VOM MCF CODE 0x82? MOVLW RTCD_FROM_MCF ; DATEN VOM MCF CODE 0x82?
CPFSEQ RX_STATUS ; WENN JA-> SKIP CPFSEQ RX_STATUS ; WENN JA-> SKIP
BRA RX_ISR1 ; NEIN-> BRA RX_ISR1 ; NEIN->
;64 BYT EMPFANGEN ------------------------------------- ;64 BYT EMPFANGEN -------------------------------------
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+) MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
MOVLW 0x3F ;64 BYT <20>BERTRAGEN? MOVLW 0x40 ;64 BYT <20>BERTRAGEN?
CPFSLT FSR1L ;NEIN ->SKIP CPFSLT FSR1L ;NEIN ->SKIP
CLRF RX_STATUS ;JA FERTIG CLRF RX_STATUS ;JA FERTIG
RETFIE RETFIE
;------------------------------------------------------------------------------------- ; SETZEN? ---------------------------------------------------
RX_ISR1 RX_ISR1
TSTFSZ RX_STATUS ;TASK H<>NGIG?
BRA RX_ISR2 ;JA ->
CPFSEQ RX_B ;BLOCK HEADER 0X82? CPFSEQ RX_B ;BLOCK HEADER 0X82?
BRA RX_ISR2 ;NEIN-> BRA RX_ISR2 ;NEIN->
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
LFSR 1,.0 ;BYT COUNTER AUF O LFSR 1,.0 ;BYT COUNTER AUF O
RETFIE RETFIE
; RTC DATEN SENDEN? -------------------------------------------------------------------------------------
RX_ISR2 RX_ISR2
MOVLW REQ_RTCD_FROM_PIC ;DATEN SENDEN? MOVLW REQ_RTCD_FROM_PIC ;DATEN SENDEN?
TSTFSZ RX_STATUS ;TASK H<>NGIG?
BRA RX_ISR3 ;JA ->
CPFSEQ RX_B ;SKIP WENN JA CPFSEQ RX_B ;SKIP WENN JA
BRA RX_ISR3 ;SONST NEXT BRA RX_ISR3 ;SONST NEXT
;BLOCK HEADER UND 64 BYT SENDEN ----------------------------------------- ;BLOCK HEADER UND 64 BYT SENDEN -----------
LFSR 0,.0 LFSR 0,.0
BCF PIR1,TXIF ;INTERRUPT FLAG L<>SCHEN BCF PIR1,TXIF ;INTERRUPT FLAG L<>SCHEN
BSF PIE1,TXIE ;Enable interrupt BSF PIE1,TXIE ;Enable interrupt
@@ -430,9 +509,11 @@ RX_ISR2
MOVWF TXREG ;BLOCK HEADER = 0X81 MOVWF TXREG ;BLOCK HEADER = 0X81
CLRF RX_STATUS ;STATUS R<>CKSETZEN CLRF RX_STATUS ;STATUS R<>CKSETZEN
RETFIE ;UND WEG RETFIE ;UND WEG
;------------------------------------------------------------------------------------- ;EXT SUB INT STARTEN?-------------------------------------------------------------------------------------
RX_ISR3 RX_ISR3
MOVLW EXT_SUB_GO ;EXT SUB FREIGEBEN? MOVLW EXT_SUB_GO ;EXT SUB FREIGEBEN?
TSTFSZ RX_STATUS ;TASK H<>NGIG?
BRA RX_ISR4 ;JA ->
CPFSEQ RX_B CPFSEQ RX_B
BRA RX_ISR4 ;NEIN-> BRA RX_ISR4 ;NEIN->
;EXT SUBS FREIGEBEN -------------------------------------------------------------- ;EXT SUBS FREIGEBEN --------------------------------------------------------------
@@ -454,9 +535,11 @@ RX_ISR3
MOVFF TABLAT,GO_SUB ;EXTERNE SUBROUTINES AKTIVIEREN WENN OK MOVFF TABLAT,GO_SUB ;EXTERNE SUBROUTINES AKTIVIEREN WENN OK
CLRF RX_STATUS ;STATUS R<>CKSETZEN CLRF RX_STATUS ;STATUS R<>CKSETZEN
RETFIE ;UND WEG RETFIE ;UND WEG
;------------------------------------------------------------------------------------- ;EXT SUB INT STOPPEN? -------------------------------------------------------------------------------------
RX_ISR4 RX_ISR4
MOVLW EXT_SUB_STOP ;EXT SUB STOPPEN? MOVLW EXT_SUB_STOP ;EXT SUB STOPPEN?
TSTFSZ RX_STATUS ;TASK H<>NGIG?
BRA RX_ISR5 ;JA ->
CPFSEQ RX_B CPFSEQ RX_B
BRA RX_ISR5 ;NEIN-> BRA RX_ISR5 ;NEIN->
;EXT SUBS STOPPEN -------------------------------------------------------------- ;EXT SUBS STOPPEN --------------------------------------------------------------
@@ -464,36 +547,36 @@ RX_ISR4
CLRF GO_SUB ;STOPPEN CLRF GO_SUB ;STOPPEN
CLRF RX_STATUS ;STATUS R<>CKSETZEN CLRF RX_STATUS ;STATUS R<>CKSETZEN
RETFIE ;UND WEG RETFIE ;UND WEG
;------------------------------------------------------------------------------------- ;REQ BLOCK? -------------------------------------------------------------------------------------
RX_ISR5 RX_ISR5
MOVLW REQ_BLOCK ;REQ BLOCK? MOVLW REQ_BLOCK ;REQ BLOCK?
TSTFSZ RX_STATUS ;TASK H<>NGIG? SKIP NON
BRA RX_ISR6 ;JA ->
CPFSEQ RX_B CPFSEQ RX_B
BRA RX_ISR6 ;NEIN-> BRA RX_ISR6 ;NEIN->
;REQ BLOCK ---------------------------------------------------------------- ;REQ BLOCK SETZEN
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
LFSR 1,TX_BUFFER ;BYT COUNTER AUF TX_BUFFER -> GLEICH EINTRAGEN LFSR 1,TX_BUFFER ;BYT COUNTER AUF TX_BUFFER -> GLEICH EINTRAGEN
RETFIE RETFIE
RX_ISR6 RX_ISR6
CPFSEQ RX_STATUS ;REQ BLOCK ADRESSE EMPFANGFEN? CPFSEQ RX_STATUS ;REQ BLOCK ADRESSE EMPFANGFEN?
BRA RX_ISR7 ;NEIN-> BRA RX_ISR7 ;NEIN->
;3 BYT EMPFANGEN ------------------------------------- ;3 BYT EMPFANGEN ---------------------------
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+) MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
MOVLW 0x82 ;3 BYT <20>BERTRAGEN? (BUFFER BEGINNT BEI 0x180 MOVLW 0x83 ;3 BYT <20>BERTRAGEN? (BUFFER BEGINNT BEI 0x180
CPFSLT FSR1L ;NEIN ->SKIP CPFSEQ FSR1L ;NEIN ->SKIP
BRA RX_RB3BOK RETFIE ;NEXT ->
RETFIE
RX_RB3BOK
LFSR 1,TX_BUFFER ;BYT RX COUNTER AUF TX_BUFFER LFSR 1,TX_BUFFER ;BYT RX COUNTER AUF TX_BUFFER
MOVFF POSTINC1,TBLPTRU ;ADRESSE EINTRAGEN MOVFF POSTINC1,TBLPTRU ;ADRESSE EINTRAGEN
MOVFF POSTINC1,TBLPTRH MOVFF POSTINC1,TBLPTRH
MOVFF POSTINC1,TBLPTRL 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 RX_RB3B2
TBLRD *+ ;LESEN UND NEXT TBLRD *+ ;LESEN UND NEXT
MOVFF TABLAT,POSTINC1 ;UND EINTRAGEN MOVFF TABLAT,POSTINC1 ;UND EINTRAGEN
CPFSEQ FSR1L ;WENN FERTIG ->SKIP CPFSEQ FSR1L ;WENN FERTIG ->SKIP
BRA RX_RB3B2 ;SONST LOOP 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 LFSR 0,TX_BUFFER ;TX COUNTER AUF TX_BUFFER
BCF PIR1,TXIF ;INTERRUPT FLAG L<>SCHEN BCF PIR1,TXIF ;INTERRUPT FLAG L<>SCHEN
BSF PIE1,TXIE ;Enable interrupt BSF PIE1,TXIE ;Enable interrupt
@@ -502,66 +585,129 @@ RX_RB3B2
MOVWF TXREG ;BLOCK HEADER = 0XA1 MOVWF TXREG ;BLOCK HEADER = 0XA1
CLRF RX_STATUS ;STATUS R<>CKSETZEN CLRF RX_STATUS ;STATUS R<>CKSETZEN
RETFIE ;UND WEG RETFIE ;UND WEG
;------------------------------------------------------------------------------------- ;PROGRAMM BLOCK? -------------------------------------------------------------------------------------
RX_ISR7 RX_ISR7
MOVLW WRITE_BLOCK ;WRITE BLOCK 0xA2 BYT EMPFANGEN? MOVLW WRITE_BLOCK ;WRITE BLOCK 0xA2 BYT EMPFANGEN?
CPFSEQ RX_STATUS ;WENN JA-> SKIP CPFSEQ RX_STATUS ;WENN JA-> SKIP
BRA RX_ISR8 ;NEIN-> BRA RX_ISR8 ;NEIN->
;WRITE BLOCK ---------------------------------------------------------------------------- ;WRITE BLOCK ------------------------
;67 BYT EMPFANGEN ------------------------------------- ;68 BYT EMPFANGEN: 3 BYT ADRESSE; 64 BYT DATEN; 1 BYT CHECKSUM -------------------
MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+) MOVFF RX_B,POSTINC1 ;HOLEN -> (CNT+)
MOVLW 0x42 ;67 BYT <20>BERTRAGEN? MOVLW 0x44 ;68 BYT <20>BERTRAGEN?
CPFSLT FSR1L ;WENN FERTIG ->SKIP CPFSEQ FSR1L ;WENN FERTIG ->SKIP
RETFIE 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 LFSR 1,RX_BUFFER ;BYT COUNTER AUF RX BUFFER
MOVFF POSTINC1,TBLPTRU ;TABLE POINTER SETZEN MOVLW 43h ;67 BYTES
MOVLW (EXTERN_INT_ADR & 0xFF0000)>>16 MOVWF RX_B ;COUNTER
CPFSLT TBLPTRU ;TEST OB WENIGER ALS ERLAUBT MOVLW 0h ;SUM CLEAR
BRA NO_PROG ;JA-> LOOP_TEST_CHECKSUM
MOVFF POSTINC1,TBLPTRH ;TABLE POINTER SETZEN ADDWF POSTINC1,0 ;ADD TO WREG
MOVLW (EXTERN_INT_ADR & 0x00FF00)>>8 DECFSZ RX_B ;-1 SKIP WENN 0
CPFSLT TBLPTRU ;TEST OB WENIGER ALS ERLAUBT BRA LOOP_TEST_CHECKSUM
BRA NO_PROG ;JA-> CPFSEQ POSTINC1 ;SUM = CHECKESUM? SKIP JA
MOVFF POSTINC1,TBLPTRL ;TABLE POINTER SETZEN BRA CHK_ERR ;NEIN CHECKSUM ERROR
;EREASE BLOCK BRA PROGRAMM_BLOCK ; OK-> PROGRAMMIEREN
BSF EECON1,EEPGD ; point to Flash program memory CHK_ERR
BCF EECON1,CFGS ; access Flash program memory MOVLW CHECKSUM_ERROR ; ERROR senden
BSF EECON1,WREN ; enable write to memory MOVWF TXREG;
BSF EECON1,FREE ; enable Row Erase operation CLRF RX_STATUS ; FERTIG
MOVLW 55h RETFIE
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
;WRITE BLOCK SETZEN? ;WRITE BLOCK SETZEN?
RX_ISR8 RX_ISR8
TSTFSZ RX_STATUS ;TASK H<>NGIG?
BRA RX_ISR9 ;JA ->
CPFSEQ RX_B ;BLOCK HEADER COMMANDOE 0XA2? CPFSEQ RX_B ;BLOCK HEADER COMMANDOE 0XA2?
BRA RX_ISR9 ;NEIN-> BRA RX_ISR9 ;NEIN->
MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT MOVWF RX_STATUS ;STATUS SETZEN = EMPFANGENES BYT
LFSR 1,RX_BUFFER ;BYT COUNTER AUF RX BUFFER LFSR 1,RX_BUFFER ;BYT COUNTER AUF RX BUFFER
RETFIE RETFIE
;------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------
RX_ISR9 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 CLRF RX_STATUS
RETFIE RETFIE
;------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------
@@ -612,17 +758,17 @@ RX_WAIT1
BTFSS TXSTA,TRMT BTFSS TXSTA,TRMT
BRA RX_WAIT1 BRA RX_WAIT1
MOVLW 'O' ;SENDE OK! MOVLW 'O' ;SENDE OK!
MOVWF TXREG; MOVWF TXREG
RX_WAIT2 RX_WAIT2
BTFSS TXSTA,TRMT BTFSS TXSTA,TRMT
BRA RX_WAIT2 BRA RX_WAIT2
MOVLW 'K' ;SENDE OK! MOVLW 'K' ;SENDE OK!
MOVWF TXREG; MOVWF TXREG
RX_WAIT3 RX_WAIT3
BTFSS TXSTA,TRMT BTFSS TXSTA,TRMT
BRA RX_WAIT3 BRA RX_WAIT3
MOVLW '!' MOVLW '!'
MOVWF TXREG; MOVWF TXREG
CLRF RX_STATUS ;OK START NORMAL CLRF RX_STATUS ;OK START NORMAL
RETFIE RETFIE
;**********************************************************************************************""""""""""""" ;**********************************************************************************************"""""""""""""
@@ -763,6 +909,20 @@ SEK_3
SEK_4 SEK_4
CLRF TICKS CLRF TICKS
INCF SECS ; Increment seconds 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? MOVLW .59 ; 60 seconds elapsed?
CPFSGT SECS CPFSGT SECS
RETFIE ;RETURN RETFIE ;RETURN
@@ -840,6 +1000,61 @@ NOT_SEP
; ENDE MAIN ; 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 end

Binary file not shown.