- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 49

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

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

    Praxistest und DIY Projekte
    Mit dem Ändern von prog_void zu void ist der erste Fehler behoben.

    Hier meine avr-gcc Version:
    Code:
    whiteapple:myCProject jan$ avr-gcc --version
    avr-gcc (GCC) 4.6.2
    Copyright (C) 2011 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    Der zweite Fehler ist leider nicht behoben.

    Ich hab mir die Datei haikuConfig.c mit dem Text-Editor angeguckt und da ist mir etwas sonderbares aufgefallen. Immer wenn ich versuche das Leerzeichen nach ByteCode bzw vor * zu entfernen, verschwindet auch der Raum zwischen * und functionTable[]:

    Vorher:
    const byteCode * functionTable[]..
    Nach dem Entfernen von dem Leerzeichen:
    const byteCode*functionTable[]..
    Ich hätte jetzt gedacht, dass es dann so aussehen müsste:
    const byteCode* functionTable[]..

    Wenn ich das Leerzeichen bei
    const char * functionDesc[]..
    entferne, verhält es sich wie erwartet:
    const char* functionDesc[]..

    Auch scheint der Raum zwischen * und functionTable[] größer zu sein als zwischen * und functionDesc[].

    Ich hoffe du verstehst, was ich meine. Vielleicht stimmt etwas mit der Formatierung nicht. Der verwendete Text-Editor heißt TextEdit und ist auf dem Mac vorinstalliert.
    Hier kannst du meine haikuConfig.c angucken: link

    Vielen Dank für deine Mühe

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

    1) leider sehe ich keinen Anhang in Post #20. (Aber da tut's ja jetzt alles und scheint nicht mehr nötig zu sein.)

    2) Wenn ich dich richtig verstehe willst (mittels libusbW32) einen COM-Port für avrdude erzeugen?!
    Das ist ok. Aber weshalb kannst du nicht AVRISP MKII für deinen Selbstbau weiter verwenden? So wie ich dich verstehe hat das doch zuvor funktioniert. Ich kenne mich mit AVRISP MKII zwar überhaupt nicht aus aber ich nehme mal an - mit viel Phantasie - du hast das circa so zum flashen genutzt:
    • avrisp.exe option1 option2 ... myHexFile.hex

    Trag das doch mal (statt avrdude) in 'HaikuVM.properties' ein. Circa so:
    • kaijoe.Upload = avrisp.exe option1 option2 ... $(HAIKU_OUTPUT)

    und berichte mir mal.

    Wenn's funktioniert haben Andere und ich gleich ein Beispiel für AVRISP MKII. Würde mich freuen.

    - - - Aktualisiert - - -

    - - - Aktualisiert - - -

    Hallo janvp,

    1) Mit "avr-gcc (GCC) 4.6.2" habe ich ein Problem! Denn das gibt es (noch) nicht für mein UBUNTU 12. (Daher kommt auch das prog_void-Problem. Die haben das in dieser Version mit dem "deprecated" wahrscheinlich schon durchgezogen.) Da ich nicht hoch auf 4.6.2 komme, kann ich dich nur bitten runter auf 4.5.3 zu kommen.

    Ich gehe davon aus, dass damit auch die zweite Fehlermeldung verschwindet:
    • ../../haikuC/haikuConfig.c:650:18: error: variable 'functionTable' must be const in order to be put into read-only section by means of '__attribute__((progmem))'


    2) Das mit den sonderbaren Leerräumen liegt an TABs ('\t') und ist kein Problem. Zwischen "ByteCode *" ist ein Leerzeichen und zwischen "* functionTable[]" ist ein Tabulatorzeichen. Nimmst du das Leerzeichen weg verschiebt sich, in dem von dir verwendeten Editor, die Tabulatorgrenze. In diesem Fall scheint das TAB ganz zu kollabieren. Fürs Auge macht das was aus, für den C-Code nicht.

  3. #23
    kaijoe
    Gast
    Hallo Haikuvm,

    der AVRISPMKII ist der Programmer für die uC. AVRISP.EXE gibt es nicht. Ich weiß leider nicht
    was das Atmel Studio 6 zum Übertragen nimmt. Der AVRISPMKII ist auf jeden Fall Hardware.
    Ich habe es aber jetzt hinbekommen.

    D.h. ich habe das Atmel Studio mit all seinen Komponenten, auch den USB Treibern, deinstalliert und danach
    den Treiber libusbWin32 installiert.
    Wenn ich jetzt den Programmer (AVRISPMKII) in den USB-Port meines Notebooks stecke,
    wird er als libusb Device im Gerätemanager erkannt.
    Nun habe ich mit libusbWIN32 aber auch das Problem, dass ich keinen COMPORT erstellt bekomme.
    Allerdings ist es bei libusbWIN32 so, dass ich bei meinem kaijoe Abschnitt in der HAIKUVM.properties
    als COMPORT USB angeben kann, statt eines COMPORTS.

    D.h.

    kaijoe.Port = \\\\\\.\\comX funktioniert nicht.

    kaijoe.Port = USB funktioniert einwandfrei.


    Ich konnte Beispielprogramme kompilieren und auch übertragen.

    Jetzt kann ich mich mal damit beschäftigen eigene Programme zu schreiben.

    Eine Frage hätte ich noch. Wird der Output von haiku.bat irgendwo protokolliert?
    Ich bekomme Warnings angezeigt bei der Ausführung von haiku.bat. Da der output aber ziemlich schnell über den Bildschirm
    scrollt und der Puffer der Eingabeaufforderung ziemlich klein ist kann ich im Moment nicht sagen was das
    für Warnings sind.


    Gruß
    Kai
    Geändert von kaijoe (19.02.2013 um 11:13 Uhr)

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

    1) suuuper, freut mich zu hören, dass es mit deinem Selbstbau klappt.

    2) Also ich mache das so (stdout und stderr getrennt):
    • c:\haikuVM\bin\haiku -v --Config kaijoe -o blink.hex C:\haikuVM\examples\src\main\java\avr\tutorial\Bli nk.java >std.out 2>std.err

    oder so (stdout und stderr zusammen):
    • c:\haikuVM\bin\haiku -v --Config kaijoe -o blink.hex C:\haikuVM\examples\src\main\java\avr\tutorial\Bli nk.java >std.outerr 2>&1

  5. #25
    Hi,
    ich versuche, den Nibobee mit Java zu programmieren. Einfache Dinge wie zum Beispiel die Ansteuerung der LED's gelingen mir auch ganz gut, Probleme machen mir - wie eigentlich zu erwarten - die Hardware-Interrupts.
    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.

    Hat jemand einen Lösungsansatz für mich?

    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.

    Übrigens: Ich nutze außer haiku.vm.MemoryAccess keine vorbereiteten Pakete, auch nicht die Asuro-Lib (weil zum Beispiel Sleep oder Msleep nicht funktioniert, der Asuro ist ja ganz anders konfiguriert).

  6. #26
    kaijoe
    Gast
    Danke Haikuvm,

    das mit der Umleitung werde ich ausprobieren.
    Ich wusste nicht, dass das auch in Windows geht.

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

    Ich hab jetzt avr-gcc 4.5.1 und es funktioniert!
    vielen Dank, nun kann ich mich zu eigenen Projekten vor wagen.

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

    ja, gerne helfe ich. Deutlich besser gelingt die Hilfe wenn ich viel Feedback kriege.

    1) So habe ich in Post #6 schon mal was zum NIBObee geschrieben. Aber leider noch kein Feedback bekommen. Tut's das so, wie dort beschrieben, für dich?

    2) Ja, wenn du nichts vom ASURO übernehmen willst, nimm einen noch einfacheren MicroKernel und trag das Folgende in Datei 'HaikuVM.properties' ein:
    Code:
    # NIBObee
    nibobee.Extends = AVR
    nibobee.Target = atmega16
    nibobee.MemorySize = 700
    nibobee.Clock = 15000000
    nibobee.MicroKernel = haiku.avr.lib.simple010.HaikuMicroKernel
    3) Fang mit dem Programm 'avr/tutorial/BlinkSimple.java' an und steigere dich dann zu 'avr/tutorial/Blink.java'. Wahrscheinlich mußt du den Port änderen. Hin zu dem Port auf dem der NIBObee seine LEDs hat. (Deine Änderung würde mich als Feedback interessieren.) Mich würde auch interessieren wie du in 'avr/tutorial/Blink.java' den Wert für TCCR0B setzt, damit Thread.sleep(..), Thread.wait(..), System.currentTimeMillis() und der interne Thread Scheduler von HaikuVM den richtigen Millisekunden Takt bei 15Mhz bekommen?!

    4) Interrupts ja! Aber wie du schon aus 3) erahnen kannst, bitte nicht 'TIMER0_OVF_vect' verwenden (findet sich in Datei './haikuVM/simpleOS.c'), denn den braucht HaikuVM selbst.

    5) Ich werde auf der HaikuVM Page demnächst eine Serie kleiner Tutorials bringen. Eines davon wird Interrupts behandeln. Wir können ja hier - mit deiner Hilfe - damit beginnen :
    Zu diesem Tutorial wird es die Datei './haikuVM/myCProject/tutorials/interrupt.c' geben. Ich bin aber noch nicht so weit und habe nur eine Skizze und erste Idee. Vielleicht kannst du mir beim vervollständigen helfen? Der einfache Plan (für Anfänger) lautet so: Es soll (in C) einen Interrupthandler für den TIMER2 geben der nichts weiter macht als die Interrupts zählen. Mit der HaikuVM-JNI Funktion 'native_avr_tutorial_Interrupt1_getTimer2_J(..)' wird der Zähler ausgelesen. Man braucht dann nur noch 'Java_avr_tutorial_Interrupt1_getTimer2( JNIEnv *env, jobject obj)' selbst zu schreiben.

    Die Datei './haikuVM/myCProject/tutorials/interrupt.c' wird deshalb ca. so aussehen:
    Code:
    #include "haikuJ2C.h"
    #include <avr/interrupt.h>
    
    volatile static jlong timer2_interrupts = 0;
    
    SIGNAL (SIG_OVERFLOW2)
    {
          timer2_interrupts ++;
    }
    
    jlong Java_avr_tutorial_Interrupt1_getTimer2( JNIEnv *env, jobject obj) {
        jlong value;
        uint8_t oldSREG = SREG;
        cli();
        value= timer2_interrupts;
        SREG = oldSREG;
        return value;
    }
    
    /**
     * Automatic generated (see ./myCProject/haikuC/haikuJNI.c)
     * getTimer2()J
     */
    void native_avr_tutorial_Interrupt1_getTimer2_J(void) {
        pushTop();    // Save variable top onto stack.
        {
            jobject    obj = NULL;
            JNIEnv *env = NULL;
            top.j = Java_avr_tutorial_Interrupt1_getTimer2(env, obj);
        }
        // Variable top holds the return value. But we have to push the lower half.
        pushTop0();
    }
    Im JAVA Programm des Tutorials 'avr/tutorial/Interrupt1.java' (sieht ähnlich aus wie 'avr/tutorial/Blink.java') wird die native Funktion getTimer2() deklariert:
    Code:
    public static native long getTimer2();
    In der JAVA main(..) Methode von 'avr/tutorial/Interrupt1.java' wird zu Beginn der TIMER2 und sein Interrupt gesetzt ca.:
    Code:
    TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
    TIMSK |= _BV(TOIE2);
    und dann in einer (Endlos-) Schleife getTime2() aufgerufen um den Wert (timer2_interrupts) auszulesen.

    6) Vielleicht, mit deiner Hilfe würde ich auch gerne ein Interrupt Tutorial für den ADC machen.
    Geändert von haikuvm (21.02.2013 um 00:27 Uhr)

  9. #29
    Hi,
    danke für die schnelle und vor allem umfangreiche Antwort.
    Zu 1:
    Ja, nach der Anleitung in diesem Post habe ich begonnen. Allerdings habe ich noch nie avrdude benutzt, und da das Hochladen so nicht auf Anhieb funktioniert hat, habe ich weiterhin den nibobee-programmer benutzt, indem ich die entstehende .hex-Datei aus dem Verzeichnis target\cross hochgeladen hab.
    Ich bin jedoch schon bald darüber gestolpert, dass die in der Asurolib definierten Methoden Sleep() und Msleep() nicht funktionieren. Ich hab mir das bis jetzt noch nicht näher angesehen, sondern einfach eine Schleife benutzt, um Zeit zu verschlafen, denn ich wollte ja erst mal einfach nur mit einer LED blinken. Ich gehe mal davon aus, das die Konfiguration des Timers, so wie sie für den Asuro benutzt wird, nicht für den nibobee funktioniert.
    Zu 2:
    Ok, werd ich machen.
    Zu 3:
    Meine Umsetzung von "Blinksimple" besteht aus 2 Klassen. Led.java definiert die Klassenkonstanten PORTB und DDRB, welche die Adressen der gleichnamigen Register enthalten. Außerdem gibt es 3 Klassenmethoden, weche die Initialisierung der Hardware übernehmen, die 4 LED's ein- oder ausschalten oder von einer zur nächsten weiterschalten.
    Led.java:
    Code:
    import static haiku.vm.MemoryAccess.*;
    
    public class Led {
    	public static final int DDRB=(((0x17) + 0x20));
    	public static final int PORTB=(((0x18) + 0x20));
    
    	public static void LedInit() {
    		setMemory8(DDRB,(getMemory8(DDRB)| 0b00001111));
    		setMemory8(PORTB, 0b00000001);
    	}
    	
    	public static void LedSwitch(){
    		int portb;
    		portb=getMemory8(PORTB);
    		if (portb < 0b00001111){
    			setMemory8(PORTB, (portb << 1));
    		}
    		else {
    			setMemory8(PORTB, 0b00000001);
    		}
    	}
    	
    	public static void LedSet(int leds){
    		if (leds > 0b00001111){
    			leds=0b00001111;
    		}
    		setMemory8(PORTB,leds);
    	}
    }
    Die Klasse TestLed.java enthält eine Klassenmethode, welche die Schleife für die Wartezeit durchläuft (als simpler Ersatz für Sleep(), wird später natürlich über den Timer geregelt, da gehe ich als nächstes dran). Außerdem enthält sie main(), in welcher einfach nur eine Art Lauflicht gebaut wird, indem nach der Initialisierung Led nach der anderen an- und ausgeschaltet wird (ich hätte auch statt LedSet mit zaehler einfach LedSwitch ohne Argumente verwenden können):
    TestLed.java:
    Code:
    public class TestLed {
    
    	private static void Sleep (int msec) {
    		int j;
    		for (int i=0; i<(msec*7); i++) {
    			j=i;
    		}
    	}
    	
    	public static void main (String args[]){
    		int zaehler=0;
    		Led.LedInit();	// 1. Led an
    		while (true){
    			while (zaehler < 4){
    				Led.LedSet((0b00000001 << zaehler)); 
    				zaehler++;
    				Sleep(1000);
    			}
    			zaehler=0;
    		}	
    	}
    }
    Zu 4-6: Ok, das ist doch mal ein Lösungsansatz, DANKE! Ich werde damit mal rumspielen. Sobald was funktionierendes dabei rum kommt, poste ich selbstverständlich hier. Ich hab auch schon gleich die erste Frage: Was enthält top, die du mit pushTop() auf dem Stack ablegst (also bevor ...getTimer2() aufgerufen wird?
    ADC ist der nächste Schritt, das ist klar. Sobald ich geradeaus fahren kann, steht natürlich Linienverfolgung auf dem "Grundschul"plan eines Roboterprogrammierers.

    Vielen Dank nochmal für die Hilfe, bis demnächst!
    Geändert von mlade (22.02.2013 um 07:20 Uhr) Grund: Code-Blöcke eingefügt

  10. #30
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2012
    Beiträge
    26
    Hallo mlade,

    zu 1)
    a) Die ASURO Methoden Sleep() und Msleep() - so wie sie in HaikuVM implementiert sind - funktionieren nur mit einem Atmega8.
    b) Ich hatte die Hoffnung, dass der "nibobee-programmer" eine EXE Datei ist die auch Commandline Optionen versteht. Dann nämlich kann ich ihn in der nächsten Version als
    Code:
    nibobee.Upload = nibobee-programmer.exe option1 option2 ... $(HAIKU_OUTPUT)
    in 'HaikuVM.properties' einbauen.

    zu 3) Leider ist dein Code unleserlich. Editier doch bitte deine Post noch einmal und schließ ihn in einen CODE-Block ein. Würde mich freuen.

    7) "nächste Frage" pushTop(): Zunächst einmal sollte an diesen automatisch generierten Funktionen 'native_*' wirklich nichts verändert werden, sonst kommt die HaikuVM durcheinander.
    Die JAVA VM ist im Wesentlichen eine Stackmaschine (also auch HaikuVM). Alle Operationen geschehen auf dem Stack. Das ist ein ewiges auf und ab (push und pop). Beispiel 3 + 4:
    Code:
    push(3);
    push(4);
    push(pop() + pop());
    Jetzt steht das Resultat 7 auf dem Stacktop und man hat dazu 5 push&pop gebraucht.

    Besonders heiß geht es am Stacktop zu. Wenn man das weiß kann man push&pop sparen indem man den Stacktop gerade nicht auf dem Stack hält, sondern in einer Variablen (hier top):
    Code:
    push(top); top=3;
    push(top); top=4;
    top=(top + pop());
    Jetzt steht das Resultat 7 in top und man hat nur 3 push&pop gebraucht. (Da ich push(top) oft brauche gibt es die Abkürzung pushTop().)
    Jetzt zu deiner Frage:
    Irgendwas ist immer in top. Da aber getTimer2() keinen Parameter braucht kann der Inhalt von top nicht für getTimer2() bestimmt sein. Deshalb muß ich top sichern ( und zwar auf den Stack mittels pushTop() ) bevor top von 'Java_avr_tutorial_Interrupt1_getTimer2(env, obj)' überschrieben wird.

    8 ) Und ... ich muß dir widersprechen: HaikuVM ist unbedingt auch für die direkte Kommunikation mit der Hardware gedacht. Das was man in C sonst in Interrupt Routinen macht sollte man in HaikuVM mit parallelen Threads lösen. (Ähnlich wie die Propellerchips sehr gut ohne Interrupts aus kommen.)

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Ä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
  •  

LiFePO4 Speicher Test