Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

1
voti

T&GV Operating system – Terza puntata

Indice

Preambolo

Un sistema operativo deve, come prima funzione, realizzare il collegamento tra l'operatore e "ciò che deve funzionare" mostrando una "faccia simpatica" all'operatore, ovvero: io (umano) non devo avere difficoltà ad impartire comandi a
"ciò che deve funzionare", il mio "operating system" dialogherà con me nella mia lingua e comanderà i dispositivi in modo che LORO capiscano ma, "tout-court", io dico --> XXX --> loro fanno: al posto delle "tre-X" c'è il nostro interprete.

Postulato

Ovviamente dovremo, comunque, inventare una sorta di linguaggio con pochi vocaboli, spesso di una lettera soltanto, ma efficace e facile da ricordare.gg

Spiegazione

Io ho sviluppato, necessariamente, anche una minima sintassi (con i relativi controlli) perché devo comandare degli scambi e dei relè che sono "collegati" in qualche modo a dei "luoghi", cioè le stazioni; ho a disposizione una tastiera minima, quindi:

Particolari

"A" = "Tascosa", la stazione nascosta sotto la montagna dotata di cinque scambi e tre tratte isolabili; comunque, quattro dei cinque scambi si possono azionare a-due-a-due, di conseguenza è come ne avessimo solo tre.
"B" = "Black Gulch", la stazioncina incuneata sotto il ponte: i due scambi di estremità si possono azionare insieme e ha due tratte isolabili.
"C" = non c'è più: era Mountain View, ma è ridotta ad una fermata senza scambi.
"D" = "Green Valley", la stazione che occupa tutta la parte alta, dove mi divertirò un mondo con le manovre... Qui ci sono sette scambi e quattro tratte.

Bene, a questo punto, sulla tastiera "telefonica", i comandi per azionare gli scambi avranno la seguente sintassi:

Lettera (ammesse "A", "B" e "D", la "C" è ignorata)
Numero di una cifra (il valore ammesso è funzione della stazione indicata: 3, 2 o 7)
Lettera ( "C" per corretto-tracciato, "D" per deviato)

i comandi per alimentare o disalimentare le tratte, invece:

Lettera (ESATTAMENTE come sopra)
segno "#" (cancelletto) serve ad indicare che non voglio parlare di scambi
Numero di una cifra (il valore ammesso è funzione della stazione indicata: 3, 2 o 4)
Cifra di azione ( "1" per alimentare e "0" per disalimentare)

Al completamento dell'esecuzione del compito selezionato il sistema torna in attesa del "primo tasto".

Ovviamente, all'azionamento di ogni tasto corrisponderà una risposta coerente: il display del nome della stazione, la ripetizione della "serigrafia" del tasto, un mini-messaggio ("..ok.." se tutto è... OK!)

Il triangolo

Bene, ora che il sistema può "capire" ed eseguire degli ordini, dobbiamo dotarlo di un minimo di raziocinio per evitare che un treno, transitando sui lati del triangolo, possa provocare un corto circuito; anzi: se non implementiamo degli isolamenti preventivi, il corto circuito è "di default", senza che un treno sia neanche posato sui binari, non ci credete? Provate a guardare la figura:

Triangolo.jpg

Triangolo.jpg

Sappiamo che gli scambi, tutti e tre quelli visibili in figura, realizzano il collegamento elettrico delle rotaie "destra-con-destra" e "sinistra-con-sinistra" quindi, ignorando per un attimo le interruzioni di isolamento che localizzano le tratte "2" e "3", se seguiamo il percorso dallo scambio4-rotaia_destra, arriviamo a superare appena-appena lo scambio3, poi torniamo indietro senza lasciare il contatto con la rotaia ma deviando sul ramo opposto, arriviamo allo scambio2, altra inversione senza abbandonare la rotaia e torniamo verso lo scambio4: siamo sulla rotaia sinistra: senza isolamenti sarebbe un corto-circuito.
Se a questo aggiungete che il tracciato di cui fanno parte gli scambi 2 e 4 è alimentato da un PWM, mentre quello che inizia con lo scambio 3 è alimentato da un altro PWM... potete immaginare che cottura se non ci fossero isolamenti e... logica di consenso.

Bene, abbiamo isolato le cose inserendo le tratte 2 e 3, ma:

