| 
 
Scheda UBW ultimo aggiornamento 19 luglio 2019  | 
		
Indice
La scheda UBW (USB Bit Whacker) è una scheda di sviluppo basata su un microcontrollore Microchip PIC con porta USB come PIC18F2455, PIC18F2550, PIC18F4455 o PIC18F4550. Quella che segue è una mia personale interpretazione dello schema base.
    
Scheda UBW originale (primo prototipo)
    
    
    Il progetto originale è a opera di Brian Schmalz 
	che ha messo a disposizione tutto il materiale sul suo sito
	http://www.schmalzhaus.com/UBW/ 
	, tutti gli strumenti utilizzati per la progettazione di questo progetto 
	sono liberi, e il progetto è aperto a chiunque di utilizzare per quello che 
	desiderano
	La scheda è alimentata dalla connessione USB e ha vari connettori dove sono 
	disponibili le porte del processore.
	La particolarità della scheda è data dal fatto che all'interno del 
	processore è presente uno speciale interprete di comandi di base per l'input 
	e l'output di controllo.
	Se collegato a un computer con un sintema operativo Windows / Max OS X /  
	Linux, la scheda UBW apparirà come una porta RS232.
	A questo punto darà possibile il controllo dei singoli pins di  I/O 
	pins del PIC attraverso semplici comandi trasmessi via seriale . 
	Il PIC viene programmato con un bootloader USB.
	Questo significa che potete creare HEX file utilizzando qualsiasi 
	compilatore o assembler (C18, CC8e, SDCC) e poi caricare il file HEX sul PIC 
	senza un programmatore esterno - direttamente via USB.
La scheda prevede:
Pulsante di reset
Risuonatore 20MHz
General Input Button (utilizzato anche per entrare in modalità programma nel corso di un reset)
Porta USB
Connettore TX / RX (può essere usato come un convertitore USB/UART)
Connettore PA - per accesso alle porte da RA0 a RA7.
Connettore PB - per accesso alle porte da RB0 a RB7.
Due LED di stato
Porta ICSP per programmazione in circuit
Alimentazione tramite porta USB o esterna
Vediamo ora 
come realizzare la scheda, si procederà iniziando dalla realizzazione del 
 
circuito stampato.     
		Per la sua realizzazione si utilizzerà una basetta in vetronite 
		(monofaccia) di dimensioni 67x54 mm circa, il metodo potrà essere quello della 
		fotoincisione o del trasferimento termico utilizzando i cosiddetti fogli 
		blu (PRESS-N-PELL), in questo caso ricordo che l’immagine delle tracce 
		del circuito dovrà essere speculare.
		Una volta inciso il rame, si verificherà in controluce o mediante 
		l’utilizzo di un multimetro che non vi siano cortocircuiti soprattutto 
		tra le piste più vicine.
		Si passerà quindi alla foratura della stessa, utilizzando principalmente 
una punta da 0,8 mm, mentre se ne utilizzerà una dal diametro 
		di 1 mm per i connettori e una da 2,5 mm per la presa USB..
		In seguito si potrà passare al posizionamento e alla saldatura dei 
		componenti seguendo lo  schema visibile sotto.
		Per la saldatura si utilizzerà un piccolo saldatore a punta fine, della 
		potenza di circa 25 – 30 W.
		S’inizierà dai ponticelli, proseguendo con le resistenze, i diodi led, 
		controllandone l’orientamento.
		Si potrà quindi, procedere con lo zoccoli dell'integrato, i pulsanti, i 
		condensatori, e il risuonatore ceramico (che potrà essere montato su un 
piccolo zoccolo).
		Continuando con i pin-strip e infine il connettore USB.
		Terminato la saldatura si potrà inserire l'integrato IC1 nell'apposito 
		zoccolo facendo attenzione alla tacca di riferimento che andrà rivolta 
		in senso opposto con la presa USB.

A confronto l'originale e la simulazione effettuata con Eagle 3d
Il circuito è stato realizzato con il programma EAGLE in versione FREE
| 
	 | 
  
|---|
    
    Elenco componenti
	
| 
		 C1  | 
		
		 470nF Condensatore multistrato  | 
	
| 
		 C2  | 
		
		 10µF Condensatore elettrolitico verticale  | 
	
| 
		 C3  | 
		
		 100nF Condensatore multistrato  | 
	
| 
		 R1,R2  | 
		
		 120 Ώ 1/4W  | 
	
| 
		 R3  | 
		
		 150 Ώ 1/4W  | 
	
| 
		 R4,R5  | 
		
		 10k Ώ 1/4W  | 
	
| 
		 D1,D2  | 
		
		 LED ø3 mm - Rosso  | 
	
| 
		 D3  | 
		
		 LED ø3 mm - Verde  | 
	
