Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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: