scalzomen Inserito: 12 agosto 2010 Segnala Inserito: 12 agosto 2010 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.
Livio Orsini Inserita: 12 agosto 2010 Segnala Inserita: 12 agosto 2010 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
scalzomen Inserita: 12 agosto 2010 Autore Segnala Inserita: 12 agosto 2010 (modificato) 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: 12 agosto 2010 da scalzomen
giacomo56 Inserita: 12 agosto 2010 Segnala Inserita: 12 agosto 2010 (modificato) Hai provato ad inviare il carattere ascii del tasto invio che dovrebbe essere 13 o 0D?Ciao. Modificato: 12 agosto 2010 da giacomo56
Livio Orsini Inserita: 12 agosto 2010 Segnala Inserita: 12 agosto 2010 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!
scalzomen Inserita: 12 agosto 2010 Autore Segnala Inserita: 12 agosto 2010 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!! Grazie
Livio Orsini Inserita: 13 agosto 2010 Segnala Inserita: 13 agosto 2010 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ù
scalzomen Inserita: 13 agosto 2010 Autore Segnala Inserita: 13 agosto 2010 Niente da fare Livio...se metto LF e CR mi da errore il compilatore...
giacomo56 Inserita: 13 agosto 2010 Segnala Inserita: 13 agosto 2010 In C il carattere CR si indica con '\r' e LF con '\n':Comunque scrivereCommand[6]='\n'; //Line feedCommand[7]='\r'; //Carriage returnè lo stesso che scrivereCommand[6]=0x0A; //Line feedCommand[7]=0x0D; //Carriage returnHai provato ad aggiungere il codice come ti ha detto Livio?Ciao.
scalzomen Inserita: 13 agosto 2010 Autore Segnala Inserita: 13 agosto 2010 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.
scalzomen Inserita: 13 agosto 2010 Autore Segnala Inserita: 13 agosto 2010 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.
giacomo56 Inserita: 13 agosto 2010 Segnala Inserita: 13 agosto 2010 In questo caso si dato che fputs fa il lavoro per noi.Ciao.
Nikiki Inserita: 20 agosto 2010 Segnala Inserita: 20 agosto 2010 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;oCommand[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 *CommandCommand = "pp2000\n\r";L'indirizzo di memoria a cui punta il puntatore "Command" è il primo byte della stringa.
scalzomen Inserita: 20 agosto 2010 Autore Segnala Inserita: 20 agosto 2010 Grazie della risposta, terrò presente se dovessi avere difficoltà nella gestione dei comandi. eventualmente ti farò sapere.a presto.
scalzomen Inserita: 30 agosto 2010 Autore Segnala Inserita: 30 agosto 2010 (modificato) 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: 30 agosto 2010 da scalzomen
Livio Orsini Inserita: 30 agosto 2010 Segnala Inserita: 30 agosto 2010 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.
scalzomen Inserita: 30 agosto 2010 Autore Segnala Inserita: 30 agosto 2010 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
Livio Orsini Inserita: 30 agosto 2010 Segnala Inserita: 30 agosto 2010 T sei gia risposto. Se prevedi un timer con questo fai il test della condizione.
scalzomen Inserita: 30 agosto 2010 Autore Segnala Inserita: 30 agosto 2010 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
scalzomen Inserita: 30 agosto 2010 Autore Segnala Inserita: 30 agosto 2010 (modificato) direi che questa soluzione mi pare funzionante anche se non so se la migliore...però almeno in simulazione con board mi sta tornando utileho messo una label ROTATIONrotation: 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: 30 agosto 2010 da scalzomen
Nikiki Inserita: 30 agosto 2010 Segnala Inserita: 30 agosto 2010 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.
Livio Orsini Inserita: 31 agosto 2010 Segnala Inserita: 31 agosto 2010 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.
scalzomen Inserita: 31 agosto 2010 Autore Segnala Inserita: 31 agosto 2010 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.
giacomo56 Inserita: 1 settembre 2010 Segnala Inserita: 1 settembre 2010 Se le temporizzazioni non devono avere la precisione di un orologio al quarzo non ti serve un timer esterno.Ciao.
Livio Orsini Inserita: 1 settembre 2010 Segnala Inserita: 1 settembre 2010 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. 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora