Forum: Mikrocontroller und Digitale Elektronik ATmega64: SPI nur bei jedem 2. RESET


von Stefan H. (shaun)


Lesenswert?

Hallo zusammen,
ich werde hier gerade zum Tier.
Ich habe auf einer Platine einen ATmega 64 sitzen (der über die 
USART0-Pins ge-ISPt wird, hier liegt der Hasenhund also nicht im Pfeffer 
begraben). Am SPI hängt über einen 5V-toleranten 3.3V-Bustreiber ein 
AD9959 (4-Kanal DDS) und ein DAC8551 (D/A-Wandler). Da das Ganze nur 
beschrieben und nicht gelesen wird, kann man eventuelle Empfangsprobleme 
als Grund meines Problems auch ausschliessen.

MOSI und SCK sind im DDR auf 1 gesetzt.
Initialisiert wird der SPI mit (C-Code):

SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);

und dann wird mit

SPDR = data;
while( !(SPSR & (1<<SPIF) ) );

gesendet.

Das PROBLEM: bei genau jedem 2. durch PonyProg ausgelösten RESET bleibt 
der AVR in der while()-Schleife hängen - dabei wird hier ja nur ein 
Statusbit abgefragt, welches durch die AVR-Hardware nach 8 SCK-Takten 
auf jeden Fall 1 werden müsste!
Wenn ich mit einem Taster "resette", bleibt er immer in der while() 
hängen, bei einem POR nie.
Wenn er irgendwo in meinem eigenen Konstrukt stehen bleiben würde, 
könnte ich ihn ja verstehen, aber wieso zum Geier an dieser Stelle?

Hat jemand eine Idee?

von Stefan H. (shaun)


Lesenswert?

Ich antworte mir gleich mal selbst, mitunter muss man ein Problem 
erstmal in Worte fassen.
Also: es war mal angedacht, einen 2. Master auf der Platine zu haben, 
daher ist \SS als input definiert gewesen. Die Leitung sollte eigentlich 
über einen 100k auf Vcc liegen. Sollte - denn nach dem Posting habe ich 
alles um den SPI nochmal gemessen und musste feststellen, dass dort so 
ca. 1,5V anlagen. Grund: ein Pad des 0603ers, der den \SS auf Vcc ziehen 
soll, war nicht mit Vcc verbunden! Ich habe ihn jetzt zum Ausgang 
gemacht und alles ist top.
Warum er allerdings bei jedem 2. Reset per Ponyprog trotzdem lief, warum 
er nach einem Kaltstart immer lief und wieso das Ding seit Wochen so 
läuft und erst jetzt Zicken macht - ???

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
Noch kein Account? Hier anmelden.