Hi, Ich benutzte einen Bootloader um mein Programm in den ATmega8 zu flashen, bislang funktionierte das auch einwandfrei. Nun benutzte ich in meinem Programm welches ich per Bootloader flashe die Hardware SPI Schnittstelle des Atmega8. Nach dem Flashen sowie nach jedem reset des uC lässt sich einmal 1 Byte per SPI versenden, danach hängt sich der Controller bei !(SPSR & (1<<SPIF)) auf. Ich habe jetzt lange nach dem Fehler gesucht. Testweise hab ich einfach mal das Programm mit AVRdude ganz ohne Bootloader geflasht und siehe da die SPI Schnittstelle funktioniert einwandfrei. Die FUSE bit Einstellungen habe ich nicht verändert. Im Anhang sind 2 dumps vom Flash. Einmal mit bootloader geflasht und einmal mit AVRdude. Für mich sehen die geflashten Programme komplett gleich aus, also scheint der Bootloader korrekt zu funktionieren. Hat jemand eine Idee wo sonst noch der Fehler liegen könnte? MFG Jörn
1. diff sagt, dass die Dateien nicht gleich sind. 2. Beim flashen mit dem Bootloader ist SPI wahrscheinlich schon initialisiert. Danach muss der µC resetet werden. Der sicherste Weg dafür ist der watchdog.
Die Dateien können auch nicht vollständig gleich sein. Ich meinte das der Programmteil ab Adresse 0x0000 - 0x0220 gleich ist .... Ab Adresse 0x1800 steht der Bootloader. Dieser kann ja nicht vorhanden sein wenn ich mein Programm wie gewohnt mit AVRdude flashe. Im Bootloader wird kein SPI verwendet. Ich kann soviel Resetten und Spannung wegnehmen wie ich will.... Mit Bootloader funktioniert in meiner Firmware die ich mittels Bootloader reinschreibe SPI nicht richtig. Oder ist der Fehler mit der SPI Schnittstelle nur ein Anzeichen dafür, das noch was ganz anderes schief läuft? Ich hoffe hier kennt jemand das Problem und kann mir helfen Gruß Jörn
>Oder ist der Fehler mit der SPI Schnittstelle nur ein Anzeichen dafür, >das noch was ganz anderes schief läuft? kann schon sein. wie sieht der code zum initialisieren und zum senden/empfangen aus? nicht schlecht, 1300 bytes großer bootloader was ist denn das für ein protokoll - "stk500v2"?
Hi, als Bootloader kommt das Beispiel aus der Atmel AN AVR109 zum einsatz. die SPI funktionen werde ich gleich mal posten, wobei diese ja eigentlich fehlerfrei funktionieren. Das Problem tritt ja nur nach flashen mit Bootloader auf. Gruß Jörn
>als Bootloader kommt das Beispiel aus der Atmel AN AVR109 zum einsatz. ist das orginal wirklich so groß, beim mir hat der gerade mal 500bytes. >Das Problem tritt ja nur nach >flashen mit Bootloader auf. ist wirklich komisch, irgenwas stimmt da nicht.
Jörn schrieb: > Nach dem Flashen sowie nach jedem reset des uC lässt sich einmal 1 Byte > per SPI versenden, danach hängt sich der Controller bei > > !(SPSR & (1<<SPIF)) > > auf. Wenn man vergessen hat, den /SS auf Ausgang zu schalten. Peter
Hi, ich bin noch nicht viel weitergekommen... das Problem besteht nach wie vor. @Peter /SS ist auf Ausgang geschaltet. Bei direktem Flashen über ISP mit AVRdude tritt das Problem nicht auf, SPI funktioniert dann einwandfrei !! Also gehe ich davon aus, das mein Programm an sich ok ist. Hier trozdem nochmal der Code für die SPI schnittstelle:
1 | #define SPI_DR DDRB
|
2 | #define SPI_PIN PINB
|
3 | #define SPI_PORT PORTB
|
4 | |
5 | #define SPI_MOSI PB3
|
6 | #define SPI_MISO PB4
|
7 | #define SPI_SCK PB5
|
8 | |
9 | |
10 | /*
|
11 | * INIT the Hardware SPI interface
|
12 | */
|
13 | |
14 | void spi_init(void) |
15 | {
|
16 | SPI_DR |= (1<<SPI_MOSI); //set as output |
17 | SPI_DR |= (1<<SPI_SCK); //set as output |
18 | |
19 | SPI_DR &= ~(1<<SPI_MISO); //set as input |
20 | |
21 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1); //activate SPI, Master Mode, Fosc/64 |
22 | }
|
23 | |
24 | /*
|
25 | * send one byte
|
26 | */
|
27 | |
28 | void spi_send_byte(unsigned char data) |
29 | {
|
30 | SPDR = data; //Write data |
31 | while (!(SPSR & (1<<SPIF))); //Wait for data to be written |
32 | }
|
1 | #define RFM12_DR1 DDRB
|
2 | #define RFM12_PIN1 PINB
|
3 | #define RFM12_PORT1 PORTB
|
4 | |
5 | #define RFM12_DR2 DDRD
|
6 | #define RFM12_PIN2 PIND
|
7 | #define RFM12_PORT2 PORTD
|
8 | |
9 | |
10 | #define RFM12_NSEL PB2
|
11 | #define RFM12_NIRQ PD2
|
12 | |
13 | |
14 | void rfm12_init(void) |
15 | {
|
16 | RFM12_DR1 |= (1<<RFM12_NSEL); //set as output |
17 | RFM12_DR2 &= ~(1<<RFM12_NIRQ); //set as input |
18 | |
19 | RFM12_PORT1 |= (1<<RFM12_NSEL); //set select high |
20 | |
21 | }
|
Beide init routinen werden am Anfang der Main aufgerufen, SPI sollte also korrekt initialisiert werden. Gruß Jörn
Jörn schrieb: > Beide init routinen werden am Anfang der Main aufgerufen, Dann aber auch die mit dem Setzen des /SS als Ausgang zuerst? Peter
Peter Dannegger schrieb:
> Dann aber auch die mit dem Setzen des /SS als Ausgang zuerst?
Genau da lag der Fehler. Ich versteh zwar nicht warum dieser nur
auffällt wenn man per Bootloader flasht und sonst nicht, aber jetzt
funktioniert es einwandfrei.
Vielen Dank, da wäre ich nie drauf gekommen ;-)
Und hier nochmal der funktionierende Code:
1 | void spi_init(void) |
2 | {
|
3 | SPI_DR |= (1<<SPI_MOSI); //set as output |
4 | SPI_DR |= (1<<SPI_SCK); //set as output |
5 | SPI_DR |= (1<<SPI_SS); //set as output |
6 | |
7 | SPI_DR &= ~(1<<SPI_MISO); //set as input |
8 | |
9 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1); //activate SPI, Master Mode, Fosc/64 |
10 | }
|
Gruß Jörn
Jörn schrieb: > Genau da lag der Fehler. Ich versteh zwar nicht warum dieser nur > auffällt wenn man per Bootloader flasht und sonst nicht, Floatende Pins sind unberechenbar. Beim Einschalten ist er vielleicht high und über die Zeit des Bootloadens entlädt er sich auf low. Wenn Du dann zuerst das SPI als Master setzt, fällt das sofort in den Slavemode zurück, da der Pin noch ein Eingang ist. Peter
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.