- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 49

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2013
    Beiträge
    12
    Hallo haikuvm,

    ich benutze Eclipse, aber wenn ich wie auf deiner Seite beschrieben vorgehe, bekommen ich immer die Ausgabe 'make not found'. Deswegen gebe ich die Befehle zum Ausführen immer noch im Terminal ein. Das funktioniert auch.

    'haiku.avr.lib.arduino.save.TWI' befindet sich im bootstrap.jar von Version 1.0.1.

    Zwei Sachen sind mir nochnicht ganz klar geworden:
    Gibt es die Möglichkeit auf Interrups zu reagieren?
    Wie schreibt man native code für haikuvm?

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

    uuups, in einer jar-Datei hatte es sich versteckt. Da bin ich nicht drauf gekommen! Danke!

    1) 'make not found'
    Tja, da bin ich ratlos. Irgendwie hat der Mac für die Commandozeile eine andere Umgebung als für Eclipse. Wenn Du da was raus kriegst, lass es mich wissen.

    2) Ja, die Zusammenarbeit mit Interrupts geht. Und das geht nur mit native C code. Das habe ich mit mlade hier diskutiert. Ist da noch was unklar? Kann vielleicht mlade noch was dazu sagen, würde mich freuen?!
    Darüber hinaus habe ich dazu schon was im Tutorial Bereich auf der neuen HaikuVM WEB page beschrieben. Die gibt's schon mal als Preview:
    http://haiku-vm.sourceforge.net/preview.html
    Vorsicht: die darin erwähnte Version 1.0.2 steht (noch) nicht zum Download bereit!

    3) Willst Du den TWI Slave mit C code realisieren? Hat Dir für eine reine JAVA Lösung die Compass Klasse nicht genug geholfen?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2013
    Beiträge
    12
    Hallo haikuvm,

    Ich habe jetzt die Wire-Library von Arduino genommen und fast komplett in Java nachgebaut. Lediglich einen native Methode brauch ich noch, um auf den Interrupt TWI_vect zu reagieren. Denn wenn die Interrupt Routine SIGNAL(TWI_vect) (im c Code) aufgerufen wird, wird ein nur Integer auf 1 gesetzt. Diesen Integer frage ich im Java Programm in einem separaten Thread permanent ab. Wenn der Integer auf 1 springt, wird die java Methode SIGNAL() ausgeführt. Diese hat den selben Inhalt, wie die Routine aus twi.c.

    Leider funktioniert einiges irgendwie nicht:
    Wenn ich den Arduino als Slave und den NXT als Master betreibe, zeigt mir der NXT an, dass ein BUS Error vorliegt.
    Wenn der Master trotzdem versucht etwas zu senden, wird auch onReceive(int numBytes) beim Slave aufgerufen, aber numBytes ist immer 0. D. h. es werden keine Daten empfangen.
    Wenn der Master versucht etwas zu empfangen, wird onRequest() aufgerufen, aber der Master empfängt nichts.

    Leider konnte ich den Arduino nicht als Master betreiben, weil ich keinen Slave besitze.

    Weißt du woran es liegen könnte, dass es zu einem BUS Error kommt?

    Hier sind meine Dateien, falls du mal einen Blick darauf werfen willst.

    LG jan

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

    puuuh, da hast Du zu Beginn gleich ein gewaltiges Projekt eröffnet. Die gesamte Wire-Library von Arduino, fast komplett ...!
    Würde mich freuen wenn das funktioniert!!
    Da habe ich aber auch eine gewaltige Menge von Fragen:
    1) Funktioniert denn die reine C Lösung der Wire-Library von Arduino? D.h.:
    1a) Hast Du das schon in der Arduino IDE probiert?
    1b) Und gegen den NXT laufen sehen?

    2) Welches Memorymodel von HaikuVM nutzt Du 16/32 oder 32/64? (Hast Du Dich da eingelesen auf der HaikuVM Page?)
    Denn ich sehe da in Deinem Code: int TWI_FREQ = 100000;
    (Das passt nicht in einen int16 falls 16/32 !!!)

    3) Hast Du Erfahrung mit Interruptprogrammierung?
    Denn Erfahrene schreiben eigentlich: volatile uint8_t newSignal = 0;

    4) Geht es nicht auch ganz ohne Interrupt (denn Threads machen's möglich) also ohne setzen von TWIE (und damit auch ohne JNI Code)? Einfach das Bit in der run()-Schleife direkt testen.
    Code:
    if ( (TWCR & _BV(TWINT)) != 0 ) { SIGNAL(); };
    (Hierbei nicht vergessen TWINT wieder zurück zu setzen.)

    5) Kosmetik: Ich würde twi nicht von Thread ableiten sondern so schreiben:
    Code:
    public class twi implements Runnable, SlaveRxEvent, SlaveTxEvent{
    ...
              Thread th = new Thread(this);
    ...
    }
    6) Ganz wichtig: Welche Version von HaikuVM nutzt Du?
    Geändert von haikuvm (14.03.2013 um 22:56 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2013
    Beiträge
    12
    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 15:38 Uhr)

  6. #6
    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.

  7. #7
    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.

Ä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, 16:31
  2. ARDUINO ARDUINO l293D + MegaservoLib
    Von m1ch15inner im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 11.07.2011, 11:50
  3. Runtime Error! in AVR Studio
    Von NemesisoD im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 05.01.2007, 19:30
  4. (LEGO MINDSTORMS) lejos Klassen Facharbeit
    Von George Dorn im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 01.03.2006, 16:29
  5. lego, lejos, logitech ;)
    Von maze2k im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 7
    Letzter Beitrag: 21.05.2005, 22:21

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests