Zahlenbereich checken

Tsu-ti

Neues Mitglied
10. Jan. 2011
4
0
0
Sprachen
Hallo,

ich suche eine elegante Lösung, wie ich in einem ATMega8 einen Zahlenbereich, der von 0-1023 geht,
checken kann. D.h. ich muss prüfen, ob ein Wert (Analogeingabe ADL/ADH) zwischen z.B. 628 bis 724 liegt. Nun wäre es einfach, wenn der Wertebereich nur bis 255 ginge. kann man so was evtl. mit dem Registerpaar r24/25 machen? Ich bin bisher nur selber auf Lösungen gekommen, die jedes Register einzeln betrachten und das ist eine ziemliche frickelei. Vielleicht denke ich auch einfach nur zu kompliziert. Wenn jemend einen Ansatz hat würde ich mich darüber freuen.

Gruß Thomas
 
Hallo Thomas,

eine Lösung könnte so aussehen (die Registerpaare x, y, oder z habe ich hier nicht verwendet).

Vielleicht passt sie ja für dich schon.

Gruß,
Dirk

Code:
  in r19, ADCH  ; ADCResult im Registerpaar r18/r19
  in r18, ADCL

  ; zuerst prüfen ob kleiner als 628
  ldi r16, low(628)
  ldi r17, high(628)

  cp r18, r16   ; zuerst low vergleichen
  cpc r19, r17  ; danach high vergleichen und Carry berücksichtigen

  brlo go_kleiner_als628

  ; nun prüfen ob größer 724
  ldi r16, low(724)
  ldi r17, high(724)

  cp r16, r18
  cpc r17, r19

  brlo go_groesser_als724

  ; ADC Result liegt zwischen den beiden Werten 
  rjmp go_zwischen  ; größer oder gleich 628 und kleiner oder gleich 724
 
Hi Dirk,

danke für Deine schnelle Antwort. So in etwa habe ich es auch realisiert.
Allerdings leicht umständlicher.

Idealerweise wäre es schön, könnte man mit einer Assemblerdirektive a la
ld x, <zahl bis 1023> gleich eines der Doppelregister nutzen. Ich kann mich
schwach errinern, irgendwo früher beim Z8,Z80 oder 8031 ging so was mal..

Ist aber auch schon 20 Jahre her.

Ich denke, ich werde Deinen Lösungsansatz nehmen und bedanke mich dafür nochmals.

Gruß Thomas
 
Hi
Der Z 80 konnte auch nur 8 Bit Datenbreite, auch wenn die Register HL, BC und DE zu 16 Bit organisiert waren. Trutzdem gibt es in der Befehlsstrukturr keinen CP HL, DE. Alles mußte über das A - Register bearbeitet werden. Da ist ein AtMega8 doch wesentlich besser ausgestattet, fast jedes Register ist in der Lage, direkt Befehle zu bearbeiten. Aber der Z80 hatte andere Vorteile... Multiprozessorbetrieb, erweiterte IO-Ebene, Ausführung von Daten- Adress- und Steuerbus usw.
Nebenbei, ich hab auch mit ihm und Sir Sinclair die PC-Welt entdeckt. Lang ist's her....
OK, wenn du nicht die 10-Bitauflösung benötigst, gäbe es die Möglichkeit, die hohen ADC-Bits in das höherwertige Byte zu schreiben und die unteren 2 Bits halt in das niederwertige Byte. Nun hast du im höherwertigen zwar nur noch eine Stufung von 256, aber vielleicht reicht diese Genauigkeit für dein Fenster. Kannst es ja mal durchrechnen....
Gruß oldmax
 
Hallo Oldmax,
OK, wenn du nicht die 10-Bitauflösung benötigst, gäbe es die Möglichkeit, die hohen ADC-Bits in das höherwertige Byte zu schreiben und die unteren 2 Bits halt in das niederwertige Byte. Nun hast du im höherwertigen zwar nur noch eine Stufung von 256, aber vielleicht reicht diese Genauigkeit für dein Fenster. Kannst es ja mal durchrechnen....

das stimmt schon. Nur warum sollte man keinen 16bit Register/Konstanten-Vergleich machen, es sind wenige Zeilen Code, zumal das Fenster relativ klein ist.

Gruß,
Dirk
 
Hi,

Nur warum sollte man keinen 16bit Register/Konstanten-Vergleich machen, es sind wenige Zeilen Code, zumal das Fenster relativ klein ist.
ich würde das folgendermaßen mit Assembler umsetzen ...

zuerst das High-Byte mit nem Compare-Befehl vergleichen. Dann steht in den Zero- / Sign-Flags schonmal drin ob es gleich/größer/kleiner ist. Wenn es gleich ist, dann geht es weiter mit dem LowByte. Da macht man das dann nochmal.

Dadurch spart man eine Vergleichoperation wenn die oberen 8Bit sich bereits unterscheiden und wenn sie gleich sind sieht man spätestens bei den unteren 8Bit wo man dran ist. Das sollte recht kurz sein und damit kann man dann seine Wertefenster aufbauen. Sozusagen ein programmierter "Fensterdiskriminator" :rolleyes: . Bei Analogen Sachen gabs da damals mal nen IC für. Ich glaube irgendwas mit TCA965 oder so. Gibts aber glaube ich nicht mehr. Wird nicht mehr hergestellt.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)