Sei sulla pagina 1di 33

CALCOLATORI ELETTRONICI Esercitazione finale

Non in questo senso

Only one will survive

student
2

Siamo partiti da
John von Neumann wrote "First Draft of a Report on the EDVAC, 1945 Dispositivi di ingresso: Tastiera Mouse Scanner Sensori Ecc.. Dispositivi di uscita: Monitor Stampante Attuatori Ecc...

CALCOLATORE ELETTRONICO
Memoria principale Unit di elaborazione (CPU)

PROGRAMMA DATI

ALU REGISTRI

Bus di sistema

Altri CALCOLATORI collegati in rete

Ingressi e uscite locali

REGISTRI DI STATO REGISTRI DI TRANSITO


Interfacce di I/O

Rete

per arrivare a
CPU
INT INTA Logica di generazione dei CS

CS# memoria e I/O Bus Comandi Bus Indirizzi Bus Dati

Chip di memoria (RAM e EPROM)

8259
INTRs

Interfacce di I/O gestite a interrupt

Interfacce di I/O gestite a polling

Sotto-sistema di I/O
4

IL SISTEMA

Interfaccia LED

Interfaccia OROLOGIO

COM1

Interfaccia Seriale 1 Interfaccia Seriale 2 Interfaccia Seriale 3

COM2

CPU + PIC + Memorie

Interfaccia INTERRUTORI

COM3

Fck = 1Hz
5

Funzionamento
Il sistema riceve di continuo dei dati dalla COM1. I dati sono costituiti da messaggi di dimensione pari ad 1KB. Ricevuto un intero messaggio, il sistema deve trasferire lintero messaggio sulla COM2 o sulla COM3 sulla base del valore corrente degli interruttori (interpretato come byte senza segno): per valori compresi tra 0 e 127 il messaggio deve essere trasferito verso la COM2, altrimenti verso la COM3. Durante la trasmissione di un messaggio il sistema deve essere in grado di ricevere un nuovo messaggio dalla COM1. Il sistema deve inoltre, sulla base del valore corrente degli interruttori, eseguire di continuo delle routine (tasks). Lindirizzo della routine corrente da eseguire memorizzato in una tabella (tabella dei tasks). Lindice di accesso alla tabella rappresentato dal valore letto dagli interruttori (interpretato anche in questo caso come byte senza segno). A tal proposito si consideri che listruzione CALLR, consente di specificare come operando un registro. Il valore corrente degli interruttori deve essere riportato in uscita su 8 led, il cui scopo appunto quello di visualizzare la programmazione corrente del sistema.

IPOTESI
Le interfacce seriali sono realizzate con 8250 e vengono tutte e tre gestite a interrupt Lorologio deve essere gestito ad interrupt La priorit delle routine di interrupt deve essere la seguente:
RX_COM1 TX_COM2 TX_COM3 CLOCK

Gli INTERRUTTORI vengono gestiti a polling CHIP di memoria (spazio da 4GB)


32KB+64KB di EPROM agli indirizzi alti 32MB+128MB di RAM agli indirizzi bassi

Dispositivi di I/0 (spazio da 64KB)


PIC: 0200-0201H Interruttori: FFFFH COM1: 01F8-01FFH COM2: 02F8-02FFH COM3: 03F8-03FFH LED: 0000H Orologio: 0100-0103H

Quesiti
HARDWARE:
Chip Select: RAM, EPROM e I/O (Mem: 4 GB, I/O: 64 KB) Interfacciamento dei dispositivi di I/0

SOFTWARE:
Main Tabella degli interrupt Tabella dei tasks (subito dopo la fine della tabella degli interrupt) Routine di gestione degli interrupt Esempio della struttura del codice di un task
8

CS Memorie
EPROM1 64KB (16 bit di indirizzamento) FFFFFFFFH

FFFF0000H EPROM2 32KB (15 bit di indirizzamento) RAM2 32 MB (25 bit di indirizzamento) RAM1 128MB (27 bit di indirizzamento) 09FFFFFFH FFFEFFFFH FFFE8000H

