Jump to content
PLC Forum


Sign in to follow this  
scalzomen

Invio Comando Seriale Da Pic - simulazione tasto ENTER

Recommended Posts

scalzomen

Salve ragazzi vi chiedo un aiuto.

Sto realizzando una piccola interfaccia con un PIC che mi dovrebbe tirare fuori dei comandi sulla porta seriale per direzionare un motore.

Tali comandi sono in forma ASCII che si possono dare al motore via HyperTerminal.

Quello che sto facendo è questo: con la funzione fputc e un ciclo gli faccio cacciare la stringa di comando sulla seriale partendo da una variabile formato char precaricata con il comando.

Per far eseguire però il comando al motore è necessario schiacciare il tasto ENTER da tastiera...come faccio a passarlo via programmazione?

Grazie per i consigli.

SAluti.

Share this post


Link to post
Share on other sites

Livio Orsini

Ti sei spiegato poco e male. Devi comandare il tutto tramite Hyperterminal da PC?

Il PIC riconosce la stringa e genera i comandi per il motore in forma On-Off?

Altro?

prova a descrivere meglio il problema

Share this post


Link to post
Share on other sites
scalzomen

Ciao Livio e scusa forse non sono stato molto chiaro.

Provo a spiegare meglio: ho un motore con un controller proprietario che viene comandato da seriale ad es attraverso hyper terminal inviando dei comandi in formato ASCII.

faccio un esempio di uso con hyper terminal: voglio che si sposti di 30°? allora gli do il comando "pp3000" (non approfondisco sul 3000 che è la posizione) schiaccio invio e ho fatto.

Ora questa sequenza devo realizzarla con un interfaccia a PIC per automatizzare la cosa...togliendo il PC; inserisco lo spezzone di programma fatto fino ad ora in C:

//Dichiarazione variabili
   
   char Command[8];
   int index;
   int8 Tris_value= 0xFF;
   
   //Caricamento del Comando
   
   Command[0]='p';
   Command[1]='p';
   Command[2]='2';
   Command[3]='0';
   Command[4]='0';
   Command[5]='0';
   
   //Apertura della porta B in INPUT
   
   Set_Tris_b(Tris_Value);
   
   //Attesa input sul PIN B0
   
   while (input(PIN_B0)){
   };
   for (index=0; index<6; index++)
      fputc(Command[index],RS232);

solo che in tal modo mi tira fuori la stringa relativa al comando ma il motore non si può ancora muovere perché non riceve l'invio..

Spero di essere stato più chiaro ora...grazie per i suggerimenti.

Edited by scalzomen

Share this post


Link to post
Share on other sites
giacomo56

Hai provato ad inviare il carattere ascii del tasto invio che dovrebbe essere 13 o 0D?

Ciao.

Edited by giacomo56

Share this post


Link to post
Share on other sites
Livio Orsini

Ora è chiaro quello che vuoi fare.

Per riprendere il tuo esempio.

.......................

  Command[0]='p';
  Command[1]='p';
  Command[2]='2';
  Command[3]='0';
  Command[4]='0';
  Command[5]='0';
  Command[6]=0Ah;  'Line feed
  Command[7]=0Dh;  'Carriage return

Basta aggiungerei 2 comandi di line feed ecarriage return. Attenzione che ho scritto i comandi in esadecimale!

Share this post


Link to post
Share on other sites
scalzomen

ma il line feed serve per andare a capo? IN tal caso potrebbe pure omettersi o no visto che non è richiesto via seriale!

una domanda: ma se la variabile Command è di tipo char non posso passargli il comando esadecimale giusto? devo utilizzare una variabile diversa?

Scusa le domande banali forse ma sto rimettendo adesso le mani su le mie conoscenze universitarie di programmazione dopo qualche annetto quindi sono a basso livello!! roflmao.gif

Grazie

Share this post


Link to post
Share on other sites
Livio Orsini

Scrivi 'LF' e 'CR' e verà tradotto dal compilatore. LF serve per considerare chiuso il comando e CR per andare a capo. Quando usi "invio" o "enter" invii tutti e due i comandi.

E' prassi comune chiudere una stringa di comando con LF+CR, anzi molti protocolli lo vedono come obbligatorio. Poi è solo un caratere in più rolleyes.gif

