PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nur eine I2C Anfrage?



franzlst
16.02.2007, 20:47
Moin,

ich habe am RN-Mega128Funk das RN-KeyLCD angeschlossen (als einziges Modul an den I2C Ausgängen).
Bereits vor ein paar Wochen habe ich Funktionen zur Ansteuerung geschrieben. Als I2C Bibliothek nutze ich diese: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

Meine Funktionen haben auch die ganze Zeit funktioniert, jetzt passt aber etwas nicht mehr, obwohl ich keine Änderung vorgenommen habe. Und zwar kann ich die Kommunikation starten (i2c_start(...)), dann zB Zeichen übermitteln (beliebig viele, i2c_write(...)) und die Kommunikation auch wieder beenden (it2_stop()), was auch wunderbar funktioniert. Nur ein neues Starten der Kommunikation (zB durch Aufruf der geanau gleichen Funktion) geht nicht mehr, an der Anzeige tut sich nichts.

Folgender Quelltext:

Programm:

#include "funktionen.c"


int main()
{
wait(1500);

i2c_init();

display_print_char('a');
display_print_char('b');
}
Ausschnitt aus funktionen.c:

void display_print_char(uint8_t zeichen)
{
i2c_start(DISPLAY + I2C_WRITE);
i2c_write(zeichen);
i2c_stop();
}

Es kommt nur zur Ausgabe 'a', das 'b' wird nicht mehr gezeigt.

Das ganze hat wie gesagt bereits funktioniert, jetzt aber nicht mehr. Weiß jemand Rat?

Danke

franzlst
18.02.2007, 20:49
Ich habe jetzt noch etwas rumexperimentiert. Anscheinend liegt es an der i2c_stop() Funktionen dass Befehle, die nach der Print-Funktion kommen, nicht ausgeführt werden.

i2c_stop():

/************************************************** ***********************
Terminates the data transfer and releases the I2C bus
************************************************** ***********************/
void i2c_stop(void)
{
/* send stop condition */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);

// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));

}/* i2c_stop */
Also wird die "stop condition" irgendwie nicht ausgeführt.

Jemand ne Ahnung, an was das liegen kann? Liegt es am RN-KeyLCD?

Ich wäre über ne Hilfe echt froh

Danke und Helau ^^

franzlst
21.02.2007, 01:06
Das Problem hat sich inzwischen als noch verzwickter herausgestellt, da es nicht mal mehr reproduzierbar ist.
Der µC hat ja 2 direkt parallel geschaltete I2C Ausgänge. An dem einen hängt das Display, an dem anderen 4 US-Sensoren (SRF02) und ein Kompass (CMPS03).

Zum Testen führe ich nun folgende Befehle aus:


mot_a_links(MAX_SPEED);
display_print_char('a');
display_print_char('b');
mot_b_rechts(MAX_SPEED);

Die Motorfunktionen dienen nur der optischen Kontrolle.

Was beim Starten (Strom an) passiert scheint nun vom Zufall abzuhängen:
Manchmal bleibt der LCD beim Robotikhardware-Startbildschirm hängen, manchmal wird 'a' angezeigt. Motor A dreht sich immer. Eine weitere Zufallskomponente kommt dazu, wenn ich die Strippe mit den Sensoren wiederholz aus- und einstecke. Manchmal passiert dadurch gar nichts, manchmal wird die Anzeige gelöscht, manchmal erscheint dann statt dem Startbildschirm das 'a', manchmal kommt das 'b' hinzu und Motor B geht noch an, manchmal kommen gleich beide Buchstaben und beide Motoren springen an. Was ich noch festgestellt habe, ist dass wenn die Sensoren von Anfang an drangesteckt sind immer nur der Startbildschirm erscheint und kein 'a'.
Anscheinend hängt es davon ab, wie ich das Kabel der Sensoren ziehe.

Ich bin hier echt fast am Verzweifeln, weil ich seit Stunden nicht weiterkomme. Und ich hasse den Zufall bei der Programmierung...

Hat vllt jetzt einer eine Idee?

Danke