;-----------------------------------------------------------------------------
; DBGDEMO.ASM - Programma dimostrativo multitasking e debug
; By Claudio Fin - Ultimo aggiornamento 20/02/2001
;-----------------------------------------------------------------------------


;-----------------------------------------------------------------------------
; USO PORTE:
;
; RA0 out      Uscita led
; RA1 out
; RA2 out
; RA3 out
; RA4 out(oc)  Uscita seriale
;
; RB0 in(p-up) Ingresso 0
; RB1 in(p-up) Ingresso 1 
; RB2 in(p-up) Ingresso 2
; RB3 in(p-up) Ingresso 3
; RB4 in(p-up) Ingresso 4
; RB5 in(p-up) Ingresso 5
; RB6 in(p-up) Ingresso 6
; RB7 in(p-up) Ingresso 7
;-----------------------------------------------------------------------------


;-----------------------------------------------------------------------------
; DEFINIZIONI
;-----------------------------------------------------------------------------

                PROCESSOR       16F84a     ;clock 4 Mhz
                RADIX           DEC
                INCLUDE         "P16F84a.INC"
                INCLUDE         "pwrasm.inc"
                __CONFIG        1111111110001b

#define         serout  PORTA,4

;-----------------------------------------------------------------------------
; VARIABILI
;-----------------------------------------------------------------------------

                ORG     0CH

txdelay         RES     1    ;ritardo per temporizzazione bit
txbyte          RES     1    ;byte da trasmettere
txcontabit      RES     1    ;conteggio bit trasmessi

dbg1            RES     1    ;primo   byte debug
dbg2            RES     1    ;secondo byte debug
dbg3            RES     1    ;terzo   byte debug
dbg4            RES     1    ;quarto  byte debug
dbgchk          RES     1    ;checksum
dbgsta          RES     1    ;stato processo debug
dbgcont         RES     1    ;contatore per processo debug

ledsta          RES     1    ;stato task led
ledcont         RES     1    ;contatore task led


;-----------------------------------------------------------------------------
; PROGRAMMA
;-----------------------------------------------------------------------------

                ORG 0


;---------------PREDISPOSIZIONE PORTE

                Ldf PORTA,10000B        ;prescrive valore su PORTA
                Bank1
                clrf TRISA              ;Predispone porta A come uscite
                bcf OPTION_REG,7        ;Attiva pull-ups su porta B
                Bank0
                Ldf PORTA,10000B        ;prescrive valore su PORTA


;---------------PREDISPOSIZIONE TIMER

                Bank1
                bcf OPTION_REG,3        ;prescaler assegnato a tmr0
                bcf OPTION_REG,5        ;conteggio da clock interno
                bcf OPTION_REG,2        ;divisione prescaler per 16


;---------------INIZIALIZZAZIONE VARIABILI

                Bank0
                clrf dbgsta
                clrf ledsta
                Ldf ledcont,122

                clrf TMR0  
                bcf INTCON,T0IF            ;azzera bit timer


;---------------LOOP PRINCIPALE CHE CHIAMA I PROCESSI OGNI 4,096 mS

mainloop        Waitnb INTCON,T0IF         ;attesa timeout timer
                bcf INTCON,T0IF            ;riazzera bit timer

                Movff PORTB,dbg1           ;mette PORTB in dbg1
                clrf dbg2
                clrf dbg3
                clrf dbg4
                call debug                 ;chiama task debug

                call led                   ;chiama task led

                goto mainloop

;-----------------------------------------------------------------------------
; PROCESSO DI TRASMISSIONE PER DEBUG Invia una trama di 4 bytes preceduti
; da un chr 170 e seguiti da un checksum che e' la somma dei bytes precedenti.
; Viene inviato un byte ad ogni chiamata e tra una trama a l'altra c'e' una
; pausa di 10 cicli elaborativi (circa 41 mS a 4,096 mS per ciclo).
; Il task e' formato da 6 stati ciascuno dei quali trasmette un byte e uno
; stato di attesa di circa 40mS (tempo intertrama)
;-----------------------------------------------------------------------------

debug           Cpje dbgsta,0,debug0
                Cpje dbgsta,1,debug1
                Cpje dbgsta,2,debug2
                Cpje dbgsta,3,debug3
                Cpje dbgsta,4,debug4
                Cpje dbgsta,5,debug5

debug6          decfsz dbgcont,f
                return
                clrf dbgsta
                return

debug0          Ldf dbgchk,170
                call sertx
                incf dbgsta,f
                return

debug1          Addff dbgchk,dbg1
                call sertx
                incf dbgsta,f
                return

debug2          Addff dbgchk,dbg2
                call sertx
                incf dbgsta,f
                return

debug3          Addff dbgchk,dbg3
                call sertx
                incf dbgsta,f
                return

debug4          Addff dbgchk,dbg4
                call sertx
                incf dbgsta,f
                return

debug5          movf dbgchk,w
                call sertx
                Ldf dbgcont,10
                incf dbgsta,f
                return

;-----------------------------------------------------------------------------
; TRASMISSIONE SERIALE 9600,n,8,2 (deve essere attivo il banco 0)
;-----------------------------------------------------------------------------

sertx      movwf txbyte
           bcf serout                ;start bit a 0
           Delay txdelay,31          ;ritardo 1 bit
           Nop2
           Ldf txcontabit,8          ;8 bit da trasmettere
txla4          rrf txbyte,f          ;scorre un bit nel flag C
               Jc txla6
               nop
               bcf serout            ;se 0 abbassa bit tx
               goto txla2
txla6          bsf serout            ;altrimenti lo alza
               Nop2
txla2          Delay txdelay,31      ;ritardo 1 bit
           Djnz txcontabit,txla4     ;ciclo di 8 bit
           Nop2
           Nop2
           nop
           bsf serout                 ;stop bits a 1
txla5      Delay txdelay,69           ;ciclo di ritardo
           return

;-----------------------------------------------------------------------------
; PROCESSO LAMPEGGIO LED
;-----------------------------------------------------------------------------

led        Cpje ledsta,0,led0

led1       bcf PORTA,0                ;led spento
           decfsz ledcont,f
           return
           Ldf ledcont,122
           decf ledsta,f
           return

led0       bsf PORTA,0                ;led acceso
           decfsz ledcont,f
           return
           Ldf ledcont,122            ;imposta tempo circa 0,499 Sec
           incf ledsta,f
           return

;-----------------------------------------------------------------------------

           END