Page 1 of 2

Strani comportamenti di Bascom AVR

PostPosted: 04 Apr 2014, 16:41
by suibaf
Salve,
ci sono delle cose che in queste ore non riesco a spiegarmi per cui chiedo il vostro aiuto.
Stò lavorando con Bascom AVR 2.0.7.7 + arduino 2560.

Se provo a scaricare in arduino questo semplice codice:
Code: Select all
         '-------------------------------------------------------------------------------
'Arduino 2560R3
'
'
'-------------------------------------------------------------------------------
$regfile = "m2560def.dat"                                   ' used micro
$crystal = 16000000                                         ' used xtal
$hwstack = 40
$swstack = 40
$framesize = 40
'------------------------------------------------------------------------------
Dim A As Byte
Dim B As Byte

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4
Cursor Off Noblink

Cls                                                         'clear the LCD display
Lcd "Attendere Prego!!!"

End   


Ricevo questo errore: https://dl.dropboxusercontent.com/u/15219757/errore%20bascom.jpg

Se al posto di Lcd "Attendere Prego!!!" ci metto Lcd "Attendere Prego!!" cioè con solo 2 punti esclamativi tutto torna ok. Mah!

Secondo problema, secondo me dovuto ad un errato mio approccio al problema:
Code: Select all
'-------------------------------------------------------------------------------
'Arduino 2560R3
'
'
'-------------------------------------------------------------------------------
$regfile = "m2560def.dat"                                   ' used micro
$crystal = 16000000                                         ' used xtal
$hwstack = 40
$swstack = 40
$framesize = 40
'-------------------------------------------------------------------------------


'Uso la PortE output
'Config Porte = Output

'Oppure il singolo bit (in questo caso il pin 3 della Porta E come Uscita)
'1 = Uscita; 0 = Ingresso
Ddrc.0 = 1
Ddrc.1 = 1                                                  'settiamo PC1 come uscita e lo usiamo come TX enable della 485 (36)
Ddre.5 = 1                                                  'LED dello Shield RS485
Ddre.3 = 0                                                  'Pin configurato come ingresso

Led_shield Alias Porte.5
Pls_shiled Alias Pine.3
Tx_enable Alias Portc.1

Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'try the second hardware UART
Open "Com2:" For Binary As #2

Config Print1 = Portc.1 , Mode = Set

'                              33             32             31               30           34             35
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4

'create an array named a, with 7 elements (1 to 7)
Dim Ric_idcard(7) As Byte
Dim Receive_idcard(7) As Byte
Dim 100ms As Byte
Dim 200ms As Byte
Dim 1sec As Byte

Ric_idcard(1) = &H55
Ric_idcard(2) = &H3C
Ric_idcard(3) = &HAA
Ric_idcard(4) = &H00
Ric_idcard(5) = &H00
Ric_idcard(6) = &H00
Ric_idcard(7) = &HCA



'Configute the timer to use the clock divided by 1024
Config Timer0 = Timer , Prescale = 1024

'T = 256* precaler/fosc =256*1024/16000000 = 16,384 mS
'quindi sifnifica che ogni 16,384mS ci sarà un overflow


'Define the ISR handler (Interrupt Service Routine)
On Ovf0 Tim0_isr
'you may also use TIMER0 for OVF0, it is the same

Enable Timer0                                               ' enable the timer interrupt
Enable Interrupts

'//////////////////////////// INIZIO PROGRAMMA ////////////////////////////////////////

'GET_DLOGIC_CARD_TYPE (0x3C)
'CMD 55 3C AA 00 00 00 CA
'RSP DE 3C ED 00 21 00 35 (OK)
'ERR EC 08 CE 00 00 00 31

'display this at the top line

Cursor Off Noblink
Cls                                                         'clear the LCD display
Lcd "Attendere Prego!"
Wait 1

Dim Contatore As Long

Do

   Contatore = Contatore + 1

   If Contatore >= 500000 Then
      Cls
      Lcd "Stai Attento"
      Contatore = 0
   End If

   If Pls_shiled = 1 Then

      Set Tx_enable
      Led_shield = 1
      Print #2 , "www.delucagiovanni.com"
      Print
      Print #2 , "Suibaf"
      Reset Tx_enable

   Else

      Led_shield = 0

   End If

Loop

