- Labornetzteil AliExpress         
Seite 5 von 5 ErsteErste ... 345
Ergebnis 41 bis 49 von 49

Thema: HaikuVM A Java VM for ARDUINO and other micros using the leJOS runtime.

  1. #41
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2013
    Beiträge
    12
    Anzeige

    Praxistest und DIY Projekte
    Hallo Haikuvm,

    Zu 2 und 3) Ich hab seit längerer Zeit nicht mehr in C programmiert. Aber nach diesem Projekt sollte wieder alles da sein Natürlich muss es ein long sein.
    Zu 4) Nein es geht anscheinend nicht. Ich führe if(TWCR & _BV(TWINT)) != 0 ) in einem separaten Thread aus, aber es ist niemals "true". Kann es sein, dass es nicht oft genug aufgerufen wird?
    Zu 6) 1.0.2

    Zu 1) Mit der Wire-Library und der Arduino-Idee hab ich eine Verbindung zum NXT aufbauen können.
    Wenn ich die Wire-Library in C anspreche, bekomme ich auch einen Bus-Error..
    Deshalb hab ich noch einmal ganz vorne angefangen und meine eigene Interrupt-Routine in C geschrieben. Diese funktioniert nun auch einwandfrei (auch die Slave-Funktionen). Nun werde ich die Einzelteile langsam auf Java übertragen und gucken ob es diesmal funktioniert.

    Edit:

    Gibt es die Möglichkeit Java Methoden aus dem C Code aufzurufen oder muss ich immer eine Variable überprüfen und dann die Methode aufrufen?
    Mit "@NativeCVariable8" kann man doch aus dem Java Code ohne JNI auf C Variablen zugreifen, oder?
    Geändert von janvp (27.03.2013 um 16:38 Uhr)

  2. #42
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2012
    Beiträge
    26
    Hallo janvp,

    zu 1) Hab' ich mir fast gedacht, dass die - sonst sehr hübsche - Wire-Library ein Problem hat mit dem NXT.
    zu 4) Das wundert mich allerdings sehr!
    4.1) Kann es sein, dass Du, auch bei dieser Lösung TWI Interrupt enabled hast? Dann nämlich wird das TWINT gleich vom Interrupt wieder weggefressen.
    4.2) Klappt das nie? Oder kommt es beim aller ersten Mal doch einmal zum Auftruf von SIGNAL()?

    Nein, aus C heraus JAVA Methoden aufrufen geht nicht (ohne weiteres).
    Du hast schon Recht, mit @NativeCVariable8 kann man direkt auf C Variablen zugreifen. Z. Zt. können das aber nur die sein die von AVR vordefiniert sind und nix eigenes. (Also z.B. Dein 'newSignal'.) Mich hat das auch schon gestört und ich werde es mit der nächsten Version ermöglichen.

    Leider habe ich nur einen Arduino. Sonst könnte ich beim TWI Slave mit testen.

  3. #43
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2013
    Beiträge
    12
    Ich habe jetzt ein kleines Testprogramm geschrieben.
    Wenn ich es ausführe, wird leider niemals "it works" ausgegeben..
    Code:
    import static haiku.avr.ATmega328p.*;
    import haiku.avr.lib.arduino.WProgram.Serial;
    
    public class SoftTWI {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		
    		Serial.begin(115200);
    		
    		Serial.print("init...");
    		
    		// Interne Pull-Ups aktivieren
    		DDRB = 0x00;
    		PORTB = 0xff;
    		DDRC = ((0 << DDC0) | (0 << DDC1) | (0 << DDC2) | (0 << DDC3) | (1 << DDC4) | (1 << DDC5));
    		PORTC = ((1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (0 << DDC4) | (0 << DDC5));
    		DDRD = 0x00;
    		PORTD = 0xff;
    		
    		// Adressregister (TWAR) auf Adresse setzen. Achtung: 1x links schieben, da Bit 0 für Global call verwendet wird
    		TWAR  = (0x43 << 1);
    		//TWAR |= (1 << 0); 
    		// Kein Interrupt erlauben und ACK auf Adresse aktivieren
    		//0<<twie kein Interrupt!
    		TWCR = (0 << TWINT) | (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN) | (0 << TWIE);
    
    		Serial.println("finished");
    		
    		while(true){
    			if( (TWCR & (1<<TWINT)) != 0 ){
    				
    				Serial.println("it works!");
    				// ACK und reset TWINT
    				TWCR = (1 << TWINT) | (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN) | (0 << TWIE);
    			}
    		}
    	}
    
    }
    Wenn ich das ganze in C schreibe und den Interrupt aktiviere, wird die Interrupt-Routine aufgerufen. Die Initialisierung sollte also stimmen.

    Hab ich irgendwas übersehen oder müsste eigentlich alles richtig sein?

    Ich hab leider auch nur den NXT als Master. Bald werd ich mir aber einen zweiten AVR anschaffen. Vielleicht liegt es echt am NXT.

  4. #44
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2012
    Beiträge
    26
    Hallo Janvp,

    ich bin mit den Details von TWI echt überfragt. (Vielleicht können hier Andere besser helfen.) Aber, Du setzt in Deinem Beispiel zwei mal das TWCR Register. So weit so gut. Aber sollte es nicht beide male "TWCR = (1 << TWINT) | ..." heißen? Also:
    Code:
        TWCR = (1 << TWINT) | (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN) | (0 << TWIE);

  5. #45
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2013
    Beiträge
    12
    Zuerst einmal:
    Eigentlich müsste die erste Zuweisung richtig sein. Denn wenn man stattdessen "TWCR = (1 << TWINT)..." schreibt ist die Bedingung immer "true", auch wenn ich nichtmal eine Kabelverbindung habe. Die zweite Zuweisung wird ja leider nie aufgerufen, aber ich habe im Wissensbereich (oder im Mircrcontroller-Forum?) gelesen, dass TWCR zurück gesetzt wird, indem TWINT durch "TWCR = (1<<TWINT).." gelöscht wird. Ich habe das aber auch nicht so ganz verstanden..

    Jetzt etwas neues:
    Meine TWI-Slave-Lib funktioniert jetzt endlich. Sie basiert aber auf der Interrupt-Routine. Ich habe erst versucht, dass eine Methode im Java Programm aufgerufen wird, wenn etwas passiert. Dies scheint aber nicht zu funktionieren.

    Wenn die Interrupt-Routine nicht auf das Java-Programm warten muss, gibt es keinen Bus-Error mehr und alles funktioniert.

    So funktioniert es nun:
    Empfang von Daten:
    Jetzt werden alle Daten im C-Programm empfangen und in einen Buffer geschrieben, welcher dann an das Java-Programm weiter gegeben wird. Die Interrupt-Routine wird nicht unterbrochen, da dass Java-Programm die Abfrage des Buffers übernimmt.
    Senden von Daten:
    Wenn ein Request eingeht, wird eine Java Methode ausgelöst. Gleichzeitig geht's weiter: Wenn der txBuffer leer ist, wird ein bestimmtes Zeichen (-1) verschickt, woran der Master erkennen soll, dass der Slave die Daten noch nicht parat hat. Der Master muss solange den Slave abfragen, bis dieser was anderes als -1 schickt.
    Wenn das Java Programm dann irgendwann mal den Buffer gefüllt hat wird dieser verschickt.
    Der nächste Request kann ausgelöst werden.

    Die Slave-Lib funktioniert jetzt wunderbar. Der Quellcode ist aber überhaupt nicht schön. Das muss noch behoben werden. Auch möchte ich noch ein Funktions-Diagramm machen, welches zeigt, wie der Master handeln sollte, damit alles funktioniert.


    Mir ist da grad etwas eingefallen:
    Früher hab ich ja im Interrupt eine Variable auf 1 gesetzt und dann mit einer Schleife solange gewartet, bis diese 0 ist. Das Java-Programm sollte sie nämlich abfragen und dann auf 0 ändern. Das ganze kann doch gar nicht funktionieren: Denn wenn der Interrupt läuft, kann ja gleichzeitig kein anderer Code ausgeführt werden. Der Interrupt hebelt somit das Java-Thread-System aus.


    Jetzt hab ich mein erstes Teil-Ziel erreicht Ich würde die Library gerne Hochladen, aber mein Internet gibt zurzeit den Geist auf (Danke Vodafone!!!). Vielleicht wird es heute Abend was.
    Edit: Hier ist sie: http://dl.dropbox.com/u/54743553/Archiv.zip
    Eine Frage bleibt aber noch: Muss ich, damit ich die "Serial.println.." am PC auslesen kann, die Arduino IDE benutzen, oder gibt es dafür ein anderes Programm?

    Vielen Dank
    Geändert von janvp (05.04.2013 um 14:05 Uhr)

  6. #46
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2012
    Beiträge
    26
    Suuuper, dass es funktioniert. Du bist auch ganz schön hartnäckig!! Das zahlt sich wohl aus.

    zu) "Eigentlich müsste die erste Zuweisung richtig sein. ..."
    Mich würde interessieren: Ist das jetzt vom grünen Tisch? Oder hast Du meinen Vorschlag von Post #44 geprüft und - in der Praxis - für untauglich/falsch befunden. (Ich meine natürlich mit bestehender(!) Kabelverbindung.) Denn ich hatte Dir in Post #36 ein praxiserprobtes Programm vorgestellt, das genau so (wie in Post #44) funktioniert, allerdings als (verkabelter) Master.

    zu) "Früher hab ich ja im Interrupt eine Variable auf 1 ..."
    Tja, das meinte ich mit meiner Bemerkung 4.1 (siehe Post #42).

    zu) ... "Serial.println.." am PC auslesen ...
    Für Windows gibt es Terminalprogramme:
    a) Hyper Terminal
    b) putty.exe
    c) andere Terminalprogramme
    Für UNIX gibt es natürlich auch Terminalprogramme, weiß aber nicht genau was gut funktioniert. Da brauche ich Deine Hilfe.

  7. #47
    hi,

    Java ist ja nun nicht für die direkte Kommunikation mit der Hardware gedacht. Also war mein Gedanke, die Interrupt-Routinen in C zu schreiben, und diese dann per JNI in meine Java-Anwendung einzubinden. In C (und ASM) hab ich mit dem Asuro auch schon einige Erfahrungen sammeln können, auch die Bearbeitung von Interrupts. Mit Java und insbesondere mit dem JNI habe ich aber keine Erfahrungen.

    Versucht habe ich, die Interrupts irgendwie ohne JNI einzubinden, indem ich einfach per setMemory8 GICR, MCUCR und SREG konfiguriert und dann eine ISR (wie ich naiv glaubte) namens SIGNAL_SIG_INTERRUPT1 zu schreiben. IRGENDWAS tut der Robot auch bei dem Interrupt, ich bin mir allerdings ziemlich sicher, dass unmittelbar ein RESET folgt.


    -------------------------------
    Awavo COM Port Monitor

  8. #48
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2012
    Beiträge
    26
    Hallo Benjaminn,

    eigentlich brauchst Du setMemory8 nicht, die Verwendung ist unbequem. Denn Du kannst die Variablen GICR, MCUCR und SREG auch direkt in JAVA/HaikuVM ansprechen. Wie sieht denn Dein Versuch von SIGNAL_SIG_INTERRUPT1 aus? Zeig doch bitte mal Deinen Quellcode.

  9. #49
    Hallo.

    Ich interessiere mich dafür, einen Arduino Mega 2560 mit Java zu programmieren (favorisiertes OS: Debian GNU/LInux). Dazu habe ichHaikuVM heruntergeladen und versuche nun gemäß dem Absatz "Arduino IDE" im Tutorial von "http://haiku-vm.sourceforge.net" vorzugehen. Das ist bisher leider nicht erfolgreich. Das Problem kann vielfältig gelagert sein:

    - Bibliotheken wurden nicht eingebunden. (Das kann in meinem Fall auch am falschen Setzen des Java-Classpath liegen.)

    - Konfiguration und vorhandene Umgebung passen nicht zusammen.

    Da ich in mancherlei Hinsicht Neuling in diesem Feld bin, bitte ich um Nachsicht. Details/Fehlermeldungen reiche ich selbstverständlich gern nach; allerdings ist mir momentan noch nicht klar, wo der erste Fehler aufgetreten ist. Über Hilfe würde ich mich sehr freuen.

    Gruß, connochaetes.

Seite 5 von 5 ErsteErste ... 345

Ähnliche Themen

  1. [ERLEDIGT] [ARDUINO] 2 Motoren + Servo mit dem Arduino Uno steuern
    Von Torrentula im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 31.08.2011, 17:31
  2. ARDUINO ARDUINO l293D + MegaservoLib
    Von m1ch15inner im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 11.07.2011, 12:50
  3. Runtime Error! in AVR Studio
    Von NemesisoD im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 05.01.2007, 20:30
  4. (LEGO MINDSTORMS) lejos Klassen Facharbeit
    Von George Dorn im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 01.03.2006, 17:29
  5. lego, lejos, logitech ;)
    Von maze2k im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 7
    Letzter Beitrag: 21.05.2005, 23:21

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen