-         

Ergebnis 1 bis 5 von 5

Thema: Wie macht man einen 16-Bit Vergleich?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109

    Wie macht man einen 16-Bit Vergleich?

    Anzeige

    Ich bekomme vom AD-Wandler einen 10-Bit Wert der mit einem 10-Bit Vorgabewert verglichen werden soll. Es sollen je nach AD-Wert verschiedene Ausgänge aktiviert werden.
    Immer nur einer in einem bestimmten Zahlenbereich. Ich komme einfach nicht dahinter wie man den nun diese Zahlenwerte vergleicht. Denn es kann ja vorkommen, daß der High-Wert niedriger ist als der Vorgabewert und der Low-Wert kann höher sein als der Low-Vorgabewert.
    Oder das Ganze kann ja auch umgekehrt der Fall sein.
    Ich muß also feststellen ob die 10-Bit Zahl innerhalb des vorgegebenen Fensters liegt, höher oder niedriger ist.

    Code:
    LED1:
    	ldi EEprom,0x00				; Vergleichswertadresse vorgeben
    	rcall LeseEEprom			; und Wert aus EEprom holen
    	cp ADHigh,TPHigh			; High-Byte vergleichen
    	brlo LED11
    	cbr Vergleich,0b00000010
    	;rjmp LED2
    
    LED11:		
    	sbr Vergleich,0b00000010
    	cp ADLow,TPLow
    	brlo LED12
    	cbr Vergleich,0b00000001
    	rjmp LED2
    
    LED12:		
    	sbr Vergleich,0b00000001
    	cpi Vergleich,3
    	brne LED2
    	cbr LEDStat,0b00000001
    	out PORTB,LEDStat
    So funktioniert es nicht richtig!

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Hallo,
    wie immer bei 16-Bit Artithmetik, erst das Low-Byte und dann das High-Byte mit Carry.
    Das Vergleichsergebnis kannst du dann ganz normal verwenden mit breq, brne, brlo, brsh usw...

    cp lowbyte, vergleichswert_low
    cpc highbyte, vergleichswert_high
    breq Labelxxx

    Gruß Jan

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Ich hab mir jetzt dein Prog nicht näher angeschaut.
    Normalerweise macht man solche Vergleiche mit dem CPC Befehl

    cp r16,r18 ;In r16,r17 steht der Messwert
    cpc r17,r19 ;In r18,r19 steht der Vergleichswert.
    brcs marke

    Als Branch Befehl können natürlich auch andere Typen verwendet werden.
    Es gibt allerdings meines Wissens keinen CPC Befehl der mit einer Konstante vergleicht, wie CPI. Die zu Vergleichenden Werte müssen also in Registern stehen, aber das dürfte ja kein Problem sein.

    EDIT:
    OH JanB war schneller

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    So einfach und ich komm nicht dahinter! Dann wird ja mein Programm richtig übersichtlich und nicht mehr so lang.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    Nach dem ich nun mit zahlreichen Fragen und auch manchmal dummen wiederholten Fehler nun mein erstes Assemblerprogramm fertig habe werde ich dieses bei nächster Gelegenheit in den ATtiny übertragen und mal sehen was passiert.
    Laut dem AVR-Simulator müsste alles so laufen wie erwartet.
    Ich werde dann hier das komplette Programm einstellen als Spickzettel für andere Anfänger und solche die einfach was wissen möchten.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •