Atmega8: Schieberegister in GCC C

Gast #2851836
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?
#2851864
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.