si possono alimentare insieme ? NO !!!, altrimenti siamo da capo in corto, almeno mentre passa il treno

quando è possibile alimentarle ? adesso vedremo:

stabiliamo i possibili percorsi del treno sullo scambio3, la posizione di questo scambio3 e la direzione di marcia sul ramo orizzontale (ricordiamoci che è un anello):

discesa  -->  scambio3 destra  -->  senso orario         tratta2 ok         tratta3 NO
discesa  --> scambio3 sinistra -->  senso orario         tratta2 NO         tratta3 NO
discesa  -->  scambio3 destra  -->  senso antiorario     tratta2 NO         tratta3 NO
discesa  --> scambio3 sinistra -->  senso antiorario     tratta2 NO         tratta3 ok
salita  -->  scambio3 destra  -->  senso orario          tratta2 NO         tratta3 NO
salita  --> scambio3 sinistra -->  senso orario          tratta2 NO         tratta3 ok
salita  -->  scambio3 destra  -->  senso antiorario      tratta2 ok         tratta3 NO
salita  --> scambio3 sinistra -->  senso antiorario      tratta2 NO         tratta3 NO


Abbiamo esaurito le possibili configurazioni. avreste detto che una figuretta così semplice avrebbe necessitato di un ragionamento così arzigogolato? No? Purtroppo eravate fuori strada; e manca ancora una cosetta:
è indispensabile, per salvaguardare la circuiteria dei PWM, il rispetto maniacale della fase e del duty-cycle dell'alimentazione del motore della locomotiva che transita dall'anello allo scambio3 (o viceversa), come ho fatto?

Semplice: ogni volta che il sistema riceve l'ordine di azionare uno scambio o un relè di tratta, vengono controllate le "condizioni di alimentabilità" delle due tratte di cui sopra, e per migliorare la velocità di risposta del software di controllo, si usa una sequenza del tipo "ON ... GOTO ...." che chi ha pastrocchiato con il BASIC ricorderà senz'altro, ma come si realizza nel PIC, in Assembler?
Prima di vedere questo particolare vediamo come costruire un valore che sia frutto delle condizioni viste prima; si fa abbastanza presto: l'elenco mostra otto condizioni possibili date dalla combinazione di tre "cause". Se a ciascuna causa, che può essere "ON" oppure "OFF", abbiniamo un 'peso' aritmetico, la somma dei numeri può avere un valore variabile da 0 a 7; riprendiamo la tabella e abbiniamo i valori:

discesa (4x0) +  scambio3 destra (1x0) + senso orario (2x0)     INDEX=0 tratta2 ok tratta3 NO
discesa (4x0) + scambio3 sinistra(1x1) + senso orario (2x0)     INDEX=1 tratta2 NO tratta3 NO
discesa (4x0) +  scambio3 destra (1x0) + senso antiorario (2x1) INDEX=2 tratta2 NO tratta3 NO
discesa (4x0) + scambio3 sinistra(1x1) + senso antiorario (2x1) INDEX=3 tratta2 NO tratta3 ok
salita (4x1)  +  scambio3 destra  (1x0)+ senso orario  (2x0)    INDEX=4 tratta2 NO tratta3 NO
salita (4x1)  + scambio3 sinistra (1x1)+ senso orario  (2x0)    INDEX=5 tratta2 NO tratta3 ok
salita (4x1)  +  scambio3 destra  (1x0)+ senso antiorario (2x1) INDEX=6 tratta2 ok tratta3 NO
salita (4x1)  + scambio3 sinistra (1x1)+ senso antiorario (2x1) INDEX=7 tratta2 NO tratta3 NO


Nel PIC si può vigliaccamente modificare il PROGRAM COUTER, cioè quel registro che indica alla CPU l'indirizzo della PROSSIMA istruzione da decodificare ed eseguire; in pratica la sequenza di istruzioni necessaria è la seguente:

              MOVLW     HIGH JUMP         ; precarica il byte più significativo
              MOVWF     PCLATH            ; del prog-counter
              MOVF      INDEX,W           ; preleva l'indice decisionale
              ANDLW     0X07              , lo restringe a tre bit per sicurezza
;
    JUMP
              ADDWF     PCL,F             ; lo applica al PRG-Counter
