mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega128A Header-Datei


Autor: Martin Karl (karls-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe bei der Programmierung des ATmega128A mit WinAVR-20100110 
folgendes Problem. Hier ein einfaches Beispiel zur Verdeutlichung.

Folgender Quellcode funktioniert i.O.:
#include <avr/io.h>
//#include "spi.h"

void spi_init( void )
{
  DDRB = 0x01;
}

int main( void )
{
  spi_init();

  while ( 1 )
  {
    PORTB = 0x01;
    PORTB = 0x00;
  }

  return 0;
}

Lagere ich nun die spi_init-Funktion in eine eigenständige Quell-Datei 
aus und binde sie über eine Header-Datei ein, verändert sich das 
Hex-File und viel schlimmer Pin1 von PortB des ATmega128A bleibt stumm. 
Im Makefile ist alles vorhanden und auch beim Compilieren und Generieren 
des Hex-Files gibt es keine Probleme.

Die Header-Datei sieht recht simpel aus:
#ifndef _SPI_H__
  #define _SPI_H__

void spi_init( void ) ;

#endif

Hat vielleicht jemand eine Ahnung wo das Problem liegen könnte?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt kein Problem, weil du ja deiner Beschreibung nach alles richtig 
gemacht hast.
Daran habe ich natürlich keinen Zweifel, zumindest solange ich nichts 
gegenteiliges sehe.

Autor: Martin Karl (karls-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei weiteren Untersuchungen wird der Fehler immer interessanter, jedoch 
tappe ich noch immer im Dunkeln. Alles was ich sagen kann, es hat nichts 
mit der Header-Datei zu tun.

Füge ich der spi_init-Funktion den Befehl DDRB=0x01; erneut hinzu 
vergrößert sich der verwendete Programmspiecher (PMEM) um 4 Byte. Dieses 
Spiel kann ich eine bestimmte Anzahl wiederholen und der verwendete PMEM 
vergößert sich um jeweils 4 Byte. Alledrings beim sechsten hinzufügen 
des Befehls verringert sich der verwendete PMEM wieder um 4 Byte und 
Pin1 von PortB ist wieder stumm. Die Frage ist also was macht der 
Compiler und habe ich vielleicht doch irgendwo eine falsche Einstellung?

Die spi_init-Funktion sieht dann wie folgt aus:
void spi_init( void )
{
  DDRB = 0x01;
  DDRB = 0x01;
  DDRB = 0x01;
  DDRB = 0x01;
  DDRB = 0x01; // funzt
//  DDRB = 0x01; // funzt nicht
}

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Karl schrieb:
> habe ich vielleicht doch irgendwo eine falsche Einstellung?

Ja.

Die Einstellung ist falsch, daß ein paar Brocken Quelltext
reichen, die deinem Programm ähneln, um daraufhin die Lösung
zu bekommen.

Mit der Einstellung "ich liefere eine komplette Beschreibung
des Problems mit Quelltexten, die nicht irgendwie nur ähnlich
aussehen sowie meine Einstellungen beim Kompilieren und
was alles noch relevant ist" hat man bessere Chancen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die M103C Fuse geändert, um mit dem Atmega128A zu arbeiten?

Schau dir das Disassemblerlisting des ersten Programms an, ob spi_init() 
vom Compiler als inline Funktion übersetzt wurde.

Bei spi_init() im externen Sourcefile kann der Compiler die Funktion in 
nicht inline machen. Bei gesetzter M103C Fuse (Werkseinstellung) stürzt 
das Programm aber beim Verlassen des spi_init() ab, weil der Stack vom 
WinAVR her für den Atmega128 initialisiert ist, physikalisch aber auf 
einem pseudo-Atmega103 läuft.

Autor: Martin Karl (karls-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ihr Beiden!

Vielen Dank für die schnelle Hilfe. Der Fehler war tatsächlich die 
falsch gesetzte M103C Fuse. Mir war nicht bewusst, dass es beim 
ATmega128A solch einen Modus gibt. Tschuldigung falls ich Euch auf die 
falsche Fährte gelockt und dadurch unötige Mühen verursacht habe.

gruss

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.