Es kann daran liegen, dass die Bewegung noch andauert, während deine main mit deinem Gsamtprogramm schon abbricht.
Mach mal eine Endlosschleife vor return.
Du must auch auf den INT0 reagieren: Siehe task_checkINT0();
Es kann daran liegen, dass die Bewegung noch andauert, während deine main mit deinem Gsamtprogramm schon abbricht.
Mach mal eine Endlosschleife vor return.
Du must auch auf den INT0 reagieren: Siehe task_checkINT0();
Gruß
Dirk
Also die Endlosschleife alleine reicht noch nicht..
Das mit dem tast_checkINT0() hab ich so verstanden:
Jedes mal wenn die Base die INT0-Leitung auf high setzt, möchte die dass der Master die ersten 3 Register (I2C_REG_STATUS1, I2C_REG_STATUS2, I2C_REG_MOTION_STATUS) ausliest?
Ist das richtig?
Und ist die INT0-Leitung mit Open-Collector-Ausgängen mit Pullups realisiert? (Damit jeder einen Interrupt auslösen kann. Währe wichtig zu wissen für den Pegelwandler)
Viele Grüße
-schumi-
Nein, das ist ein normaler Portpin mit einem 10 kOhm PULLDOWN.
Gruß
Dirk
Und wenn jetzt die M32 einen Interrupt auslösen möchte? Gibts nen Datencrash und die Base bekommts nicht mit?!
Oder wird der Pin entweder auf Eingang (mit Pulldown = low) oder Ausgang high und niemals Ausgang low geschalten?
Hardware:
Am XBUS (Pin 8 ) werden im ganzen RP6-System je ein Portpin der Platinen zusammen geführt:
Base -> PA4
M32 -> PD2
M128 -> PE5
D.h.: Natürlich kann es da zu Konflikten kommen.
Software:
Ein System (Base, M32 oder M128 ) kann nur als Ausgang den IRQ auslösen, die anderen Systeme müssen den Portpin auf Eingang schalten. Das System, was einen IRQ auslöst, ist ein I2C-Slave, denn der will ja dem Master sagen, dass Daten anliegen. Dazu zieht er den XBUS Pin 8 auf Highpegel. Im RP6Base-Slave-Programm passiert das in der Funktion signalInterrupt() und darin mit dem Makro extIntON. Umgekehrt wird der Interrupt gelöscht mit clearInterrupt() bzw. dem Makro extIntOFF.
Die Makros schalten einfach PA4.
Die M32 (oder deine Platine) als Master bekommt das Signal über einen Eingangspin und muss dann darauf reagieren (z.B. über den I2C-Bus Daten übernehmen...).
Geändert von Dirk (16.06.2012 um 20:50 Uhr)
Gruß
Dirk
Der Hinweis wo ich das finde ist schon mal super - vielen herzlichen Dank dafür
D.h.Code:/*****************************************************************************/ // External Interrupt Output // Can be used to notify Master Controllers // about events when operating in Slave Mode. /** * Set external interrupt to high level */ void extIntON(void) { DDRA |= E_INT1; PORTA |= E_INT1; } /** * Set external interrupt to low level */ void extIntOFF(void) { PORTA &= ~E_INT1; DDRA &= ~E_INT1; }
ON = Ausgang + high
OFF = Eingang + Kein Pullup
-> Kein Konflikt möglich
Wobei ich mich schon frage, ob es bein ON nicht besser währe erst auf High zu schalten und dann auf Ausgang und bei OFF erst auf Eingang und dann PullupAus. Sonst kann ja für einen sehr kurzen Augenblick doch eine "hartes" low an der Interrupt-Leitung geben.
So, jetzt muss ich erst mal überlegen wie ich das mit der Pegelwandlung mache... Vielleicht kann man das I2C-Prinzip ja umstülpen.
Viele Grüße
-schumi-
Haben die GPIOs des Raspberry denn andere Pegel als +5V/Gnd?So, jetzt muss ich erst mal überlegen wie ich das mit der Pegelwandlung mache...
Oder warum braucht es eine Pegelanpassung?
Gruß
Dirk
Lesezeichen