software shift auf I/O Pin

Gast #1290722
Hallo,

ich möchte bei einem ATmega8 den Inhalt einer Variable seriell auf einem
I/O Pin rausschiften. Die SPI ist ja schon belegt. Schreibe in C unter
AVR GCC, c programmierung ist aber noch relativ neu für mich.
Habe mehrere Möglichkeiten ausprobiert. Der Code unten funktioniert, 
aber ich frage mich ob es noch andere, kürzere Schreibweisen gibt??
Wie würdet ich ein shift auf ein I/O-Pin beschreiben?
1
unsigned int shift_out(unsigned int *PORT, unsigned int pin , unsigned int shift_reg, unsigned int *portclk, unsigned int clkpin)
2
{
3
  static int shift_cnt ;
4
 
5
 if ((shift_cnt < MAX_length-1) && (*portclk & (1 << clkpin)))
6
  { 
7
  if ( (shift_reg & (1 << shift_cnt)) )
8
     *PORT |=  (1 << pin) ; // wenn an der Stelle im shiftreg eine 1 dann pin setzen   
9
  else  
10
    *PORT &= ~(1 << pin) ; // wenn eine 0 dann pin auf nullsetzen
11
    
12
  shift_cnt++ ; //counter weiterzählen
13
  }
14
   
15
 if ((shift_cnt >= MAX_length-1) && (*portclk & (1 << clkpin)))
16
  {
17
   shift_cnt = 0 ;  
18
   return 0 ;
19
  }
20
 else
21
   return 1 ;  
22
}


Vielen Dank!

Gruß an alle!
#1290812
@  Stephan (Gast)

>Wie würdet ich ein shift auf ein I/O-Pin beschreiben?

Knackpunkt eines schnellen Schiebens ist, dass man NICHT mit einer 
variabeln Anzahl verschiebt, das dauert ziemlich lange. Besser ist eine 
konstante Maske und ein Verschieben der Daten. Hier mal vereinfacht mit 
festem Port dargestellt.
1
void shift8 (data) {
2
  uint8_t cnt;
3

4
  for(cnt=0; cnt<8; cnt++) {
5
    if (data & 0x80) {
6
      PORTA |= 0x20;    // Datenbit schreiben
7
    } else {
8
      PORTA &= ~0x20;
9
    }
10
    PORTA |= 0x30;      // Taktflanke
11
    PORTA &= ~0x30;
12
    data<<=1;
13
  }
14
}

MfG
Falk
#1290902
@  Stefan Ernst (sternst)

>Och, da sind noch mehr drin.
>Der Code verändert beim Takt-Pin-Toggeln auch den Data-Pin.

Kleiner Aufmerksamkeitstest ;-)

Jaja, war nur mal fix hingeschmiert.
1
void shift8 (uint8_t data) {
2
  uint8_t cnt;
3

4
  for(cnt=0; cnt<8; cnt++) {
5
    if (data & 0x80) {
6
      PORTA |= 0x20;    // Datenbit schreiben
7
    } else {
8
      PORTA &= ~0x20;
9
    }
10
    PORTA |= 0x40;      // Taktflanke
11
    PORTA &= ~0x40;
12
    data<<=1;
13
  }
14
}

MFG
Falk

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.