'the following code is executed when the timer rolls over
Tim0_isr:

   200ms = 200ms + 1
   If 200ms >= 12 Then                                      '200:16,384 = 12,2

      Printbin #2 , Ric_idcard(1) ; 7
      200ms = 0

   End If


   100ms = 100ms + 1
   If 100ms >= 20 Then

      Inputbin #2 , Receive_idcard(1) ; 7
      100ms = 0

   End If

   1sec = 1sec + 1
   If 1sec >= 61 Then

      Cls
      Lcd "Fabio"                                           ' Receive_idcard(1) ; Receive_idcard(2) ; Receive_idcard(3) ; Receive_idcard(4) ; Receive_idcard(5) ; Receive_idcard(6) ; Receive_idcard(7)
   1sec = 0
   End If

Return
End



Questo semplice programmino si blocca alle prime righe con Lcd "Attendere Prego!" e non và più avanti. Se invece nell'interrupt Tim0_isr tolgo il secondo IF dove faccio l' Inputbin "tutto" torna a funzionare. Siccome ho bisogno di scrivere(e funziona) e leggere(e non funziona) con la seriale avevo pensato appunto a inputbin. Potete suggerirmi qualcosa? Grazie in anticipo.
Fabio

Re: Strani comportamenti di Bascom AVR

PostPosted: 04 Apr 2014, 19:48
by deluca
Intanto iniziamo con il testare il tuo primo programmino con 2 e 3 (!)

https://www.dropbox.com/s/mtquq2n0ey6x2 ... .44.53.jpg
https://www.dropbox.com/s/jefr4k5dkhbiz ... .45.22.jpg


tutto sembrerebbe funzionare....

Molto strano il problema che hai esposto!!
ma non credo assolutamente sia un problema del compilatore.

Re: Strani comportamenti di Bascom AVR

PostPosted: 04 Apr 2014, 19:51
by deluca
il tuo programma si pianta incontrando
Code: Select all
Inputbin #2 , Receive_idcard(1) ; 7

poichè l'istruzione si aspetta ricevere 7 byte. Sei certo che questi byte arrivano in modo corretto?
Hai la possibilità di analizzare la linea seriale?
La periferica con cui vorresti dialogare è "uFR RFID NFC Reader / Writer" ?

PS. Tu stai usando il (;) ma il carattere deve essere (,) in questo modo:
Code: Select all
Inputbin ar(1) , 7 ' will fill 7 bytes starting at index 1.

Re: Strani comportamenti di Bascom AVR

PostPosted: 04 Apr 2014, 21:28
by suibaf
Non so cosa dire. Se io aggiungo il terzo (!) non funziona piu'. Tu lo hai provato con hw o con un simulatore software?
Per l'inputbin ho capito il problema, ma evidentemente non è la funzione che mi serve. MI servirebbe che si scatenasse un interrupt quando arrivano dati sulla seriale, non posso bloccare l'intero programma nell'attesa che arrivino dei dati. Cosa mi suggerisci?
Grazie

p.s.
si sono dei dispositivi che leggono e scrivono RFID.

Re: Strani comportamenti di Bascom AVR

PostPosted: 04 Apr 2014, 21:36
by deluca
ma se metti 4,5 ecc (!) cosa succede?
come hai potuto vedere l'ho simulato, ma appena possibile effettuerò i test su ardu-2560, sono veramente curioso :)
mai incontrato uno di questi .... beh! come chiamarli !!! esclamablemi :)

A proposito di Inputbin.....
linka il pdf del modulo rfid, così vedremo di valutare la strada migliore per leggere i dati.

Re: Strani comportamenti di Bascom AVR

PostPosted: 04 Apr 2014, 23:03
by suibaf
Se metto 4,5 (!) và in errore lo stesso. Massimo 2 (!).

Come ti dicevo l'obbiettivo finale è quello di comunicare con un reader RFID, ma per ora non l'ho collegato.
Stò facendo dei test con il pc. L'inputbin funziona, ma si blocca perchè aspetta i dati sulla seriale. Quando arrivano i dati li vedo correttamente. Ma non posso bloccare il prg in attesa che arrivi qualcosa.

Ho trovato poi sull'help di bascom:

Code: Select all
Config Serialin1 = Buffered , Size = 20 , Bytematch = All


Che dovrebbe scatenare un interrupt

Code: Select all
Serial1bytereceived:

   Print #2 , "we got an A"

Return


Farebbe proprio al mio caso. Quando arrivano dati di qualsiasi genere, vado a leggerli e mi comporto di conseguenza.
Ma non si scatena mai nessun evento. Ho provato anche l'esempo che è proprio per 2560, ma senza successo.

Aspetto vostri ragguagli.

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 08:53
by suibaf
Non capisco perchè la ricezione non mi funziona. Il codice mi sembra semplice, ma non funziona:

