Se vuoi farti del male puoi provare a generare un segnale videocomposito (in bianco e nero, sempre che non voglia ammazzarti a gestire anche la sottoportante colore in QAM


). Altrimenti generi solo i segnali di sincronismo e tramite 3 convertitori D/A a rete a scala R-2R a 8 bit (collegati alle porte I/O di un PIC con un po' di I/O o a 5 linee del PIC tramite 3 registri shift-and-store 4094

) puoi generare un segnale RGBS a 16 milioni di colori che poi puoi buttare dentro a un modulatore videocomposito. Integrati un po' vecchiotti ma che per certe applicazioni sono ancora validi

. Altrimenti ci dovrebbero essere i chip moderni che entrando con un segnale (anche digitale) di qualche tipo fanno l'OSD

.
P.S. per gestire il segnale video con un PIC 4 MHz di clock non credo siano sufficienti, il segnale video ha una banda di 5.5 MHz e se non vuoi trovarti con i cicli macchina alla gola

meglio 8-10 MHz (o 20

) perchè devi gestire il sincronismo di riga (15625), quello di quadro (25), quello di interlacciamento (50)... Con una memoria VRAM esterna di adeguata capacità basta iterare 720 colonne per 576 righe per 50 volte alternate (prima pari poi dispari) al secondo la lettura di un byte (256 grigi o 256 colori tramite tavolozza), 2 byte (65536 colori, 5 bit per canale), o 3 byte (24 bit, 8 bit per canale). La visualizzazione a video in PAL avviene una riga alla volta, quindi per ogni riga 720 punti poi la prossima

.
Se ti ci metti con impegno raggiungi qualsiasi risultato (cit.



).
Tornando a noi, credo che per ora continuerò a sviluppare in PIC Assembler, dato che lo conosco come le mie tasche. La memoria programma dei PIC16F87x (ho giusto trovato un 16F877A a 40 pin con 33 I/O

) tiene 8K parole e la programmazione in alto livello non permette un controllo minuzioso sull'overhead di gestione del programma stesso. Ad esempio in PBP utilizzare l'interrupt via software (ON INTERRUPT) è comodo dal punto di vista della stesura del programma perchè non devi unire blocchi ad alto livello con pezzi Assembler, ma nelle parti dove è richiesto l'interrupt handling il 50% delle istruzioni servono solo per controllare se è arrivato un interrupt, praticamente ti si dimezza la velocità operativa...

. Certo se devi stampare papiri sui display alfanumerici (o disegnare una foto sul display grafico

) è più "bello" e "carino" fare una sola PRINT con una stringa lunga un chilometro

, ma visto che io userò sì e no il 10% della memoria RAM utente di un PIC16F876/877, ottengo lo stesso risultato con meno impegno di risorse (preziosissime) di sistema allocando tutto lo spazio utente disponibile in pagina 3 (100 e rotti caratteri eh...) come "memoria video", all'avviamento mi precarico iterativamente le stringhe predefinite che userò (la EEPROM mi serve per le memorie del motore

) e quando me ne serve una mi basta una sola chiamata alla subroutine relativa che autonomamente si occuperà di piazzare il cursore dove serve e iterare la stampa di tutti i caratteri

. La funzione di lettura automatica di un pulsante (BUTTON) con eliminazione delle spurie e il typematic fa comodo se il programma non è troppo complicato, perchè per come è stata strutturata, a meno di impazzire con i salti condizionati e blocchi IF-THEN-ELSE (usando 3-4 registri come variabili d'ambiente), non posso far fare due lavori diversi a seconda che prema il pulsante e lo lasci o lo tenga premuto (typematic); in Assembler basta una subroutine di ritardo (che comunque avevo già per il display, 10 righe

) e con altre 12-15 istruzioni fai quel che vuoi

. I controlli su tutte le condizioni possibili d'errore (motore non gira, limite raggiunto, microswitch guasto, reed non segnala eccetera) basta farli nell'ordine giusto, quando serve (di continuo se sto muovendo il motore) e con i giusti salti: il PIC è RISC, l'unico salto condizionato che può fare è saltare l'istruzione successiva a quella di controllo, si mettono tutte le condizioni d'errore alla fine, se nella subroutine devo gestire più movimenti metto per ogni movimento il blocco controllo errori e se in un punto qualsiasi della procedura si verifica un errore basta saltare sempre alla stessa posizione che si preuccuperà di gestire l'errore

. Supporta fino a 6 livelli di nidificazione delle subroutine (lo stack sarebbe da 8 ma uno è riservato all'interrupt e uno lo si tiene sempre libero

) quindi si può fare un moderato riciclaggio del codice snellendo ancora di più il programma

. Non so quanto riciclaggio fa il linguaggio ad alto livello, ho paura non troppo... Antgue tu continua pure a sviluppare in PBP, è ottimo per chi inizia da zero o per chi non è avvezzo a ragionare a bit, byte e indirizzi (io venendo anche da 2 anni di programmazione Assembler x86 ero facilitato

), se dovessi cominciare a programmare lo proverei anche io. Altrimenti c'è sempre la programmazione in C adattato, naturalmente il C non è facile come il Basic ma è sicuramente più raffinato e tosto; anche qui se volessi imparare sarei un pochino facilitato perchè conosco un po' di PHP (un C semplificato)...

P.S. il PBP prende a prestito qualche sintassi non solo dal mitico Basic, ma anche da C, Java e Pascal, tipo quando devo specificare un bit di un registro e scrivo PORTB.5 come in Java per OGGETTO.VALORE, i "modificatori" delle istruzioni per riformattare il risultato tipici del C, o le DECLARE, che sono le #DEFINE del C

, la REPEAT-UNTIL identica al Pascal...
Vabbè vi lascio per ora...


