Forum: Mikrocontroller und Digitale Elektronik SPI und ATmega128


von Stefanie (Gast)


Lesenswert?

Hallo,
ich bin gerade nach dem Datenblatt des Atmega128 vorgegangen und wollte
die SPI initialisieren. Aber es funktioniert nichts so. Hat wer von euch
schon mal eine Erfahrung gemacht?

Ach ja, was ist der Unterschied zwischen (1<<PD6)  und _BV(PD6)
was ist besser und kann alle beiden Versionen der AVR-Compiler?

von Jan M. (mueschel)


Lesenswert?

Da solltest du uns mal deinen Quellcode zeigen, dann kann dir auch
jemand sagen, was du falsch machst.

(1<<PD6) und _BV(PD6) sind identisch. Irgendwo wirst du ein
#define _BV(x) (1<<(x))
finden. Ob das dein spezieller AVR-Compiler kann -> Keine Ahnung,
avr-gcc und Konsorten kennen es jedenfalls.

von Stefanie (Gast)


Lesenswert?

Hallo,
ich möchte z.B. dass an der SPI die Zahlenreihe 0x10, 0x78, 0x00, 0x10,
0xF8, 0x00 herausgeschickt wird. Ich habe es mal in der Main-Schleife so
versucht zu programmieren:

  /* Set MOSI(PB2), SCK(PB1) and SS(PB0) to output,
   * all others are input */
  DDRB = (1<<DDB2) | (1<<DDB1) | (1<<DDB0);

  /* Activate pull-up resistors for all outputs not for inputs

        ??Muß ich die aktivieren?*/
  //PORTB &= ~(_BV(PB3));
  //PORTB =  _BV(PB2) | _BV(PB1) | _BV(PB0);

  /* no SPI interrupt, SPI as master, MSB first, fck/16 */
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);


  SPDR = 1;
  while (!(SPSR & (1<<SPIF)))
  ;
  printf("Daten %02x - %u  ", SPDR, SPDR);

  SPDR = 0;
  while (!(SPSR & (1<<SPIF)))
  ;
  printf("Daten %02x - %u  ", SPDR, SPDR);

  SPDR = 7;
  while (!(SPSR & (1<<SPIF)))
  ;
  printf("Daten %02x - %u  ", SPDR, SPDR);

  SPDR = 8;
  while (!(SPSR & (1<<SPIF)))
  ;
  printf("Daten %02x - %u  ", SPDR, SPDR);

  SPDR = 0;
  while (!(SPSR & (1<<SPIF)))
  ;
  printf("Daten %02x - %u  ", SPDR, SPDR);

  SPDR = 0;
  while (!(SPSR & (1<<SPIF)))
  ;
  printf("Daten %02x - %u  ", SPDR, SPDR);


Als Ausgabe erhalte ich über die UART:
UART TEST
 Daten 00 - 0  Daten 00 - 0  Daten 00 - 0  Daten 00 - 0  Daten 00 - 0
Daten 00- 0


Was hat das zu bedeuten?? Ich versteh auch nicht, steht in SPDR nun das
drin was ich versende oder dass, was ich vom anderen Baustein gesendet
bekomme?

von Jan M. (Gast)


Lesenswert?

So wie du es beschreibst, stimmt das Verhalten des Programms.
SPDR dient sowohl für die gesendeten als auch für die empfangenen
Daten. Schreibst du etwas in dieses Register, wird es gesendet. Nach
dem Senden enthält SPDR dann die Daten, die empfangen wurden. Da nichts
empfangen wird, ist die Ausgabe verständlicherweise 0.
(Wann genau der hineingeschriebene Wert aus dem SPDR gelöscht wird,
kann ich dir aus dem Kopf nicht sagen, das findest du aber auch im
Datenblatt)

> /* Activate pull-up resistors for all outputs not for inputs

>    ??Muß ich die aktivieren?*/

Ich weiß nicht, wo du diese Zeile her hast, so wie es da steht, stimmt
es nicht. pull-ups gibt es nur bei inputs. Diese ziehen den Eingang auf
ein definiertes high-level, auch wenn kein Signal anliegt. Bei outputs
braucht man keine pullups (bzw. nennt es nicht so), da man einen
Ausgang ja aus dem Programm heraus mit high- oder low-level belegt.

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
Noch kein Account? Hier anmelden.