Hallo zusammen, ich habe gerade versucht eine Verbindung über SPI zwischen zwei Mikrocontrollern herzustellen. Dazu hab ich ein Programm aus der Codesammlung des Forums genommen. Der dort verwendete Controller war der Atmega8, ich benutze den Atmega48. Die Pinbelegungen der beiden Controller sind identisch, daran dürfte es also nicht liegen. Beide Controller besitzen einen Takt von 8MHz. Hab den Code mal angehängt. Woran kann es liegen?
Anscheinend bleibt das Programm beim Master in dieser Zeile hängen: while (!(SPSR & (1<<SPIF)));
Hallo Fred, das ist ja nur der Sourcecode eines Controllers. Ist der andere identisch. Mußt ja erst mal rausfinden, an welchem der beiden es liegt?
Hi Dirk, der Sourcecode für den Master befindet sich im ersten Post ganz oben, der Code des Slave in dem darunter.....
du hast den SPI-Interrupt aktiviert UND ein ISR, d.h. wenn das SPI fertig ist wird die ISR aufgerufen und damit automatisch das SPIF gelöscht!, klar, dass sich der µC aufhängt. (am besten den interrupt nicht aktivieren, wenn du den sowieso nicht brauchst, das Flag wird doch trotzdem gesetzt) wird der slave wirklich mit high-pegel am SlaveSelect pin angesprochen?
1 | PORTB &= ~_BV(PB0); <- das sollte so funktionieren |
ach ja um dich vor überraschungen zu schützen den slaveselect pin des Master auf output oder pullup aktivieren
Kein Problem, passiert....;-) Hast du ne Ahnung woran das liegen kann? Hab alle versucht, nur irgendwie haut das nicht hin.
Hi Jörg, >am besten den interrupt nicht aktivieren, wenn du den sowieso nicht >brauchst, das Flag wird doch trotzdem gesetzt Welchen? Den SPI? Aber der wird doch gar nicht aktiviert. Die Routine ist zwar drin, aber der Interrupt wird nirgens aktiviert. Sehe ich zumindest nicht ;-) Brauchen tu ich doch eigentlich nur den Timer-Interupt.....
Ok, hast recht, aber im Simulator läuft das Programm! - bis der Timer1 überläuft dauert es eben ziemlich lang - die SPI übertragung dauert auch min. 8*16Takte - laufen die µCs wirklich mit 8MHz? (Fuses bzw. CLKPR-Register korrekt?) (standard sind 1MHz, da dauert alles 8x so lang) - btw. die SIGNAL-Geschichten sind veraltet! und sorry nochmals
>>Brauchen tu ich doch eigentlich nur den Timer-Interupt.....
Genau und da steht ein "return" drin. Sollte das nicht ein "reti" sein ?
Oder Abfrage umstellen um das "return/reti" ganz zu vermeiden.
if (count == 1) {
master_transmit ('1');
count--;
}
else if (count == 0) {
master_transmit ('0');
count++;
}
Holger
@Holger:
>> Sollte das nicht ein "reti" sein ?
gibts nicht in C, wenn der Compiler die ISR als solche erkennt, wird da
schon korrekt "reti" benutzt, also: "return" ist schon richtig, man darf
natürlich keine Werte zurückgeben (irgendwie logisch, wohin auch?)
Also langsam verzweifel ich wirklich. Hab jetzt alles noch mal überprüft, aber keinen Fehler gefunden. Takt von 8MHz ist auf beiden Controllern eingestellt. Es scheint so, als bleibt der Controller beim Master an der Stelle while (!(SPSR & (1<<SPIF))); //Wait for Transmission Complete hängen. Ich weiß nur nicht warum. Keiner ne Idee?
Wenn du das Programm für einen ATMega 8 übersetzt hast und in den 48 brennst, dann könnte das dein Problem sein. Die Registeradressen sind beim 48 anders. Da müsste dann aber weit mehr schief laufen. Mehr fällt mir dazu nicht mehr ein. Ich probier das Master Proggi heute Abend mal auf einem 88 oder 168 aus.
Die einzige Registeradresse die anders war, war die des TIMSK-Registers. Das habe ich von TIMSK(Atmega8) in TIMSK1(Atmega48) umbenannt. Ansonsten waren die Registeradressen soweit gleich..... Oder ich hab was übersehen....
Woher weißt du, dass der Proz. da hängen bleibt? im Simulator funktioniert das Programm bei mir! (siehe posting oben v. 13:11h).
Ich hab's ;) Das Programm lief tatsächlich nicht. PB0 ist ja auch nicht SS beim ATMega48. Das ist PB2 ! Ich krieg jetzt schöne regelmäßige Clock Impulse auf SCK. Holger
Supi Holger, jetzt klappt es bei mir auch. Obwohl ich nicht ganz verstehe warum. SS ist beim Atmega8 auch nicht PB0 sondern auch PB2. dOb ich jetzt nen High- und Lowpegel mit PB0 oder PB2 erzeuge müsste doch eigentlich keinen Unterschied machen. Oder?
Du kannst PB0 für deine Zwecke nehmen. Der Trick ist allerdings das PB2 unbedingt ein Ausgang sein muss beim SPI Master. Ob du ihn benutzt oder nicht. Alte Macke beim ATMega SPI Modul.
>>wieso Macke? Auf Seite 126 ist beschrieben das der SS Pin im Mastermode >>auf High gehalten werden muß damit der SPI im Master läuft (Seite 126 >>atmega8.pdf) muss er nicht ;) Er muss nur als Eingang beim Mastermode auf High gehalten werden. Als Ausgang ist der Pegel egal. Ich nehm SS immer gleich als CS Pin für irgendein SPI Gerät. Als Eingang ist der ja schon fast nicht mehr zu gebrauchen. Jeder Low Pegel resettet den Mastermode und macht ihn zum Slave.
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.