Hi *, ich bin langsam am verzweifeln, mein SPI am mega64 will keine Bits ausspucken (SCK/MOSI kein signal am Ozsi). PORTB ist komplett als Out konfiguriert, mein SPCR=0x0b01011000, SPSR=0x00. Ich kann in SPDR genau ein Byte reinschreiben, dann geht er nach "while(!(SPSR & 0b1000000))" eins weiter, aber danach will SPIF nicht mehr auf eins gehen und das Programm bleibt hängen. Die SPI Fuse ist auf enabled gesetzt, sonst könnte ich ja nix reinladen. Aber ich hab nirgendwo gesehen, dass ich mit der Fuse enabled das SPI im regulären Betrieb nicht benutzen kann... Gibts da sonst noch Fallstricke? Danke
Du hast natürlich recht :) ist schon spät.... here comes:
1 | #include <mega64.h> |
2 | #include <delay.h> |
3 | |
4 | void main(void) { |
5 | PORTA=0x00; //DEBUG LEDS |
6 | DDRA=0xFF; |
7 | |
8 | PORTB=0x00; //SPI PORT |
9 | DDRB=0xFF; |
10 | |
11 | TIMSK=0x00; |
12 | ETIMSK=0x00; |
13 | |
14 | SPCR=0x0b01011000; |
15 | SPSR=0x00; |
16 | |
17 | while (1) { |
18 | PORTA = 0xFF; //LEDs aus |
19 | SPDR = 0x40; |
20 | while(!(SPSR & (1<<8))) {} |
21 | PORTA.0 = 0; //1. LED an |
22 | delay_ms(1000); |
23 | SPDR = 0xA1; |
24 | while(!(SPSR & (1<<8))) {} |
25 | PORTA.1 = 0; //2. LED an |
26 | delay_ms(1000); |
27 | };
|
28 | }
|
ich messe hier mir dem oszi an SCK und MOSI, aber da rührt sich (außer beim Programmieren) nichts. Wohl aber ändert SCK die Ruhepolarität, wenn ich die Polarität im SPCR ändere. Er kommt aus der ersten While Warte Schleife nicht raus, und ich kann mir nicht erklären, weshalb. Quarz ist 16MHz, Compiler ist CodeVision, neueste Version. Hab ich etwas übersehen? Danke.
>MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK.
Bei MasterMode ist kann und sollte der als Ausgang geschaltet sein.
ich vermute folgendes:
1 | while (1) |
2 | {
|
3 | SPDR = 0x40; |
4 | while(!(SPSR & (1<<8))); |
5 | |
6 | delay_ms(1000); |
7 | |
8 | SPDR = 0xA1; |
9 | while(!(SPSR & (1<<8))); |
10 | delay_ms(1000); |
11 | }
|
lt deinen Einstelungen sendest du mit clk/4. ergibt bei 16MHz eine Sendedauer von 2µsek! Und das wird alle 1'000'000µsek gesendet! Das ist ohne geeignete Triggerung nicht "zu finden". Vorschlag: Lass mal beide Delays weg, somit müsste der einfach die zwei Bytes rausblasen. Fehler im Code finde ich nicht. Mal abgesehen, dass man einiges schöner schreiben kann:
1 | while(!(SPSR & (1<<SPIF))); |
2 | ...
|
> Das ist ohne geeignete Triggerung nicht "zu finden".
hab ein tds 2014, das findet alles =)
Egal, hier war der Fehler:
1 | while(!(SPSR & (1<<SPIF))); |
kennt codevision nicht.
1 | while(!(SPSR & (1<<8))); |
verursachte einen deadlock
1 | while(!(SPSR & 0b1000000)); |
tut jetzt und mit timebase 1us schön sichtbar :) Danke euch und gn8
>>MISO darf nicht als Ausgang gesetzt werden, nur SS, MOSI und SCK. >Bei MasterMode ist kann und sollte der als Ausgang geschaltet sein. Hm, du meinst wohl eher Eingang, wenn wir von MISO im Mastermode sprechen ? Wie auch immer, im Datenblatt heist es dass MISO sowieso fest auf Eingang geschaltet wird wenn der SPI Mastermode aktiviert wird. Der Rest (MOSI, SCK und SS) sind "user defined" und sollten auf Ausgang geschaltet werden, was er auch schön getan hat. >ich messe hier mir dem oszi Da würde ich mich mal Matthias anschließen. Dieser Peak-Tech Logic-Probe (früher sagte man da mal Logiktester) tut für sowas hervorragende Dienste, weil du damit auch sehr kurze Impulse sichtbar machen kannst.
Tja, mein Betrag war ein paar Sekunden zu spät um sinnvoll zu sein :-)
1 | while(!(SPSR & (1<<8))); |
Hoppla, da fällt es mir wie Schuppen von den Haaren. 1<<8 ist das neunte Bit, aber SPSR hat nur 8 :-) Das hier sollte es dann tun:
1 | while(!(SPSR & (1<<7))); |
Christoph Söllner wrote: > ich messe hier mir dem oszi an SCK und MOSI, aber da rührt sich (außer > beim Programmieren) nichts. Wieso ändert sich beim Programmieren was an MOSI? Du hast doch nicht etwa den ISP-Anschluss an MOSI und MISO angeschlossen? Wenn dem so wäre, dürftest Du den µC allerdings überhaupt nicht programmieren können.
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.