Hallo, ich habe ein - mir unerklärliches - Problem: Ich habe einen ATMega2560 Controller. An der SPI Schnittstelle hängen zwei AD-Wandler und eine SD-Karte. Ich hatte alles schon am Laufen, sprich Analogwerte auslesen, Gain- und Offsetwerte auf SD-Karte speichern. Jetzt habe ich eine neue Platine bekommen, bei der dieser Teil der Schaltung gleich geblieben ist und nun funktioniert nichts mehr, also zumindest nicht sofort! Wenn ich die Spannung auf mein Board gebe funktioniert alles außer die SPI-Schnittstelle (AD-Wandler auf 65535 und SD-Karte wird nicht gelesen). Wenn ich den Controller dann resete, dann startet er neu und alles funktioniert!?!?!?!? Hat schon jemand soetwas erlebt bzw. hat jemand einen Hinweis woran es liegen könnte? Softwarefehler schließe ich aus, da nach einem Reset ja alles funktioniert. Einen Hardwarefehler seh ich aber auch nicht, da nach einem Reset ja alles funktioniert.... Bin für jede Antwort dankbar! Gruß
Klingt mir danach, als ob die Peripherie beim Aufbauen der Versorgungsspannung mehr Zeit braucht, als deine Reset Routine ihnen zur Verfügung stellt. Evtl. sind die Fuses im Mega auf zu schnell gestellt? Ansonsten füg einfach noch eine kleine Warteschleife im Reset ein.
Danke für die schnelle Antwort. Also die Fuses im Mega sind wie folgt gesetzt: BODLEVEL = 4V3 OCDEN = [X] JTAGEN = [X] SPIEN = [X] WDTON = [ ] EESAVE = [ ] BOOTSZ = 2048W_1F800 BOOTRST = [X] CKDIV8 = [ ] CKOUT = [X] SUT_CKSEL = EXTXOSC_8MHZ_XX_16KCK_65MS EXTENDED = 0xFC (valid) HIGH = 0x1A (valid) LOW = 0xBF (valid) Ich betreibe den Mega mit einem externen 16MHz Quartz. Das ist ja die längste einstellbare Zeit über die Fuses... Die Idee mit der Warteschleife im Reset ist gut, nur wie realisier ich das?? Wo kann ich auf die Reset-Time zugreifen? Danke!
spien schrieb: > Die Idee mit der Warteschleife im Reset ist gut, nur wie realisier ich > das?? Wo kann ich auf die Reset-Time zugreifen?
1 | int main() { |
2 | _delay_ms(80Jahre); |
3 | ... weitermachen ... |
ok, das ist ein einfaches delay, das hätt ich auch noch hinbekommen.... Ich dachte es gibt noch eine Möglichkeit das "Anlaufen" des Controllers zu verzögern. Im Datenblatt gibt es eine Time-out period t(TOUT). Ich dachte es gibt vielleicht eine Möglichkeit über diese ein delay in den Reset zu geben...
spien schrieb: > Softwarefehler schließe ich aus Ich nicht. Es gibt einen SPI-Standardfehler: /SS wird zu spät auf Ausgang gesetzt und daher geht das SPI in den Slave-Mode. Peter
Danke Peter, aber auf das habe ich geachtet (glaube ich zumindest):
1 | int main(void) |
2 | {
|
3 | |
4 | //******** Port definitions
|
5 | DDRH |= (1 << PH4) | (1 << PH5); //Channel Select |
6 | PORTH |= (1 << PH4) | (1 << PH5); //No device selected |
7 | DDRH |= (1 << PH2) | (1 << PH3); //External ADC RESET Ports |
8 | PORTH |= (1 << PH2) | (1 << PH3); //External ADC RESET Ports |
9 | DDRB |= (1 << PINB2) | (1 << PINB1) | (1 << PINB0); //Set MOSI, SCK and /SS ouput (SPI-MODE) |
10 | DDRL |= (1 << PL4); //Output for PWM |
11 | |
12 | //******** UART init (PD2 -> RXD, PD3 -> TXD)
|
13 | UCSR1C |= (1<<UCSZ10) | (1<<UCSZ11); |
14 | UBRR1H = (BAUD_PRESCALE >> 8); |
15 | UBRR1L = BAUD_PRESCALE; |
16 | UCSR1B |= (1<<RXEN1) | (1<<TXEN1); |
17 | |
18 | //******** SPI init
|
19 | SPCR |= (1 << SPE) | (1 << MSTR) | (1 << CPOL); |
Ich tippe mittlerweile auch fast auf das Problem, das Matthias angesprochen hat.
Hallo, nachdem ich mich immer ärgere wenn ich einen Thread finde, der das gleiche Problem beinhaltet aber dann keine Lösung anbietet poste ich den gefundenen Fehler. Nachdem ich also einiges versucht habe, bin ich bei der SD-Karten Initialisierung hängen geblieben. Und tatsächlich, nach dem Power on brauchte die SD-Karte etwas länger auf meine Anfrage zu antworten, viel aus der Funktion mit einem Fehler raus (welchen ich noch nicht anzeigen ließ) und hat das /SS-Signal nicht wieder auf High gesetzt. Somit hatte ich immer zwei Zuhörer bzw. zwei Sprecher, die das MISO-Signal irgendwo floatend zwischen High und Low hielten. Somit muss ich Peter recht geben, es lag dann letztendlich doch am /SS Pin... Als Konzequenz habe ich gleich ein Fehler-Handling eingefügt... Danke (fast) allen für die hilfreichen Antworten! Gruß
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.