| |
| SETUP
|
SETUP
BSF 3,5
;Bank 1 kiezen: Instellen van in/out poorten gebeurt op bank1
MOVLW 6
MOVWF ADCON1
;Poort A op digitaal instellen
MOVLW B'001111'
;De pinnen die we niet gebruiken stellen we in als als output zodanig dat hun
toestand
MOVWF TRISA
;het programma niet zouden beinvloeden
MOVLW B'00111111'
MOVWF TRISB
MOVLW B'10000000'
MOVWF TRISC
MOVLW B'10000000'
MOVWF TRISD
MOVLW B'100'
MOVWF TRISE
BCF 3,5
;Bank 0 kiezen: Voor de zekerheid zetten we alle pinnen op nul
volt voor we het
programma runnen
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
CLRF STORENEW
CLRF STOREOLD
SETBAUD
;seriele poort
instellen
BSF 3,5
;Bank 1
BCF TRISC,6
;Maak RC6 - TX pin een output (pin voor
de seriele transmissie)
BSF TRISC,7
;Maak RC7 - RX pin een input (sequentiele
receiver)
BCF TXSTA,BRGH
;Selecteer low speed mode
MOVLW D'1'
MOVWF SPBRG
;31.250 KHz @ 4 MHz klok (cfr datasheet pic16f877a paragraaf 10)
BCF TXSTA,SYNC
;Kies async mode
BSF TXSTA,TXEN
;Maak seriele transmissie mogelijk
BCF 3,5
;Bank0
movlw 0x90
;Maak seriele receptie mogelijk B'1001
0000'
movwf RCSTA
movlw 0xc0
;globale en peripherische interupts
B'1100 0000'
movwf INTCON
BSF 3,5
;Bank 1
movlw 0x20
;RX interupts
movwf PIE1
BCF 3,5
;Bank 0
MOVLW B'00010000' ;één pin
constant op 1 voor het vaccuum trekken
MOVWF JOYSTICK
| ROBTOPC
|
ROBTOPC
MOVF PORTA,W
;channel opslaan
MOVWF CHAN
MOVF PORTB,W
; actie die robot doet
opslaan in storenew
MOVWF STORENEW
MOVF STORENEW,W
ANDLW B'00001100'
;tijdens stilstand stuurt robot xxxx00xx (de 00 zegt
dat alle poten op de wand zijn) tijdens een beweging
BTFSC STATUS,Z
;zal slechts één van die 0'en een
1 zijn en het resultaat niet 0 --> status, z = 0 en de inhoud van poortB
GOTO ROBTOPC
;moet naar midi gestuurd worden om
een noot te spelen in Max --> GOTO SEND
CALL SEND
;bij stilstand is het resultaat nul --> status,z = 1 en er moet geen actie worden
uitgevoerd--> GOTO ROBTOPC
GOTO ROBTOPC
;na SEND, moet dit alles opnieuw
gechecked worden --> GOTO ROBTOPC
SEND: ;noteon
MOVFW CHAN
;steek waarde van
channel in w-reg
ADDLW D'144'
;waarde voor note
on (1001xxxx)
CALL OUTIT
;output eerste midi byte, channel
MOVF PORTB,W
;Midi noot die bij bepaalde
beweging hoort
CALL OUTIT
;output de byte
MOVLW D'64'
;waarde van
velocity (0 = off 127 = max volume)
CALL OUTIT
;output de byte
;noteoff
MOVFW CHAN
ADDLW D'128'
;waarde voor note
off (1000xxxx)
CALL OUTIT
;output de MIDI channel byte
MOVF PORTB,W
CALL OUTIT
MOVLW D'64'
;waarde
voor velocity value (0 = off 127 = max volume)
CALL OUTIT
MOVF
STORENEW,W ;steek gebruikte data in storeold
MOVWF STOREOLD
MOVF PORTB,W
;Haal nieuwe data op poort B
MOVWF STORENEW
MOVF STORENEW,W
ANDLW B'00001100'
;Ga na of robot nog beweegt
BTFSC STATUS,Z
GOTO SEND
SUBWF
STOREOLD
BTFSS STATUS,Z
GOTO SEND
OUTIT
BTFSS PIR1,4
;wacht voor bit 4 = 1
;txreg empty dan leeg
GOTO OUTIT
MOVWF TXREG
;steek in txregister
voor autotransmissie
RETURN
| PCTOROB
|
PCTOROB:
MOVWF
WREG_TEMP ;bewaar RCREG in tijdelijke
WREG_TEMP
MOVF
STATUS,W ;bewaar STATUS
via W-register in tijdelijke STATUS_TEMP
CLRF
STATUS
;ga naar bank 0
MOVWF
STATUS_TEMP ;
MOVF
PCLATH,W ;bewaar PCLATH
in WREG
MOVWF
PCLATH_TEMP ;bewaar PCLATH in tijdelijke file
CLRF
PCLATH
;selecteer pagina 0 in program memory
MOVF FSR,W
;bewaar FSR in WREG
MOVWF
FSR_TEMP ;sla FSR
op in tijdelijke FSR_TEMP file
Bank0
;select bank0
BTFSC
PIR1,RCIF
;test de RCIF receive
interrupt
BSF
STATUS,RP0 ;ga naar
bank 1 indien RCIF geset is
BTFSC
PIE1,RCIE
;test of interrupt
ingeschakeld indien RCIF geset
GOTO GetData
;indien zowel RCIF en RCIE geset kan er
informatie langsheen RCREG gekregen worden
;can do special error handling here - an unexpected interrupt occurred
EndInt:
BCF 3,5
;selecteer
bank 0
MOVF FSR_TEMP,W
;haal de
tijdelijk bestand FSR weer op
MOVWF FSR
;herstel
FSR
MOVF PCLATH_TEMP,W
;haal de tijdelijk bestand PCLATH weer op
MOVWF PCLATH
;herstel
PCLATH
MOVF STATUS_TEMP,W
;haal de tijdelijk bestand STATUS weer op
MOVWF STATUS
;herstel
STATUS
SWAPF
WREG_TEMP,F ;recupereer W-register
SWAPF
WREG_TEMP,W ;en dit zonder status te wijzigen
RETFIE
;na
interrupt terug naar Robtopc
;******************************************************************************
GetData:
BCF
3,5
BTFSC
RCSTA,OERR
;check de overrun error flag
GOTO ErrOERR
;RCSTA,OERR = 1 --> fout
opgetreden --> GOTO ErrOERRr
BTFSC
RCSTA,FERR
;RCSTA,OERR = 0 --> geen fout, check
de framing error--> GOTO ErrFERR
GOTO ErrFERR
MOVF
COUNTER,W
;start:
counter =0, dan dienen er drie bytes ingelezen te worden, dit gebeurt met een
schuifsysteem
SUBLW B'00000011'
;bij
elke ingelezen byte wordt de counter met 1 verhoogd, eens counter = 3 moet de lus opnieuw
begonnen worden
BTFSS STATUS,Z
;moet
moet de data 1 opgeschoven worden en de lus opnieuw beginnen
GOTO $+3
MOVLW B'00000000'
MOVWF COUNTER
MOVF
DATAIN2,W
;Verplaats de laatst
gekregen data naar een volgende register
MOVWF DATAIN3
MOVF
DATAIN1,W
;Verplaats de laatst
gekregen data naar een volgende register
MOVWF DATAIN2
MOVF RCREG,W
;receiven van een derde byte
MOVWF DATAIN1
;kopiëren naar datain1
INCF COUNTER,COUNTER
;counter 1 verhogen
MOVF COUNTER,W
SUBLW B'00000011'
BTFSS STATUS,Z
;ga na of
de laatste databyte een 0 was
GOTO BlockNotComplete
; indien ja, moet er gewacht worden voor een volgende byte
Bank0
MOVF
DATAIN3,W
;velocity in vuilbak
MOVWF GARBAGE
MOVF
DATAIN2,W
;noot naar joystick
ADDLW B'00100000'
MOVWF JOYSTICK
MOVWF PORTD
movf
DATAIN1,W
;channel in vuilbak
movwf GARBAGE
BlockNotComplete:
GOTO EndInt
;fout tgv overrun error, de overrun error bit flag OERR is set, deze moet gecleared worden
en dan verder gaan met programma
ErrOERR:
BCF RCSTA,CREN
; receiver resetten en terug setten
BSF RCSTA,CREN
GOTO EndInt
;framing error opgetreden, FERR is geset, clearen en verdergaan met programma
ErrFERR:
MOVF RCREG,W
;negeer
de data met een fout
GOTO EndInt
|