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