RAM1: 128 MB 27 bit 5 bit costanti RAM2: 32 MB 25 bit 7 bit costanti EPROM1: 64 KB 16 bit 16 bit costanti EPROM2: 32 KB 15 bit 17 bit costanti Decodifica completa:
CS_EPROM1 CS_EPROM2 CS_RAM1 = CS_RAM2 = = BA31 .. BA16 = BA31 .. BA17 /BA16 BA15 /BA31 BA30 BA29 BA28 /BA27 /BA31 BA30 BA29 /BA28 BA27 /BA26 /BA25

08000000H 07FFFFFFH

00000000H

Pu essere invertito il mapping di RAM1 e RAM2? E di EPROM1 e EPROM2? Perch?

CS Memorie
BA EPROM1 EPROM2 RAM1 RAM2 31 1 1 0 0 30 1 1 0 0 29 1 1 0 0 28 1 1 0 0 27 1 1 0 1 26 1 1 x 0 25 1 1 x 0 24 1 1 x x 23 1 1 x x 22 1 1 x x 21 1 1 x x 20 1 1 x x 19 1 1 x x 18 1 1 x x 17 1 1 x x 16 1 0 x x

Identifica RAM2 rispetto a RAM1

Identifica univocamente RAM1

Identifica univocamente RAM2 rispetto a EPROM1 e EPROM2 Permette di distinguere EPROM1 e EPROM2 da RAM1 e RAM2 Permette di distinguere EPROM1 da EPROM2

Decodifica semplificata: CS_EPROM1 = BA31 BA16 CS_EPROM1# = /BA31 + /BA16 CS_EPROM2 = BA31 /BA16 CS_EPROM2# = /BA31 + BA16 CS_RAM1= /BA27 CS_RAM1#= BA27 CS_RAM2 = /BA31 BA27 CS_RAM2# = BA31 + /BA27

10

CS dispositivi di I/O
Decodifica semplificata: 1. 2. 3. 4. 5. 6. 7. SWITCH: FFFFH (1 byte) CS_SWITCH# = /BA15 CLOCK: 0100-0103H (4 bytes) CS_CLOCK# = /BA8 + BA7 PIC: 0200-0201H (2 bytes) CS_PIC# = /BA9 + BA7 LED: 0000H (1 byte) CS_LED# = BA9 + BA8 COM1: 01F8-01FFH (8 bytes) CS_COM1# = BA9 + /BA7 COM2: 02F8-02FFH (8 bytes) CS_COM2# = BA8 + /BA7 COM3: 03F8-03FFH (8 bytes) CS_COM3# = BA15 + /BA9 + /BA8 BA CLOCK PIC SWITCH LED COM1 COM2 COM3 1 5 0 0 1 0 0 0 0 1 4 0 0 1 0 0 0 0 1 3 0 0 1 0 0 0 0 1 2 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 9 0 1 1 0 0 1 1 8 1 0 1 0 1 0 1 7 0 0 1 0 1 1 1 6 0 0 1 0 1 1 1 5 0 0 1 0 1 1 1 4 0 0 1 0 1 1 1 3 0 0 1 0 1 1 1 2 0 0 1 0 x x x 1 x 0 1 0 x x x 0 x x 1 0 x x x 11

Interruttori: input
CS_SWITCH#
Vcc Vcc Vcc

IORDC#

S7

S6

S0

IN[7..0] EN1* EN2*

244
OUT[7..0]

BD[7] BD[6]

BD[0] 12

Led: output

L7

L6

L0

CS_LED# O[7..0] CK IOWRC# BD[7] BD[6]

373
D[7..0]

OE*

BD[0]

13

Interfacce seriali 8250 (COM1, COM2, COM3)


CS_COM1# CS_COM2# CS_COM3#

BA[2..0] IOWRC# IORDC# BD[7..0]

IR_COM1 IR_COM2 IR_COM3

CS* A[2..0] WR* RD* D[7..0] INT

TX RX

8250

Sar presente un 8250 per ogni porta seriale presente nel sistema (in questo caso 3)
14

Interfaccia verso il clock


CS_CLOCK# BA[1..0] IOWRC# BD[7..0]

CS* A[1..0] WR* D[7..0]

Interfaccia orologio

A[1..0] Ore Minuti Secondi 00 01 10

Mapping dei registri interni dellinterfaccia


15

PIC (Programmable Interrupt Controller) 8259


CS_PIC# BA0 IOWRC# IORDC# BD[7..0] Alla CPU Dalla CPU

CS* A0 WR* RD* D[7..0] INT INTA*

IR0 IR1 IR2 IR3

