Vai al contenuto
PLC Forum


Invio Comando Seriale Da Pic - simulazione tasto ENTER


scalzomen

Messaggi consigliati

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.

Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

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.

Modificato: da scalzomen
Link al commento
Condividi su altri siti

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

Ciao.

Modificato: da giacomo56
Link al commento
Condividi su altri siti

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!

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

a presto.

Link al commento
Condividi su altri siti

  • 2 weeks later...

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

Modificato: da scalzomen
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Modificato: da scalzomen
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...