| ForumEA
| Inviato il: 29/09/2014 17:30:54
|
Che spettacolo vedere il codice,questo tuo progetto sarà il riferimento del PPTEA,dovrebbe essere portato in giro per le fiere:vedi make faire
--------------- Assistente ForumEA
| | | | MarKoZaKKa
| Inviato il: 29/09/2014 22:37:07
|
...considerato che si tratta di cowboy programming...
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 09/12/2014 12:13:29
|
Azz, ho ripreso in mano l'oggetto , e mi sono accorto di non aver aggiornato la documentazione... (si, devo leggermi la documentazione per ricordarmi come funziona... sarà Alzheimer?.... chi?)
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 13/12/2014 08:59:06
|
Allra, ho scoperto un baco, ho aggiornato la documentazione del nodo, ho aggiornato codice e documentazione del master, ho messo tutto QUI
Ciao!
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 13/12/2014 09:00:11
|
Elettro, hai poi implementato la domotica?
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 24/02/2015 12:14:34
|
Ho fatto piccoli aggiustamenti nel codice, per risparmiare ancora qualche token, appena bolle scoverà il baco che gli ho segnalato, posterò tutto, e mi dedicherò alla realizzazione del controller impianto, probabilmente con il Micromite + interfaccia terminale vga + PPTEA... ohmamma!!!
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 21/09/2015 21:30:51
|
Ulteriore versione del codice nodo, a seguito dei test su una rete di 4 nodi. Migliorata la gestione comunicazioni, eliminata selezione velocità, ora fissa a 9600bps.
Con questo codice hanno girato 4 nodi in rete con 1 interrogazione dal master controller ogni secondo, per 24ore, senza che i nodi si piantassero.
Adesso mi metto sotto con il Micromite master controller.
PRAGMA NO_NUM_LINE
PRAGMA EXTENDED2K_EEPROM
REM INIZIO PROGRAMMA
REM PPTEA/DOMO v3.28 19/09/15
REM IMPOSTAZIONI INIZIALI
SETIO=&H67803
OUT=&H0000
PWMIO1=&H0
CADS=2
EEXTERNAL=0
SERIALSPEED=SPEED_9600
CONSTANT MRQ_OUT=&HFD
CONSTANT MRQ_IN=&HFB
CONSTANT MRQ_ANALOG=&HFA
CONSTANT MRQ_SET=&HFE
CONSTANT MRQ_TOG=&HFF
CONSTANT MRQ_LSET=&HF9
CONSTANT MRQ_LRST=&HF8
CONSTANT MRQ_NOP=&HF0
CONSTANT MAST_CMD=&HC0
CONSTANT MAST_PRG=&HF0
CONSTANT MAST_RPL=&HAF
CONSTANT PROG_MODE_IO=&H7F
CONSTANT PROG_RPL=&HDF
CONSTANT PROG_MODE_ANSW=&HBF
CONSTANT PROG_ERR=&HEF
CONSTANT DPRG=&H10
:INIT
CALL LOAD_MEMORY
IF !LOAD_MEMORY THEN
WPGM=TRUE
CALL WAIT_PGM
CALL COMMS_CHECK
ELSE
WPGM=FALSE
CALL INITOUTS
ENDIF
REM LOOP PRINCIPALE
:MAIN_LOOP
IF WPGM THEN :INIT
CALL INPUT_CHECK
IF INPUT_CHECK<&H2F AND INPUT_CHECK>&H00 THEN CALL CALCOUT(FALSE)
IF TIMER-RT<COMM_INTR THEN :MAIN_LOOP
CALL COMMS_CHECK
GOTO :MAIN_LOOP
END
REM CONTROLLO INGRESSI
SUB INPUT_CHECK
T_ADDR=&H00
P_ADDR=&H0F-(INP/&H800)
IF P_ADDR=&H00 THEN :EXIT_CHECK
GV1=FALSE
GV2=TIMER+PWT
ST=TIMER
:PUSHTIME_MEASURE
IF TIMER<GV2 THEN :SKIP_FLASH
GV2=TIMER+PWT
GV1=!GV1
OUTBIT(&H0F)=GV1*DO_SIGNAL
:SKIP_FLASH
IF &H0F-(INP/&H800)<>&H0 AND TIMER<ST+PUSHTIME2 THEN :PUSHTIME_MEASURE
PTIME=TIMER-ST
IF PTIME>PUSHTIME1 THEN T_ADDR=&H01
IF PTIME>PUSHTIME2 THEN T_ADDR=&H02
OLD_P=P_ADDR
OLD_T=T_ADDR
OUTBIT(&H0F)=FALSE
:EXIT_CHECK
INPUT_CHECK=P_ADDR*&H03+T_ADDR
SUBEND
REM CALCOLO STATO USCITE INIZIALE
SUB INITOUTS
CELL=&H02
OLD_OUT=REEPROM
NEW_OUT=OLD_OUT
IF RELAY=&HAA THEN
MEM=OLD_OUT
CALL SETOUT
ENDIF
SUBEND
REM ATTESA PROGRAMMAZIONE VIA SERIALE/USB
SUB WAIT_PGM
MOD_OUT=0
COMM_RESET=30.0
COMM_INTR=0.500
COMM_WAIT=0.250
CALL SIGNAL(5,6)
SUBEND
REM CONTROLLO COMUNICAZIONI IN ARRIVO
SUB COMMS_CHECK
ST=TIMER+COMM_WAIT
WHILE TIMER<ST
COM_IN=COM_IN & SERIALINPSTR & USBINPSTR
LOOP
IF LEN(COM_IN)>=&H04 THEN
CALL COMM_ANALYZE
RT=TIMER
ENDIF
IF TIMER>=COMM_RESET THEN
SERIALCLOSE
RESET_TIMER
ENDIF
SUBEND
REM ANALISI COMUNICAZIONI IN ARRIVO ED ESECUZIONE COMANDI REMOTI
SUB COMM_ANALYZE
RESET_TIMER
:ANALYZE
GV3=&H01
MSGID=ASC(MID(COM_IN,1,1)))
MRQ=ASC(MID(COM_IN,2,1)))
DATOIN=ASC(MID(COM_IN,3,1)))
CHECKIN=ASC(MID(COM_IN,4,1)))
CALL CHECK
MASTREPLY=TRUE
IF CHECKIN<>CHECK THEN :ANALYZEBACK
IF MSGID=MAST_PRG OR MSGID=NODE_PRG THEN :PROG_COMMAND
IF WPGM THEN :ANALYZEOK
' :COMMANDS
MASTREPLY=FALSE
IF MSGID=MAST_CMD THEN :MAST_COMMS
MASTREPLY=TRUE
IF MSGID<>NODE_CMD THEN :ANALYZEOK
MSGID=MAST_RPL
IF MRQ=MRQ_NOP THEN :NOP_COMM
IF MRQ=MRQ_IN THEN :COMMS_INSTATE
IF MRQ=MRQ_OUT THEN :COMMS_OUTSTATE
IF MRQ=MRQ_ANALOG THEN
GV2=1
:COMMS_ANALOG
AG1=0
GV1=&H0
:ADD
AG1+=CADSIND(GV2)
GV1--
IF GV1>&H9 THEN :ADD
AG1=(AG1/&HA)*&H2+&H801
AG3=AG1/&H100
AG2=(AG1-AG3*&H100)/&H10
AG1=AG1-(AG3*&H100+AG2*&H10)
MRQ=NODE_ID+AG3
DATOIN=AG2*&H10+AG1
CALL COMMOUT
GV2++
IF GV2<3 THEN :COMMS_ANALOG
GOTO :ANALYZEOK
ENDIF
:MAST_COMMS
IF MRQ=MRQ_SET THEN :COMMS_SETOUT
IF MRQ=MRQ_TOG THEN :COMMS_TOGOUT
IF MRQ=MRQ_LSET THEN :COMMS_LSET
IF MRQ=MRQ_LRST THEN :COMMS_LRST
GOTO :ANALYZEOK
'COMUNICAZIONE USCITE ANALOGICHE
:COMMS_OUTSTATE
MRQ=NODE_ID+&HD
CELL=2
DATOIN=REEPROM+&H80
GOTO :COMMS_END
:COMMS_INSTATE
MRQ=NODE_ID+&HB
DATOIN=(OLD_T*&H10+OLD_P) OR &H80
GOTO :COMMS_END
:COMMS_SETOUT
MRQ=NODE_ID+&HE
T_ADDR=&H03
GOTO :TOG_SET_END
:COMMS_TOGOUT
MRQ=NODE_ID+&HF
T_ADDR=&H06
GOTO :TOG_SET_END
:COMMS_LSET
MRQ=NODE_ID+&H9
T_ADDR=&H04
GOTO :TOG_SET_END
:COMMS_LRST
MRQ=NODE_ID+&H8
T_ADDR=&H05
:TOG_SET_END
MOD_OUT=DATOIN-&H80
CALL CALCOUT(TRUE)
GOTO :COMMS_END
:NOP_COMM
MRQ=NODE_ID+&HC
MSGID=MAST_RPL
CELL=&HF7
IF DATOIN=&HFF THEN
OLDNOP=REEPROM
DATOIN=OLDNOP
GOTO :COMMS_END
ENDIF
IF DATOIN<>&HF0 THEN :ANALYZEBACK
NOP=REEPROM
DATOIN=&H7F
IF NOP=OLDNOP THEN WEEPROM=&H80
GOTO :COMMS_END
:PROG_COMMAND
IF MSGID=MAST_PRG THEN MASTREPLY=FALSE
CELL=&HFF
IF MRQ=PROG_MODE_IO THEN
MRQ=NODE_ID + &HF
IF WPGM AND DATOIN=&H55 THEN :EXIT_PROGMODE
IF DATOIN=&HAA AND MSGID=NODE_PRG THEN :ENTER_PROGMODE
IF DATOIN=&HAA AND MSGID=MAST_PRG AND INPUT_CHECK=&H2F THEN :ENTER_PROGMODE
ENDIF
IF MRQ=PROG_ERR THEN :PROG_ERROR_QRY
IF WPGM THEN :PROG_DATA
GOTO :ANALYZEOK
:ENTER_PROGMODE
WEEPROM=&H02
WPGM=TRUE
GOTO :PROGMODE_COMM
:EXIT_PROGMODE
WEEPROM=&HAA
:PROGMODE_COMM
MSGID=PROG_MODE_ANSW
GOTO :COMMS_END
:PROG_DATA
IF MRQ>=&H90 THEN :NODPRG
<img border=0 src=faccine\biggrin.gif width=20 height=20>PRG
MRQ-=DPRG
DATOIN-=DPRG
:NODPRG
CELL=MRQ
WEEPROM=DATOIN
CALL SIGNAL(25,1)
MSGID=PROG_RPL
GOTO :COMMS_END
:PROG_ERROR_QRY
IF MSGID=NODE_PRG OR WPGM THEN MASTREPLY=TRUE
DATOIN=REEPROM
MSGID=PROG_ERR
MRQ=NODE_ID + &HF
GOTO :COMMS_END
:COMMS_END
IF MASTREPLY THEN CALL COMMOUT
:ANALYZEOK
GV3=&H04
:ANALYZEBACK
COM_IN=RIGHT(COM_IN,LEN(COM_IN)-GV3)
IF LEN(COM_IN)>=4 THEN :ANALYZE
COM_IN=""
SUBEND
REM CALCOLO CHECK BYTE
SUB CHECK
CHECK=(MRQ+DATOIN) MOD &H100
IF CHECK<>&H00 THEN :CHECKBACK
CHECK=&HFF
:CHECKBACK
SUBEND
REM TRASMISSIONE MESSAGGI SU SERIALE/USB
SUB COMMOUT
CALL CHECK
GV1=CHR(MSGID)
GV1=GV1&CHR(MRQ)
GV1=GV1&CHR(DATOIN)
GV1=GV1&CHR(CHECK)
SERIALOUT=GV1
USBOUT=GV1
SUBEND
REM CALCOLO NUOVO STATO USCITE
SUB CALCOUT
IF T_ADDR>&H02 THEN :COMMSET
CELL=INPUT_CHECK
MOD_OUT=REEPROM
IF MOD_OUT=&H80 THEN :CALCOUTBACK
IF MOD_OUT>&H80 THEN :MEM_NOPCOMM
:COMMSET
CELL=&H02
OLD_OUT=REEPROM
INIBH_OUT=(OLD_OUT AND MASKBIT)
IF T_ADDR=&H04 THEN
MOD_OUT=OLD_OUT OR MOD_OUT
GOTO :IMPOSE
ENDIF
IF T_ADDR=&H05 THEN
MOD_OUT=OLD_OUT AND MOD_OUT
ENDIF
IF T_ADDR=&H02 OR T_ADDR=&H03 THEN :IMPOSE
:TOGGLE
IF RELAY=&H55 THEN <img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS ELSE :XOROUTS
:IMPOSE
IF RELAY=&H55 THEN :XOROUTS
<img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS
NEW_OUT=MOD_OUT
IF T_ADDR=&H02 THEN
NEW_OUT=NEW_OUT OR INIBH_OUT
ENDIF
IF RELAY=&H55 THEN MEM=MOD_OUT XOR OLD_OUT ELSE MEM=NEW_OUT
GOTO <img border=0 src=faccine\biggrin.gif width=20 height=20>OIT
:XOROUTS
IF T_ADDR=&H02 THEN
MOD_OUT=MOD_OUT OR INIBH_OUT
ENDIF
NEW_OUT=MOD_OUT XOR OLD_OUT
IF RELAY=&H55 THEN MEM=MOD_OUT ELSE MEM=NEW_OUT
<img border=0 src=faccine\biggrin.gif width=20 height=20>OIT
CALL SETOUT
GOTO :CALCOUTBACK
:MEM_NOPCOMM
CELL=&HF7
WEEPROM=MOD_OUT
:CALCOUTBACK
IF &H0F-(INP/&H800)>&H00 THEN :CALCOUTBACK
SUBEND
REM ATTUAZIONE NUOVO STATO USCITE
SUB SETOUT
CELL=&H02
WEEPROM=MEM
' :NORMALRELAY
OUT=NEW_OUT*&B100
IF RELAY<>&H55 THEN :SETOUTBACK
' :STEPRELAY
WAITMS STEPDELAY
OUT=&H00
:SETOUTBACK
SUBEND
REM CARICO CONFIGURAZIONE DA EEPROM
SUB LOAD_MEMORY
LOAD_MEMORY=TRUE
' :NODEID
GV1=&HFE
CELL=GV1
GV2=REEPROM
IF GV2=&H00 OR GV2>=&H0F THEN :PROGERR
' :SETID
NODE_ID=GV2*&H10
NODE_PRG=MAST_PRG+GV2
NODE_CMD=MAST_CMD+GV2
' :CONFIGOK
CELL=&HFF
GV1=REEPROM
IF GV1<>&HAA THEN :PROGERR
' :SERIALCOMM
GV1=&HF6
CELL=GV1
GV2=REEPROM
IF GV2=&H00 THEN :PROGERR
COMM_RESET=GV2*(30.0/255)
GV1=&HF5
CELL=GV1
GV2=REEPROM
IF GV2=&H00 THEN :PROGERR
COMM_INTR=GV2*(15.0/255)
GV1=&HF4
CELL=GV1
GV2=REEPROM
IF GV2=&H00 THEN :PROGERR
COMM_WAIT=GV2*(1.0/255)
' :RELAYKIND
GV1=&HFD
CELL=GV1
GV2=REEPROM
IF GV2<>&HAA AND GV2<>&H55 THEN :PROGERR
RELAY=GV2
CELL=&HFC
STEPDELAY=REEPROM
' :TIMEOUT
CELL=&HFB
GV2=REEPROM
PUSHTIME2=2.0/255
PUSHTIME1=GV2*PUSHTIME2
CELL=&HFA
GV2=REEPROM
PUSHTIME2*=GV2
CELL=&HF9
PWT=REEPROM
PWT/=512.0
' :INIBITHED_OUTS
CELL=&HF2
MASKBIT=REEPROM
' :SIGNAL
GV1=&HF3
CELL=GV1
GV2=REEPROM-&H01
IF GV2>&H01 THEN :PROGERR
DO_SIGNAL=GV2
GOTO :LOADMEMBACK
:PROGERR
LOAD_MEMORY=FALSE
IF WPGM THEN :LOADMEMBACK
CELL=&HFF
WEEPROM=GV1
WPGM=TRUE
:LOADMEMBACK
SUBEND
REM SEGNALAZIONE
SUB SIGNAL(GV1,GV2)
:SIG
OUTBIT(&H0F)=GV2 MOD 2
WAITMS GV1
GV2--
IF GV2>0 THEN :SIG
OUTBIT(&H0F)=FALSE
SUBEND
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 06/10/2015 13:36:24
|
...Sono riuscito a rimettere la selezione velocità, più alcune ottimizzazioni del codice, in 1937 token... ho pure sistemato una stupidaggine che non mi piaceva sui comandi...
Adesso mi applico sul serio con il Micromite... forse...
PRAGMA NO_NUM_LINE
PRAGMA EXTENDED2K_EEPROM
REM INIZIO PROGRAMMA
REM PPTEA/DOMO v3.28a 05/10/15
REM IMPOSTAZIONI INIZIALI
SETIO=&H67803
OUT=&H0000
PWMIO1=&H0
CADS=2
EEXTERNAL=0
CONSTANT MRQ_OUT=&HFD
CONSTANT MRQ_IN=&HFB
CONSTANT MRQ_ANALOG=&HFA
CONSTANT MRQ_SET=&HFE
CONSTANT MRQ_TOG=&HFF
CONSTANT MRQ_LSET=&HF9
CONSTANT MRQ_LRST=&HF8
CONSTANT MRQ_NOP=&HFC
CONSTANT MAST_CMD=&HC0
CONSTANT MAST_PRG=&HF0
CONSTANT MAST_RPL=&HAF
CONSTANT PROG_MODE_IO=&H7F
CONSTANT PROG_RPL=&HDF
CONSTANT PROG_MODE_ANSW=&HBF
CONSTANT PROG_ERR=&HEF
CONSTANT DPRG=&H10
:INIT
REM CARICO CONFIGURAZIONE DA EEPROM
REM :NODEID
GV1=&HFE
CELL=GV1
GV2=REEPROM
IF GV2=&H00 OR GV2>=&H0F THEN :PROGERR
REM :SETID
NODE_ID=GV2*&H10
NODE_PRG=MAST_PRG+GV2
NODE_CMD=MAST_CMD+GV2
REM :CONFIGOK
CELL=&HFF
GV1=REEPROM
IF GV1<>&HAA THEN :PROGERR
REM :SERIALCOMM
GV1=&HF6
CELL=GV1
GV2=REEPROM
IF GV2=&H00 THEN :PROGERR
COMM_RESET=GV2*(30.0/255)
GV1=&HF5
CELL=GV1
GV2=REEPROM
IF GV2=&H00 THEN :PROGERR
COMM_INTR=GV2*(15.0/255)
GV1=&HF4
CELL=GV1
GV2=REEPROM
IF GV2=&H00 THEN :PROGERR
COMM_WAIT=GV2*(1.0/255)
REM :SPEED
GV1=&HF8
CELL=GV1
GV2=REEPROM
IF GV2<&H51 OR GV2>&H55 THEN :PROGERR
REM :SELECTSPEED
GV2=POW(2,GV2-&H51)
GV1=&HA0/GV2
IF GV1=10 THEN GV1+=2
IF GV1=20 THEN GV1-=1
SERIALSPEED=GV1
REM :RELAYKIND
GV1=&HFD
CELL=GV1
GV2=REEPROM
IF GV2<>&HAA AND GV2<>&H55 THEN :PROGERR
RELAY=GV2
CELL=&HFC
STEPDELAY=REEPROM
REM :TIMEOUT
CELL=&HFB
GV2=REEPROM
PUSHTIME2=2.0/255
PUSHTIME1=GV2*PUSHTIME2
CELL=&HFA
GV2=REEPROM
PUSHTIME2*=GV2
CELL=&HF9
PWT=REEPROM
PWT/=512.0
REM :INIBITHED_OUTS
CELL=&HF2
MASKBIT=REEPROM
REM :SIGNAL
GV1=&HF3
CELL=GV1
GV2=REEPROM-&H01
IF GV2>&H01 THEN :PROGERR
DO_SIGNAL=GV2
REM CALCOLO STATO USCITE INIZIALE
CELL=&H02
OLD_OUT=REEPROM
NEW_OUT=OLD_OUT
IF RELAY=&HAA THEN
MEM=OLD_OUT
CALL SETOUT
ENDIF
WPGM=FALSE
GOTO :MAIN_LOOP
:PROGERR
IF !WPGM THEN
CELL=&HFF
WEEPROM=GV1
WPGM=TRUE
ENDIF
REM ATTESA PROGRAMMAZIONE VIA SERIALE/USB
MOD_OUT=0
COMM_RESET=30.0
COMM_INTR=0.500
COMM_WAIT=0.100
CALL SIGNAL(5,6)
CALL COMMS_CHECK
REM FINE CARICO CONFIGURAZIONE DA EEPROM
REM LOOP PRINCIPALE
:MAIN_LOOP
IF WPGM THEN :INIT
REM CONTROLLO INGRESSI
T_ADDR=&H00
P_ADDR=&H0F-(INP/&H800)
IF P_ADDR=&H00 THEN :EXIT_CHECK
GV1=FALSE
GV2=TIMER+PWT
ST=TIMER
:PUSHTIME_MEASURE
IF TIMER<GV2 THEN :SKIP_FLASH
GV2=TIMER+PWT
GV1=!GV1
OUTBIT(&H0F)=GV1*DO_SIGNAL
:SKIP_FLASH
IF &H0F-(INP/&H800)<>&H0 AND TIMER<ST+PUSHTIME2 THEN :PUSHTIME_MEASURE
GV3=TIMER-ST
IF GV3>PUSHTIME1 THEN T_ADDR=&H01
IF GV3>PUSHTIME2 THEN T_ADDR=&H02
OLD_P=P_ADDR
OLD_T=T_ADDR
OUTBIT(&H0F)=FALSE
:EXIT_CHECK
INPUT_CHECK=P_ADDR*&H03+T_ADDR
REM FINE CONTROLLO INGRESSI
IF INPUT_CHECK<&H2F AND INPUT_CHECK>&H00 THEN CALL CALCOUT(FALSE)
IF TIMER-RT<COMM_INTR THEN :MAIN_LOOP
CALL COMMS_CHECK
GOTO :MAIN_LOOP
END
REM CONTROLLO COMUNICAZIONI IN ARRIVO
SUB COMMS_CHECK
ST=TIMER+COMM_WAIT
WHILE TIMER<ST
COM_IN=COM_IN & SERIALINPSTR & USBINPSTR
LOOP
IF TIMER>=COMM_RESET THEN
SERIALCLOSE
RESET_TIMER
ENDIF
IF LEN(COM_IN)>=&H04 THEN CALL COMM_ANALYZE
RT=TIMER
SUBEND
REM TRASMISSIONE MESSAGGI SU SERIALE/USB
SUB COMMOUT
CALL CHECK
COMMOUT=CHR(MSGID)
COMMOUT=COMMOUT&CHR(MRQ)
COMMOUT=COMMOUT&CHR(DATOIN)
COMMOUT=COMMOUT&CHR(CHECK)
SERIALOUT=COMMOUT
USBOUT=COMMOUT
SUBEND
REM CALCOLO CHECK BYTE
SUB CHECK
CHECK=(MRQ+DATOIN) MOD &H100
IF CHECK<>&H00 THEN :CHECKOUT
CHECK=&HFF
:CHECKOUT
SUBEND
REM ANALISI COMUNICAZIONI IN ARRIVO ED ESECUZIONE COMANDI REMOTI
SUB COMM_ANALYZE
RESET_TIMER
:ANALYZE
GV3=&H01
MSGID=ASC(MID(COM_IN,1,1)))
MRQ=ASC(MID(COM_IN,2,1)))
DATOIN=ASC(MID(COM_IN,3,1)))
CHECKIN=ASC(MID(COM_IN,4,1)))
GV4=NODE_ID+(MRQ-&HF0)
CALL CHECK
MASTREPLY=TRUE
IF CHECKIN<>CHECK THEN :ANALYZEBACK
IF MSGID=MAST_PRG OR MSGID=NODE_PRG THEN :PROG_COMMAND
IF WPGM THEN :ANALYZEOK
REM :COMMANDS
MASTREPLY=FALSE
IF MSGID=MAST_CMD THEN :MAST_COMMS
MASTREPLY=TRUE
IF MSGID<>NODE_CMD THEN :ANALYZEOK
MSGID=MAST_RPL
IF MRQ=MRQ_NOP THEN :NOP_COMM
IF MRQ=MRQ_IN THEN :COMMS_INSTATE
IF MRQ=MRQ_OUT THEN :COMMS_OUTSTATE
IF MRQ=MRQ_ANALOG THEN
REM COMUNICAZIONE USCITE ANALOGICHE
GV2=1
:COMMS_ANALOG
AG1=0
GV1=&H0A
:ADD
AG1+=CADSIND(GV2)
GV1--
IF GV1>1 THEN :ADD
AG1=(AG1/&HA)*&H2+&H801
AG3=AG1/&H100
AG2=(AG1-AG3*&H100)/&H10
AG1=AG1-(AG3*&H100+AG2*&H10)
MRQ=NODE_ID+AG3
DATOIN=AG2*&H10+AG1
CALL COMMOUT
GV2++
IF GV2<3 THEN :COMMS_ANALOG
GOTO :ANALYZEOK
ENDIF
:MAST_COMMS
IF MRQ=MRQ_SET THEN :COMMS_SETOUT
IF MRQ=MRQ_TOG THEN :COMMS_TOGOUT
IF MRQ=MRQ_LSET THEN :COMMS_LSET
IF MRQ=MRQ_LRST THEN :COMMS_LRST
GOTO :ANALYZEOK
:COMMS_OUTSTATE
CELL=2
DATOIN=REEPROM+&H80
GOTO :COMMS_END
:COMMS_INSTATE
DATOIN=(OLD_T*&H10+OLD_P) OR &H80
GOTO :COMMS_END
:COMMS_SETOUT
T_ADDR=&H03
GOTO :TOG_SET_END
:COMMS_TOGOUT
T_ADDR=&H06
GOTO :TOG_SET_END
:COMMS_LSET
T_ADDR=&H04
GOTO :TOG_SET_END
:COMMS_LRST
T_ADDR=&H05
:TOG_SET_END
MOD_OUT=DATOIN-&H80
CALL CALCOUT(TRUE)
GOTO :COMMS_END
:NOP_COMM
MSGID=MAST_RPL
CELL=&HF7
IF DATOIN=&HFF THEN
OLDNOP=REEPROM
DATOIN=OLDNOP
GOTO :COMMS_END
ENDIF
IF DATOIN<>&HF0 THEN :ANALYZEBACK
NOP=REEPROM
DATOIN=&H7F
IF NOP=OLDNOP THEN WEEPROM=&H80
GOTO :COMMS_END
:PROG_COMMAND
IF MSGID=MAST_PRG THEN MASTREPLY=FALSE
CELL=&HFF
IF MRQ=PROG_MODE_IO THEN
IF WPGM AND DATOIN=&H55 THEN :EXIT_PROGMODE
IF DATOIN=&HAA AND MSGID=NODE_PRG THEN :ENTER_PROGMODE
IF DATOIN=&HAA AND MSGID=MAST_PRG AND INPUT_CHECK=&H2F THEN :ENTER_PROGMODE
ENDIF
IF MRQ=PROG_ERR THEN :PROG_ERROR_QRY
IF WPGM THEN :PROG_DATA
GOTO :ANALYZEOK
:ENTER_PROGMODE
WEEPROM=&H02
WPGM=TRUE
GOTO :PROGMODE_COMM
:EXIT_PROGMODE
WEEPROM=&HAA
:PROGMODE_COMM
MSGID=PROG_MODE_ANSW
GOTO :COMMS_END
:PROG_DATA
IF MRQ>=&H90 THEN :NODPRG
<img border=0 src=faccine\biggrin.gif width=20 height=20>PRG
MRQ-=DPRG
DATOIN-=DPRG
:NODPRG
CELL=MRQ
WEEPROM=DATOIN
CALL SIGNAL(25,1)
MSGID=PROG_RPL
MRQ_TX=MRQ
GOTO :COMMS_END
:PROG_ERROR_QRY
IF MSGID=NODE_PRG OR WPGM THEN MASTREPLY=TRUE
DATOIN=REEPROM
MSGID=PROG_ERR
GOTO :COMMS_END
:COMMS_END
IF MASTREPLY THEN
MRQ=GV4
CALL COMMOUT
ENDIF
:ANALYZEOK
GV3=&H04
:ANALYZEBACK
COM_IN=RIGHT(COM_IN,LEN(COM_IN)-GV3)
IF LEN(COM_IN)>=4 THEN :ANALYZE
COM_IN=""
SERIALCLOSE
SUBEND
REM CALCOLO NUOVO STATO USCITE
SUB CALCOUT
IF T_ADDR>&H02 THEN :COMM_IN_SET
CELL=INPUT_CHECK
MOD_OUT=REEPROM
IF MOD_OUT=&H80 THEN :CALCOUTBACK
IF MOD_OUT>&H80 THEN :MEM_NOPCOMM
:COMM_IN_SET
CELL=&H02
OLD_OUT=REEPROM
INIBH_OUT=(OLD_OUT AND MASKBIT)
IF T_ADDR=&H04 THEN
MOD_OUT=OLD_OUT OR MOD_OUT
GOTO :IMPOSE
ENDIF
IF T_ADDR=&H05 THEN
MOD_OUT=OLD_OUT AND MOD_OUT
ENDIF
IF T_ADDR=&H02 OR T_ADDR=&H03 THEN :IMPOSE
:TOGGLE
IF RELAY=&H55 THEN <img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS ELSE :XOROUTS
:IMPOSE
IF RELAY=&H55 THEN :XOROUTS
<img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS
NEW_OUT=MOD_OUT
IF T_ADDR=&H02 THEN
NEW_OUT=NEW_OUT OR INIBH_OUT
ENDIF
IF RELAY=&H55 THEN MEM=MOD_OUT XOR OLD_OUT ELSE MEM=NEW_OUT
GOTO <img border=0 src=faccine\biggrin.gif width=20 height=20>OIT
:XOROUTS
IF T_ADDR=&H02 THEN
MOD_OUT=MOD_OUT OR INIBH_OUT
ENDIF
NEW_OUT=MOD_OUT XOR OLD_OUT
IF RELAY=&H55 THEN MEM=MOD_OUT ELSE MEM=NEW_OUT
<img border=0 src=faccine\biggrin.gif width=20 height=20>OIT
CALL SETOUT
GOTO :CALCOUTBACK
:MEM_NOPCOMM
CELL=&HF7
WEEPROM=MOD_OUT
:CALCOUTBACK
IF &H0F-(INP/&H800)>&H00 THEN :CALCOUTBACK
SUBEND
REM ATTUAZIONE NUOVO STATO USCITE
SUB SETOUT
CELL=&H02
WEEPROM=MEM
REM RELE STANDARD
OUT=NEW_OUT*&B100
IF RELAY<>&H55 THEN :SETOUTBACK
REM RELE STEP
WAITMS STEPDELAY
OUT=&H00
:SETOUTBACK
SUBEND
REM SEGNALAZIONE
SUB SIGNAL(GV1,GV2)
:SIG
OUTBIT(&H0F)=GV2 MOD 2
WAITMS GV1
GV2--
IF GV2>0 THEN :SIG
OUTBIT(&H0F)=FALSE
SUBEND
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 20/11/2015 22:19:36
|
Piu lavoro col Micromite e piu apprezzo il lavoro di Bolle con il PPTEA. Il simulatore è uno strumento potentissimo, che permette di provare il codice ed individuare problemi e bug a colpo d'occhio... il MM ti obbliga a provare tutto in hardware, la versione per PC del MMBasic non supporta i comandi specifici dell'hardwarw e quindi devi lavorare per forza col chip... rinnovo i complimenti a Bolle ed al team che sta dietro al PPTEA... bisognerebbe che vi applicaste al MM per fare la stessa cosa...
Modificato da BellaEli - 20/11/2015, 23:44:03
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | PinoTux
| Inviato il: 25/11/2015 18:27:36
|
Mi fa piacere che stai provando altre alternative e che nel confronto hai trovato punti di forza del lavoro fatto da Bolle.
Ultimamente mi ha confidato che riprenderà in mano il PPTEA appena sbrigati i compiti di questo periodo, sperando in un attimo di "calma"...
--------------- "Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza" http://iv3gfn.altervista.org/ http://pptea.altervista.org/
| | | | MarKoZaKKa
| Inviato il: 26/11/2015 07:35:28
|
Più che alternativo è un compagno di giochi...
Avendo più porte seriali e la gestione degli interrupt sia su seriale che sugli input mi permette alcune cose in maniera più facile rispetto al PPTEA (cmq il master domotica esiste già x PPTEA) ma nn è ancora detto che non scelga una soluzione ibrida demandando ad un PPTEA la gestione delle routine di interrogazione a causa di alcuni intoppi che sto incontrando nella comunicazione a 4800/9600bps... sembra che il MM mi perda dei dati in RX... purtroppo sto usando la versione del fw precedente e nn riesco a trovare il tempo per proseguire con costanza... ogni volta che riparto devo recuperare le idee... difetti del cowboy programmer...
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | non sbaglio mai
| Inviato il: 26/11/2015 16:29:22
|
Sì d'accordo su tutto
essendo ignorantissimo in materia, mi chiedo se non ci fosse un modo per far entrare in teste dure come la mia, tutti quei concetti e o
( fw, r, mm,cawboy programmer, ) | | | | MarKoZaKKa
| Inviato il: 29/11/2015 12:02:03
|
Chiedi e ti sarà spiegato ;-)
con un pò di ritardo:
fw=firmware (il "sistema operativo" che, messo nel PIC, lo trasforma in PPTEA o MicroMite)
rx=Receive (tx=Transmit) abbreviazioni usate quando si parla di comunicazioni
mm=abbreviazione per MicroMite
cowboy programmer=programmatore che lavora seguendo l'istinto e l'impeto del momento (come un cowboy che insegue il capo di bestiame) senza una pianficazione ed uno studio preliminare del problema).
Modificato da MarKoZaKKa - 08/12/2015, 08:07:03
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 08/12/2015 08:18:59
|
La versione 1.0 del DomoMaster on MicroMite èstata testata ieri con successo nella gestione di eventi in una rete di 5 nodi PPTEA/DOMO 3.28a; alla attuazione di un'ingresso al quale è associato un'evento remoto, entro 6 secondi viene eseguito il comando; nello specifico la cordicella di emergenza del bagno provoca l'accensione di luce bagno, luce stanza, luce corridoio, allarme stanza ed allarme remoto (ricordo che lo scenario dove sto costruendo il sistema è il futuro b&b di mio fratello).
Le prove fatte mi hanno permesso di capire che i problemi di "comprensione" del MM erano dovuti al rumore sul CAN-BUS (mancavano le resistenze di terminazione del bus, per cui il rumore causava errori nei bytes trasmessi, specie alle alte velocità).
Adesso proseguo per implementare alcune funzioni aggiuntive (comunicazione via bluetooth e/o wifi per la segnalazione allarmi)
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|