Assemblercode
Home Up flowcharts Assemblercode

 

 

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