Strani comportamenti di Bascom AVR

Sezione dedicata al sistema di sviluppo BASCOM-AVR per i micro AVR
At90s, Attiny, Atmega e Xmega

Strani comportamenti di Bascom AVR

Postby suibaf » 04 Apr 2014, 16:41

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
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby deluca » 04 Apr 2014, 19:48

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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby deluca » 04 Apr 2014, 19:51

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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 04 Apr 2014, 21:28

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.
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby deluca » 04 Apr 2014, 21:36

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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 04 Apr 2014, 23:03

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.
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 05 Apr 2014, 08:53

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
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby Fagos » 05 Apr 2014, 09:44

@suibaf,
posta il codice che hai scritto dove utilizzi :
Code: Select all
 Config Serialin1 = Buffered , Size = 20 , Bytematch = All


ok, hai già postato
User avatar
Fagos
 
Posts: 100
Joined: 31 Aug 2011, 15:01

Re: Strani comportamenti di Bascom AVR

Postby deluca » 05 Apr 2014, 10:40

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?
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 05 Apr 2014, 10:45

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
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby deluca » 05 Apr 2014, 10:58

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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 05 Apr 2014, 11:12

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
Last edited by suibaf on 05 Apr 2014, 14:51, edited 1 time in total.
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby pier » 05 Apr 2014, 11:17

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
pier
 
Posts: 115
Joined: 11 Aug 2013, 22:05

Re: Strani comportamenti di Bascom AVR

Postby deluca » 05 Apr 2014, 13:01

@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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby pier » 05 Apr 2014, 14:39

@Deluca

Ok, ora è tutto più chiaro
Grazie
pier
 
Posts: 115
Joined: 11 Aug 2013, 22:05

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 05 Apr 2014, 15:09

che non è bellissimo , ma così è!
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 05 Apr 2014, 16:55

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
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Re: Strani comportamenti di Bascom AVR

Postby pier » 05 Apr 2014, 20:15

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?)
pier
 
Posts: 115
Joined: 11 Aug 2013, 22:05

Re: Strani comportamenti di Bascom AVR

Postby deluca » 05 Apr 2014, 20:23

@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).
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Strani comportamenti di Bascom AVR

Postby suibaf » 05 Apr 2014, 21:52

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

:( :( :(
User avatar
suibaf
 
Posts: 122
Joined: 08 Mar 2014, 09:55
Location: Lecce

Next

Return to BASCOM-AVR

Who is online

Users browsing this forum: No registered users and 10 guests