Problema con Atmega 644 e UART

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

Problema con Atmega 644 e UART

Postby michele » 15 Feb 2013, 10:22

Salve a tutti,
ho deciso di postare su questo forum perché credo sia l'unico che possa darmi una mano con il problema che sto riscontrando.
Premetto che sono nuovo in quanto a programmazione con BASCOM e sto cercando di addentrarmi in mezzo a questa nuova jungla, anche perché l'unico linguaggio che ho utilizzato fin ora per programmare microcontrollori è stato l'HiTech-C per i PIC.

Il problema è il seguente: ho bisogno di pilotare un motore (esattamente un AX-18A della Dynamixel - http://www.electronickits.com/robot/BioloidAX-12(english).pdf anche se il modello è differente, i motori sono equivalenti nel protocollo di comunicazione).
Il motore utilizza l'UART per la comunicazione, in modalità half duplex: ho già provveduto a creare la scheda per la conversione da full duplex con 2 canali a half duplex con un solo canale, com'è spiegato nel datasheet del motore stesso.
Ora, ho bisogno di inviare un pacchetto tramite l'UART dal microcontrollore al motore, ma non conosco il baud rate iniziale per poter inviare questo primo pacchetto! Non ho trovato nulla che potesse indicare il baud rate, se non la velocità di trasmissione, impostata di default a 1000000... e non credo indichi il baud rate :?
Inoltre, date le mie scarse conoscenze per BASCOM, ho utilizzato il seguente codice per iniziare a sperimentare qualcosa:
Code: Select all
$regfile = "m644adef.dat"
$crystal = 18432000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2       'Utilizzo un display LCD per il debug
Config Portc.0 = Output

Open "comc.2:19200,8,n,1" For Output As #1                  'Apro una porta UART virtuale in uscita
Open "comc.4:19200,8,n,1" For Input As #2                   'E una in ingresso

Dim Pacchetto_ric As String * 20
Dim Init1 As Byte , Init2 As Byte , Id As Byte , Lenght As Byte , Inst As Byte , Par1 As Byte , Par2 As Byte , Check As Byte

Init1 = &HFF                                                'Le seguenti istruzioni fanno parte del pacchetto che dovra' essere trasmesso
Init2 = &HFF
Id = &HFE                                                   'In particolare l'id e' impostato in broadcast, quindi tutti i motori collegati su questa rete riceveranno il pacchetto
Lenght = &H04
Inst = &H03
Par1 = &H03                                                 'I parametri imposteranno l'ID del motore a 1, così da poterlo distinguere all'interno di una rete di motori
Par2 = &H01                                                 'Questo esempio e' stato preso dal datasheet del motore stesso
Check = &HF6

Config Lcd = 16 * 2

Cls
Home Upper
Lcd "Prova"
Wait 2                                                      'Provando il display, tutto funziona correttamente
Cls
Waitms 10
Set Portc.0                                                  'Imposto il pin di enable a 1 logico in modo da poter attivare il circuito nella parte di trasferimento, successivamente verra' reimpostato a 0 per permettere la ricezione
                                                             'Da questo punto in poi il programma sembra bloccarsi e il motore (dotato di LED per l'attivita') non da alcun segno di vita.
Print #1 , Init1
Print #1 , Init2
Print #1 , Id
Print #1 , Lenght
Print #1 , Inst
Print #1 , Par1
Print #1 , Par2
Print #1 , Check

Reset Portc.0
Pacchetto_ric = Waitkey(#2)
Home Upper
Lcd Pacchetto_ric

End

Potreste darmi una mano nella creazione di questo protocollo di rete? Sono sicuro che quello che ho fatto è sbagliatissimo, ma volevo provarci comunque... :roll:
Poi si parla di pacchetti trasmessi sulla rete... ma come faccio a creare un pacchetto con tutte quelle informazioni? :|

Spero di aver fornito abbastanza informazioni e che il problema sia più semplice di quanto sembri!

Grazie a tutti in anticipo,
Michele
michele
 
Posts: 4
Joined: 10 Nov 2012, 19:08

Re: Problema con Atmega 644 e UART

Postby deluca » 15 Feb 2013, 12:39

Ciao Michele,
ti consiglio di procedere step-by-step.

Ti sei accertato dell'ID del suo servo? Con quale software ?

Perchè hai scelto di usare una seriale virtuale ?
1) La seriale virtuale non ti garantisce un perfetto baud rate
2) Non puoi gestire l'interrupt

