Forum: Mikrocontroller und Digitale Elektronik Periode v. Messwerterfassung einstellen


von Grabner Franz (Gast)


Angehängte Dateien:

Lesenswert?

Hi zusammen!

Ich verwende das Siemens Starter Kit SK 167 1/9 und habe Dave, µVision, 
Flash-Tools 16W von Phytec und Netbeams zur Verfügung. Habe leider von 
Java überhaupt keine Ahnung und beim Rest tu ich mir auch nicht so 
leicht ... Könnt ihr mir ein bisschen weiterhelfen?

Wie soll ich das angehen? Über HyperTerminal oder Eingabe irgendwie über 
Java?

Ich hab mir sowas in die Richtung gedacht:
Der Messwert soll über die A/D-Wandlung eingelesen und codiert über die 
serielle Schnittstelle gesendet werden. Dabei soll der User die Periode 
ändern können (wieder über serielle Schnittstelle?)

Wie soll ich das am besten (einfachsten) lösen? Timer oder 
Receive-Interrupt (wenns das gibt)? Wie stelle ich die Periode ein?

Ich hoffe ihr könnt mir ein paar Tips geben.

Viele Grüße
Franz

von Ronny (Gast)


Lesenswert?

Hast du dir schon das Beispiel von Phytec (measurements) angeschaut?Da 
sind etliche Sachen bereits ganz gut demonstriert (u.a. Timer gesteuerte 
A/D-Wandlung,kommando-basierte serielle Kommunikation)

Kleiner Tipp am Rande:

DaVe ist eine nette Spielerei um sich NACH LEKTÜRE des Datenblatts mit 
einigen Peripherie-Registern vertraut zu machen (insbesondere die 
PLL-Settings und die Baudraten-Sachen).Bei einem richtigen Projekt sorgt 
das Tool allerdings zu den selben Problemen wie alle Code-Generatoren 
wie z.B. komplizierte Änderung einmal erstellter Initialisierungscodes, 
unübersichtlicher Code mit Tausenden Zeilen Kommentaren (nicht falsch 
verstehen,Kommentare sind wichtig.Aber 10 Zeilen Kommentar auf eine 
Zeile Code ist zuviel des guten) und im schlimmsten Fall sogar eventuell 
Datenverlust wenn man das mit eigenen Code ergänzte DaVe-Projekt nochmal 
mit DaVe öffnet.

von Grabner Franz (Gast)


Lesenswert?

Thx für den Tip. Aber wie geh ich das am besten an? Das einstellen der 
Periode krieg ich noch hin, aber wie mache ich das über Java? Welchen 
Interrupt verwende ich? Oder nehm ich Timer?

Hier noch mal die Aufgabenstellung:
Die Periode der Messungen soll zur Laufzeit einstellbar sein. Die 
Periode soll über ein geeignetes Benutzerinterface in der PC-Software 
einstellbar sein und über die serielle Schnittstelle an das am 
Mikrocontroller ausgeführte Messwerterfassungsprogramm übertragen 
werden.

Ich hoffe ihr könnt mir ein paar Tips geben!

Grüße
Franz

von Grabner Franz (Gast)


Lesenswert?

OK ich werd dann mal konkreter:

Mein Programm soll die am µC anliegende Spannung erfassen (von analogen 
Eingang) und die Spannung über die serielle Schnittstelle weitergeben. 
Dabei soll die Periode (wie oft "abgetastet" wird) einstellbar sein. So 
mein Ansatz für die C-Files:

IO.C:

  P2   = 0x0000;      // P2 mit Wert initialisieren
  ODP2 = 0x0000;      // Alle Kanäle in Push/Pull-Mode
  DP2  = 0x03FF;      // P2.0 - P 2.9 auf Ausgabe setzen
------------------------------------------------------------
Main.C:

#include "MAIN.H"
#include "stdio.H"

unsigned int result;
unsigned int periode;

IEN = 1;          // Globale Interrupt-Freigabe

void main(void)
{

  while(1){
    //printf("Geben Sie die Periode ein! Vorteiler = 512");
    periode=_getkey();           // Eingegebenen Wert einlesen
    while(ADBSY){}              // solange beschäftigt ist, warte
    result = ADDAT & 0x03FF;        // Maskierung um 10 Bit Ergebnis der 
ADC Wandlung zu erhalten
    result=(result*5.)/1024.;        // Umrechnung: 1024 Stufen, 5 V
    printf("%f\n",result);          // Ergebnis ausgeben
    T3IR=0;                  // zurücksetzen des Interrupt Request Bits 
für neuerliche Abfrage
                        // wird gesetzt wenn Timer 0 erreicht
    }

}

------------------------------------------------------------
ADC.C:

void ADC_vInit(void)
{
  /// fixed channel single conversion
  /// ADC start bit is set

  ADCON  = 0x0088;             // Start der A/D-Wandlung von Kanal 8

}

------------------------------------------------------------

GT1.C:

#include "MAIN.H"
#include "Math.H"

unsigned int Round(unsigned int Zahl, unsigned int Stellen)
{
    Zahl *= pow(10, Stellen);
    if (Zahl >= 0)
  {
        floor(Zahl + 0.5);
  }
    else
  {
        ceil(Zahl - 0.5);
      Zahl /= pow(10, Stellen);
  }
    return Zahl;
}