Code: Select all
'-----------------------------------------------------------------------------------------

'purpose                  : test for M2560 support

'micro                    : Mega2560

'suited for demo          : yes

'-----------------------------------------------------------------------------------------

$regfile = "m2560def.dat"                                   ' used micro
$crystal = 16000000                                         ' used xtal
$hwstack = 40
$swstack = 40
$framesize = 40



Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Config Print1 = Portc.1 , Mode = Set

Config Serialin1 = Buffered , Size = 20 , Bytematch = All

Open "Com2:" For Binary As #2


Enable Interrupts


Do

Loop


'Label called when UART2 receives a char

Serial1bytereceived:

Print #2 , "Ho ricevuto dati sulla seriale."

Return

End

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 09:44
by Fagos
@suibaf,
posta il codice che hai scritto dove utilizzi :
Code: Select all
 Config Serialin1 = Buffered , Size = 20 , Bytematch = All


ok, hai già postato

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 10:40
by deluca
https://www.dropbox.com/s/e7k44phb0fvsr ... .35.28.jpg
il codice funziona ...
Controlla i collegamenti della seriale 1, hai in mezzo convertitori rs232/485 o convertitori usb/seriali?

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 10:45
by suibaf
questo codice adesso funziona, ho aggiunto Config Pinc.1 = Output:
Code: Select all

'-----------------------------------------------------------------------------------------

'purpose                  : test for M2560 support

'micro                    : Mega2560

'-----------------------------------------------------------------------------------------



$regfile = "m2560def.dat"                                   ' used micro
$crystal = 16000000                                         ' used xtal
$hwstack = 40
$swstack = 40
$framesize = 40

Dim Rx_cmd As Byte


Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Config Print1 = Portc.1 , Mode = Set
Config Pinc.1 = Output

Config Serialin1 = Buffered , Size = 100 , Bytematch = All

Open "Com2:" For Binary As #2


Enable Interrupts


Do

Loop


'Label called when UART2 receives a char

Serial1bytereceived:

Print #2 , "Ho ricevuto dati sulla seriale"

Return

End



Però, se invio dal pc un byte, mi risponde "ho ricevuto dati sulla seriale". Se dal pc invio una serie di byte mi risponde con qualcosa di casuale che non riesco a interpretare.
Perchè si comporta in questa maniera? Non dovrebbe rispondermi sempre nella stessa maniera?
Avrei mille domande da fare e non voglio approfittare della vostra disponibilità, ma
Una volta ricevuti i dati nel buffer, come faccio a sapere quanti byte ho ricevuto ed leggere il loro contenuto?
Grazie

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 10:58
by deluca
Ho capito che ti stai interfacciando in RS485 visto che stai usando il "Config Print1". ok

poi tutto dipende dal tipo di dati che devi manipolare, se devi trattare dati numerici o alphanumerici, e a questo punto la chiamata alla routine Serial1*****: potrebbe cambiare in base a questa scelta.

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 11:12
by suibaf
Si mi stò interfacciando in RS485.

