mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC 16F877A Vergleichen ob Analoger Wert in bestimmten Bereich liegt


Autor: willer77 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde gern mit einem PIC 16F877A einen Motor ein bzw ausfahren. Dazu 
lese ich eine beim Motor angebrachte Lichtschranke über den AD Wandler 
ein. Einen zweiten Wert gebe ich über einen Poti vor, dieser ist der 
Soll Wert für den Motor. Das heißt also ich gebe eine Spannung am Poti 
vor und wandle diese ebenfalls am ADC. Dann Vergleiche ich den Wert mit 
dem eingelesenen Wert von der Lichtschranke und vergleiche auf > oder < 
in dem ich beide Werte voneinander abziehe, und das Carry Flag auswerte. 
So weiß ich ob der Motor rechts oder links loslaufen soll. Weiter 
vergleiche ich dann ständig den Wert der Lichtschranke mit dem nur 
einmal eingelesene Wert des Poti-sobald ein Vorzeichenwechsel 
stattfindet, stoppe ich den Motor. dann geht alles wieder von vorne los- 
neuer Sollwert wird eingelesen und wieder geschaut wo der Motor 
hinlaufen soll. Jetzt habe ich das Problem das mein Motor natürlich 
ständig um den Sollwert herum vor und zurück läuft- ich würde also gerne 
sagen das der Motor stehen bleiben soll sobald er sich in einem 
bestimmten Bereich befindet. Wie könnte ich das machen??? Dachte 
irgendwie an eingegebene Tabellenwerte die ich dann irgendwie auswerte?? 
Kenn mich aber dafür zu wenig aus-bin für jede Anregung dankbar!!!

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst eine =>Hysterese.

Erst wenn die Differenz Soll-Ist vom Betrage her größer als X ist, wird 
entsprechend verfahren.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: willer77 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten. Genau so etwas brauche ich, dass ist 
mir vom Prinzip her klar, nur wie kann ich sowas in Assembler umsetzen??

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst dir einen Bereich schaffen, indem dein Motor stehen bleibt. 
Also angenommen dein Poti hat den Wert 500. Dann subtrahierst du einmal 
10 von diesem Wert, das ist dein unterer Vergleichswert. Nun addierst du 
in einem zweiten Schritt 10 hinzu, dass ist dein oberer Vergleichswert. 
Damit würde der Motor zwischen 490 und 510 stehen bleiben. Ist ein wenig 
mehr Schreiberei in Assembler aber grundsätzlich nicht allzu schwierig. 
Falls 8 Bit genau genug sind, dann benutze nur die höheren 8 Bit von dem 
ADC. Das spart dir die Rechnerei mit den 16-Bit Zahlen.

Sven

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.equ max=123
.equ min=89

.dseg
st_ausgang:    .byte   1

.cseg 
; messwert in r16
asm_st:
  cpi r16, max
  brlo asm_st_no_max
  ldi r17,1          ; obere Schwelle überschritten -> 1
  sts st_ausgang,r17
  ret
asm_st_no_max:
  cpi r16, min
  brsh asm_st_no_min
  ldi r17,0         ; untere Schwelle unterschritten -> 0
  sts st_ausgang,r17
  ret
asm_st_no_min:
  ret               ; zwischen den Schwellen, keine Änderung

In PIC-ASM sehr ähnlich, kann ich aber nicht.

MFG
Falk

Autor: willer77 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@falk
Danke für den Code, leider kenn ich mich damit nicht aus!!

@stepp64
8 bit würden locker reichen-obwohl ich zur zeit noch mit 16 bit rechne. 
Das Problem was ich habe liegt immer noch in den Vergleichsprozessen. 
Ich addiere bzw subtrahiere von meinem Poti_Wert jeweils z.B 10 und lege 
diese Werte in zwei Speicherzellen ab. Aber wie kann ich dann am 
schnellsten meinen Lichtschrankenwert damit vergleichen-ob erim Bereich 
liegt oder drunter bzw darüber. Ich steh da wohl irgendwie auf der 
Leitung.

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also angenommen du hast den minimalen Wert in min gespeichert und den 
maximalen Wert in max. Dein Vergleichswert steht in pot.

Nun sagen wir mal: min ist 120,  max ist 140 und pot ist 130.

Nun musst du zwei Vergleiche machen. Vergleichen ob etwas größer oder 
kleiner ist kannst du nur über den Subtraktionsbefehl. Du lädst also pot 
nach w und subtrahierst min von w ab. Carry ist dann 0 wenn w größer war 
und 1 wenn es gleich oder kleiner war. Schau dir mal das Instruction set 
des 16F887 (nicht 877) an. Dort ist es besser beschrieben.

Bsp.
   movfw pot
   subwf min,w       ;das w hinter dem Komma ist wichtig, damit der Wert in   
                     ;min nicht überschrieben wird
   btfss STATUS,C
   goto  größer

kleiner
   .....

größer
   .....

Probier es im Simulator aus, da kannst du schön erkennen ob es 
funktioniert

Autor: willer77 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp. Ich werds morgen mal ausprobieren-hab mir schon 
gedacht das ich es so machen muss, ist halt so bei RISC!!! Sehe nur noch 
das Problem wenn mein Poti z.B. auf 9 ist und ich 10 abziehe für meinen 
unteren Grenzwert dann hab ich ja FF und Carry gesetzt-aber irgendwie 
muss das ja auch noch zu lösen sein!!

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na sicher ist das zu lösen. Nach Subtraktionen und Additionen sollte man 
immer das Carryflag überprüfen und entsprechend reagieren.

Kommt in deinem Fall ein Überlauf zustande, dann setzt du den Wert pot 
halt einfach auf 0. Gilt ja in diesem Beispiel für alle Werte zwischen 0 
und 9.

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.