www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bootloader--SPI Problem


Autor: Jörn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Anon Ymous (avion23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ←↓→ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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"?

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ←↓→ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... irgenwas stimmt da nicht ...

Einsame Klasse - diese Antwort.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
#define SPI_DR    DDRB
#define SPI_PIN    PINB
#define SPI_PORT  PORTB

#define SPI_MOSI  PB3
#define SPI_MISO  PB4
#define SPI_SCK    PB5


/*
 * INIT the Hardware SPI interface
 */

void spi_init(void)
{
  SPI_DR |= (1<<SPI_MOSI);          //set as output
  SPI_DR |= (1<<SPI_SCK);            //set as output

  SPI_DR &= ~(1<<SPI_MISO);          //set as input

  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);  //activate SPI, Master Mode, Fosc/64
}

/*
 * send one byte
 */

void spi_send_byte(unsigned char data)
{
  SPDR = data;                //Write data
  while (!(SPSR & (1<<SPIF)));        //Wait for data to be written
}


#define RFM12_DR1  DDRB
#define RFM12_PIN1  PINB
#define RFM12_PORT1  PORTB

#define RFM12_DR2  DDRD
#define RFM12_PIN2  PIND
#define RFM12_PORT2  PORTD


#define RFM12_NSEL  PB2
#define RFM12_NIRQ  PD2


void rfm12_init(void)
{
  RFM12_DR1 |= (1<<RFM12_NSEL);    //set as output
  RFM12_DR2 &= ~(1<<RFM12_NIRQ);    //set as input

  RFM12_PORT1 |= (1<<RFM12_NSEL);    //set select high

}


Beide init routinen werden am Anfang der Main aufgerufen, SPI sollte 
also korrekt initialisiert werden.

Gruß Jörn

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

void spi_init(void)
{
  SPI_DR |= (1<<SPI_MOSI);          //set as output
  SPI_DR |= (1<<SPI_SCK);            //set as output
  SPI_DR |= (1<<SPI_SS);            //set as output

  SPI_DR &= ~(1<<SPI_MISO);          //set as input

  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);  //activate SPI, Master Mode, Fosc/64
}


Gruß Jörn

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.