IR_COM1 IR_COM2 IR_COM3 IR_CLOCK Fck = 1Hz

8259

16

Tabella degli interrupt


Valore di ICW2 F8H F0H E8H E0H 18H 10H 08H 00H Interrupt types F8H..FFH F0H..F7H E8H..EFH E0H..E7H 18H..1FH 10H..17H 08H..0FH 00H..07H Indirizzo simbolico della routine INT_CLOCK INT_COM3 INT_COM2 INT_COM1 ES: se programmiamo il PIC con ICW2 = F8H, avremo che gli interrupt type associati ai vari dispositivi risulteranno essere: COM1 : n = F8H COM2 : n = F9H COM3 : n = FAH CLOCK: n = FBH Indirizzo in memoria

3FC-3FFH 3F8-3FBH 3F4-3F7H 3F0-3F3H 3EC-3EFH 3E8-3EBH 3E4-3E7H 3E0-3E3H 004-007H 000-003H

Frammento della IVT 3E0H


17

F8H * 4

1111 1000 00

Tabella dei tasks


Supponiamo che la tabella inizi subito dopo la fine della IVT. Ogni elemento della tabella contiene lindirizzo in memoria del task da eseguire. Ogni elemento sar quindi costituito da 4 byte e la tabella di 256 elementi risulter quindi di dimensione pari a 1KB.
Indirizzo Task255 Indirizzo Task0 7FFH 7FCH 403H 400H 3FFH IVT 000H

Per eseguire un determinato task, la CPU sulla base di un indice i di 1 byte, acceder alla tabella per recuperare lindirizzo della routine da eseguire ed eseguir una CALLR a quellindirizzo: taskIndex taskTable LBU MULTI LW CALLR DB EQU 1 400H
Byte senza segno!

R1,taskIndex(R0) R1,R1,4 R2,taskTable(R1) R2


18

Dispositivi di I/O: PIC, CLOCK, SWITCH, LED


;Nomi simbolici dei registri del PIC ICW1 EQU 200H ICW2 EQU 201H ICW4 EQU 201H OCW1 EQU 201H OCW2 EQU 200H ;Parole di comando del PIC RESET EQU ADDRESS EQU EN_AEOI EQU MASK EQU EOI EQU

13H F8H 1H 0H 20H

; linterrupt viene rilevato sul fronte (1BH = a livello) ; 5 bit pi significativi dellinterrupt type ; AEOI disabilitato (3H = abilitato) ; 8 bit di maschera (0: non mascherato,1: mascherato) ; da inviare per segnalare la fine della routine

;Nomi simbolici per i registri del CLOCK CLOCK_S EQU 100H CLOCK_M EQU 101H CLOCK_H EQU 102H ;Indirizzo degli SWITCH SWITCH EQU ;Indirizzo dei LED LED

FFFFH

EQU

0000H

19

Dispositivi di I/O: COM1, COM2, COM3


; nomi simbolici per i registri di COM1 RBR1 EQU 01F8H ;DLAB = 0 THR1 EQU 01F8H ;DLAB = 0 DLL1 EQU 01F8H ;DLAB = 1 DLM1 EQU 01F9H ;DLAB = 1 IER1 EQU 01F9H ;DLAB = 0 LCR1 EQU 01FBH LSR1 EQU 01FDH ; nomi simbolici per i registri di COM2 RBR2 EQU 02F8H ;DLAB = 0 THR2 EQU 02F8H ;DLAB = 0 DLL2 EQU 02F8H ;DLAB = 1 DLM2 EQU 02F9H ;DLAB = 1 IER2 EQU 02F9H ;DLAB = 0 LCR2 EQU 02FBH LSR2 EQU 02FDH ; nomi simbolici per i registri di COM3 RBR3 EQU 03F8H ;DLAB = 0 THR3 EQU 03F8H ;DLAB = 0 DLL3 EQU 03F8H ;DLAB = 1 DLM3 EQU 03F9H ;DLAB = 1 IER3 EQU 03F9H ;DLAB = 0 LCR3 EQU 03FBH LSR3 EQU 03FDH

20

Ricezione e trasmissione simultanee


Double buffering

COM_RX

Buffer0 Buffer1

COM_TX

Trasmissione: Buffer1 Ricezione: Buffer0

SWAP

COM_RX

COM_TX

