Forum: Mikrocontroller und Digitale Elektronik Atmega8: Schieberegister in GCC C


von Johnny (Gast)


Lesenswert?

Hi,
ich versuche imom ein Assembler-Programm in C zu übersetzten, was mir 
bis jetzt allerdings nur bedingt gelungen ist. Es geht um 
Schieberegister, ich habe mich im orig. Assembler-Programm an das 
Tutorial hier gehalten:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Ansteuerung_per_SPI-Modul

Hier ist meine C - Version:
1
#include <avr/io.h>
2
#define RCK          PB2;
3
#define SCK          PB5;
4
#define SER          PB3;
5
6
7
void  out(uint8_t config)
8
{
9
  while(SPSR & (1<<SPIF)){}
10
  SPDR = config;
11
  while(SPSR & (1<<SPIF)){}
12
  PORTB &= ~(1<<2);
13
  PORTB |= (1<<2);
14
}
15
16
void  SPIInit()
17
{
18
  DDRB |= ((1<<3) | (1<<5) | (1<<2));
19
  SPCR = (1<<SPE) | (1<<MSTR);
20
  SPSR = (1<<SPI2X);
21
  SPDR = (1<<SPI2X);
22
}
23
24
int main(void)
25
{
26
  SPIInit();
27
  out(0b11000110);
28
    while(1)
29
    {
30
        //TODO:: Please write your application code 
31
    }
32
}
An dem Schieberegister sind LEDs angeschlossen, welche leuchten (sind 
intakt) sollten, es aber nicht tun. Kann mir jemand etwas auf die 
Sprünge helfen?

von Karl H. (kbuchegg)


Lesenswert?

Johnny schrieb:

>   while(SPSR & (1<<SPIF)){}


Die Sequenz
1
SchiebeOut:
2
    sbis  SPSR, SPIF            ; prüfe ob eine alte Übertragung beendet ist
3
    rjmp  SchiebeOut

kommt nur dann aus der Schleife raus, wenn das Bit gesetzt ist.
SBIS bedeutet 'Skip If Bit Is Set'
Skip bedeutet 'überspringe' und gemeint ist damit der nächste Befehl.

Der nächste Befehl, also der RJMP, wird übersrungen (also nicht 
ausgeführt), wenn das angegebene Bit gesetzt ist.
Effektiv macht diese Sequenz also:

  Solange das Bit NICHT gesetzt ist, wird immer weiter 'geschleift'. Der
    RJMP wird jedesmal ausgeführt und führt wieder zum SBIS zurück

  Erst dann, wenn das Bit gesetzt ist, wird die Schleife abgebrochen,
    weil dann der RJMP nicht ausgeführt wird.

Deine Schleife
1
  while(SPSR & (1<<SPIF)){}
macht genau das Gegenteil davon.

von Chris (Gast)


Lesenswert?

Du brauchst das Rad nicht neu erfinden.
http://www.mikrocontroller.net/articles/Porterweiterungen

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.