www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Parität eines Registers Rausfinden (Assembler)


Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo...

Ich bin dabei ein kleines Programm zu schreiben indem ich die Parität 
eines Registers herausfinden möchte und später mit dem T-Flag anzeigen 
möchte...

T = 0 heisst Parität ist gerade
T = 1 heisst Parität ist ungerade

Ich habe das Programm bereits soweit das ich die Anzahl Einsen (im 
Binärcode) in einem Register angezeigt bekomme... Nun muss ich nur mehr 
rausfinden ob die Zahl gerade oder ungerade ist... wie kann ich das 
machen...

MFG Mike

Autor: Tim Seidel (maxxie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib dir mal auf Papier auf, wie ungerade Zahlen 1,3,5,7... in binär 
aussehen. Du wirst schnell herausfinden, wie du eine ungerade Zahl 
erkennst.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du die Anzahl der Einsen hast, zeigt das unterste Bit eine gerade 
(0) oder ungerade (1) Zahl an.

Es geht aber einfacher: 
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: Frank Schlaefendorf (Firma: HSCS) (linuxerr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wäre sinnvoll, wenn du den Controllertyp angegeben hättest, denn 
viele haben einen speziellen Befehl, um die Parität zu bestimmen. Oft 
ist es so, dass ein Paritätsbit bei Arithmetik oder Logikbefehlen 
automatisch gesetzt wird.
Wenn du von einer Binärzahl wissen wills, ob sie gerade oder ungerade 
ist, dann musst du nur die letzte Bitstelle testen. Ist diese 1, dann 
ist die zahl ungerade, ist sie 0, dann ist die zahl gerade. Testen 
kannst du das zb mit rechts-Schiebebefehlen, die das niederwertige Bit 
in ein Flag(Carry z.B.) schieben. Du kannst auch eine and-Maske 0x01 auf 
die Zahl legen und testen, ob das ergebnis 0 ist.

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danka für die schnelle Antwocht... sehr dumm von mir... da hätte ich 
auch selbst drauf kommen können... ich arbeite mit einem Atmega 8  und 
soviel ich weiss gibt es hier kein Paritäts bit / Flag oä...

Vielen Dank... ich schreibs jetzt schnell um dann poste ich noch das 
programm...

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein programm...

.include "m8def.inc"
.org 0x0000

CLR R16      ;lösche R16
LDI R17,0x09  ;Lade 0x09in R17 = Schleife
Immer:

Dec R17
BRNE Weiter    ;wenn Schleife nicht a ende ist gehe zu Weiter
ROR R16      ;Rotiere R16 nach Rechts Bit 0 in Carry
BRCC Aus    ;Wenn carry = 0 gehe zu Aus
SET        ; Sonst setze T Flag
Aus: Rjmp Aus  ;Endlosschleife

Weiter:
Rol R20      ;Rotiere R20 Nach Links mit Carry
BRCS Paritaet  ;Wenn carry = 1 gehe zu Paritaet

Rjmp Immer    ;Gehe zu Immer

Paritaet:

Inc R16      ; Addiere 1 zu R16 gibt anzahl Einsen an

Rjmp Immer    ;Gehezu Immer

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hier mein Programm:
      ldi r18,0b11111110   ; deine Zahl
      clr r17              
      ldi r16,8            ; acht mal

aaa:  eor r17,r18
      lsr r18
      dec r16
      brne aaa
      bst r17,0            ; Parität nach T

MfG Spess

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mike: Einfacher wird es, wenn man das Bit ins Carry rausschiebt und 
anschliessend schlicht ebendieses Carry zur Summe addiert (ADC r,0).

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter obigem Link hättest Du ein spaghetticode-freies Assemblerprogramm 
gefunden, das kürzer und schneller ist ...

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess danke für das Kurze Programm... WOW Ich bin 
begeistert...programmiere noch nicht sehr lange aber so ein kurtzes 
Programm hätte ich nie hin bekommen...Zumindest habe ich es 
verstanden...auch wenn ich was länger brauchte...hehe

>Unter obigem Link hättest Du ein spaghetticode-freies Assemblerprogramm
>gefunden, das kürzer und schneller ist ...

Ja ich habe mir den Link angesehen... wurde jedoch nicht schlau draus...


Jetzt habe ich noch eine Frage... ich möchte mein programm erweitern un 
zum beispiel die anzahl an Low pegel von 2 Ports (ATMega8) in ein 
register schreiben... jedoch kann ich hier nicht mehr mit Rol oder ROR 
arbeiten... we kann ich hier intelligent vorgehen?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>we kann ich hier intelligent vorgehen?

Da hilft wirklich nur Zählen. Einfach beide Ports (PinX) in zwei 
Register einlesen.

Mal so aus dem Stehgreif:

     in r16,PinA
     in r17,PinB
     ldi r18,16
     clr r19

aaa: sbrc r16,0
     inc r19
     lsr r17
     ror r16
     dec r18
     brne aaa

MfG Spess

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ne frage zu deinem Programm (von Spess) aus dem Stehgreif.. (ne 
kleine sache die ich nicht verstehe... wie kümmerst du dich denn hier um 
das Register R17? dieses Wird da gar nicht bearbeitet oder übersehe ich 
hier etwas? und wieso gebrauchst du für das R16 den ROR Befehl Carry 
wird doch gar nicht gebraucht oder?

Hoffe du hast verständnis für meine fragen... hehe...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LSR/ROR bildet zusammen einen 16-Bit Schiebebefehl.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Spess: Du zählst die Einsen, nicht die Nullen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fixere Variante:

     in r16,PinA
     in r17,PinB
     ldi r18,16
     ldi r19,16

aaa: lsr r17
     ror r16
     sbci r19,0
     dec r18
     brne aaa

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>wie kümmerst du dich denn hier um das Register R17?

Du wolltest doch die Leitungen von 2 Ports?

>wie kümmerst du dich denn hier um das Register R17?

Doch, mit 'in r17,PinB'

> und wieso gebrauchst du für das R16 den ROR Befehl Carry wird doch gar...

'lsr r17' schiebt Bit0 von r17 ins Carryflag. 'ror r16' schiebt das 
Carry-Flag nach Bit7 von r16. Das Ganze entspricht einem '16Bit-lsr'.

Ich habe gerade gesehen, das du die Nullen zählen willst. Dann muss es 
heissen:

aaa: sbrs r16,0

MfG Spess

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> @Spess: Du zählst die Einsen, nicht die Nullen.

Ja und? Bei gerader Gesamt-Bitzahl sind entweder beide gerade oder beide 
ungerade, hat auf die Parity also keinen Einfluss.

Andreas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Fixere Variante:

Stimmt.

MfG Spess

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:

> Ja und? Bei gerader Gesamt-Bitzahl sind entweder beide gerade oder beide
> ungerade, hat auf die Parity also keinen Einfluss.

Es ging in diesem Fall bereits um die Anzahl Null-Bits, nicht mehr um 
die Parität.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Es ging in diesem Fall bereits um die Anzahl Null-Bits, nicht mehr um
> die Parität.

OK. Ist trotzdem einfacher, die Einsen zu zählen. Dann am Ende eben noch 
einmal von 16 abziehen, dann passt es wieder.

Andreas

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:

> OK. Ist trotzdem einfacher, die Einsen zu zählen. Dann am Ende eben noch
> einmal von 16 abziehen, dann passt es wieder.

Nö. Spess' Version ist da wie gezeigt neutral (SBRS/SBRC) und meine ist 
bei Nullen einfacher. Einsen braucht ein NEG hintendrein.

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ich hatte bereits zu beginn den SBRC in SBRS umgewandelt...

Trotzem Einen grossen Dank An alle...

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hier bin ich wieder... Heute wollte ich einem freund dieses 
Programm erklären... doch ich bekam es nicht hin... ich verstehe die 
einzelnen schritte doch die logik dahinter und den weg ein solches 
programm zu schreiben konnte auch ich nicht ganz verstehen...

nun wollte ich mal fragen ob mir niemand (wenn auch nur kurz) erklären 
könnte wie man dadrauf kommt...

das es fonktioniert sehe ich ja..^^

ich habe mir dann ein Blatt genommen und jeden schritt aufgeschrieben... 
nur die Logik fehlte mir... warum es so ist...


spess53 schrieb:
> Hi
>
> Hier mein Programm:
>
>
>       ldi r18,0b11111110   ; deine Zahl
>       clr r17
>       ldi r16,8            ; acht mal
> 
> aaa:  eor r17,r18
>       lsr r18
>       dec r16
>       brne aaa
>       bst r17,0            ; Parität nach T
> 
>
> MfG Spess

Hoffe ihr könnt mir nochmals helfen...

gruss Mike

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Heute wollte ich einem freund dieses Programm erklären...

Freund oder Lehrer?

Du solltest dir mal die Logiktabelle für Ex-Oder (eor) zu Gemüte führen.

Es interessiert nur das Bit0 von r17 und r18. Eine 1 in Bit0 von r18 
invertiert Bit0 von r17. Eine Null nicht. Also ist Bit0 (von r17) nach 
einer geradzahligen Anzahl von Invertierungen wieder Null, nach einer 
ungeraden Anzahl von Invertierungen Eins. Ganz einfach.

MfG Spess

Autor: Mike Dupo (hero2992)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein einem Freund... aber ich dachte das ganze Register 17 würde 
eventuell noch was anzeigen...ich bin jedoch immer noch davon 
begeistert... danke spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>...ich bin jedoch immer noch davon begeistert...

Ich auch. War eine ganz spontane Idee.

>aber ich dachte das ganze Register 17 würde eventuell noch was anzeigen

r17 wird zwar jedes mal komplett verändert, aber nur Bit0 ist 
interessant.

MfG Spess

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.