Ricezione: Buffer1

Trasmissione: Buffer0

I ruoli dei due buffer vengono alternativamente scambiati: mentre un buffer viene usato per memorizzare i dati attualmente ricevuti (es. Buffer0), laltro (es. Buffer1) viene usato per trasferire i dati precedentemente ricevuti. Una volta che il buffer di ricezione risulta pieno, il ruolo dei buffer viene scambiato (swap). Sotto quali ipotesi questo meccanismo funziona? 21

Dichiarazione delle variabili e costanti


; Orologio Ore DB 1 Minuti DB 1 Secondi DB 1 ; Buffer: doppio buffer in memoria per consentire invio e ricezione contemporanei buffer0 DB 1024 buffer1 DB 1024 ;Flag: 0=buffer di ricezione buffer0; 1=buffer di ricezione buffer1 RxBuffer DB 1 ;Indice dellelemento corrente da mettere nel buffer corrente di ricezione RxIndex DB 2 ;Indice dellelemento corrente da trasmettere TxIndex DB 2

DOPPIO BUFFER

RxIndex

TxIndex

TxIndex

RxIndex

RxBuffer 0

RxBuffer 1

buffer0 buffer1

buffer0 buffer1

22

Inizializzazione delle periferiche: PIC


PROC init_PIC PUSH R1

; interrupt rilevati a fronte ADDI R1,R0, RESET OUT ICW1(R0), R1 ;5 bit pi significati dellinterrupt type (F8H) ADDI R1,R0, ADDRESS OUT ICW2(R0), R1 ;AEOI disabilitato ADDI R1,R0, EN_AEOI OUT ICW4(R0), R1 POP RET ENDP R1

23

Inizializzazione delle periferiche: COM1,2,3


PROC init_com1 ; La procedura inizializza COM1 : bit-rate 4800, 8 bit per ; carattere, parita' pari, 1 stop bit PUSH R1 ; DLAB = 1 per accedere a DLM e DLL (DL=DLM##DLL) ADDI R1,R0, 80H OUT LCR1(R0), R1 ; bit rate = 4800 DL = 0018H ; 9600 DL=000CH OUT DLM1(R0), R0 ADDI R1,R0,18H OUT DLL1(R0), R1 ; 8 bit per car., 1 stop bit,parita` pari,DLAB=0 ->LCR=1BH ADDI R1,R0,1BH OUT LCR1(R0), R1 ; clear di IER per disabilitare le interruzioni OUT IER1(R0), R0 ;lettura iniziale per svuotare il buffer di ricezione IN R1, RBR1(R0) POP R1 RET ENDP Ipotesi: F=1.8432 MHz COM1 @ 4800 COM2 @ 9600 COM3 @ 9600

Le procedure di inizializzazione di COM2 e COM3 differanno da COM1 per questo valore e accederanno ai registri della propria interfaccia, e.s. LCR2, IER3,

24

Main: inizializzazione
Main: CLI
//INIZIALIZZAZIONE VARIABILI

LB LH LH LB LB LB

RxBuffer(R0),R0 RxIndex(R0),R0 TxIndex(R0),R0 Ore(R0),R0 Minuti(R0),R0 Secondi(R0),R0

// INIZIALIZZAZIONE PERIFERICHE

CALL CALL CALL CALL ADDI OUT ADDI OUT STI

init_PIC init_COM1 init_COM2 init_COM3 R1,R0,1 IER1(R0), R1 R1,R1,F0H OCW1(R0),R1

Abilitazione interrupt di ricezione sulla COM1

// ABILITAZIONE DEGLI INTERRUPT

Smacheramento degli interrupt IR0,IR1,IR2,IR3 sul PIC

25

Main loop
Loop: IN SB OUT R1, SWITCH(R0) taskIndex(R0),R1 LED(R0),R1 ;lettura interruttori ;memorizzazione byte di ;programmazione ;visualizzazione byte di ;programmazione
;indice corrente del task ;accesso alla tabella dei task ;esecuzione task
PROC TASKn PUSH PUSH ;CODICE DEL TASK

LBU MULTI LW CALLR

R1,taskIndex(R0) R1,R1,4 R2,taskTable(R1) R2

Loop

Generico Task:

POP POP RET ENDP 26

Routine di interrupt dellorologio (Interrupt Type FBH)


