.title "RXBYTE" ; Titolo del programma .vers "ST62E10" ; Microprocessore usato .w_on ; Abilita la memoria a finestre ; 8 Mhz ;vers 31/7/96 ;---------------------------------------------------------------------------- ;| VARIABILI DEL MICROPROCESSORE | a .def 0ffh ;Registro accumulatore x .def 080h ;Registro x y .def 081h ;Registro y v .def 082h ;Registro v w .def 083h ;Registro w port_a .def 0c0h ;Registro Dati porta A port_b .def 0c1h ;Registro Dati porta B port_c .def 0c2h ;Registro Dati porta C pdir_a .def 0c4h ;Registro Direzione porta A pdir_b .def 0c5h ;Registro Direzione porta B pdir_c .def 0c6h ;Registro Direzione porta C popt_a .def 0cch ;Registro Opzioni porta A popt_b .def 0cdh ;Registro Opzioni porta B popt_c .def 0ceh ;Registro Opzioni porta C ior .def 0c8h ;Registro Opzioni per le Interruzioni addr .def 0d0h ;Registro Dati dell'A/D converter adcr .def 0d1h ;Registro di Controllo dell'A/D converter psc .def 0d2h ;Registro per il Prescaler del Timer tcr .def 0d3h ;Registro Dati del Timer tscr .def 0d4h ;Registro TSCR del Timer wdog .def 0d8h ;Registro del WatchDog drw .def 0c9h ;Registro della zona dati ROM (Rom Data Window) ;-------------------------------------- ;VARIABILI usate da questo PROGRAMMA ;-------------------------------------- prima_var .def 084h ;fino a 0bfh massimo ;------------------------ ;SETTAGGIO INIZIALE ;------------------------ .org 0880h inizio ldi wdog,0ffh ;Carico il Watch-Dog. ;*** Setta la porta A ldi port_a,00000000b ;pa0=input ldi pdir_a,00000000b ldi popt_a,00000000b ;*** Setta la porta B ldi port_b,00000000b ;default out=0 ldi pdir_b,11111111b ;tutti out ldi popt_b,11111111b reti jp main ;------------------------ ;GESTORI di INTERRUPT ;------------------------ ad_int reti tim_int reti BC_int reti A_int reti nmi_int reti ;------------------------ ;PROGRAMMA PRINCIPALE ;------------------------ main ldi wdog,255 ;RICEVE UN BYTE ldi w,25 ;resta in questo loop fino a che input testa jrs 0,port_a,main ;da alto torna basso e permane + di un T dec w ;per assicurarsi che sia un nuovo byte jrnz testa ldi x,8 ;numero bit da ricevere x confronto input ldi wdog,255 jrr 0,port_a,input ;resta qui se non riceve dalla linea ldi w,13 ;predispone per la campionatura a 1/2 T decr dec w jrnz decr jrr 0,port_a,zero ;se dopo 1/2 T e` 0 salta uno set 0,a ;altrimenti setta bit0 di a dec x ;conta un bit ricevuto jrz out ;se sono finiti salta sla a ;altrimenti sposta a sinistra bit0 e preapara resta jrs 0,port_a,resta ;per il prossimo jp input ;se linea =1 resta altrimenti input out ld port_b,a ;ha ricevuto il byte e lo mette su port_b jp main ;ricomincia per altro byte zero res 0,a ;bit0= 0 dec x jrz out ;se sono finiti salta sla a ;altrimenti sposta a sinistra e libera x prox jp input ;ne aspetta un altro ;------------------------- ;VETTORI DI INTERRUPTS ;------------------------- .org 0ff0h jp ad_int ;A/D int vector #4 jp tim_int ;timer int vector #3 jp BC_int ;port B & C int vector #2 jp A_int ;port A int vector #1 .org 0ffch jp nmi_int ;nmi int vector #0 jp inizio ;reset vector .end ; Fine del programma