Forum: Mikrocontroller und Digitale Elektronik Bekomme SPI im ATMega8 nicht zum Laufen


von Adrian E. (ahsd)


Angehängte Dateien:

Lesenswert?

Hi,

ich stehe gerade etwas auf dem Schlauch. Ich versuche seit Stunden den 
SPI im ATMega8 zum Laufen zu bekommen, aber der regt sich überhaupt 
nicht.

Ich habe den Code jetzt komplett aufs wesentliche runtergebrochen. Auf 
einem Pin sende ich zwischendurch ein paar Impulse, um zu sehen an 
welcher Stelle im Programm ich bin.

Nachdem ich den SPI aktiviert und konfiguriert habe, schreibe ich ein 
Byte in SPDR. Darauf hin müsste er doch anfangen zu senden, richtig?

Der Screenshot zeigt, dass das Programm durchlaufen wird, der SPI aber 
nichts tut.

Liebe Grüße,
Adrian.

edit: fast den Code vergessen...
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define SCK  PB5    //  CLK
5
#define MOSI  PB3    //  MOSI
6
#define DEBUG1  PC4    //   Pin für debug Impulse
7
8
9
void SPI_enable(void);
10
void debug(uint8_t);
11
12
int main(void)
13
{
14
  PORTC &= ~(1 << DEBUG1);    // Debug Port auf low und Ausgang
15
  DDRC |= (1 << DEBUG1);
16
  
17
  PORTB &= ~((1 << SCK) | (1 << MOSI));  // SCK / MOSI Ports auf low und Ausgang 
18
  DDRB |= (1 << SCK) | (1 << MOSI);
19
  
20
  debug(1);        // DEBUG Impuls 1
21
  
22
  PORTB |= (1 << SCK);      // Impuls zeigt, dass der SCK Ausgang funktioniert
23
  PORTB &= ~(1 << SCK);
24
  
25
  PORTB |= (1 << MOSI);      // Impuls zeigt, dass der MOSI Ausgang funktioniert
26
  PORTB &= ~(1 << MOSI);
27
  
28
  void SPI_enable(void);
29
  
30
  PORTB |= (1 << SCK);      // Impuls zeigt, dass der SCK Ausgang funktioniert
31
  PORTB &= ~(1 << SCK);
32
33
  SPDR = 0xFF;          // Jetzt müsste doch eine Clock zu sehen sein !?
34
  
35
  //while(!(SPSR & (1 << SPIF))){}  // Warten bis der Transfer abgeschlossen ist.
36
  
37
  debug(2);        // DEBUG Impuls 2
38
  
39
  return 0;
40
}
41
42
void SPI_enable(void)
43
{
44
  SPCR = 0b01110000;          // SPIE=0, SPE=1, DORD=1, MSTR=1, CPOL=0, CPHA=0, SPR1=0, SPR1=0
45
  SPSR &= ~(1 << SPI2X);      // SPI2X=0
46
  return;
47
}
48
49
50
void debug(uint8_t n)        // Sendet n kurze Debug-Impulse
51
{
52
  uint8_t x;
53
  for(x=1; x<=n; x++){
54
    
55
    PORTC |= (1 << DEBUG1);
56
    PORTC &= ~(1 << DEBUG1);
57
  }
58
  return;
59
}

von spess53 (Gast)


Lesenswert?

Hi

Setze mal das SS-Pin auf Ausgang.

MfG Spess

von Ulrich F. (Gast)


Lesenswert?

Adrian E. schrieb:
> void SPI_enable(void);
Mitten in Main eine Funktionsdekalration?
1. das kann nicht funktionieren.(zumindest nicht das tun was du 
erreichen möchtest)
2. Wieso schreit der Compiler nicht?

von Adrian E. (ahsd)


Lesenswert?

Ulrich F. schrieb:
> Adrian E. schrieb:
>> void SPI_enable(void);
> Mitten in Main eine Funktionsdekalration?
> 1. das kann nicht funktionieren.(zumindest nicht das tun was du
> erreichen möchtest)
> 2. Wieso schreit der Compiler nicht?

Uups, da war es wohl schon etwas spät.. Aber nein, der Compiler schreit 
nicht.
Leider kann ich das erst heute Abend wieder testen.

Aber klar, so wird SPI_enable() ja nie ausgeführt..

von Adrian E. (ahsd)


Lesenswert?

Ich konnte es eben simulieren. Ja, scheint zu funktionieren. Danke, da 
war wieder das Brett vorm Kopf...

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.