| 
		 IC1  | 
		
		 PIC18F2550-I/SP SDIP+ zoccolo 14+14  | 
	
| 
		 Y1  | 
		|
| 
		 ICSP  | 
		
		 Pin strip maschio verticale 1x6  | 
	
| 
		 JP1  | 
		
		 Pin strip maschio verticale 1x6  | 
	
| 
		 PA-PB  | 
		
		 Connettore 10 Vie Molex 
		
		
		  | 
	
| 
		 PWR  | 
		
		 Morsettiera 2 poli passo 2,5mm  | 
	
| 
		 RESET-PRG  | 
		
		
		 
		   | 
	
| 
		 SER_TTL  | 
		
		 Connettore 4 pin maschio Molex passo 2.54mm  | 
	
| 
		 USB  | 
		|
| 
		 AN1  | 
		
		 Pin strip maschio verticale 1x3  | 
	
| 
		 AN2  | 
		
		 Pin strip maschio verticale 1x6  | 
	
| 
		 J1,J2  | 
		
		 J10MM  | 
	
| 
		 J3  | 
		
		 J5MM  | 
	
| 
		Processore PIC18F2550 28-Pin High Performance, Enhanced Flash, USB Microcontrollers with nanoWatt Technology  | 
	||
		
		![]()  | 
		
		
				 | 
		
		![]()  | 
	
| Piedinatura | Datasheet | Foto dell'integrato | 
| Risuonatore ceramico 20 MHz | ||
		![]()  | 
		
		 | 
		
		![]()  | 
	
| Piedinatura | Datasheet | Foto | 

Il cavo viene costruito con il connettore tipo A da un lato (computer) ed il connettore tipo B dall'altro (periferica). Normalmente le nuove cpu hanno due porte USB, ma usano un solo canale IRQ ed un solo indirizzo di memoria I/O. Sul singolo canale IRQ si possono usare fino a 112 periferiche utilizzando gli hubs e le extension-boxes
| 
		 USB pinout  | 
	|||
| 
		 Pin N  | 
		
		 Nome  | 
		
		 Funzione  | 
		
		 Colore filo  | 
	
| 
		 1  | 
		
		 Vcc  | 
		
		 +5V massimo 500mA  | 
		
		 Rosso  | 
	
| 
		 2  | 
		
		 D-  | 
		
		 data input to computer  | 
		
		 Bianco  | 
	
| 
		 3  | 
		
		 D+  | 
		
		 data output from computer  | 
		
		 Verde  | 
	
| 
		 4  | 
		
		 GND  | 
		
		 ZeroG round  | 
		
		 Nero  | 
	
Saldatura delle resistenze e di alcuni ponticelli
Saldatura dello zoccolo dell'intergrato, dei condensatori e i pulsanti
scheda ultimata con i vari connettori, led
Dettaglio connettore ICSP
Dettaglio Led di presenza alimentazione e led collegamento
Dettaglio connettori porte PA e PB
Dettaglio Risuonatore ceramico 20 MHz e connettori 3 pin
SET COMANDI DISPONIBILI
(FIRMWARE 
1.4.3)
In questa tabella sono riassunti i comandi con la lori sintassi disponibile per il firmware nella versione 1.4.3. Altre informazioni più complete ed aggiornate possono essere trovate sul sito dell'autore http://www.schmalzhaus.com/UBW/
| Comando | Descrizione | Sequenza comandi seguita da <CR> | Esempio | Valore di ritorno | 
| R | Reset | R | "R" | "OK" | 
| C | Configura pin di I/O e analogici | C,<DirA>,<DirB>,<DirC>,<AnalogEnableCount> <DirA>,<DirB>,<DirC> = [0..255]; Output(0), Input(1) for each bit. <AnalogEnableCount>=[0..12]; Number of I\Os to enable for analog input.  | 
		"C,4,245,52,0" | "OK" | 
| O | Uscita porta digitale | O,<PortA>,<PortB>,<PortC> <PortX>=[0..255]; Output value to each port  | 
		"O,0,255,22" | "OK" | 
| I | Input from 
		digital ports Returns decimal values for PortA, PortB, and PortC separated by commas.  | 
		I | "I" | "I,001,045,205" | 
| V | Restituisce la versione del firmware | V | V" | "UBW FW D Version 1.4.3" | 
| A | Analog 
		input request Returns decimal values for all enabled analog inputs separted by commas.  | 
		A | "A" | "A,0145,1004,0000,0045" | 
| T | Timed I\O 
		(digital and analog) Periodically returns “I” and “A” packets  | 
		T,<Time>,<Mode> <Time>=[1..30000]; Time in units of ms. <Mode>=[0,1]; Digital “I” packets (0), Analog “A” packets (1)  | 
		"T,100,0" | "OK" | 