Share this post


Link to post
Share on other sites
scalzomen

Niente da fare Livio...se metto LF e CR mi da errore il compilatore...

Share this post


Link to post
Share on other sites
giacomo56

In C il carattere CR si indica con '\r' e LF con '\n':

Comunque scrivere

Command[6]='\n'; //Line feed

Command[7]='\r'; //Carriage return

è lo stesso che scrivere

Command[6]=0x0A; //Line feed

Command[7]=0x0D; //Carriage return

Hai provato ad aggiungere il codice come ti ha detto Livio?

Ciao.

Share this post


Link to post
Share on other sites
scalzomen

Forse ho risolto diversamente...leggendo un po l'. ho trovato che invece di usare fputc si può prendere fputs che caccia direttamente la stringa + CR e LF...quindi sono ok...

comunque per conoscenza sarebbe bene sapere anche perché con l'altra strada non va.

Grazie.

Share this post


Link to post
Share on other sites
scalzomen

Io avevo scritto LF e CR come indicato da Livio ma mi dava errore.

Adesso ho provato come indicato da te Giacomo e funziona in entrambi i modi.

Comunque questa strada è più macchinosa della fptus...non sei d'accordo.

Share this post


Link to post
Share on other sites
giacomo56

In questo caso si dato che fputs fa il lavoro per noi.

Ciao.

Share this post


Link to post
Share on other sites
Nikiki

Ad una variabile puoi passargli quello che ti pare purchè compatibile con la sua dimensione.

Una variabile char occupa un byte quindi gli puoi passare qualsiasi valore da 0 a 255.

Quando scrivi:

Command[0]='p';

è il compilatore che traduce il la lettera p (messa tra i singoli apici) nel suo corrispondente valore ascii (70 esadecimale, 112 decimale).

ottieni lo stesso effetto se scrivi:

Command[0]=112;

o

Command[0]=0x70;

nel tuo caso puoi usare anche un puntatore ad una stringa, forse più facile da gestire se hai diversi comandi di questo tipo:

char *Command

Command = "pp2000\n\r";

L'indirizzo di memoria a cui punta il puntatore "Command" è il primo byte della stringa.

Share this post


Link to post
Share on other sites
scalzomen

Grazie della risposta, terrò presente se dovessi avere difficoltà nella gestione dei comandi. eventualmente ti farò sapere.

a presto.

Share this post


Link to post
Share on other sites
scalzomen

Ciao ragazzi, ritorno su questa discussione perché vorrei chiedere una cosa sempre in merito a questa interfaccia per comandare un motore attraverso PIC con comandi seriali.

diciamo che ho scritto le righe di programma che gestiscono la rotazione del motore.

Adesso a fine ciclo io vorrei ritornare al punto in cui ho il check di una condizione che mi fa ripartire eventualmente il motore: che mi consigliate per tornare ad un punto del programma? un goto?

Sostanzialmente credo che una volta avviato la prima volta il PIC non devo rifare il set-up delle funzioni tipo ADC_OFF ecc...mi basta tornare a dove ho il check della condizione giusto?

Grazie dei suggerimenti.

Saluti

Edited by scalzomen

Share this post


Link to post
Share on other sites
Livio Orsini

Dipende da molte cose.

Potresti fare un ciclo di while infinito dove testi la candizione di on o off.

Potresti fare un funzione a tempo, 100ms p.e., in cui verifichi se sei in condizioni di on o di off.

Potresti.....Ci sono soluzioni quasi infinite al tuo problema. Molto dipende da come hai strutturato il sistema e dalle tue preferenze.

Share this post


Link to post
Share on other sites
scalzomen

Grazie Livio, ti spiego meglio il sistema.

Il motore deve far ruotare un pannello solare con un circuito elettronico che si preoccupa del tracking del sole.

Tale circuito tira fuori due uscite..una sola di esse sarà a 5V in un determinato istante a seconda di dove il pannello deve ruotare.

Tali uscite sonon gli ingressi al PIC che comanda il motore.