INT_CLOCK: STI PUSH PUSH PUSH PUSH LB LB LB ADDI SEQI BEQZ ADD ADDI SEQI BEQZ ADD ADDI SEQI BEQZ ADD
N.B.Gestione vettorizzata e annidata in Fully Nested Mode

End:

R1 R2 R3 R4

SB SB SB OUT OUT OUT ADDI OUT POP POP POP POP RFE

Secondi(R0),R1 Minuti(R0),R2 Ore(R0),R3 CLOCK_S(R0),R1 CLOCK_M(R0),R2 CLOCK_H(R0),R3 R1,R0,EOI OCW2(R0),R1 R4 R3 R2 R1

R1,Secondi(R0) R2,Minuti(R0) R3,Ore(R0) R1,R1,1 R4,R1,60 R4,end R1,R0,R0 R2,R2,1 R4,R2,60 R4,end R2,R0,R0 R3,R3,1 R4,R3,24 R4,end R3,R0,R0

27

COM1 (Interrupt type F8H)


INT_COM1: STI PUSH PUSH PUSH IN LHU LBU BEQZ SB J SB ADDI SEQI BNEZ SH J SH XORI SB IN ANDI SGTU ADDI BNEZ OUT J OUT ADDI OUT POP POP POP RFE R1 R2 R3 R2, RBR1(R0) R1, RxIndex(R0) R3, RxBuffer(R0) R3,buf0 buffer1(R1),R2 check1K buffer0(R1),R2 R1,R1,1 R2,R1,1024 R2,1kdone RxIndex(R0),R1 com1_end RxIndex(R0),R0 R3,R3,1 RxBuffer(R0),R3 R1,SWITCH(R0) R1,R1,0FFH R2,R1,127 R1,R0,2 R2,com3 IER2(R0), R1 com1_end IER3(R0),R1 R1,R0,EOI OCW2(R0),R1 R3 R2 R1 ;PROLOGO

;Lettura del byte ricevuto da COM1 ;Lettura dellindice corrente ;Controllo di quale sia il buffer di ricezione corrente ;Scrittura in buffer1 ;Scrittura in buffer0

Buf0: check1K:

;Fine trasferimento di 1KB? ;NO ;SI Fine trasferimento di 1KB ;Inversione del buffer corrente di ricezione

1kdone:

;Lettura stato corrente degli interruttori

;Smaschera TX su COM2 ;Smaschera TX su COM3 ; EOI ; EPILOGO

com3: com1_end:

28

COM2 (Interrupt type F9H)


INT_COM2: STI PUSH PUSH LH SEQI BEQZ SH OUT J Continue: LB BNEZ LB J LB OUT ADDI SH ADDI OUT POP POP RFE R1 R2 R1,TxIndex(R0) R2,R1,1024 Continue TxIndex(R0),R0 IER2(R0),R0 com2_end R2,RxBuffer(R0) R2,TxFromBuf0 R2,buffer1(R1) send R2,buffer0(R1) THR2(R0),R2 R1,R1,1 TxIndex(R0),R1 R1,R0,EOI OCW2(R0),R1 R2 R1 ;PROLOGO

;Aumento indice e controllo fine ;trasmissione

;maschera TX COM2

;Verifica del buffer di trasmissione ;e prelievo del byte da inviare

TxFromBuf0 : send:

;Trasferimento e incremento ; dellindice

com2_end:

; EPILOGO

29

COM3 (Interrupt type FAH)


INT_COM3: STI PUSH PUSH LH SEQI BEQZ SH OUT J Continue: LB BNEZ LB J LB OUT ADDI SH ADDI OUT POP POP RFE R1 R2 R1,TxIndex(R0) R2,R1,1024 Continue TxIndex(R0),R0 IER3(R0),R0 com2_end R2,RxBuffer(R0) R2,TxFromBuf0 R2,buffer1(R1) send R2,buffer0(R1) THR3(R0),R2 R1,R1,1 TxIndex(R0),R1 R1,R0,EOI OCW2(R0),R1 R2 R1 ;PROLOGO

;Aumento indice e controllo fine ;trasmissione

;maschera TX COM3

;Verifica del buffer di trasmissione ;e prelievo del byte da inviare Unica differenza rispetto a COM2 ;Trasferimento e incremento ; dellindice

TxFromBuf0 : send:

