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


von Stephan (Gast)


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?
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!

von Falk B. (falk)


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.
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

von ... .. (docean) Benutzerseite


Lesenswert?

da fehlt der Typ bei der Übergabe...

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

von Stefan E. (sternst)


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.

von Falk B. (falk)


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.
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

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.