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.