unsigned int extern periode;

void GT1_vInit(void)
{

  T3CON = 0x0086;   // Vorteiler 512, Timer Mode, noch nicht starten, 
Abwärtszähler
  T3    = 0x9897;  //  load timer 3 register, Anzahl der Takte

  T3IC = 0x0048;   // Gruppenlevel: 0
            // Prioritätsstufe: 2
          // enable Timer 3 Interrupt

  T3R = 1;         //   set timer 3 run bit
            // Starten des Timers
}

void GT1_viIsrTmr3(void) interrupt T3INT
{

  T3IR=0;     // zurücksetzen des Interrupt Request Bits für neuerliche 
Abfrage
         // wird gesetzt wenn Timer 0 erreicht
  T3=Round(periode/(50e-9*512),0);      // 50ns = kleinste Taktzyklus?
                    // 50e-9*512 ergeben den Zeitraum, in dem 1 x 
abgefragt wird
                    // Bsp.: 1 / erg = Anzahl der Takte wobei 1 für eine 
Sekunde steht
  ADST=1;        // Start der A/D-Wandlung

}

------------------------------------------------------------

ASC.C:

void ASC_vInit(void)
{
  ///  8-bit data asynchronous operation
  ///  one stop bit
  ///  ignore framing error
  ///  ignore overrun error
  ///  divide clock by reload value + constant
  ///  receiver enabled
  S0CON  = 0x0011;

  //   ASC baudrate reload register
  ///  baudrate =  9615,38 Baud
  S0BG   = 0x0040;    // Baudrate auf 9600 Bd mit S0BRS=0
              // S0BRS = 0 Divide clock by reload-value + constant 
(depending on mode)

  P3    |= 0x0400;    //  set P3.10 output latch (TXD0)
              // P3.10 auf 1 setzen (Rest bleibt wie er ist)
            // enstpricht P3 = P3 | 0x0400;
  DP3   |= 0x0400;    /// set P3.10 direction control (TXD0 output)
              //  P3.10 auf Ausgang setzen, Rest bleibt
  DP3   &= 0xF7FF;    /// reset P3.11 direction control (RXD0 input)
              // P3.8 - P3.10 bleibt nach Maskierung übrig (Rest 0)
            // das was vorher eingestellt war, bleibt



   S0TIR=1;        // setzen des Interrupt Request Flag
               // f. Polling (fortlaufende Abfrage der Signale)
            // This source has raised an interrupt request


  S0R    = 1;         //  enable baudrate generator
              // Start des Baudratengenerators
}

}




Ich hab mir gedacht, ich mach einen Interrupt wenn die serielle 
Schnittstelle was empfängt. Wie heißt die dazugehörige Fkt. (verwende 
kein Dave im Moment)? Soll ich diese zu ASC.c hinzufügen oder GT1.c? 
Wenn ich sie unter GT1.c hinzutue, wie heißt die dann? Wird dann nur der 
Einsprungspunkt geändert und sie heißt gleich?

So ganz habe ich noch nicht gecheckt wie das arbeiten soll, ich stelle 
es mir aber im Moment so vor:

Ich spiele mein fertige *.h86 HEX Datei auf den Speicher und starte dann 
die Flash-Anwendung und Hyperterminal. Irgendwie so geht es. Den 
Programmaufbau stelle ich mir so vor: Wenn ich was in meiner C-Datei was 
ausgebe (z.B. mit printf), dann wird es auch auf dem Hyperterminal 
ausgegeben. Und meine Java-Anwendung schaut nur, wenn was über die 
serielle Schnittstelle kommt, zeigt mir das an, und kann wieder was über 
die serielle Schnittstelle senden, welches mein C Programm mit _getkey 
wieder bekommt. Lieg ich dabei viel daneben?

So zum Schluss meine Java Datei:

package serielle;

import at.htlklu.elektronik.schnittstellen.SerielleSchnittstelle;
import at.htlklu.elektronik.schnittstellen.StringListener;

public class Main implements StringListener{

    /** Creates a new instance of Main */
    public Main() {
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().echo();
        System.out.println(„Geben Sie die Periode ein!“);
        String eingegeben =
                stringEvent.getStringReceived();
        System.out.println(eingegeben);
        com.sendString(eingegeben);

    }

    SerielleSchnittstelle com;
    public void echo() {
        com = new SerielleSchnittstelle();
        // optional Abfrage des Ports
        String port =
                SerielleSchnittstelle.listAndSelectPort();
        if (port != null)
            com.setPortName(port);
        //
        com.addStringListener(this);
    }

    public void stringReceived(
            at.htlklu.elektronik.schnittstellen.StringEvent
            stringEvent) {
        String empfangen =
                stringEvent.getStringReceived();
        System.out.println(empfangen);
        com.sendString(empfangen);
    }
}

Hier könnt ihr meine Files finden (Java ist noch alter Source-Code):
http://www.speedyshare.com/123780834.html

Passwort: http://www.mikrocontroller.net

Mehr weiß ich einfach nicht.

Grüße
Franz

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.