Re: Serielle Messwertausgabe Kategorie: Verschiedenes (von Reiner S. - 29.08.2005 15:51) | |
Als Antwort auf Re: Serielle Messwertausgabe von Peter S - 26.08.2005 17:16
| |
Hallo, mit folgenden kleinen �nderungen funktionierts. // ADC_0: Messwertausgabe // Eingang ADC0 PA0 (PortA.0) // erforderliche Library: IntFunc_Lib.cc // Der Me�wert wird über die serielle Schnittstelle ausgegeben // Der ADC hat eine Auflösung von 10 Bit. // Bei einer Referenzspannung von 5V bedeutet dies 4,8828mV/Bit. (5V/1024Bit) // Als Referenzspannung kann Vcc, die interne Referenz(2,56V) // oder eine externe Spannung verwendet werden. // Deklaration der Formatierungsvariablen #define LF 0x0A #define CR 0x0D #define SPACE 0x20 //-------------------------------------------------------------------------- // Auswertung der am verwendeten Eingang anliegenden Spannung unter // Berücksichtigung der angegebenen oberen und unteren Limits. // void ADC_Check_Limit(byte channel,word limit_low, word limit_high) { word ADC_Wert; // In dieser Variablen wird der // gemessene Wert gespeichert. char ausgabe[4]; // In dieser Variablen wird der Messwert // gespeichert und seriell ausgegeben ADC_Set(ADC_VREF_VCC, channel); // Festlegung der Bezugsgrö�e des Eingangskanals // und Bestimmung des verwendeten Kanals. // In diesem Fall werden alle gemessenen // Werte auf 5V bezogen. ADC_Wert=ADC_Read(); // Einlesen des Wertes des Kanals Msg_WriteChar(CR); // Ausgabe: Wagenrücklauf Msg_WriteChar('A'); // Ausgabe: A Msg_WriteChar('D'); // Ausgabe: D Msg_WriteChar('C'); // Ausgabe: C Msg_WriteChar(channel|0x30); // Ausgabe der Kanalnummer über eine // bitweise ODER-Verknüpfung mit dem // Hexwert des ASCII-Zeichens 0. Msg_WriteChar(SPACE); // Ausgabe: Leerzeichen Msg_WriteChar(':'); // Ausgabe: : Msg_WriteChar(SPACE); // Ausgabe: Leerzeichen Msg_WriteWord(ADC_Wert); // Ausgabe: gemessener Wert Str_WriteWord(ADC_Wert,10,ausgabe,0,0); // Ist die USB Schnittstelle nicht angesteckt, Serial_WriteText(ausgabe); // sind diese Zeilen nicht erforderlich. Serial_Write(CR); // Alle Msg_Write... Befehle werden dann direkt } // über die RS232 Schnittstelle ausgegeben. //------------------------------------------------------- // Hauptprogramm // void main(void) { char ausgabe[5]; Serial_Init(SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD9600); while (1) { // Funktionsaufruf mit Angabe des verwendeten Kanals, // des unteren und des oberen Limits. // Beide Limits wurden in Bezug auf die verwendete Referenzspannung // ADC_VREF_VCC (5V) berechnet. // unteres Limit 3,5V: 3,5V/4,8828mV = 717 (0x02CD) // oberes Limit 4,5V: 4,5V/4,8828mV = 922 (0x039A) ADC_Check_Limit(ADC0,0x02CD, 0x039A); // Der Eingang wird alle 500ms gelesen und ausgewertet. AbsDelay(500); } } Gru� Reiner > Hallo, > > sorry wegen der Verzögerung, aber ich habe momentan viel zu tun. Mit folgenden Code kann man Zahlen > in einen Text ausgeben: > > char Ausgabe[6]; > word ADC_Wert; > > // schreibt ein word in den String mit einem offset von 0 (also direkt an den Anfang) > // die Basis ist 10 (also dezimal), und die minimale Breite ist 0 (bei grö�eren Werten wird der Text > // evtl. mit Nullen am Anfang aufgefüllt) > Str_WriteWord(ADC_Wert,10,Ausgabe,0,0); > > Am besten mal mit den Werten rumspielen un den String dann mit Msg_WriteText in die Debugausgabe > schicken. Sicherheitshalber den String schon mal länger definieren, z.B. char Ausgabe[12]; > > Gruss Peter > > > Hallo Peter, > > > > vielen Dank für deine Antwort...ich verzweifle an diesem Ding. Leider ist die begeleitende > > Einführung der C-Control pro nichts für Anfänger... > > Ich habe mir aus den Beispielprogrammen was zusammengebastelt, mit dem msg-Befehlen sehe ich > > auch das Egebnis im Debugfenster. Jetzt mu� allerdings der Messwert 'ADC_Wert' offensichtlich um- > > gewandelt werden um ihn mit dem 'Serial_Write' Befehl über RS232 ausgeben zu können. Aber > > mit den vorleigenden Angaben bekomme ich das nicht geregelt. Meine Frage lautet somit wie mu� > > ich die Umwandlung des ADC Messwertes vornehmen um den String dann ausgeben zu können ? > > Ich möchte lediglich eine Zahl für den Messwert erhalten dann Zeilenumbruch, neuer Messwert etc... > > > > anbei das Programm wie es jetzt ist.. > > > > kannst du helfen ?? > > > > // ADC_0: Messwertausgabe > > // Eingang ADC0 PA0 (PortA.0) > > // erforderliche Library: IntFunc_Lib.cc > > > > // Der Me�wert wird über die serielle Schnittstelle ausgegeben > > > > // Der ADC hat eine Auflösung von 10 Bit. > > // Bei einer Referenzspannung von 5V bedeutet dies 4,8828mV/Bit. (5V/1024Bit) > > // Als Referenzspannung kann Vcc, die interne Referenz(2,56V) > > // oder eine externe Spannung verwendet werden. > > > > // Deklaration der Formatierungsvariablen > > #define LF 0x0A > > #define CR 0x0D > > #define SPACE 0x20 > > > > //------------------------------------------------------------------------------ > > // Auswertung der am verwendeten Eingang anliegenden Spannung unter > > // Berücksichtigung der angegebenen oberen und unteren Limits. > > // > > > > > > void ADC_Check_Limit(byte channel,word limit_low, word limit_high) > > { > > word ADC_Wert; // In dieser Variablen wird der > > // gemessene Wert gespeichert. > > char Ausgabe[6]; // In dieser Variablen wird der Messwert > > //gespeichert und seriell ausgegeben > > ADC_Set(ADC_VREF_VCC, channel); // Festlegung der Bezugsgrö�e des Eingangskanals > > // und Bestimmung des verwendeten Kanals. > > // In diesem Fall werden alle gemessenen > > // Werte auf 5V bezogen. > > ADC_Wert=ADC_Read(); // Einlesen des Wertes des Kanals > > > > Msg_WriteChar(CR); // Ausgabe: Wagenrücklauf > > Msg_WriteChar('A'); // Ausgabe: A > > Msg_WriteChar('D'); // Ausgabe: D > > Msg_WriteChar('C'); // Ausgabe: C > > Msg_WriteChar(channel|0x30); // Ausgabe der Kanalnummer über eine > > // bitweise ODER-Verknüpfung mit dem > > // Hexwert des ASCII-Zeichens 0. > > Msg_WriteChar(SPACE); // Ausgabe: Leerzeichen > > Msg_WriteChar(':'); // Ausgabe: : > > Msg_WriteChar(SPACE); // Ausgabe: Leerzeichen > > Msg_WriteWord(ADC_Wert); // Ausgabe: gemessener Wert > > > > Serial_WriteText(Ausgabe); > > Serial_Write(CR); > > Serial_Write(LF); > > > > } > > //------------------------------------------------------- > > // Hauptprogramm > > // > > void main(void) > > { > > Serial_Init(SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD9600); > > > > > > while (1) > > { > > // Funktionsaufruf mit Angabe des verwendeten Kanals, > > // des unteren und des oberen Limits. > > // Beide Limits wurden in Bezug auf die verwendete Referenzspannung > > // ADC_VREF_VCC (5V) berechnet. > > // unteres Limit 3,5V: 3,5V/4,8828mV = 717 (0x02CD) > > // oberes Limit 4,5V: 4,5V/4,8828mV = 922 (0x039A) > > > > ADC_Check_Limit(ADC0,0x02CD, 0x039A); > > > > // Der Eingang wird alle 500ms gelesen und ausgewertet. > > AbsDelay(50); > > } > > } > > > > > > > > > > > Hallo Ralf, > > > > > > wie möchtest Du denn die Daten über die serielle ausgeben? Mit Serial_Write() kann man ein Byte auf > > > die Serielle schicken, oder man konvertiert die Werte in einen Text String und gibt sie dann mit > > > Serial_WriteText() aus. Es gibt mehrere Beispielprogramme, wie man Text in einen String schreibt. > > > Man kann die Messwerte z.B. mit Str_WriteInt() in den String schreiben und dann ausgeben. > > > > > > Gruss Peter > > > > > > > Hallo liebe Anwender, > > > > > > > > kann jemand einem C-Neuling eine Hilfestellung geben. Wir versuchen einen Messwert vom > > > > ADC-Port über die serielle Schnittstelle auszugeben. Textausgaben funktionieren, aber wie > > > > bekomme ich den Messwert direkt über die Schnittstelle gesendet ? Kann hier jemand helfen ? > > > > > > > > Vielen Dank > > > > > > > > Ralf | |
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum