PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sensoren --> Auswerten



Redals1311
27.06.2008, 12:17
Habe eine frage,
Habe an einem Pic eine Sensorenspannung von 0 bis 5 V anliegen.
Diese muss ausgewertet werden.
Bei einer Reichweite von 10 cm gibt der Sensor eine Spannung von 5 V aus.

Nun möchte ich mit Hilfe des Pics 16f877, diese Spannung auswerten.



;************************************************* **********
;* Name : LCD Datum: 05.03.2008 *
;* ------------ *
;* Funktion : sensor *
;* *
;* Autor : *
;************************************************* **********
LIST p=16F877 ; TAB - otherwise: unnecessary warning
#include <p16F877.inc>
;__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF
__CONFIG 0x3F39
ERRORLEVEL -302

ADW_1 EQU 0x31


Initialisierung:
bsf STATUS,RP0
clrf TRISB
bsf TRISA,0
bcf STATUS,RP0
clrf PORTB
movlw B'00000000'
movwf ADCON1

Main_1

; ADC-Vorbereitungen:
; ADC einschalten
bsf ADCON0, 0 ; ADON=1
; ADC speed für (fosc/32) MHz einstellen
bsf ADCON0, 7 ; ADCS1=1
bcf ADCON0, 6 ; ADCS0=0


Haupt:
clrf PORTB
bcf PORTB,4
clrf ADW_1
bcf ADCON0, 5
bcf ADCON0, 4
bcf ADCON0, 3
call Verzögerung_100us
bsf ADCON0, 2

warte_auf_ADW:

btfsc ADCON0, 2
goto warte_auf_ADW
movf ADRESH,W
movwf ADW_1

movlw D'100'
subwf ADW_1,W
btfss STATUS,Z
goto Test


goto Haupt

Test
bsf PORTB,4
call Verzögerung_1s
call Verzögerung_1s
call Verzögerung_1s
;call Verzögerung_1s
;call Verzögerung_1s

goto Haupt

#include "VERZ/Verz_A.inc"

end



Bei diesem Code wird immer wieder das Zero Flag überprüft. Da sich die Spannung immer um ein paar mV veränder und nie konstant ist, ist das Zero flag auch nur einen kurzen Moment gesetzt.
es sollte aber länger gesetzt sein. damit an einem Portpin ein High signal ausgegeben werden kann
WIe kann ich das realisieren bzw. den code umstellen

the_Ghost666
27.06.2008, 22:58
Speicher den Zustand des Zeroflags doch einfach in einer Variable.
also einfach den Test ändern:

movlw D'100'
subwf ADW_1,W
btfsc STATUS,Z
goto Test
MOVLW D'1'
MOVWF Flag
goto Test

Und in Test löschst du den Wert vom Flag erst nach einer zeit deiner Wahl. Das Problem ist scheinbar, dass die Messung damit zu schnell aufeinander folgen, bzw ihre Wirkung sofort eintritt. Du könntest eine Toleranz um den Zielwert nehmen, zb in dem du das niederwertigste Bit der Wandlung ignorierst, oder nicht bei 100 sondern in einem Bereich von 95 bis 105 auslöst.
Ich hoffe ich hab dein Problem richtig verstanden, sonst erläuter es bitte nochmal genauer.

P.S.: Das Zero-Flag bleibt so lange gesetzt, bis du es mit einer Operation wieder änderst, also ein Ergebnis oder Zwischenergebnis hast, dass das Z-Flag beeinflusst. Dh sobald der BSF PORTB,4 Befehl kommt und die Wartezeit vorbei ist, springst du ja wieder an den Anfang und löschst PORTB. In deiner Zählschleife wird wahrscheinlich das Z-Flag geändert, spätestens aber bei Haupt wieder gelöscht.

Bitte beschreib nochmal genau, was du machen möchtest, AD-Wert einlesen lassen, AD-Wert prüfen, ob er =100 ist, und wenn, dann den PB4 High, für wie lange? Wann soll er wieder gelöscht werden?

Redals1311
28.06.2008, 00:02
also,....

ich habe einen Sensor der mir eine spannung von 0 bis 5 V ausgibt.
Diese Spannung wird beeinflußt, durhc die Reichweite. Wenn ein Gegenstand weiter weg ist ---> 0V
nah dran --> 5 V

