Hi Leute, bin ein Neuling, also bitte nicht steinigen wenn ich irgendwelche gravierende Fehler mache oder gemacht habe. Das Projekt was wir machen behinaltet eine Platine mit einem ATMega88, einem Flashspeicher (SPI), Beschleunigungssensor (SPI) und einem Drucksensor (TWI). Wir sind noch ziemlich am Anfang, also ist noch nicht viel da. Woran es hakt ist die Initialiserung des Flashs. Wir haben von unseren Projektbetreuern Bibliotheken bekommen für die Bauteile, daher dachten wir, das wird nicht sooo schwer. In der Initialiserungsfunktion für den Flash ist am Ende eine Funktion, welche das Status-Register komplett mit Nullen überschreiben soll. Sobald in dieser Funktion die Schleife:" while(!(SPSR & (1 << SPIF))); " kommt, springt er in die ISR des Timers und kommt da aber nicht mehr raus... leider seh ich nicht, woran das liegt ich glaube, ich habe alles nötige angehängt was man eventuell braucht geschrieben hab ich das noch in AVR Studio 4.iwas (18 oder 19) weiß nicht, wie ich hier als Gast ansehnlich Code einfügen kann ansonsten einfach sagen wenn noch was fehlen sollte oder so
Ja sorry, die erste rar-Datei nicht beachten, da hat das Datenblatt vom Flash gefehlt.
Vermutung, ohne das Programm angeschaut zu haben. Der SS Port des SPI Interfaces ist als Input deklariert oder sonst verwendet, sodass ein Low-Pegel das SPI Interface von Master auf Slave Modus umkonfiguriert. Deshalb wird das SPIF Flag nicht mehr gesetzt. SS Pin nicht verwenden, bzw. sicher auf 1 setzen, mit aktivem Pullup. Hatte einmal so einen Fehler.
:
Bearbeitet durch User
Variablen, auf die im Hauptcode und in der ISR zugegriffen wird, müssen als "volatile" deklariert werden.
@Klaus: oh mist, mir fällt erst jetzt auf, dass da wo die Ports für die Ausgänge definiert werden es so da steht:" DDRB = (1<<DDB3) | (1<<DDB5); //Setzt MOSI, SCK auf Ausgang DDRC = (1<<DDC1) | (1<<DDC0); //Setzt CS und WP auf Ausgang " das ist natürlich falsch und sollte so aussehen:" DDRB |= (1<<DDB3) | (1<<DDB5); //Setzt MOSI, SCK auf Ausgang DDRC |= (1<<DDC1) | (1<<DDC0); //Setzt CS und WP auf Ausgang " damit war also die Bibliothek falsch und ich Idiot habs nicht gesehen. wow, nicht mal das kann ich... @MWS: also die Variablen die wir in der ISR des Timers verwenden bleiben in der Klasse des Timers. müssen/sollten die da auch als volatile deklariert werden? weil der Timertest mit der LED hat damals funktioniert was aber wohl er Glück war, oder?
Neuling schrieb: > also die Variablen die wir in der ISR des Timers verwenden bleiben in > der Klasse des Timers. > müssen/sollten die da auch als volatile deklariert werden? > weil der Timertest mit der LED hat damals funktioniert > was aber wohl er Glück war, oder? Welcher "Klasse"? Lies Dich halt mal über volatile und Interrupts ein, auch hier im Forum zu finden.
Ich habe das zu den Volatiles gelesen. Aber entsprechend dem was da steht, muss man generell immer die Variablen die in der ISR vorkommen als "volatile" deklarieren, da man mit dieser Variable in der Regel nachher etwas anfangen will was außerhalb der ISR ist. Bzgl. Klasse ist das hier natürlich der falsche Begriff.
Ist doch hier ganz ordentlich erklärt: http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich Anonsten: probier's einfach aus.
Neuling schrieb: > das ist natürlich falsch und sollte so aussehen:" > DDRB |= (1<<DDB3) | (1<<DDB5); //Setzt MOSI, SCK auf Ausgang > DDRC |= (1<<DDC1) | (1<<DDC0); //Setzt CS und WP auf Ausgang Aber PB2 (mit der Funktion SS) scheint ein Eingang zu sein und das mag die SPI Schnittstelle nicht.
das heißt ich sollte genrell den Port PB2, welcher als SS definiert ist, vorsichtshalber auch schonmal auf Ausgang stellen, oder?
Ja sorry, ich sagte doch ich bin ein Neuling. Auf der anderen Seite mit etwas überlegen sollte das eigentlich klar sein...^^ Immerhin geht er den Programm-Code jetzt soweit durch. Dank euch schonmal :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.