Forum: Mikrocontroller und Digitale Elektronik MOSI bei ATmega16 gibt keine Daten raus


von Albert .. (albert-k)


Lesenswert?

Hallo zusammen
Ich habe das Problem das bei meinem ATmega16 keine Daten am MOSI Pin 
(SPI) rauskommen. DAs Clocksignal und das Chipselect hingegen werden 
sauber geschaltet.
Ich programmiere über einen ISP programmer welcher während dem Betrieb 
angeschlossen bleibt. Könnte das ein Problem darstellen? Ich habe auch 
schon den Pin abgetrennt, aber keine Verbesserung erfahren.

Meine Initialisierung sieht wie folgt aus:
1
void gvSPIConfig(void){
2
  //Configure IO Pins
3
  DDRB |= (1<<PB4) | (1<PB5) | (1<<PB7);  //Set MOSI, SCK and SS to Output
4
  DDRB &= ~(1<<PB6);            //Set MISO to Input
5
  PORTB |= (1<<PB6);            //Enable Pull-up on MISO
6
  PORTB |= (1<<PB4);            //Set SS High
7
8
  //Configure Data Order
9
  SPCR |= 0x00;
10
11
  //Configure Master or Slave
12
  SPCR |= 0x10;
13
14
  //Configure Transfer Mode
15
  SPCR |= 0x00;
16
17
  //Configure Clock Rate
18
  SPCR |= 0x02;
19
}
Das versenden läuft wie folgt ab
1
void gvSPIWrite(uint8_t u8Data){
2
  PORTB &= ~(1<<PB4);  //Set SS low
3
  SPDR = u8Data;
4
  while(!(SPSR & (1<<SPIF)));  //wait till transmission complete
5
  PORTB |= (1<<PB4);  //Set SS High
6
}
Aber am MISO Pin kommen keine Daten raus. Er scheint sie aber 
herauszushiften. Zumindest kann er die gvSPIWrite Funktion erfolgreich 
beenden und die weiteren Aufgaben im Code werden auch ohne weiteres 
abgearbeitet. Auch am Oszi sehe ich immer wieder den wechselnden SS 
Pegel und das Clock Signal.

von slw (Gast)


Lesenswert?

Schluss gegen GND oder pin nicht richtig dran

von Albert .. (albert-k)


Lesenswert?

Kurzschluss gegen Ground ist es nicht. Und gemessen habe ich direkt am 
Pin des uC. Ich habe mal auf einen defekt geschlossen und ihn 
ausgetauscht, dort genau dasselbe verhalten.

von Michael H. (michael_h45)


Lesenswert?

Siehst du was am Clock?

von Albert .. (albert-k)


Lesenswert?

Ja, das Clock Signal kommt raus. Auch mit der richtigen Frequenz und dem 
richtigen Timing.

von slw (Gast)


Lesenswert?

ich sehe nicht, dass Du SPI enabled hast?

Set SCPR.6 oder so ähnlich

von Michael H. (michael_h45)


Lesenswert?

DDRB |= (1<<PB4) | (1<PB5) | (1<<PB7);  //Set MOSI, SCK and SS to Output
                     ^

von slw (Gast)


Lesenswert?

SPCR gemeint natürlich

von Albert .. (albert-k)


Lesenswert?

Michael H. schrieb:
> DDRB |= (1<<PB4) | (1<PB5) | (1<<PB7);  //Set MOSI, SCK and SS to Output
>                      ^

AAAAAAAAHHHHHHHHHHHH...ich dreh am Schnitzel....verdammte Tastatur die 
hängt. Morgen wird sie Sauber gemacht. Vielen Dank!

slw schrieb:
> ich sehe nicht, dass Du SPI enabled hast?
>
> Set SCPR.6 oder so ähnlich

Das habe ich im main Programm gemacht, sonst würde ich ja auch kein 
Clock Signal bekommen.

von slw (Gast)


Lesenswert?

ist MOSI offen? oder hängt was auf der anderen Seite?

von Albert .. (albert-k)


Lesenswert?

slw schrieb:
> ist MOSI offen? oder hängt was auf der anderen Seite?

Es war das fehlende "<" beim setzen des Data Direction Registers. Siehe 
Post von Michael H.

von Düsendieb (Gast)


Lesenswert?

Hallo, habe auch eine Frage zu dem Programm:

wieso wird vor dem Senden ss auf low gesetzt?
"PORTB &= ~(1<<PB4);  //Set SS low"

Das sollte doch Slave select bei low sein.



Axel

von Floh (Gast)


Lesenswert?

Düsendieb schrieb:
> wieso wird vor dem Senden ss auf low gesetzt?

Daran ist der Slaveselect des Slaves angeschlossen.

> "PORTB &= ~(1<<PB4);  //Set SS low"
>
> Das sollte doch Slave select bei low sein.

Solange SS als Ausgang definiert ist, wird der mega16 nicht in den 
Slavemodus wechseln, falls du das meinst.
:-)

von Düsendieb (Gast)


Lesenswert?

Floh schrieb:
> Solange SS als Ausgang definiert ist, wird der mega16 nicht in den
>
> Slavemodus wechseln, falls du das meinst.

genau das meinte ich. Danke

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.