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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.