Le seriali hw a disposizione sono già state utilizzate? (decidi la priorità da assegnare alle periferiche)
alta - di tipo hardware
bassa - virtualizzate

questo è il primo step.

CMQ. prova ad effetuare un ping al servo per vedere se risponde.

ciao
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: Problema con Atmega 644 e UART

Postby ulisse21 » 15 Feb 2013, 15:29

salve,
non ne sono sicuro,
ma il baud di questi servo va da 7343bps a 1000000bps, quindi direi che il valore indicato da michele sia 1mbps ovvero un megabit per secondo.

io consiglierei, come anche detto da deluca, di scendere con il baud rate a 115200 ed eseguire la connessione tra uC e servi utilizzando la uart hardware che di sicuro risulta essere
più affidabile.

ciao a tutti
ulisse21
 
Posts: 49
Joined: 10 Nov 2012, 14:36

Re: Problema con Atmega 644 e UART

Postby michele » 15 Feb 2013, 16:02

L'unico motivo per il quale utilizzavo una UART virtuale era dovuto al fatto che se avessi dovuto utilizzare quella hardware avrei dovuto staccare i cavi dal circuito per programmare ogni volta il microcontrollore, dato che utilizzo il bootloader con flash via USB e il micro che sto utilizzando possiede una sola UART hardware. Ma mi arrangerò :roll:

Proverò comunque con il baud rate riferitomi da ulisse21 e tenterò di pingare il motore per poi farvi sapere!

Grazie mille per le risposte tempestive :D
michele
 
Posts: 4
Joined: 10 Nov 2012, 19:08

Re: Problema con Atmega 644 e UART

Postby michele » 15 Feb 2013, 16:53

È con grande stupore che vi annuncio l'avvenuta comunicazione tra micro e motore! Il baud rate di ulisse21 era esatto :D

Adesso il problema sta nell'inviare e ricevere i pacchetti... a quanto pare, il codice che ho fatto è parzialmente buono per mandare una serie di informazioni una alla volta, ma quello di cui ho bisogno è un pacchetto intero da trasferire direttamente al motore! Sono riuscito ad assegnargli ID 1 con il codice precedente, ma adesso mi serve capire come fare a ricevere i pacchetti inviati dal motore e se il modo in cui li sto mandando è corretto.

Il LED di attività si accende ogni volta che mando le informazioni al motore, e sempre con il codice di prima mi ritorna una sorta di carattere speciale (assomiglia ad un mouse visto sul display LCD) che non assomiglia neanche lontanamente al pacchetto di Status descritto nel datasheet :?
Cosa mi consigliate di fare? Ci sono delle guide per questo tipo di protocolli che posso seguire?

Grazie ancora in anticipo,
Michele
michele
 
Posts: 4
Joined: 10 Nov 2012, 19:08

Re: Problema con Atmega 644 e UART

Postby deluca » 17 Feb 2013, 21:40

per la creazione del pacchetto da inviare dovresti procedere così:

analizza i comandi che ti servono per far svolgere al tuo servo le operazioni .....

a questo punto puoi creare una slice di codici utilizzando la concatenazione seriale(;) di più codici esadecimali,
in modo che non vengano inviati (CR) e (LF) per ogni codice spedito.

Tieni presente che se tu spedisci con Print un carattere in questo modo .... PRINT "A" o PRINT 3 verranno accodati i caratteri x0A e x0D.
Per evitarli: PRINT "A"; scegliendo quando dovrai spedirli, aggiungendo solo alla fine il carattere x0D... PRINT "A";"B";chr(&h0D);

ciao
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: Problema con Atmega 644 e UART

Postby adriano » 19 Feb 2013, 13:14

Buongiorno Signori ,
molto interessante il 3d , michele , sto prendendo spunto dal suo programma per imparare , grazie per aver spiegato ogni linea di comando ...sai al inizio si prende un idea di qua , una di la :-)
Ho apprezzato molto il 3d perché la comunicazione seriale e uno dei miei obbiettivi .
come sempre vi ringrazio per "il sapere" che condividete sul forum
Mai mi fu dato di vedere un animale in cordoglio di sé. Un uccelletto cadrà morto di gelo giù dal ramo senza aver provato mai pena per sé stesso.
User avatar
adriano
 
Posts: 108
Joined: 17 Feb 2013, 11:07


Return to BASCOM-AVR

Who is online

Users browsing this forum: No registered users and 4 guests

cron