mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Linear rückgekoppeltes Schieberegister unter AVR-Programmieren


Autor: Matthias .. (chillin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte mit AVR ein Linear rückgekoppeltes Schieberegister 
programmieren um damit in einer Modellbahnwelt die lichter "zufällig" an 
und aus zu schalten.

Ich finde aber leider keinen ansatz wie ich das programmieren muss.

hat zufällig jemand den Quellcode dafür, bzw. ein ähnliches beispiel?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo genau liegt das Problem? Wenn Du weißt, welche Bits rückgekoppelt 
werden müssen, dann ist der Rest doch trivial: Einmal schieben und die 
EXOR-verknüpften Bits hinten dranhängen.

Autor: Matthias .. (chillin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann ich den einzelne bits exor'en oder nur zwei register?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias P. wrote:
> kann ich den einzelne bits exor'en oder nur zwei register?
Du musst Dir die Werte so schieben, dass die zu verknüpfenden Bits an 
der selben Position liegen (idealerweise an Position 0). Dann das 
(bitweise) EXOR drauf loslassen, das Ergebnis mit 1 verUNDen und zum 
Schieberegister dazuODERn...

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias,

Google nach LFSR und lese den gleichlautenden Artikel bei Wikipedia.
Da steht alles was du benötigst. Google findet für dich auch listen mit 
sogenannten TAPS, also den Abgriffen zum xodern für unterschieldliche 
Bit-Anzahlen.

Jochen Müller

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias,

Das X-Odern ist eine sog. Parity-Berechnung.
Es geht also nur darum, ob die Anzahl der Rückführbits die 1 sind gerade 
oder ungerade ist. Das lässt sich in Assembler sehr leicht machen:

für jeden Bitabgriff wird ein Zähler erhöht wenn das bit=1 ist.
dann wird der zähler rechts ins carry geschoben, bit-0 des zählers ist 
also im carry. das carry wird dann rechts in das lfsr-byte geschoben.

wichtig: lfsr klappt nur, wenn das lfsr-byte anfangs ungleich null ist, 
also eine initialisierung einbauen.

;========================
; 8Bit LFSR für data
;========================
LFSR:     clr   count
          sbrc  data,7
    inc   count
    sbrc  data,5
          inc   count
    sbrc  data,4
          inc   count
    sbrc  data,3
          inc   count
          ror   count
          rol   data
          brne  lfsrx
          ldi   data,128
lfsrx:    ret

Jochen Müller

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

Bewertung
0 lesenswert
nicht lesenswert
Hier mal was für C
volatile static uint8_t Feld[3];

void takt(void)
{
  int i;
  uint8_t tmp_sreg;  // temporaerer Speicher fuer das Statusregister
 
  tmp_sreg = SREG;   // Statusregister (also auch das I-Flag darin) sichern
  cli();             // Interrupts global deaktivieren
  
  i= (Feld[2] & 1<<7) ^ (Feld[2] & 1<<4);
  
  Feld[2]<<=1;

  if(Feld[1] & 1<<7)
    Feld[2]++;

  Feld[1]<<=1;

  if(Feld[0] & 1<<7)
    Feld[1]++;

  Feld[0]<<=1;

  if(i)
    Feld[0]++; //ergebins dex xor reinschreiben

  SREG = tmp_sreg;     // Interrupt Status-Register wieder herstellen 
}

void main (void)
{
  Feld[0]=1;
  Feld[1]=0;
  Feld[2]=0;

  for(;;)
  {
      takt();

      //Feld[0]-[2] auf Ausgänge schreiben

      //ein bißchen warten

   }
}

Autor: Matthias .. (chillin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe!

denke ich habs verstanden, werde da mal ein bisschen rumschreiben, mir 
hat der richtige denkanstoß gefehlt...

jetzt sollte es klappen

Danke nochmal!

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch was für avr-gcc.

Ich verwende den Pseudozufalls-Algorithmus wie im c-File.

Nach dem Start wird durch den zufälligen RAM-Inhalt eine seed berechnet, 
alles andere ist Arithmetik über nem endlichen Galois-Feld der 
Charakteristik 2, also sehr effizient zu berechnen.

Hier noch der Header:
#ifndef _PARIT_15_H_
#define _PARIT_15_H_

extern uint16_t prandom(void);

#endif // _PARIT_15_H_

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die avr-libc besitzt eine erprobte Implementierung eines LFSR-basierten
rand() bzw. random().

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.