Nun wollte ich die spannung an dem AD Port einlesen um diese Spannung weiter zuverarbeiten.
D.h. Wenn die Reichweite 15 cm beträgt ---> 4 V , soll ein Portpin High gesetzt werden.
Da der WErt nicht konstant bleibt müsste ich am besten einen Bereich festlegen wo der Pin high gesetzt werden kann(z.b. 3.8 V bis 4.2 V)
Aber wie??Mit Hilfe des Carry Flags?

the_Ghost666
28.06.2008, 10:41
Ah ok,
also willst du eine Toleranz. Ja, wenn du nur eine Untergrenze hast und testen möchtest, ob die überschritten wurde, kannst du das Carry nehmen, einfach auf die Weise wie vorher das Z-Flag.
Noch eine Möglichkeit wäre von dem 10-12Bit AD-Wert einfach die untersten Bits zu verwerfen, das kommt auf sowas wie einen Tiefpassfilter raus. Du kannst mit einem Bit einstellen, wie die 12Bit in 2 Byte verteilt sind ,linksbündig oder rechtsbündig.So kannst du einfach alles über dem 2./4.Bit abschneiden, verlierst aber an Genauigkeit.
Oder du machst einfach eine Abfrage, mit 2 Bedingungen, wenn der Wert >95 oder <105 ist.

Redals1311
28.06.2008, 11:46
ach so
also das sselbe mit wie ich im oberen code habe nur mit dem Carry flag ? Habe ich das richtig verstanden =)?

Da ich 2 Abstandsensoren habe, sollte ich dann am besten die werte von den beiden vergleichen damit es noch genauer ist .

DIe Sensren brauche ich für ein selbstfahrendes auto. (2 sensoren wollte ich vorne machen)

the_Ghost666
28.06.2008, 17:04
Naja, ein vergleichen der Sensorwerte bringt nur etwas, wenn die Sensoren das gleiche Feld abdecken. Z.B. würde das Auto auf eine Stange zu fahren, könnte Sensor1 die Entdecken, Sensor2 aber nicht! Dennoch wären ja beide Ergebnisse richtig.

Was ich dir Empfehlen würde, mach eine Funktion, die die Messung übernimmt, am Besten sogar interruptgesteuert. Dh nach einem festen Intervall (z.B. nachdem die Messung beendet ist) wird der Interrupt aufgerufen, die Werte in den Speicher geschrieben. Da machst du zuerst eine Tiefpassfilterung (einfach den Mittelwert bilden, am besten sogar nicht nur mit 2 sondern direkt 4 Werten) und prüfst dann, ob der Zustand eingetreten ist, denn du willst. Das Carry kannst du nehmen, solange du nur bei Unterschreiten eines Wertes gewarnt werden willst.
Ist der Zustand eingetreten, setzt die Funktion den Pin. Das Hauptprogramm reagiert dann entsprechend, und löscht nach seiner Aktion das Bit. Eigentlich genauso, wie du es bisher gemacht hast. Nur, dass ein Interrupt dem Prozessor Zeit lässt was anderes zu tun, und eine Funktion das Übersichtlicher machen würde. Ich muss gerade noch auf ne Klausur lernen, vielleicht kann ich nach etwas Beispielcode posten.

Redals1311
28.06.2008, 17:36
ja danke das wäre gut
aber lerne erst einmal dafür

solange werde ich mich mal daran begeben

the_Ghost666
28.06.2008, 20:18
Hast du schonmal mit Interrupts gearbeitet? Wieviel Erfahrung hast du denn insgesamt so?

Redals1311
28.06.2008, 21:17
also ich habe schon einmal mit interrupts gearbeitet,
kann lcds ansteuern ...etc

müsste ja eigentlich hierfür reichen =)

Redals1311
08.07.2008, 08:56
habe es leider immrnoch nicht hinbekommen

kann mir denn wer anders noch helfen??

Redals1311
08.07.2008, 08:56
habe es leider noch immer nicht hinbekommen

kann mir jmd weiter helfen

vlt habe ich das konfigurationswort falsch

wie lautet es für den pic 16f877??

WEil ich noch nicht einmal ein Port Pin im wechsel an aus schalten kann... entweder ist de rPortpin nur High oder Low.
Habe schon 3 neue Pics vewendet sie müssten eigentlich nicht kaputt sein.
Spannung liegt an den richtigen pins an, Quarz ist 4 Mhz groß und parallel dazu 22 nF kondensatoren... ich weiß nicht weiter...