| PI | Pin Input 
		read Returns decimal value of Port AND’ed with 2^^<Pin>  | 
		PI,<Port>,<Pin> <Port> = [A,B,C] <Pin>=[0..7]  | 
		"PI,C,6" | "PI,<Value>" | 
| PO | Pin Output 
		write Writes to bit <Pin>  | 
		PO,<Port>,<Pin>,<Value> <Port> = [A,B,C] <Pin>=[0..7] <Value>=[0..255]  | 
		"PO,A,3,0" | "OK" | 
| PD | Pin Direction set | PD,<Port>,<Pin>,<Direction> <Port> = [A,B,C] <Pin>=[0..7] <Direction>=[0,1] ; Output(0), Input(1)  | 
		"PD,A,3,0" | "OK" | 
| MR | Legge una locazione di memoria | MR,<Address> <Address>=[0..4095]; RAM address  | 
		"MR,3968" | "MR,28" | 
| MW | Scrive in una locazione di memoria | MW,<Address>,<Value> <Address>=[0..4095]; RAM address <Value>=[0..255]  | 
		"MW,3968,56" | "OK" | 
| CU | Configure 
		UBW Setting parameter 1 to a value of 0 turns off the “OK” response.  | 
		CU,<Parameter>,<Value> <Parameter>=[0..255]; <Value>=[0..255]  | 
		"CU,1,0" | "OK" | 
| RC | RC servo pulse output | RC,<Port>,<Pin>,<Value> <Port> = [A,B,C] <Pin>=[0..7] <Value>=[0..11890]  | 
		"RC,B,3,5945" | "OK" | 
| BO | Bulk digital Output** | 
		BO,<ASCII_HEX_Bytes> <ASCII_HEX_Bytes>=[00..FF]xN; Each byte in Hex is concatenated.  | 
		"BO,55A721" | "OK" | 
| BC | Bulk digital Configure** | BC,<Init>,<WaitMask>,<WaitDelay>,<StrobeMask>,<StrobeDelay> <Init>=[0..255]; <Init> is initial value written to PortA. <WaitMask>=[0..255]; “Busy” bit mask used if <WaitDelay> > 0. <WaitDelay>= [0..255]; Units of 400ns. <StrobeMask>=[0..255]; XOR’ed with <Init> for strobe signal. <StrobeDelay>=[0..255]; Units of 830ns.  | 
		"BC,1,1,1,1,1" | "OK" | 
| BS | Binary Send to parallel output** | BS,<ByteCount>,<BinaryStreamOfBytes> <ByteCount>=[1..56]; Number of bytes to be written <BinaryStreamOfBytes>= Sequence of 8 bit characters to be written  | 
		"BS,3,#Ij" | "OK" | 
Lista messaggi di errore:
"! 0" (non utilizzato)
"! 1" (non utilizzato)
"!2 Err: TX Buffer overrun" 
	Questo errore è generato se, per qualche ragione, il codice interno della 
	UBW tenta di inviare troppi dati al PC in una sola volta.
"!3 Err: RX Buffer overrun" 
	Questo errore è generato se, mentre il UBW sta ricevendo dati dal PC, il 
	buffer di ricezione interno è troppo pieno. 
"!4 Err: Missing parameter(s)" 
	Il UBW invierà questo errore se si aspettava di trovare un altro parametro 
	nel comando, ma invece trovato un <CR> o <LF>. 
"!5 Err: Need comma next, found: '<some_char>'"
	
	Il UBW invierà questo errore se si aspettava di trovare una virgola, ma ha 
	trovato qualcos'altro. Il <some_char> sarà il carattere che ha trovato 
	al posto 
	della virgola. 
"!6 Err: Invalid parameter value" 
	
	Questo errore significa che l'UBW ha trovato un parametro, ma il suo valore 
	era al di fuori del range accettabile.
"!7 Err: Extra parameter" 
	Questo errore indica che il UBW aspettato di vedere un <LF> o <CR>, ma invece 
	ha trovato una virgola in più o un parametro in 
	più. 
"!8 Err: Unknown command '<command_chars>"
	Questo errore indica che il nome o singolo comando non è stato 
	capito o non esiste. <command_chars> sarà uno o due byte che il UBW ricevuto 
	che non corrisponde ad alcun comando.
Una volta completato il montaggio occorre caricare l programma all'interno del processore, per questo motivo la scheda è dotata di apposito connettore ICSP, potrà così essere utilizzato un programmatore dotato anch'esso di questo connettore come il PIC
| 
		 Scarica DRIVER (MCHPFSUSB_Setup_v1.3.exe)  | 
		
		 Scarica Firmware (UBW_Boot20MHz_combo_2455.zip)  | 
	
Una volta collegata la scheda al programmatore questo riconoscerà automaticamente il processore

