www.mikrocontroller.net

Forum: Compiler & IDEs avr-gcc erzeugt unvollständigen Code


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

WinAVR 20060421
avr-gcc v4.1.1

CPU ist ATmega8, Makefile ist richtig.

Folgender Code:

[...]

int main(void)
{
  unsigned char i;
  
  // init ports   
  // PB3-MOSI output
  // PB4-FSYNC output
  // PB5-SCK  output 
  
  DDRB = (1<<DDB5)|(1<<DDB4)|(1<<DDB3);
  DDRD = 0xFF;
  PORTD = 0x00;
  
  // init SPI
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
  
  while(1)
    SPI_Send8(0b10101010);
  
  return 0;
}

Der avr-gcc erzeugt daraus folgenden Code:
int main(void)
{
 116:  88 e3         ldi  r24, 0x38  ; 56
 118:  87 bb         out  0x17, r24  ; 23
  unsigned char i;
  
  // init ports
  // PB3-MOSI output
  // PB4-FSYNC output
  // PB5-SCK  output 
  
  DDRB = (1<<DDB5)|(1<<DDB4)|(1<<DDB3);
  DDRD = 0xFF;
 11a:  8f ef         ldi  r24, 0xFF  ; 255
 11c:  81 bb         out  0x11, r24  ; 17
  PORTD = 0x00;
 11e:  12 ba         out  0x12, r1  ; 18
  
  // init SPI
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
 120:  82 e5         ldi  r24, 0x52  ; 82
 122:  8d b9         out  0x0d, r24  ; 13
 124:  8a ea         ldi  r24, 0xAA  ; 170
 126:  8f b9         out  0x0f, r24  ; 15
 128:  77 9b         sbis  0x0e, 7  ; 14
 12a:  fe cf         rjmp  .-4        ; 0x128 <main+0x12>
 12c:  fc cf         rjmp  .-8        ; 0x126 <main+0x10>

0000012e <_exit>:
 12e:  ff cf         rjmp  .-2        ; 0x12e <_exit>


Kann mir jemand sagen, warum für die Zeile
  DDRB = (1<<DDB5)|(1<<DDB4)|(1<<DDB3);

kein Code erzeugt wird? Ich versuche die ganze Zeit, SPI auf meinem
ATmega8 zum laufen zu bringen und wundere mich, warum es nicht geht.
Nun ist es mir klar, die DDR-Register sind nicht entsprechend gesetzt.
Ich habe mich schon gewundert, warum deSimulator von AVR Studio gleich
beim Programmstart zur Zeile "DDRD = 0xFF;" gesprungen ist.

Ich hoffe, jemand hat Rat.

Tobias

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann mir jemand sagen, warum für die Zeile
> DDRB = (1<<DDB5)|(1<<DDB4)|(1<<DDB3);
> kein Code erzeugt wird?

Schau mal ein bischen weiter oben:

 116:  88 e3         ldi  r24, 0x38  ; 56
 118:  87 bb         out  0x17, r24  ; 23

(1<<DDB5)|(1<<DDB4)|(1<<DDB3)
ergibt auffallend genau 0x38

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, ja du hast recht :(

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Fehler gefunden. Wenn man beim ATmega8 SPI als Master
benutzen will, muß /SS (PB2) als Ausgang konfiguriert sein. Und ich
dachte das wäre egal. grrr

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.