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