com2_end:

; EPILOGO

30

Overview: MAIN e Clock

Main
Loop: IN SB OUT
LBU MULTI LW CALLR

OUT
R1, SWITCH(R0) taskIndex(R0),R1 LED(R0),R1
R1,taskIndex(R0) R1,R1,4 R2,taskTable(R1) R2

IN

OUT
INT_CLOCK: STI PUSH ... LB R1,Secondi(R0) LB R2,Minuti(R0) LB R3,Ore(R0) ... End: SB Secondi(R0),R1 SB Minuti(R0),R2 SB Ore(R0),R3 Ore Minuti OUT CLOCK_S(R0),R1 OUT CLOCK_M(R0),R2

Loop

taskTable taskIndex
PROC TASKn PUSH PUSH PROC TASKn PUSH ;CODICE DEL TASK PUSH

Secondi

PROC TASKn PUSH PUSH

;CODICE DELPOP TASK POP RET ;CODICE DEL TASK POP ENDP POP POP RET POP ENDP RET

ENDP

31

Overview: seriali
COM2/COM3 COM1

IN
INT_COM1: STI ... IN LHU LBU SB

Smaschera interrupt

R2, RBR1(R0) R1, RxIndex(R0) R3, RxBuffer(R0) buffer1(R1),R2 buffer0(R1),R2 R1,SWITCH(R0) IER2(R0), R1 IER3(R0),R1 OCW2(R0),R1

IN

Maschera interrupt
INT_COM2: STI LH STI SH OUT LB LH LB SH LB OUT LB OUT LB RFE LB OUT RFE R1,TxIndex(R0) TxIndex(R0),R0 IER2(R0),R0 R2,RxBuffer(R0) R1,TxIndex(R0) R2,buffer1(R1) TxIndex(R0),R0 R2,buffer0(R1) IER2(R0),R0 R2,RxBuffer(R0) THR2(R0),R2 R2,buffer1(R1) R2,buffer0(R1) THR2(R0),R2

Buf0:

SB IN OUT

com3:

OUT OUT RFE

INT_COM3: Continue:

Continue: send:

send:

RXIndex Buffer0

TxIndex

Buffer1

RxBuffer

32

I 10 quesiti
1. Cosa cambierebbe se linterfaccia verso l orologio funzionasse in modo diverso? Ovvero: riceve 2 byte in sequenza, dove il primo indica il parametro da settare (ore =FFH,minuti=FEH,secondi=FDH) e il secondo il valore. 2. Quali sono gli interrupt type associati alle varie routine programmando il PIC con ICW2= 38H? 3. Considerando 0-stati di wait, calcolare quando durano i vari frammenti di codice 4. Quali sono le istruzioni da inserire nelle routine di interrupt affinch si possa operare in fully nested mode? 5. Cosa cambierebbe nel caso in cui si vogliano gestire la COM2 e la COM3 a polling? Dove andrebbe inserito il codice a tal riguardo? 6. Come si potrebbe gestire a polling la forma donda periodica in modo da rilevare ogni secondo trascorso? Dove andrebbe inserito il codice a tal riguardo? 7. Volendo prevedere un task che una volta ricevuto 1KB provveda a controllare quanti byte sono uguali al carattere A come si dovrebbe agire? Chi lo fa partire? Deve lavorare ad interrupt disabilitati? 8. Si vuole introdurre anche un cicalino che si attiva quando riceve in ingresso un valore logico alto. Un task deve controllare delle variabili che rappresentano lora a cui impostata una sveglia. Nel momento in cui rileva che lora corrente coincide con lora della sveglia deve attivare il cicalino. La disattivazione del cicalino avvine mediante un pulsante gestito ad interrupt. Scrivere il codice del task che si occupa di questo, la routine di gestione del tasto ed interfacciare le due nuove periferiche al sistema. 9. Supponiamo che se nel momento in cui stato ricevuto 1KB il valore degli interruttori vale FFH, quello che si vuole fare mandare in uscita il KB ad entrambe le COM2 e COM3. Quali modifiche occorre apportare al sistema? Solo software o anche hardware? 10. Si vuole che nel momento in cui il valore degli interruttori vale 0 il sistema si comporti come segue: cerca di capire a che baud rate funziona la COM1 ed imposta di conseguenza la stessa baud rate sulle COM2 e COM3. 33