| NonSoloBolleDiAcqua
| Inviato il: 7/3/2013,14:36
|
Prima bozza...dovrebbe essere autoesplicativo!
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | MarKoZaKKa
| Inviato il: 7/3/2013,15:57
|
Grazie... lo immaginavo diverso, ma per iniziare è ottimo!
Io lo vedevo così, dove ad ogni riga, si invia la prima sequenza, si aspetta la ricezione, se la ricezione combacia con quanto atteso, si illumina OK, mi dice il ritardo della risposta, e se presente TX2 invia la seconda sequenza (stessa riga) aspetta la risposta e mi dice il ritardo. Se non è specificata una TX2, si va alla riga sotto e si ripete, dopo il ritardo impostato.
Grazie!!!
E chi è che se lo scarica, oltre me? Immagine Allegata: SerialZaK
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | alessio287
| Inviato il: 7/3/2013,21:36
|
Ciao Marko,
io non ho ambienti di sviluppo come il vb6 di Bolle...
Non penso che con eabasic ti posso essere d'aiuto... se pensi il contrario sono qua
Bye Alessio287
| | | | MarKoZaKKa
| Inviato il: 7/3/2013,23:26
|
Bolle, una precisazione: usando i CAN transceiver, ho una eco di ritorno di quanto trasmetto, sulla ricezione... il ritardo misurato dal tuo pgm è 15ms... dovresti quindi buttare via quanto arriva sulla seriale entro, diciamo, i 30ms dalla trasmissione del PC (modificabile? ). Attualmente, la risposta dal nodo 1 la ricevo in 300ms, quella dal nodo 14 in 850ms, ma volevo appunto usare questo strumento anche per ottimizzare il codice e ridurre questi tempi di reazione.
Alessio287, tutti si può essere d'aiuto a tutti... come già detto in altri luoghi, sono un cattivo programmatore ed un pessimo elettronico, ho solo molte idee per la testa e poco tempo per realizzarle... magari tu dai un'occhiata al mio codice della domotica, e trovi come ottimizzarlo. Mio padre diceva "chiunque può insegnarti qualcosa, anche uno spazzino per la strada".
Ciao!
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | NonSoloBolleDiAcqua
| Inviato il: 8/3/2013,01:48
|
CITAZIONE (MarKoZaKKa @ 7/3/2013, 23:26) Bolle, una precisazione: usando i CAN transceiver, ho una eco di ritorno di quanto trasmetto, sulla ricezione... il ritardo misurato dal tuo pgm è 15ms... dovresti quindi buttare via quanto arriva sulla seriale entro, diciamo, i 30ms dalla trasmissione del PC (modificabile? ). Si può mettere un flag del tipo 'cut echo' che si limita a buttare i caratteri di echo non legandoli al tempo....i dati di recezione vengono presi dopo quelli. Cosa ne dici?
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | MarKoZaKKa
| Inviato il: 8/3/2013,12:24
|
Come le mette meglio, capo, purchè funzioni!
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 9/5/2013,09:27
|
Visto che manca, posto il codice EABASIC del PPTEA/DOMO nella sua ultima versione... Aspetto sempre un volontario che mi realizzi il
| | | | MarKoZaKKa
| Inviato il: 12/9/2013,00:36
|
Dopo un pò di lavoro rubando quà e là quarti d'ora, ho finalmente riscritto il codice del PPTEA/DOMO per la versione Advanced del compiler... sicuramente non sarà un capolavoro, ma perlomeno è aggiornato. In questa versione i comandi possono essere ricevuti sia via seriale che via usb, ciò facilita chi volesse giocarci sopra, perchè non impone di avere un MAX232 od altro adattatore rs232/ttl a portata di mano, e nemmeno una porta COM disponibile (Luca450MHz ). Il codice è poco commentato, ma non ho potuto fare di meglio, perdonatemi e divertitevi, chi avesse domande le ponga (pinga panga) Ciao!
p.s. C'è anche la versione "indentata"
REM PPTEA/DOMO v.3.14 by MarKoZaKKa
REM I/O MAP:
REM BIT 0-1: ANALOG INPUTS
REM BIT 2-8: RELAY OUTPUTS CONFIGURABLE FOR NORMAL OR STEP RELAY
REM BIT 11-14: BINARY CODED INPUTS
REM BIT 15: STATUS LED OUTPUT
REM EEPROM MEMORY MAP:
REM CELL &HFF: CONFIGURATION STATUS &HAA=OK
REM CELL &HFE: NODE ID FOR MESSAGES &H01...&H0E (&H00=BROADCAST, &h0F=MASTER)
REM CELL &HFD: RELAY TYPE &HAA=STANDARD &H55=STEP
REM CELL &HFC: STEP RELAY COMMAND PULSE LENGHT IN MILLISECONDS
REM CELL &HFB: SHORT PUSH TIMEOUT
REM CELL &HFA: LONG PUSH TIMEOUT
REM CELL &HF9: PUSH CYCLE TIMEOUT
REM CELL &HF8: COMMUNICATION SPEED &H50=4800bps...&H55=57600bps
REM CELL &HF7: QUERY CODE FOR MASTER CONTROLLER
REM CELL &H02: OUTPUT STATUS
REM CELL &H03...&H2C: CONFIGURATION AREA
REM IN CONFIGURATION AREA EACH INPUT CODE BELONGS TO 3 CONFIGURATION CELLS:
REM 1st & 2nd CELL ARE OUTPUT TOGGLE BITMAPS, 3rd CELL IS FORCED OUTPUT BITMAP
REM 1st CELL IS ADDRESSED BY INPUT DURATION LESS THAN SHORT PUSH TIMEOUT
REM 2nd CELL IS ADDRESSED BY INPUT DURATION LESS THAN LONG PUSH TIMEOUT
REM 3rd CELL IS ADDRESSED BY INPUT DURATION MORE THAN LONG PUSH TIMEOUT
REM OUTPUT BITMAPS ARE 7 BIT LONG STARTING FROM LSB
REM MSB IS O FOR NORMAL OPERATION CODE,
REM MSB IS 1 AND ALL OTHERS BIT 0 FOR "NO OUTPUT CHANGE" CODE
REM MSB IS 1 AND OTHERS BIT LESS OR EQUAL TO &HEB FOR "MASTER QUERY" CODES
PRAGMA NO_NUM_LINE
PRAGMA EXTENDED2K_EEPROM
REM INIZIO PROGRAMMA
CALL BASIC_INITS
:INIT
CELL=&HFF
WPGM=REEPROM
IF WPGM=&HAA THEN :LOAD_MEM
IF WPGM=&H0 THEN :NOCONFIG ELSE :MEMERR
:NOCONFIG
PRINT " PPTEA/DOMO IS WAITING FOR CONFIG"
GOTO :WPGM
:MEMERR
CALL PROG_ERR(WPGM)
:WPGM
WPGM=TRUE
CALL WAIT_PGM
OUTBIT(15)=1
GOTO :INIT
:LOAD_MEM
WPGM=FALSE
CALL LOAD_MEMORY
IF LOAD_MEMORY THEN :GO_ON
GOTO :INIT
REM INIZIALIZZAZIONE USCITE
:GO_ON
CELL=&H02
MOD_OUT=REEPROM
CALL INITOUTS
REM LOOP PRINCIPALE
PRINT " PPTEA/DOMO v 3.14 IS RUNNING!"
:MAIN_LOOP
IF WPGM THEN :INIT
OUTBIT(15)=1
CALL INPUT_CHECK
IF P_ADDR=0 THEN :COMMSCHECK
IF P_ADDR<>&H0F THEN :OKIN
CALL PROG_ERR(&H00)
GOTO :INIT
:OKIN
CALL CALCOUT(FALSE)
:COMMSCHECK
CALL COMMS_CHECK(WPGM)
GOTO :MAIN_LOOP
REM IMPOSTAZIONI INIZIALI
SUB BASIC_INITS
SETIO=&H67803
OUT=&H0000
PWMIO1=&H00
CADS=2
EEXTERNAL=0
CONSTANT PULSHI=&H7803
CONSTANT PTIME1_ADDR=&H00
CONSTANT PTIME2_ADDR=&H01
CONSTANT PTIME3_ADDR=&H02
CONSTANT MRQ_STATO=&HFD
CONSTANT MRQ_ANALOG=&HFA
CONSTANT MRQ_SET=&HFF
CONSTANT MAST_CMD=&HB*16
CONSTANT MAST_PRG=&HF*16
CONSTANT MAST_RPL=&HDF
CONSTANT DPRG=&H40
SUBEND
REM ATTESA PROGRAMMAZIONE VIA SERIALE/USB
SUB WAIT_PGM
OUTBIT(15)=1
MOD_OUT=0
SERIALSPEED=SPEED_4800
FOR GV1=0 TO 5
OUTBIT(15)=1
WAITMS 2
OUTBIT(15)=0
WAITMS 5
NEXT GV1
OUTBIT(15)=0
CALL COMMS_CHECK(WPGM)
SUBEND
REM CONTROLLO COMUNICAZIONI IN ARRIVO
SUB COMMS_CHECK(MODE)
:COMMS
ST=TIMER
WHILE TIMER-ST<0.250
COM_IN=COM_IN & SERIALINPSTR & USBINPSTR
WAITMS 75
IF LEN(COM_IN)>=4 THEN :COMMANALYZE
LOOP
GOTO :COMMBACK
:COMMANALYZE
CALL COMM_ANALYZE(MODE)
:COMMBACK
SERIALCLOSE
IF LEN(COM_IN)<4 THEN COM_IN=""
SUBEND
REM ANALISI COMUNICAZIONI IN ARRIVO ED ESECUZIONE COMANDI REMOTI
SUB COMM_ANALYZE(MODE)
DELTACOMM=1
IF LEN(COM_IN)<4 THEN :ANALYZEBACK
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
IF CHECKIN<>CHECK THEN :ANALYZEBACK
IF MODE AND (MSGID=MY_PRG OR MSGID=MAST_PRG) THEN :PROGIN
IF WPGM=FALSE AND (MRQ=&H01 AND DATOIN=&HAA) THEN CALL PROG_ERR(&H00)
IF !(MSGID=MY_CMD OR MSGID=MAST_CMD) THEN :ANALYZEBACK
CELL=&HF7
GV1=REEPROM
IF (MRQ=&HF0 AND DATOIN=&HFF) THEN :NOPCOMM
MSGID=MAST_RPL
IF MRQ=MRQ_STATO THEN :COMMS_OUTSTATE
IF MRQ=MRQ_SET THEN :COMMS_SETOUT
IF MRQ=MRQ_ANALOG THEN :COMMS_ANALOGIN
GOTO :ANALYZEBACK
:NOPCOMM
MRQ=NODE_ID+&HC
MSGID=&HDF
DATOIN=GV1
CALL COMMOUT
CELL=&HF7
WEEPROM=&H80
GOTO :ANALYZEOK
:COMMS_OUTSTATE
MRQ=NODE_ID+&HF
CELL=2
DATOIN=REEPROM+&H80
CALL COMMOUT
GOTO :ANALYZEOK
:COMMS_SETOUT
MRQ=NODE_ID+&H5
MOD_OUT=DATOIN-&H80
CALL CALCOUT(TRUE)
CALL COMMOUT
GOTO :ANALYZEOK
:COMMS_ANALOGIN
FOR GV2=1 TO 2
AG1=0
FOR GV1=1 TO 10
AG1=AG1+CADSIND(GV2)
NEXT GV1
AG1=(AG1/(GV1-1))+&H400
AG3=AG1/256
AG2=(AG1-AG3*256)/16
AG1=AG1-(AG3*256+AG2*16)
MSGID=MAST_RPL
MRQ=NODE_ID+AG1
DATOIN=AG2*16+AG3
CALL COMMOUT
NEXT GV2
GOTO :ANALYZEOK
:PROGIN
IF WPGM=TRUE AND !(MRQ=&H01 AND DATOIN=&H55) THEN :PROG
CELL=&HFF
WEEPROM=&HAA
WPGM=FALSE
GOTO :ANALYZEOK
:PROG
IF MRQ>=&HB8 THEN :NODPRG
IF MRQ>=&H40 THEN <img border=0 src=faccine\biggrin.gif width=20 height=20>PRG
GOTO :ANALYZEBACK
<img border=0 src=faccine\biggrin.gif width=20 height=20>PRG
MRQ=MRQ-DPRG
DATOIN=DATOIN-DPRG
:NODPRG
CELL=MRQ
WEEPROM=DATOIN
MSGID=MAST_RPL
CALL COMMOUT
FOR GV1=0 TO 2
OUTBIT(15)=1
WAITMS 10
OUTBIT(15)=0
WAITMS 50
NEXT GV1
OUTBIT(15)=0
GOTO :ANALYZEOK
:ANALYZEOK
DELTACOMM=4
:ANALYZEBACK
COM_IN=RIGHT(COM_IN,LEN(COM_IN)-DELTACOMM)
SUBEND
REM CALCOLO CHECK BYTE
SUB CHECK
CHECK=(MRQ+DATOIN)
CHECK=INT(CHECK-((CHECK/256)*256))
IF CHECK>&H00 THEN :CHECKBACK
CHECK=&HFF
:CHECKBACK
SUBEND
REM TRASMISSIONE MESSAGGI SU SERIALE/USB
SUB COMMOUT
CALL CHECK
MSGID=CHR(MSGID)
MRQ=CHR(MRQ)
DATOIN=CHR(DATOIN)
CHECK=CHR(CHECK)
WAITMS 75+((NODE_ID/16)*25)
GV1=MSGID & MRQ & DATOIN & CHECK
SERIALOUT=GV1
USBOUT=GV1
WAITMS 75
SUBEND
REM CALCOLO STATO USCITE INIZIALE
SUB INITOUTS
CELL=&HFD
RELAY=REEPROM
CELL=&H02
OLD_OUT=REEPROM
IF RELAY=&H55 THEN :STEP ELSE :PULSE
:PULSE
NEW_OUT=MOD_OUT
GOTO :INITIT
:STEP
NEW_OUT=MOD_OUT XOR OLD_OUT
:INITIT
MEM=OLD_OUT
CALL SETOUT
SUBEND
REM CALCOLO NUOVO STATO USCITE
SUB CALCOUT(MODE)
IF MODE THEN :COMMSET
R_C=(P_ADDR*&H03)+T_ADDR
CELL=R_C
MOD_OUT=REEPROM
IF MOD_OUT>&H80 THEN :MEM_NOPCOMM
IF MOD_OUT=&H80 THEN :CALCOUTBACK
:COMMSET
CELL=&HFD
RELAY=REEPROM
CELL=&H02
OLD_OUT=REEPROM
IF MODE THEN :IMPOSE
IF T_ADDR=PTIME3_ADDR THEN :IMPOSE ELSE :TOGGLE
:IMPOSE
IF RELAY=&H55 THEN :XOROUTS ELSE <img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS
:TOGGLE
IF RELAY=&H55 THEN <img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS ELSE :XOROUTS
<img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS
NEW_OUT=MOD_OUT
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
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
IF NEW_OUT=0 THEN :CALCOUTBACK
CALL SETOUT
GOTO :CALCOUTBACK
:MEM_NOPCOMM
CELL=&HF7
WEEPROM=MOD_OUT
:CALCOUTBACK
SUBEND
REM ATTUAZIONE NUOVO STATO USCITE
SUB SETOUT
:NORMALRELAY
OUT=NEW_OUT*&B100
IF RELAY<>&H55 THEN :SETOUTBACK
:STEPRELAY
CELL=&HFC
GV1=REEPROM
WAITMS GV1
OUT=&H00
:SETOUTBACK
CELL=&H02
WEEPROM=MEM
PRINT "OUTS: "&MEM
SUBEND
REM CARICO CONFIGURAZIONE DA EEPROM
SUB LOAD_MEMORY
LOAD_MEMORY=TRUE
CELL=&HFD
GV1=REEPROM
IF (GV1=&HAA OR GV1=&H55) THEN :TIMEOUT
GV1=&HFD
GOTO :PROGERR
:TIMEOUT
CELL=&HFB
GV1=REEPROM
PUSHTIME1=(GV1*(2.0/255))
CELL=&HFA
GV1=REEPROM
PUSHTIME2=(GV1*(2.0/255))
CELL=&HF8
GV1=REEPROM
IF GV1>&H50 OR GV1<&H54 THEN :SELECTSPEED
GOTO :PROGERR
:SELECTSPEED
GV1=GV1-80
ON GV1 GOTO :Q,:N,<img src='faccine/biggrin.gif' alt="faccine/biggrin.gif" style="max-width:700px;max-height:1700px;"/>,:T,:C
:Q
SERIALSPEED=SPEED_4800
GOTO :NODEID
:N
SERIALSPEED=SPEED_9600
GOTO :NODEID
<img src='faccine/biggrin.gif' alt="faccine/biggrin.gif" style="max-width:700px;max-height:1700px;"/>
SERIALSPEED=SPEED_19200
GOTO :NODEID
:T
SERIALSPEED=SPEED_38400
GOTO :NODEID
:C
SERIALSPEED=SPEED_57600
GOTO :NODEID
:NODEID
CELL=&HFE
NODE_ID=REEPROM*16
IF NODE_ID>0 AND NODE_ID<240 THEN :SETID
GV1=&HFE
GOTO :PROGERR
:SETID
MY_CMD=MAST_CMD+(NODE_ID/16)
MY_PRG=MAST_PRG+(NODE_ID/16)
PRINT " PPTEA/DOMO NODE NR:" & NODE_ID/16
GOTO :LOADMEMBACK
:PROGERR
LOAD_MEMORY=FALSE
CALL PROG_ERR(GV1)
:LOADMEMBACK
SUBEND
REM SALVATAGGIO ERRORE PROGRAMMAZIONE IN EEPROM
SUB PROG_ERR(IND)
PRINT " !CONFIG ERROR IN EEPROM: " & IND & " ! "
CELL=&HFF
WEEPROM=IND
WPGM=TRUE
SUBEND
REM CONTROLLO ATTUAZIONE INGRESSI
SUB INPUT_CHECK
P_ADDR=0
T_ADDR=0
CELL=&HF9
PWT=REEPROM
PWT=INT(PWT*(1.0/255)*1000)
OUTBIT(15)=TRUE
:RELEASED
P_ADDR=(&H0F-((INP AND &H7800)/&H800))
IF P_ADDR=&H00 THEN :INPUTSBACK
GV1=TRUE
ST=TIMER
OUTBIT(15)=GV1
:PUSHED
GV1=GV1 XOR TRUE
WAITMS PWT
OUTBIT(15)=GV1
IF (&H0F-((INP AND &H7800)/&H800))<>&H0 AND ((TIMER-ST)<pushtime2) THEN :PUSHED
PTIME=(TIMER-ST)
IF PTIME>PUSHTIME1 THEN :PT2
T_ADDR=PTIME1_ADDR
GOTO :ENDPT
:PT2
IF PTIME>PUSHTIME2 THEN :PT3
T_ADDR=PTIME2_ADDR
GOTO :ENDPT
:PT3
T_ADDR=PTIME3_ADDR
:ENDPT
:NOT_RELEASED
OUTBIT(15)=FALSE
GV1=(&H0F-((INP AND &H7800)/&H800))
IF GV1>&H00 AND GV1<>15 THEN :NOT_RELEASED
:INPUTSBACK
SUBEND
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 12/9/2013,12:38
|
E TE PAREVA... ho trovato un bug relativamente all'uso dei relè passo-passo... ho aggiornato nel post sopra sia il codice che il file allegato, chi lo avesse scaricato è pregato di riscaricarlo (o di cercarsi il bug ) Ciao!
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | | | | MarKoZaKKa
| Inviato il: 21/10/2013,11:50
|
Bolle, ho ancora problemi con la gestione della seriale... se invio i dati sulla porta USB, con il TX str del debugger, funziona tutto regolarmente; se mi collego con la seriale (utilizzo un convertitore USB/seriale TTL della FTDI, niente MAX232) non c'è verso, la ricezione è saltuaria... urge spiegone su come usare la seriale del PPTEA, ormai il sw domotico è terminato... thnks
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | NonSoloBolleDiAcqua
| Inviato il: 21/10/2013,12:02
|
CITAZIONE (MarKoZaKKa @ 21/10/2013, 12:50) Bolle, ho ancora problemi con la gestione della seriale... se invio i dati sulla porta USB, con il TX str del debugger, funziona tutto regolarmente; se mi collego con la seriale (utilizzo un convertitore USB/seriale TTL della FTDI, niente MAX232) non c'è verso, la ricezione è saltuaria... urge spiegone su come usare la seriale del PPTEA, ormai il sw domotico è terminato... thnks la gestione della seriale del PPTEA utilizza l'uart della libreria della microchip...nel funzionamento non ho mai avuto problemi...nemmeno con l'utilizzo del raspberry che funge a livelli di tensione differenti.Quando puoi posta lo schema elettrico ...gli do un'occhiatina da vicino!
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | ElettroshockNow
| Inviato il: 21/10/2013,20:31
|
Ciao Marko, io ho riscontrato un problema simile interfacciando un convertitore usb/ttl ad un Atmega. Ricevevo alcune volte errori senza spiegazione . Dopo giorni di mal di testa ,ho capito che bastava resettare il processore in contemporanea alla connessione dell'usb. Quindi i +5V provenienti dall'usb (che fino a quel momento alimentavano solo il convertitore quando connesso) li ho mandati tramite una resistenza da 4.7K alla base di un BC547 ,il quale ha l'emettitore a massa e il collettore connesso ad un condensatore da 1microF e una resistenza da 1M . L'altro capo del condensatore e della resistenza sono connessi al reset del microcontrollore (che possiede una resistenza pull up da 10K). In pratica quando connetto l'usb ,i 5V mandano un impulso di reset al micro . Cosi' ho risolto i miei problemi .... problemi mai riscontrati con una 232 vera
Ciao ElettroshockNow
| | | | MarKoZaKKa
| Inviato il: 22/10/2013,09:59
|
CITAZIONE (NonSoloBolleDiAcqua @ 21/10/2013, 13:02) Quando puoi posta lo schema elettrico ...gli do un'occhiatina da vicino!
Lo schema elettrico non c'è, nel senso che sto ancora lavorando con la KSB-I, comunque c'e poco da "schemare", tx su rx ed rx su tx
per il momento, nulla in mezzo, no max232 no mcp2551, solo link seriale a livelli TTL con adattatore usb FTDI. Penso sia più qualcosa legato a come ho scritto il codice... può essere un problema il fatto di avere la eeprom da2K piena al 98-99%?
CITAZIONE (ElettroshockNow @ 21/10/2013, 21:31) Cosi' ho risolto i miei problemi .... problemi mai riscontrati con una 232 vera
Purtroppo non è il mio caso...
Allego il codice dell'ultimo rimaneggiamento... adesso faccio fare un polling ogni tot della seriale, anzichè ad ogni ciclo di esecuzione, devo ancora provarlo in hardware... nel file .hex allego i comandi da inviare via seriale o via usb per configurare il nodo; una volta configurato, il comando più banale è il query dello stato uscite: &HB1FDFFFC al quale il nodo risponde con &HDF1F809F se le uscite sono tutte a zero. Attenzione a portare alti gli ingressi (sarebbe utile una funzione del debugger per impostare lo stato circuitale degli ingressi...) altrimenti il codice torna in modalità configurazione, dalla quale lo si fà uscire portando prima gli ingressi alti e poi inviando &HF1015556
Grazie dell'aiuto.. è l'ultimo scoglio, ma è il cuore del progetto... dopo questo c'è il montaggio delle schedine...
PRAGMA NO_NUM_LINE
PRAGMA EXTENDED2K_EEPROM
REM INIZIO PROGRAMMA
PRINT " PPTEA/DOMO v 3.14"
CALL BASIC_INITS
:INIT
CELL=&HFF
WPGM=REEPROM
IF WPGM=&HAA THEN :LOAD_MEM
IF WPGM=&H00 THEN :NOCONFIG ELSE :MEMERR
:NOCONFIG
PRINT " CONFIG NEEDED!"
GOTO :WPGM
:MEMERR
CALL PROG_ERR(WPGM)
:WPGM
WPGM=TRUE
CALL WAIT_PGM
OUTBIT(15)=1
GOTO :INIT
:LOAD_MEM
WPGM=FALSE
CALL LOAD_MEMORY
IF LOAD_MEMORY THEN :GO_ON
GOTO :INIT
REM INIZIALIZZAZIONE USCITE
:GO_ON
CELL=&H02
MOD_OUT=REEPROM
CALL INITOUTS
REM LOOP PRINCIPALE
:MAIN_LOOP
IF WPGM THEN :INIT
OUTBIT(15)=1
CALL INPUT_CHECK
IF P_ADDR=0 THEN :COMMSCHECK
IF P_ADDR<>&HF THEN :OKIN
CALL PROG_ERR(&H00)
GOTO :INIT
:OKIN
CALL CALCOUT(FALSE)
:COMMSCHECK
IF TIMER<comm_intr THEN :MAIN_LOOP
CALL COMMS_CHECK(WPGM)
GOTO :MAIN_LOOP
REM IMPOSTAZIONI INIZIALI
SUB BASIC_INITS
SETIO=&H67803
OUT=&H0000
PWMIO1=&H0
CADS=2
EEXTERNAL=0
CONSTANT PULSHI=&H7803
CONSTANT PTIME1_ADDR=&H00
CONSTANT PTIME2_ADDR=&H01
CONSTANT PTIME3_ADDR=&H02
CONSTANT MRQ_STATO=&HFD
CONSTANT MRQ_ANALOG=&HFA
CONSTANT MRQ_SET=&HFF
CONSTANT MAST_CMD=&HB0
CONSTANT MAST_PRG=&HF0
CONSTANT MAST_RPL=&HDF
CONSTANT DPRG=&H40
SUBEND
REM ATTESA PROGRAMMAZIONE VIA SERIALE/USB
SUB WAIT_PGM
OUTBIT(15)=1
MOD_OUT=0
SERIALSPEED=SPEED_4800
COMM_TIME=0.500
COMM_INTR=&H1
FOR GV1=0 TO 5
OUTBIT(15)=1
WAITMS 5
OUTBIT(15)=0
WAITMS 10
NEXT GV1
OUTBIT(15)=0
CALL COMMS_CHECK(WPGM)
SUBEND
REM CONTROLLO COMUNICAZIONI IN ARRIVO
SUB COMMS_CHECK(MODE)
COM_IN=
:WAITAGAIN
RESET_TIMER
OUTBIT(15)=1
ST=TIMER
WHILE TIMER-ST<comm_time
COM_IN=COM_IN & SERIALINPSTR & USBINPSTR
WAITMS 50
LOOP
GV1=LEN(COM_IN)
IF (GV1<&H4 AND GV1>&H0) THEN :WAITAGAIN
IF GV1=0 THEN :COMMBACK
CALL COMM_ANALYZE(MODE)
:COMMBACK
SERIALCLOSE
SUBEND
REM ANALISI COMUNICAZIONI IN ARRIVO ED ESECUZIONE COMANDI REMOTI
SUB COMM_ANALYZE(MODE)
:ANALYZE
DELTACOMM=1
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
IF CHECKIN<>CHECK THEN :ANALYZEBACK
IF MODE AND (MSGID=MY_PRG OR MSGID=MAST_PRG) THEN :PROGIN
IF WPGM=FALSE AND (MRQ=&H01 AND DATOIN=&HAA) THEN CALL PROG_ERR(&H00)
IF !(MSGID=MY_CMD OR MSGID=MAST_CMD) THEN :ANALYZEBACK
CELL=&HF7
GV1=REEPROM
IF MSGID=MY_CMD AND MRQ=MAST_PRG AND DATOIN=&HFF THEN :NOPCOMM
MSGID=MAST_RPL
IF MRQ=MRQ_STATO THEN :COMMS_OUTSTATE
IF MRQ=MRQ_SET THEN :COMMS_SETOUT
IF MRQ=MRQ_ANALOG THEN :COMMS_ANALOGIN
GOTO :ANALYZEBACK
:NOPCOMM
MRQ=NODE_ID+&HC
MSGID=&HDF
CELL=&HF7
DATOIN=REEPROM
IF DATOIN=&H80 THEN :ANALYZEOK
CALL COMMOUT
WEEPROM=&H80
GOTO :ANALYZEOK
:COMMS_OUTSTATE
MRQ=NODE_ID+&HF
CELL=2
DATOIN=REEPROM+&H80
CALL COMMOUT
GOTO :ANALYZEOK
:COMMS_SETOUT
MRQ=NODE_ID+&H5
MOD_OUT=DATOIN-&H80
CALL CALCOUT(TRUE)
CALL COMMOUT
GOTO :ANALYZEOK
:COMMS_ANALOGIN
FOR GV2=1 TO 2
AG1=0
FOR GV1=1 TO 10
AG1=AG1+CADSIND(GV2)
NEXT GV1
AG1=(AG1/(GV1-1))+&H400
AG3=AG1/256
AG2=(AG1-AG3*256)/16
AG1=AG1-(AG3*256+AG2*16)
MSGID=MAST_RPL
MRQ=NODE_ID+AG1
DATOIN=AG2*16+AG3
CALL COMMOUT
NEXT GV2
GOTO :ANALYZEOK
:PROGIN
IF WPGM=TRUE AND !(MRQ=&H01 AND DATOIN=&H55) THEN :PROG
CELL=&HFF
WEEPROM=&HAA
WPGM=FALSE
GOTO :ANALYZEOK
:PROG
IF MRQ>=&HB8 THEN :NODPRG
IF MRQ>=&H40 THEN <img border=0 src=faccine\biggrin.gif width=20 height=20>PRG
GOTO :ANALYZEBACK
<img border=0 src=faccine\biggrin.gif width=20 height=20>PRG
MRQ=MRQ-DPRG
DATOIN=DATOIN-DPRG
:NODPRG
CELL=MRQ
WEEPROM=DATOIN
MSGID=MAST_RPL
CALL COMMOUT
FOR GV1=0 TO 2
OUTBIT(15)=1
WAITMS 10
OUTBIT(15)=0
WAITMS 50
NEXT GV1
OUTBIT(15)=0
GOTO :ANALYZEOK
:ANALYZEOK
DELTACOMM=4
:ANALYZEBACK
COM_IN=RIGHT(COM_IN,LEN(COM_IN)-DELTACOMM)
IF LEN(COM_IN)>=4 THEN :ANALYZE
SUBEND
REM CALCOLO CHECK BYTE
SUB CHECK
CHECK=(MRQ+DATOIN) MOD 256
IF CHECK>&H00 THEN :CHECKBACK
CHECK=&HFF
:CHECKBACK
SUBEND
REM TRASMISSIONE MESSAGGI SU SERIALE/USB
SUB COMMOUT
CALL CHECK
MSGID=CHR(MSGID)
MRQ=CHR(MRQ)
DATOIN=CHR(DATOIN)
CHECK=CHR(CHECK)
WAITMS 75
GV1=MSGID & MRQ & DATOIN & CHECK
SERIALOUT=GV1
USBOUT=GV1
WAITMS 75
SUBEND
REM CALCOLO STATO USCITE INIZIALE
SUB INITOUTS
CELL=&HFD
RELAY=REEPROM
CELL=&H02
OLD_OUT=REEPROM
IF RELAY=&H55 THEN :STEP ELSE :PULSE
:PULSE
NEW_OUT=MOD_OUT
GOTO :INITIT
:STEP
NEW_OUT=MOD_OUT XOR OLD_OUT
:INITIT
MEM=OLD_OUT
CALL SETOUT
SUBEND
REM CALCOLO NUOVO STATO USCITE
SUB CALCOUT(MODE)
IF MODE THEN :COMMSET
R_C=(P_ADDR*&H03)+T_ADDR
CELL=R_C
MOD_OUT=REEPROM
IF MOD_OUT>&H80 THEN :MEM_NOPCOMM
IF MOD_OUT=&H80 THEN :CALCOUTBACK
:COMMSET
CELL=&HFD
RELAY=REEPROM
CELL=&H02
OLD_OUT=REEPROM
IF MODE THEN :IMPOSE
IF T_ADDR=PTIME3_ADDR THEN :IMPOSE ELSE :TOGGLE
:IMPOSE
IF RELAY=&H55 THEN :XOROUTS ELSE <img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS
:TOGGLE
IF RELAY=&H55 THEN <img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS ELSE :XOROUTS
<img border=0 src=faccine\biggrin.gif width=20 height=20>IRECTOUTS
NEW_OUT=MOD_OUT
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
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
IF NEW_OUT=0 THEN :CALCOUTBACK
CALL SETOUT
GOTO :CALCOUTBACK
:MEM_NOPCOMM
CELL=&HF7
WEEPROM=MOD_OUT
:CALCOUTBACK
SUBEND
REM ATTUAZIONE NUOVO STATO USCITE
SUB SETOUT
:NORMALRELAY
OUT=NEW_OUT*&B100
IF RELAY<>&H55 THEN :SETOUTBACK
:STEPRELAY
CELL=&HFC
GV1=REEPROM
WAITMS GV1
OUT=&H00
:SETOUTBACK
CELL=&H02
WEEPROM=MEM
PRINT "OUTS: "&MEM
SUBEND
REM CARICO CONFIGURAZIONE DA EEPROM
SUB LOAD_MEMORY
LOAD_MEMORY=TRUE
CELL=&HFD
GV1=REEPROM
IF (GV1=&HAA OR GV1=&H55) THEN :TIMEOUT
GV1=&HFD
GOTO :PROGERR
:TIMEOUT
CELL=&HFB
GV1=REEPROM
PUSHTIME1=(GV1*(2.0/255))
CELL=&HFA
GV1=REEPROM
PUSHTIME2=(GV1*(2.0/255))
CELL=&HF8
GV1=REEPROM
IF GV1>&H50 OR GV1<&H54 THEN :SELECTSPEED
GOTO :PROGERR
:SELECTSPEED
GV1=GV1-80
ON GV1 GOTO :Q,:N,<img src='faccine/biggrin.gif' alt="faccine/biggrin.gif" style="max-width:700px;max-height:1700px;"/>,:T,:C
:Q
SERIALSPEED=SPEED_4800
GOTO :NODEID
:N
SERIALSPEED=SPEED_9600
GOTO :NODEID
<img src='faccine/biggrin.gif' alt="faccine/biggrin.gif" style="max-width:700px;max-height:1700px;"/>
SERIALSPEED=SPEED_19200
GOTO :NODEID
:T
SERIALSPEED=SPEED_38400
GOTO :NODEID
:C
SERIALSPEED=SPEED_57600
GOTO :NODEID
:NODEID
CELL=&HFE
NODE_ID=REEPROM*16
IF NODE_ID>0 AND NODE_ID<240 THEN :SERIALCOMM
GV1=&HFE
GOTO :PROGERR
:SERIALCOMM
CELL=&HF6
GV1=REEPROM
COMM_TIME=(GV1*(1.0/255))
CELL=&HF5
GV1=REEPROM
COMM_INTR=(GV1*(2.0/255))
:SETID
MY_CMD=MAST_CMD+(NODE_ID/16)
MY_PRG=MAST_PRG+(NODE_ID/16)
PRINT " NODE:" & NODE_ID/16
GOTO :LOADMEMBACK
:PROGERR
LOAD_MEMORY=FALSE
CALL PROG_ERR(GV1)
:LOADMEMBACK
SUBEND
REM SALVATAGGIO ERRORE PROGRAMMAZIONE IN EEPROM
SUB PROG_ERR(IND)
PRINT " EEPROM ERROR: " & IND & " ! "
CELL=&HFF
WEEPROM=IND
WPGM=TRUE
SUBEND
REM CONTROLLO ATTUAZIONE INGRESSI
SUB INPUT_CHECK
P_ADDR=0
T_ADDR=0
CELL=&HF9
PWT=REEPROM
PWT=INT(PWT*(1.0/255)*1000)
OUTBIT(15)=TRUE
:RELEASED
P_ADDR=(&H0F-((INP AND &H7800)/&H800))
IF P_ADDR=&H00 THEN :INPUTSBACK
GV1=TRUE
ST=TIMER
OUTBIT(15)=GV1
:PUSHED
GV1=GV1 XOR TRUE
WAITMS PWT
OUTBIT(15)=GV1
IF (&H0F-((INP AND &H7800)/&H800))<>&H0 AND ((TIMER-ST)<pushtime2) THEN :PUSHED
PTIME=(TIMER-ST)
IF PTIME>PUSHTIME1 THEN :PT2
T_ADDR=PTIME1_ADDR
GOTO :ENDPT
:PT2
IF PTIME>PUSHTIME2 THEN :PT3
T_ADDR=PTIME2_ADDR
GOTO :ENDPT
:PT3
T_ADDR=PTIME3_ADDR
:ENDPT
:NOT_RELEASED
OUTBIT(15)=FALSE
GV1=(&H0F-((INP AND &H7800)/&H800))
IF GV1>&H00 AND GV1<>15 THEN :NOT_RELEASED
:INPUTSBACK
SUBEND
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| | | | MarKoZaKKa
| Inviato il: 25/10/2013,12:32
|
Allora, ritrovata la scatola delle meraviglie, ieri sera ho smanettato un po... la versione attuale della sub che riceve i dati via seriale è questa:
SUB COMMS_CHECK(MODE)
:WAITAGAIN
RESET_TIMER
OUTBIT(15)=1
ST=TIMER
WHILE TIMER-ST<COMM_TIME
COM_IN=COM_IN & SERIALINPSTR & USBINPSTR
WAITMS 75
LOOP
COM_IN=COM_IN & SERIALINPSTR & USBINPSTR
SERIALCLOSE
GV1=LEN(COM_IN)
IF (GV1<&H4 AND GV1>&H0) THEN :WAITAGAIN
IF GV1=0 THEN :COMMBACK
CALL COMM_ANALYZE(MODE)
:COMMBACK
SUBEND
al momento, se invio una stringa di 12 comandi via seriale, ottengo da 0 a 8 risposte in sequenza, rarissimamente 12... se le invio con TX USB del compiler ottengo 12 su 12... mah!
Bolle, hai qualche idea su come modificare la routine?
--------------- Tecnico qualificato in clownerie Windsurfer a tempo perso Slalomaro senza speranze
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|