Si dovrà ora caricare il file caricare il file hex UBW_Boot20MHz_combo_2455..hex
		![]()
        		
        Scarica 
		
		Firmware
		(UBW_Boot20MHz_combo_2455.zip)

Premendo il tasto Write verrà trasferito all'interno della memoria del processore

La scheda per essere riconosciuta ha bisogno di 
appositi driver che si trovano
all'interno del file MCHPFSUSB_Setup_v1.3.exe
		![]()
		Scarica 
		DRIVER
		(MCHPFSUSB_Setup_v1.3.exe)
                
                
                driver aggiornati al sito Microchip
Quando si collegherà la scheda alla porta USB, verrà 
segnalata la presenza di una nuova periferica
e alla richiesta si sceglierà quelli presenti nella cartella
\MCHPFUSB\fw\Cdc\inf\win2k_xp_vista32_64\
una volta copiati i vari file verrà creata una porta virtuale, nell'esempio 
sotto COM21

Utilizzano un programma Serial Terminal, 
nell'esempio sotto quello fornito dalla Parallax per la gestione della
scheda Propeller
ma può essere utilizzato anche un'altro programma, settando come "Com Port" 
quello della propria scheda
se si invierà il comand "V" e se tutto è andato a buon fine si otterrà come 
risposta la stringa
"UBW FW Version 1.4.3"

La scheda UBW quando è 
collegata al PC apparirà come una porta RS232 e data la presenza dell'interprete 
fa si che questa possa essere programmata facilmente tramite semplici programmi 
come il Basic.
Nell'esempio si utilizza un piccolo
modulo relè, per il 
collegamento si utilizzerà il connettore a tre pin connesso alla porta PA0
Il compilatore scelto per la 
realizzazione del programma di gestione lato PC è "Just Basic", un ambiente di 
sviluppo semplice, pratico e soprattutto gratuito, I’ideale per principianti ed 
esperti, dalle caratteristiche notevoli.
Ecco, alcune particolarità:
• è un ambiente di programmazione in Basic e da esso eredita tutte le 
caratteristiche intrinseche;
• è completamente GRATUITO per utilizzo personale e applicazioni commerciali;
• dispone di un editor con testo colorato in relazione ai diversi tipi di 
codice;
• ha possibilità di creare programmi in modo testo o applicazioni a finestre GUI
• gestisce numeri a precisione illimitata;
• include un debugger a livello sorgente con implementazione dei breakpoints;
• dispone di un editor personalizzabile di GUI;
• ha un help in linea molto completo;
• Supporta la gestione della porta seriale con protocollo RS232.

IL JUST BASIC E LA 
COMUNICAZIONE SERIALE
Il Just Basic, mette a disposizione un metodo semplice e sicuro per gestire la 
comunicazione seriale.
Il cuore del procedimento sta nell'istruzione OPEN "COMn.", la quale instaura ed 
apre una comunicazione seriale per la lettura e la scrittura, quindi stabilisce 
un flusso in entrata ed uscita. La gestione completa della seriale utilizza le 
API di Windows per la comunicazione. La sintassi base del comando è la seguente:
OPEN “COMn:baud,parity,data,stop" for random as #handle
Dove:
• "n" rappresenta il numero logico della porta seriale (1, 2, 3, ecc);
• "baud" rappresenta la velocità di comunicazione (bps)
• "parity" prevede invece i seguenti possibili valori:
N No parity
E Even parity
0 Odd parity
S Space parity
M Mark parity
• Valori disponibili per "data" sono: 5, 6, 7 e 8. Essi indicano la lunghezza 
della " parola" spedita;
• "stop" può assumere il valore di 1 o 2, a seconda di quanti bit di stop 
occorrono per la comunicazione.
Inoltre I'utente può aggiungere alcuni parametri opzionali, molto utili, che 
consentono di controllare al meglio le transizioni dei dati, anche in presenza 
di eventuali timeout. Essi sono i seguenti:
• CSn imposta il timeout del segnale di CTS, in millisecondi;
• DSn imposta il timeout del segnale di DSR, in millisecondi;
• PE abilita il controllo della parità;
• RS disabilita il controllo dell'RTS (request to send).
Una volta che la comunicazione è stabilita, per scrivere sulla porta seriale è 
sufficiente inoltrare il comando:
print #seriale, "STRINGA"
Per chiudere infine la comunicazione è opportuno utilizzare I'apposito comando, 
come segue:
close #seriale
    ![]()  | 
		
    ![]()  | 
		
    ![]()  | 
	
    Nota: Quando si carica il programma occorrerà 
	sostituire nella riga
	ComPort$ = "com21" 'Numero porta
	Il numero della porta che è stata attribuita dal sistema

| Elenco revisioni | |
| 18/07/2019 | Aggiornato pagina | 
| 24/08/2010 | Emissione preliminare |