Devo implementare un protocollo di comunicazione, con il lettore RFID appunto. Lo scambio dati è in esadecimale.
Ma come ti dicevo non l'ho ancora collegato il lettore. ho collegato in 485 il 2560 al pc tramire 2 convertitori 232/485, uno sul 2560 e l'atro lato pc. Che cosa vuoi dire che potrebbe cambiare la chiamata a serialin?
Grazie

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 11:17
by pier
Perdonate, forse dico una cosa assurda ma mi pare di vedere che nel codice è configurata la com2 in termini di baud etc e la serialin1 in termini di buffer etc quindi si attendono caratteri dalla com2 usando Serial1ByteReceived (per la UART1 secondo l'help Bascom). Infatti nella simulazione di Deluca mi pare si usi la portad (si vede male) che dovrebbe corrispondere alla USART1.
Non vedo come possa influire il pinc.1
Non c'è un po' di confusione sulle seriali usate?

Pier

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 13:01
by deluca
@pier, la cosa funziona così
Code: Select all
Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com3 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com4 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Enable Interrupts

Config Serialin = Buffered , Size = 20
Config Serialin1 = Buffered , Size = 20 , Bytematch = 65
Config Serialin2 = Buffered , Size = 20 , Bytematch = 66
Config Serialin3 = Buffered , Size = 20 , Bytematch = All


quando configuri la Com1 stai configurando la UART0 e così via. Infatti la "serialin" corrisponde alla uart0.
Il pinc.1 è il pin che viene utilizzato dal micro quando si trasmette attraverso un chip tipo MAX485 configurato in modalità half-duplex. Sugli stessi fili vengono fatti viaggiare i dati sia in trasmissione che in ricezione. Il pin in questione viene settato quando viene eseguita una istruzione di Print.

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 14:39
by pier
@Deluca

Ok, ora è tutto più chiaro
Grazie

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 15:09
by suibaf
che non è bellissimo , ma così è!

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 16:55
by suibaf
Giovanni,

non so se è un problema di timing o di bascom o mio, ma è un pò di gioni che ci stò dietro e di cose strane me ne succedono. Non essendo piu' giovanissimo posso dire che comunque solitamente è colpa mia.
Guardiamo un attimo quando alla seriale arrivano dei dati:

Code: Select all
'Label called when UART receives a char

Serial1bytereceived:
   Contatore = Contatore + 1

   If Contatore = 1 Then Locate 2 , 1

   While Ischarwaiting(#2) > 0                              'while there are bytes in the buffer

      A = 0
      A = Inkey(#2)

      Print #2 , A
      Waitms 10

   Wend

   Contatore = 0

Return


Se io invio dei dati (dal pc): 5D 5D 5D 5D, lui (2560) mi risponde alla stessa maniera visto che faccio Print #2 , A
e mi aspetto sul mio terminale poicchè 5D vale 93:
93 93 93 93 e invece arriva: 93 253 93 93 .

Addririttura se spedisco 5d 5d 5d 5d 5d 5d, mi risponde con : =73539393 quando dovrebbe risponder con 93 93 93 93 93 93.
Mi date qualche ragguaglio? Grazie

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 20:15
by pier
Dico la mia probabilmente errata avendo poca dimestichezza con le comunicazioni:
se arrivi alla label Serial1bytereceived per via di un interrupt forse non ti serve Ischarwaiting e ti basta leggere il buffer con inkey.
L'Ischarwaiting credo debba essere in un loop che ne controlli lo stato (1 o 0 senza usare interrupts).
Guarda la sintassi e l'esempio di Ischarwaiting nell'help. Il suo stato inoltre è assegnato ad una variabile. Non è garantito che usato come fai tu vada bene.
Da ultimo l'waitms messo li mi pare un po' pericoloso e me ne sfugge la funzione così come mi pare inutile l'azzeramento di A e forse ti puoi risparmiare il contatore essendo che quando arrivi lì hai necessariamente un carattere da scrivere a meno che non ne attendi diversi che, in questo caso, devi sommare nella stringa A (a proposito: tutto dimensionato correttamente?)

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 20:23
by deluca
@ragazzi,
vedo che la questione diventa sempre + complessa.

@suibaf,
procediamo per gradi.

in che modo spedisci i dati dal tuo pc.
-software (terminale)
-formato (HEX, singolo carattere, premi un singolo carattere sulla tastiera alla volta)

Important !! come dice pier, mai inserire ritardi dentro un handler interrupt !!
quindi waitms va eliminato e va cambiata la routine dell'interrupt.
Code: Select all
While Ischarwaiting(#2) > 0

non è necessario poichè l'evento è già stato intercettato e quindi il comando risulta essere superfluo(vedi Help).

Re: Strani comportamenti di Bascom AVR

PostPosted: 05 Apr 2014, 21:52
by suibaf
in che modo spedisci i dati dal tuo pc.

Lo spedisco dal pc con un terminal in esadecimale. Scrivo il comado che mi interessa, in questo caso 55 3C AA 00 00 00 CA e per ora mi piacerebbe tanto che il 2560 ricevesse questo comando e me lo rigirasse nuovamente. Ricevere lo riceve, ma mi ritorna dei numeri che per ora non ne ho capito il significato.
https://dl.dropboxusercontent.com/u/15219757/send_data.jpg

@Pier
Le osservazioni che hai fatto sono tutte corrette, ma quando ne hai provate un pò senza successo allora inizi a testare cose improbabili. L'obbiettivo è semplice, ma ancora non vedo la luce. :oops:
Per quanto riguarda l'help di bascom, credimi me lo stò mangiando. Devo essere sincero non è fatto benissimo, i concetti Mark li butta li senza spiegare bene. E' una mia opinione ovviamente da neofita.

Snellendo il codice al massimo ho :
Code: Select all
'Label called when UART receives a char

Serial1bytereceived:

      A = Inkey(#2)

      Print #2 , A

Return


Con questo risultato:
https://dl.dropboxusercontent.com/u/15219757/send_data2.jpg

:( :( :(