www.mikrocontroller.net

Forum: Compiler & IDEs Code fuer effiziente Schieberegisteransteuerung


Autor: sammy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich habe zwei 74HC164 Schieberegister (Serial In, Parallel Out) an
einem 2313 haengen.
Ich komme mit der effizienten Ansteuerung allerdings nicht so ganz
klar, das braucht alles zu viele Programmzeilen.
Ich braeuchte eine Moeglichkeit es moeglichst effizient anzusteuern,
wenn ich z.B. die Bitfolge 101010101 am Ausgang haben moechte, oder
weiss, das z.B. die ersten 4 oder letzten 4 Ausgaenge des
Schieberegisters eine 1 haben sollen....

Habt ihr da so was auf Anhieb parat?

Autor: Sebastian__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kopiere doch dein Datenbyte in ein Register, zb r16, jetzt kannst du mit
jedem Clock impuls den du erzeugst das register mit lsr nach rechts
schieben, nach jedem shift fragst du dann das bit 0 von r16 mit (sbrs
r16,0) ab und gibst endweder ein low oder ein high auf den IO port.
nach 8 mal shiften bist du feritg.


MfG
Sebastian

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um sagen zu können, was an Deinem Code nicht effizient ist, müßtest Du
ihn doch erstmal hier rein stellen (als Dateianhang).

Oder hast du etwa gar keinen und willst nur das fertige Programm.


Peter

Autor: sammy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code habe ich schon, halt auf meine typische "fuer den PC schnell
zusammengebastelt Art" programmiert....


/*
;  PB0 : Schiebe1 RESET
;  PB1 : Schiebe1 CLOCK
;  PB2 : Schiebe1 DATA
;  PB3 : LED TOO HIGH Max
;  PB4 : LED TOO LOW Max
*/

static void led_schiebe_hochzaehlen(void)
{
    sbi(PORTB,1);// Schieberegister hochzaehlen
    cbi(PORTB,1);
    cbi(PORTB,0);
}


/*
static void led_ansteuerung(unsigned short int amount) // 10 LEDs
ansteuern
{
  sbi(PORTB,0); //Schieberegister resetten
  cbi(PORTB,0);
    if (amount<6) // TOO HIGH LEDS
    {
      if (amount==5)
      {
        sbi(PORTB,3);
      }else{cbi(PORTB,3);}
      if (amount>=4)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount>=3)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount>=2)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount>=1)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
    }
    else if (amount>5) //TOO LOW LEDS
    {
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
      led_schiebe_hochzaehlen();
      if (amount>=6)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount>=7)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount>=8)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount>=9)
      {
        sbi(PORTB,1);
      }
      led_schiebe_hochzaehlen();
      if (amount==10)
      {
        sbi(PORTB,4);
      }else{cbi(PORTB,4);}
    }
}

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So richtig kann ich nicht erkennen, was Dein Code machen soll.


Anbei eine Routine zum Ausgeben eines Bytes.
Für 2* 74HC164 hintereinander must Du 2 Bytes raussschieben, d.h. diese
Routine 2* aufrufen.

Resetten brauchst Du nicht, nach 16 Takten sind doch eh alle alten Bits
rausgeschoben.

Sieht so aus, als ob Du mit PB3 und PB4 noch ein extra Latch
ansteuerst. Dann nimm doch besser gleich den 74HC595.
Auch reicht ein Latchsignal aus, um alle 16 Bits gleichzeitig zu
übernehmen.


Peter

Autor: Minos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also laut doc unter den faqs soll man das so machen:

PORTB &= (unsigned char)~(1<<DMOSI);

da der operand ~ ein 16 bit aus der anweisung macht.

sollte der compiler nicht wenigstens nen warning rauswerfen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"sollte der compiler nicht wenigstens nen warning rauswerfen?"

Warum, das Ergebnis stimmt doch auch bei 16 Bit.

Allerdings sollte ein 8Bit Compiler die Operation auch auf 8Bit
optimieren, wenn der Zieloperand nur 8Bit ist. Und es macht wenig Sinn,
das High Byte zu berechnen und es dann niemandem zuzuweisen.

Aber im Zweifelsfalle gilt natürlich immer "nimm lieber ein cast
mehr", schaden kanns ja nicht.


Peter

Autor: sammy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es zu dem ganzen irgendwo ein gutes Tutorial, steige so durch die
Befehle nicht ganz durch. :-/

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest Dir ein C-Lehrbuch beschaffen, wo die Operatoren
(+,-,|,&,||,&&,<<,~ usw.) alle erklärt sind.


Bestimmt findest Du auch entsprechende Seiten im Web.


Peter

Autor: Minos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> "sollte der compiler nicht wenigstens nen warning rauswerfen?"
> Warum, das Ergebnis stimmt doch auch bei 16 Bit.

ich habe mal für kurze zeit mit dem wickenhäuser flash_m1 und dem
compiler gearbeitet. der hat zumindest nen warning generiert.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

http://www.schellong.de/c.htm ist garnicht schlecht.

Matthias

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Minos

"der hat zumindest nen warning generiert."


Und wie lautet diese ?


Peter

Autor: Minos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
test.c 49: Warning: overflow in converting constant expression from
'int' to 'unsigned char'

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Minos,

das darf aber nur dann kommen, wenn Du für DMOSI Werte >7 einsetzt,
also versuchst, einen nicht existenten 9. Portpin anzusprechen.

Ansonsten ist so eine Warnung schlichtweg falsch und der Compiler
Schrott.

Eine 1 um 7 geschiftet ist nur 128 und das paßt noch dicke in ein
unsigned char.


Peter

Autor: Minos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yo haste recht. ich arbeite eh nicht mehr mit dem und das ganze war nur
mal zum antesten! ich halte eh die ganze reihe 80CXXX für veraltet.

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.