Newsgroup: it.hobby.elettronica.digitale
Titolo: Realizzazione SOFTWARE

Salve a tutti, io sto cercando di costruire una centralina elettronica di
LUCI
a 16Ch gestita da PC via seriale.
Scusate fin da subito se mi dilungherò molto ma credo sia più difficile
spiegare che
realizzare tale progetto, vi prego di seguirmi fino in fondo.
Ora io ho già creato progettato tutto l'hardware necessario ma per quanto io
abbia provato letto, studiato purtroppo non
sono riuscito a programmare i PIC utilizzando l'Assembler. Io volevo sapere
se fra di voi c'è una persona amica ke mi farebbe questo piccolo favore
di progettarmi un piccolo software non molto complesso che ora andrò a
descrivere: (io non sono riuscito a gestire INTERRUPT e CICLI che qui sono
fondamentali)
Allora inizio subito col dire che il PIC da programmare è un 16F74 (in caso
non vada bene si può anche cambiare con un altro o con anche ATMEL o ST6 etc
etc)
Io ho 16 canali luci e 4 canali opzionali, tutti i canali sono attivi a
livello logico alto.
Le porte dei 16 canali sono la D (da 1 a 8) e la B (da 9 a 16) mentre per
quanto riguarda i 4 canali opzionli sono il bit RA5 e tutta la porta E (RE0,
RE1, RE2).
I pin connessi alla porta seriale (standard RS-232) sono RA0 e RA1
rispettivamente input dalla seriale e output dalla seriale.
Il pin RA2 (n.4) è un ponticello di abilitazione delle 4 porte opzionali (di
conseguenza abiliterà la ricezione di un pacchetto di dati in più dalla
seriale).
Il pin n.18 (RC3) riceve invece un'onda quadra a 50Hz che corrisponde a
quella della tensione di rete a 220V e servirà poi per gestire i canali
luce.
Tralascio per ora la gestione opzionale delle 4 uscite che comunque saranno
solo ON o OFF e non avranno la possibilità di pilotare TRIAC in maniera da
ottenere
un dimmer.
****
Innanzitutto devo premettere che ogni canale necessita di almeno 5+3bit
(2^5=32step, gli altri 3 bit servono
solamente per ottenere un byte e forse per futuri sviluppi del software, la
costante da aggiungere serve per gestire l'invio
dei dati dal PCe deve poter essere modificata a piacere) per poter
definire la combinazione dello step in questione dove si ha
000 00000b + Costante = 0% della potenza ovvero lampada spenta
000 11111b + Costante = 100% della potenza ovvero lampada accesa al massimo
Tutte le altre combinazioni intermedie definiscono i rimanenti 31 step.
Quindi avendo 16 canali e ogni canale richiedendo 8bit dobbiamo riservare
alla gestione
dei canali ben 16 registri da 8bit oppure 8 regiustri da 16bit (io per la
spiegazione mi baserò su registri a 8bit
e d'ora in poi li chiamerò registri dati, RD)
Il programma all'accensione dovrà portare le porte D e B (vedi sopra per i
PIN e i canali) a 0
quindi iniziare la fase di decodifica andando a leggere dai RD e portando
ciascuna uscita al valore presente
nel registro corrispondente.
La fase di portare le uscite ai valori dei RD deve essere fatta ciclicamente
e fino all'infinito (ovvero lo spegnimento del
circuito). Ricordo ancora che le uscite sono attive a livello logico alto.
Bisogna inoltre gestire un INTERRUPT, quello dei dati da ricevere via
seriale; per saperlo gestire correttamente si deve dire
innanzitutto che lo standard di comunicazione non prevede parità, viaggia
con 8bit di dati, 1 bit di stop e alla velocità di 38400.
I byte che verranno ricevuti sono esattamente 16 (17 poi se verranno
abilitate le uscite ausiliarie), non ho previsto la gestione degli errori
nell'invio dei pacchetti dati e nemmeno la possibilità di inviare
informazioni al PC dal microcontrollore, se viene ricevuto un pacchetto non
valido
semplicemente non si deve considerare quel pacchetto ma tenere il precedente
ricevuto.
Quindi per poter gestire questa fase si ha bisogno di un contatore che si
incrementi ad ogni byte ricevuto e che, dopo aver verificato che
il valore ricevuto non fuoriesca dal range disponibile, lo memorizzi nel suo
registro corrispondente.
Una volta terminata questa fase, il programma deve tornare a gestire
l'output rimasto in sospeso dal punto dove l'aveva lasciato.
E' chiaro che l'occhio non deve accorgersi di nulla e che tutto deve
sembrare fluido e
deve essere immediato, anche perchè la gestione via PC deve avvenire quasi
in tempo reale.
Per quanto riguarda le 4 uscite ausiliarie il discorso è diverso ma non
complicato.
Innanzitutto per abilitarle bisogna portare alto il valore di RA2, quindi la
procedura
che gestisce l'output alle uscite si dovrà occupare anche di queste 4 uscite
aggiuntive
di conseguenza sarà necessario un registro da almeno 4 bit in più e queste
uscite vanno
considerate sempre accese al 100%. Di conseguenza anche la gestione dei
pacchetti di
dati in arrivo via seriale dovrà occuparsi di un ulteriore byte, il 17esimo,
e verificarlo
quindi memorizzarlo.
Ogni bit del nibble corrisponderà esattamente a ciscun stato dei pin
ausiliari.
0000 = tutto OFF
1111 = tutto ON
Bisgona aggiungere inoltre che se il pin RA2 è a stato logico basso le
uscite vanno lasciate ad OFF.
***
Ora faccio seguire lo schema elettronico da me progettato per questo
circuito (è realizzato in FIDOCAD)
per me è molto importante sapere se almeno questo è giusto, se non lo
dovesse essere, lo modificherei
immediatamente seguendo le tue istruzioni. (Verificare il funzionamento del
circuito per quanto riguarda il
MATERCLEAR, il segnale ad ONDA QUADRA e la gestione della SERIALE). Sta a te
dirmi a quanti MHz
è necessario che io faccia lavorare il mio progetto per poter ottenere un
buon risultato.
Per quanto riguarda i finali di potenza si tratta di un triac BT137 isolato
galvanicamente con un MOC3020.
[FIDOCAD ]
TY 195 110 5 3 0 0 0 * 1
TY 208 110 5 3 0 0 0 * 40
TY 196 141 5 3 0 0 0 * 16F74
RV 194 110 215 210
LI 192 112 194 112
LI 192 117 194 117
LI 192 122 194 122
LI 192 127 194 127
LI 192 132 194 132
LI 192 137 194 137
LI 192 142 194 142
LI 192 147 194 147
LI 192 152 194 152
LI 192 157 194 157
LI 192 162 194 162
LI 192 167 194 167
LI 192 172 194 172
LI 192 177 194 177
LI 192 182 194 182
LI 192 187 194 187
LI 192 192 194 192
LI 192 197 194 197
LI 192 202 194 202
LI 192 207 194 207
LI 215 207 217 207
LI 215 202 217 202
LI 215 197 217 197
LI 215 192 217 192
LI 215 187 217 187
LI 215 182 217 182
LI 215 177 217 177
LI 215 172 217 172
LI 215 167 217 167
LI 215 162 217 162
LI 215 157 217 157
LI 215 152 217 152
LI 215 147 217 147
LI 215 142 217 142
LI 215 137 217 137
LI 215 132 217 132
LI 215 127 217 127
LI 215 122 217 122
LI 215 117 217 117
LI 215 112 217 112
LI 186 167 192 167
MC 186 167 0 0 045
MC 222 157 0 0 045
LI 217 157 222 157
LI 194 162 215 152
SA 194 162
SA 215 152
LI 164 174 190 174
LI 190 174 192 172
LI 164 189 175 189
LI 175 189 175 178
LI 175 178 192 178
LI 192 178 192 177
MC 154 174 0 0 170
MC 164 174 0 0 140
MC 154 189 0 0 170
LI 154 174 154 189
LI 154 174 154 167
LI 154 167 186 167
SA 154 174
SA 186 167
SA 164 189
SA 164 174
TY 162 191 3 2 0 0 0 * 22pF
TY 155 169 3 2 0 0 0 * 22pF
MC 32 4 0 0 500
LI 32 4 32 35
LI 32 35 12 35
LI 32 74 32 43
MC 12 43 2 0 000
MC 12 35 2 0 000
TY 2 38 3 2 0 0 0 * 220V AC 50Hz
MC 99 51 0 0 210
MC 89 41 0 0 210
MC 99 31 1 0 210
MC 89 41 1 0 210
LI 67 4 99 4
LI 99 4 99 31
LI 99 51 99 74
LI 99 74 67 74
SA 89 41
SA 99 51
SA 99 31
SA 109 41
TY 64 13 3 2 0 0 0 * Sec. 10V 1A
TY 91 40 3 2 0 0 0 * Ponte 1A
MC 117 41 0 0 180
MC 145 41 1 0 170
MC 155 41 0 0 180
TY 130 43 3 2 0 0 0 * M
TY 135 40 3 2 0 0 0 * U
TY 125 40 3 2 0 0 0 * E
RV 124 39 138 46
LI 109 41 124 41
LI 138 41 155 41
MC 155 41 3 0 010
MC 117 51 0 0 045
MC 145 51 0 0 045
MC 155 51 0 0 045
TY 131 58 3 2 0 0 0 * 100nF multistrato
TY 105 58 3 2 0 0 0 * 1000uF 25V
TY 127 39 3 2 0 0 0 * 7805
TY 159 44 3 2 0 0 0 * 100uF 16V
MC 83 41 0 0 045
LI 83 41 89 41
SA 117 41
SA 145 41
SA 155 41
TY 158 35 3 2 0 0 0 * +Vcc
MC 32 43 1 0 890
LI 12 43 22 43
TY 17 46 3 2 0 0 0 * 500mA 220V
MC 188 162 3 0 010
LI 188 162 193 162
MC 190 39 1 0 220
LI 155 41 186 41
LI 186 41 190 39
LI 190 54 155 54
SA 155 54
MC 160 112 0 0 180
LI 160 112 192 112
MC 160 122 0 0 045
MC 173 102 1 0 080
TY 176 107 3 2 0 0 0 * 10kOhm 1/4W
TY 164 118 3 2 0 0 0 * 1uF 15V
MC 173 102 3 0 010
TY 176 96 3 2 0 0 0 * +Vcc
MC 107 94 1 0 300
MC 92 94 0 0 200
LI 92 94 92 87
LI 92 87 97 87
SA 92 94
MC 92 109 0 0 045
LI 97 109 92 109
LI 92 109 92 94
SA 92 109
MC 107 74 1 0 080
LI 107 84 107 94
SA 107 87
LI 99 74 107 74
SA 99 74
MC 97 87 0 0 080
TY 86 81 3 2 0 0 0 * 10k 1/4W
TY 105 70 3 2 0 0 0 * 1k 1/4W
SA 107 94
TY 93 97 3 2 0 0 0 * 1N4148
TY 102 114 3 2 0 0 0 * 2N2222
MC 120 109 3 0 080
TY 123 104 3 2 0 0 0 * 10k 1/4W
LI 117 109 120 109
LI 120 109 142 109
LI 192 197 142 197
LI 142 197 142 109
SA 120 109
MC 120 99 3 0 010
TY 179 157 3 2 0 0 0 * +Vcc
TY 73 163 3 2 0 0 0 * 1
TY 73 147 3 2 0 0 0 * 16
MC 74 169 3 0 640
TY 86 155 3 2 0 0 0 * MAX232
MC 109 169 0 0 180
LI 99 169 99 179
LI 99 179 109 179
MC 89 169 0 0 180
LI 94 169 94 179
LI 94 179 89 179
TY 112 171 3 2 0 0 0 * 1uF 16V
MC 74 169 0 0 180
LI 84 169 84 179
LI 84 179 74 179
TY 68 179 3 2 0 0 0 * 1uF 16V
TY 85 179 3 2 0 0 0 * 1uF 16V
LI 70 169 79 169
TY 55 171 3 2 0 0 0 * 1uF 16V
MC 74 144 2 0 180
LI 74 134 79 134
LI 79 134 79 144
TY 69 130 3 2 0 0 0 * 1uF 16V
LI 74 134 66 134
MC 66 134 0 0 045
MC 69 145 2 0 010
LI 74 145 69 145
SA 74 145
MC 60 169 3 0 180
MC 60 169 3 0 010
LI 109 169 128 169
MC 128 169 0 0 045
SA 109 169
SA 79 134
SA 74 134
LI 84 144 84 124
LI 89 145 89 124
MC 89 124 3 0 000
MC 84 124 3 0 000
TY 91 119 3 2 0 0 0 * IN
TY 76 118 3 2 0 0 0 * OUT
LI 104 134 104 145
LI 79 134 104 134
LI 99 145 99 131
LI 99 131 182 131
LI 182 131 182 117
LI 182 117 192 117
LI 94 145 94 137
LI 94 137 185 137
LI 185 137 185 122
LI 185 122 193 122
TY 138 67 3 2 0 0 0 * sono le uscite della porta D e sono attive
TY 138 71 3 2 0 0 0 * a livello logico alto e sono i canali dal 1 all'8
TY 138 75 3 2 0 0 0 * Stessa cosa dicasi per la porta B dal pin 33 al 40
TY 138 63 3 2 0 0 0 * I pin del MC dal 19 al 22 e dal 27 al 30
TY 138 79 3 2 0 0 0 * che corrispondono ai canali dal 9 al 16
TY 138 83 3 2 0 0 0 * e sono sempre attive a 1
TY 138 87 3 2 0 0 0 * 4 ulteriori uscite sono previste nei pin 7,8,9,10
TY 138 91 3 2 0 0 0 * per futuri sviluppi (ES luci strobo)
TY 159 180 3 2 0 0 0 * 10MHz
MC 15 30 0 0 070
MC 185 145 1 0 750
LI 192 127 188 127
LI 188 127 188 145
LI 188 145 185 145
MC 170 145 2 0 010
Vi ringrazio già da adesso, sono ben accetti consigli e pezzi di codice ASM
perchè io non ci capisco nulla anche se mi sono molto applicato in tale
direzione.
Grazie ancora e scusatemi se mi sono dilungato tanto, se non fosse ancora
chiaro qualcosa
non esitate a dirmelo.
Stefano.
per rispondere, usate il NewsGroup oppure togliete NO-SPAM dall'indirizzo:
sy3kcN...@inwind.it


Ciao
intanto perche' non scrivi il programma in C?
E' molto piu' semplice che in ASM...
Poi... piuttosto che leggere la seriale da interrupt, io lo userei per
sincronizzare il segnale ai Triac con la sinusoide della rete...
Se ti serve una mano per il programma scrivimi
ciao
S