;
              GOTO      T2YT3N            ; tratta2=ok, tratta3=NO
              GOTO      TTNO              ; NESSUNA DELLE DUE
              GOTO      TTNO              ; NESSUNA DELLE DUE
              GOTO      T2NT3Y            ; tratta2=NO, tratta3=ok
              GOTO      TTNO              ; NESSUNA DELLE DUE
              GOTO      T2NT3Y            ; tratta2=NO, tratta3=ok
              GOTO      T2YT3N            ; tratta2=ok, tratta3=NO
              GOTO      TTNO              ; NESSUNA DELLE DUE
;


se la condizione "ok" non sussiste, anche se è stata elaborata con successo la direttiva di alimentazione di una delle due tratte, questa viene SUBITO ri-disalimentata (in effetti, per semplicità, vengono "spente" entrambe andando ad eseguire la serie di istruzioni che inzieranno dalla label "TTNO");
se poi, quando la situazione lo consente, si richiede l'alimentazione di una delle due tratte, viene alzato il segnale software chiamato "SYNC_T" (sincronismo di trazione): questo segnale costringe il PWM della parte alta ad ignorare la posizione del "suo" potenziometro, ma ad assumere il valore richiesto dal potenziometro della parte bassa, in pratica entrambi i PWM vengono comandati da una manopola sola, come se di trattasse si un unico PWM. Questo assicura che nel momento in cui le ruote della locomotiva metteranno in parallelo i due "alimentatori" non succederà nulla in quanto entrambi, in un qualunque momento, staranno erogando la stessa tensione ( si o no, essendo PWM ) e per la stessa durata di tempo.

Non appena cessano le condizioni di "tratta alimentata" (vuoi per richiesta diretta di disalimentazione vuoi perchè uno degli scambi interessati è stato "girato"), viene "spento" il segnale software "SYNC_T", quindi i due PWM tornano indipendenti l'uno dall'altro.

Una piccola "chicca", riguarda le istruzioni:

              MOVLW     HIGH JUMP         ; precarica il byte più significativo
              MOVWF     PCLATH            ; del prog-counter

vi sarete chiesti: "cosa vogliono dire ?" e/o "a cosa servono ?"... se andate a dare un'occhiata la manuale di programmazione dei PIC, cercando "COMPUTED GOTO", troverete un discorso che verte sull'impostazione corretta del valore del PCLATH (interfaccia di sola scrittura tra "noi" e la parte più significativa del Program Counter).
Ebbene, se non impostiamo correttamente il PCLATH, quando il programma va in esecuzione e passa ad eseguire la sequenza di applicazione dell' "INDEX" al PCL, il GOTO sarà eseguito chissà dove, fidatevi: il rendermi conto di questa necessità mi è costato diversi acquisti di pillole contro il mal di testa, finchè non ho scoperto come risolvere il problema, poi: "... ma che scemo !!!...."

Spero di essere stato esauriente, l'argomento non si presta ad essere spiegato "semplicisticamente", purtroppo, intanto le cose stanno funzionando: io mi ci sto divertendo davvero (è un hobby SI o no ?) e non mi dispiacerebbe sapere che qualcun altro ha preso spunto e da quello che ho fatto io e si sta divertendo come ed anche più di me.

Per adesso fermo le mie elucubrazioni, credo di avere giocato parecchi "carichi" sul tavolo di T&GV riguardo ai PIC; adesso qualcosa circa i "paleo-informatici" GP 160...

GP160-1.jpg

GP160-1.jpg


Nel cerchio rosso... LUI!, il GP160, La freccia verde indica un perforatore di nastro (o di banda, come si diceva una volta...) Quella gialla indica invece un'unità disco (con cartuccia ESTRAIBILE!!!): la cartuccia, da un paio di MB, se non ricordo male, era da 50 cm di diametro... Pochi MB?, beh, la "ram" (che poi ram non era) del GP160, a quei tempi era MAX 64Kb o, meglio: 32Kw da 16bit
NOTA BENE: eravamo nel 1977, Ivana ed io eravamo sposati da un anno e stava per nascere Andrea (adesso, nel febbraio 2011, ha quasi 34 anni...)...

Fatemi sapere quanto siete curiosi ...

saluti a tutti ! ! ! !

0

Commenti e note

Inserisci un commento

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.