www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik software shift auf I/O Pin


Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?
unsigned int shift_out(unsigned int *PORT, unsigned int pin , unsigned int shift_reg, unsigned int *portclk, unsigned int clkpin)
{
  static int shift_cnt ;
 
 if ((shift_cnt < MAX_length-1) && (*portclk & (1 << clkpin)))
  { 
  if ( (shift_reg & (1 << shift_cnt)) )
     *PORT |=  (1 << pin) ; // wenn an der Stelle im shiftreg eine 1 dann pin setzen   
  else  
    *PORT &= ~(1 << pin) ; // wenn eine 0 dann pin auf nullsetzen
    
  shift_cnt++ ; //counter weiterzählen
  }
   
 if ((shift_cnt >= MAX_length-1) && (*portclk & (1 << clkpin)))
  {
   shift_cnt = 0 ;  
   return 0 ;
  }
 else
   return 1 ;  
}



Vielen Dank!

Gruß an alle!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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.

void shift8 (data) {
  uint8_t cnt;

  for(cnt=0; cnt<8; cnt++) {
    if (data & 0x80) {
      PORTA |= 0x20;    // Datenbit schreiben
    } else {
      PORTA &= ~0x20;
    }
    PORTA |= 0x30;      // Taktflanke
    PORTA &= ~0x30;
    data<<=1;
  }
}

MfG
Falk

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da fehlt der Typ bei der Übergabe...

g *freut sich bei Falk ein Fehler gefunden zu haben*

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ... schrieb:

> g *freut sich bei Falk ein Fehler gefunden zu haben*

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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.
void shift8 (uint8_t data) {
  uint8_t cnt;

  for(cnt=0; cnt<8; cnt++) {
    if (data & 0x80) {
      PORTA |= 0x20;    // Datenbit schreiben
    } else {
      PORTA &= ~0x20;
    }
    PORTA |= 0x40;      // Taktflanke
    PORTA &= ~0x40;
    data<<=1;
  }
}

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.