software shift auf I/O Pin

Gast #1290722
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!
#1290812
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
#1290902
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren