ciao,
come spesso accade, per poter attivare dei carichi o c'=E8 un bel "filo"
( tra centralina e apparato) o un collegamento RF con i moduli TX-RX.
Cercavo un modo pi=F9 casereccio per utilizzare le onde convogliate, senza scomodare x-10, modem su power line , etc...
Cercando in rete ho trovato pochi esempi tra cui quello di filrub.
Il concetto "sembra" semplice. Riporto la sua spiegazione... [=2E..] Il principio di base =E8 sovrapporre alla tensione di rete (f=3D50 Hz) un segnale a frequenza elevata (160 KHz) e ampiezza limitata (100-200 mV).
Questo segnale si propaga in tutto l'impianto elettrico di casa ed =E8 quindi "disponibile" in ogni presa. Se stabilisco che la condizione di "uno logico" equivale al segnale a
160 KHz presente e la condizione di "zero logico" equivale al segnale non presente posso allora trasmettere dei dati digitali attraverso l'impianto elettrico, e posso far comunicare tra loro diversi dispositivi posti in stanze diverse senza dover tirare nuovi fili. [=2E..] Da qui l'idea di usare un PIC per ridurre ulteriormente la componentistica. Diciamo che non =E8 necessario comunicare con un rs232 sulla linea, ma =E8 sufficiente scambiare qualche byte (ovvio che =E8 serializzato !) senza troppi controlli sull'esito di trasmissione e ricezione. Il pic avrebbe un comportamento standard che, con l'aggiunta di qualchecomponente esterno, dovrebbe poter essere utilizzato in modo facile e veloce ogni
qualvolta si necessita di una "comunicazione" su linea elettrica. Ad esempio (prendendo spunto dal dtmf decode 8870) alcuni pin potrebbero svolgere le seguenti funzioni: RA2=3D dato pronto: se in scrittura il dato =E8 pronto per essere inviato se in lettura il dato =E8 pronto per essere letto RA3=3D read/write: se 0 il PIC si mette in ascolto sulla linea, se 1 il pic scrive RB0-RB3 =3D cifra letta (diciamo di inviare un dato a 4 bit) RB4=3D output su linea elettrica RB5=3D input da linea elettrica
All'interno del PIC =E8 controllato il valore di RA3 (read/write) e mi metto nella proc di lettura o scrittura. Il clock del PIC16f88 =E8 8Mhz quindi 1 istruzione dura 0.5 us. Con questo clock riesco a generare frequenze tra 150kHz (6.6us) e
166KHz(6us) che sono in linea con quanto letto in materia di frequenze utilizzate per la linea elettrica.Per comodit=E0 il tempo di bit lo imposto a 250*6us=3D1.5ms Il mio pacchetto da inviare (nell'ordine LSB-MSB) sar=E0 quindi una cosa
del tipo: SAAAADDDDP quindi 10 bit: S=3D bit di start =3D sempre 1 A=3D bit di indirizzo (diciamo per far comunicare pic differenti sulla linea) D=3D bit di dato P=3D bit di stop =3D sempre 1 totale 15ms, pi=F9 o meno...
Il circuito allegato =E8 ispirato a quanto gi=E0 visto. Q1 dovrebbe generare il burst (livello 1 del bit) e spararlo sulla linea elettrica tramite TR1 (che su consiglio di filrub =E8 un wb1010)
R3,L1 e C1 effettuano un ottimo filtro (sempre consigliato da filrub) sulla rete (forse per frequenze sui 166kHz sarebbe merglio 92uH), quindi il segnale viene raddrizzato e Q2 ricostruisce il livello 0/1.
Dato che sono alle prime armi e lo schema =E8 puramente teorico, cosa suggerite ?
1) non =E8 possibile usare un solo "trasformatore" ? 1=2E1) anch'io penso di si, ma in che modo ? 2) quali sar=E0 l'ampiezza del segnale in ricezione ? 3) forse =E8 meglio amplificarlo ? (la semplicit=E0 dello schema per=F2 siva a far benedire)
Scusate se non posto subito lo schema in fidocad, ma se volete ho quello di eagle.
P=2ES: un grazie a chi mi ha aiutato nel progetto precedente
con tanta pazienza:
Allego un prototipo di codice in basic.
Define CONF_WORD =3D 0x2f18 Define CONF_WORD_2 =3D 0x3ffc Define CLOCK_FREQUENCY =3D 8
Symbol pin_dp =3D RA2 Symbol pin_rw =3D RA3 Symbol pin_out =3D RB4 Symbol pin_in =3D RB5
Dim val_lettura As Bit Dim val_scrittura As Bit Dim val_datook As Bit Dim val_datonook As Bit Dim val_livelloon As Bit Dim val_livellooff As Bit
Dim valorepin As Bit Dim i As Byte Dim j As Byte Dim cifra As Byte Dim indirizzo As Byte Dim pacchetto As Word Dim appo As Word
'--------- inizio programma
val_lettura =3D 0 val_scrittura =3D 1
val_datook =3D 1 val_datonook =3D 0
val_livelloon =3D 0 val_livellooff =3D 1
OSCCON =3D 0x70 'internal 8mhz clock OPTION_REG =3D 0 AllDigital ANSEL =3D 0 TRISA =3D 0 TRISB =3D 0
TRISB.5 =3D 1 TRISA.3 =3D 1
mainloop:
If pin_rw =3D val_lettura Then Gosub main_lettura Endif
If pin_rw =3D val_scrittura Then Gosub main_scrittura Endif
Goto mainloop End burst: 'circa 1.5 ms i =3D 250 '--bit time While i 0 pin_out =3D 1 i =3D i - 1 ASM: nop pin_out =3D 0
Wend
'--bit time end Return no_burst: '1.5 ms di silenzio a 8mHz pin_out =3D 0 For i =3D 1 To 250 ASM: nop ASM: nop ASM: nop Next i
Return attendi_mezzobit: '0.75 ms di pausa a 8mHz For i =3D 1 To 125 ASM: nop ASM: nop ASM: nop Next i Return attendi_unbit: '1.5 ms di pausa a 8mHz For i =3D 1 To 249 ASM: nop ASM: nop ASM: nop Next i Return
main_lettura: 'ricevo prima il bit meno significativo pin_dp =3D val_datonook If TRISA.2 0 Then ' se non ero in lettura ' mi predispongo per l'output TRISA.2 =3D 0 TRISB =3D TRISB And 0xf0 RB =3D RB And 0xf0 Endif appo =3D 0
'in ricezione attendo di sentire un 1 While pin_in =3D val_livellooff ASM: nop If pin_rw =3D val_scrittura Then Goto finelettura Endif Wend ' dopo , mi sincronizzo con ' il centro del segnale ' e ricevo 9 bit sucessivi Gosub attendi_mezzobit For j =3D 1 To 9 Step 1 Gosub attendi_unbit appo =3D ShiftRight(appo, 1) valorepin =3D pin_in If valorepin =3D val_livelloon Then appo =3D appo Or 0x0100 Endif Next j Break 'l ultimo deve essere un 1 If appo.8 =3D 1 Then appo =3D appo And 0x00ff cifra =3D appo.LB cifra =3D cifra And 0xf indirizzo =3D appo.LB indirizzo =3D ShiftRight(indirizzo, 4) PORTB =3D PORTB Or cifra pin_dp =3D val_datook Endif finelettura:
Return main_scrittura: 'mando prima il bit meno significativo If TRISA.2 1 Then 'se non ero in scittura ' mio predispongo TRISA.2 =3D 1 TRISB =3D TRISB Or 15
Endif pin_out =3D 0 'attendo l'indicazione di dato pronto While pin_dp =3D val_datonook ASM: nop If pin_rw =3D val_lettura Then Goto finescrittura Endif
Wend cifra =3D PORTB And 15 'il "pacchetto" =E8 composto ' da primi4 bit indirizzo ' secondi 4 bit cifra ' preceduti da un 1 e seguiti da un 1 pacchetto =3D cifra pacchetto =3D pacchetto + (indirizzo * 16) pacchetto =3D ShiftLeft(pacchetto, 1) pacchetto.0 =3D 1 pacchetto =3D pacchetto And 0x01ff pacchetto =3D pacchetto Or 0x0200
appo =3D pacchetto For j =3D 1 To 10 Step 1 Break If appo.0 =3D 1 Then Gosub burst Else Gosub no_burst Endif appo =3D ShiftRight(appo, 1)
Next j=20 finescrittura:=20
Return