Ho previsto a monte anche la presenza di un timer che attivi la macchina ad es ogin 15 minuti. Per cui faccio un ciclo, il motore girerà a dx o sx fino a che non vi sarà equilibrio dopodiché voglio tornare su a fare il check del timer che per ora sto simulando su evaluation board con un interruttore...

non so se ti ho chiarito la cosa.

Grazie ancora

Share this post


Link to post
Share on other sites
Livio Orsini

T sei gia risposto. Se prevedi un timer con questo fai il test della condizione.

Share this post


Link to post
Share on other sites
scalzomen
Livio Orsini+30/08/2010, 14:35--> (Livio Orsini @ 30/08/2010, 14:35)

no..forse non mi sono spiegato. comunque escludiamo per il momento il timer che ancora non ce l'ho.

Sostanzialmente faccio partire il programma con il debugger nel CCS C compiler.

Dopodiché esso esegue un ciclo in cui fa il test della condizione ossia aspetta che premo il pulsante sulla board, quindi fa il test dei sensori e si muove in un senso o nell'altro e si ferma...

per farlo ripartire devo fare il reset con il debugger e di nuovo go. Io vorrei mettere una cosa che mi faccia ripartire direttamente dal punto in cui aspetta il pulsante e mi chiedevo se va bene uno statement goto e se posso indirizzarlo ad un numero di linea.

Grazie Livio

Share this post


Link to post
Share on other sites
scalzomen

direi che questa soluzione mi pare funzionante anche se non so se la migliore...però almeno in simulazione con board mi sta tornando utile

ho messo una label ROTATION

rotation:

while (input(PIN_A4)){                    // Attesa start
};

.
.
.                                                   // Codice
.


goto rotation;

i puntini indicano il codice che gestisce la rotazione del motore.

Ovvio che con questa funzione non posso poi uscire dal ciclo..ma in questa applicazione non è necessario.

Edited by scalzomen

Share this post


Link to post
Share on other sites
Nikiki

Di solito si cerca di evitare i "goto", anche se non sono vietati e il compilatore li accetta.

Puoi ottenere lo stesso scopo facendo un while con la condizione sempre vera, e al suo interno il tuo while.

es:

while (1)

{

...la tua condizione...

}

questo loop verrà sempre eseguito all'infinito perchè la condizione (1) è sempre vera.

Share this post


Link to post
Share on other sites
Livio Orsini

O fai un ciclo infinito, come suggerisce nikiki, oppure esegui tutto sino ad un'istruzione di stop. Un interruot a tempo "risveglierà" il micro facendolo ripartire da una funzione ben precisa.

Alla seconda soluzione si ricorre solo quando si vuole risparmiare energia, per esempio se si alimenta il sistemino solo con batteria.

Share this post


Link to post
Share on other sites
scalzomen
Livio Orsini+31/08/2010, 09:11--> (Livio Orsini @ 31/08/2010, 09:11)

è quello che devo fare...una condizione a tempo...ora la sto simulando con l'avvento del tasto RA4 solo per comodità.

ma poiché la temporizzazione dovrebbe essere intorno ai 10-15 min non la farò con il pic ma con un timer esterno...almeno così mi hanno consigliato.

Voi che ne pensate?

Grazie dei consigli.

Share this post


Link to post
Share on other sites
giacomo56

Se le temporizzazioni non devono avere la precisione di un orologio al quarzo non ti serve un timer esterno.

Ciao.

Share this post


Link to post
Share on other sites
Livio Orsini

Perchè complicarsi la vita ed aggiungere componenti? A parte il teorema che enuncia: "tutto quello che non c'è non si può guastare", c'è il corollario della legge di Murphy che assicura che i componenti inutili sono i più soggetti a guasti. biggrin.gif

Hai un micro che ha il suo bell'oscillatore stabile e preciso; hai la possibilità di derivarne un bel timer che ti scatena un interrupt, per altro facilissimo da trattare con il compilatore CSC.

Ti programmi il timer per 100ms (come valore di esempio) con questa cadenza incremeti (decrementi) una variabile per 9000 volte (15'). Alla scadenza chiami la funzione che farà il test e tutte le operazioni legate.

Nell'attesa il main cicla all'infinito.

Soluzione semplice, con poche istruzioni e facile da manutere - modificare.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...