-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Sensoren --> Auswerten

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.01.2008
    Ort
    Aachen
    Alter
    29
    Beiträge
    45

    Sensoren --> Auswerten

    Anzeige

    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.

    Code:
    ;***********************************************************
    ;*  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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    07.01.2008
    Ort
    Aachen
    Alter
    29
    Beiträge
    45
    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?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.01.2008
    Ort
    Aachen
    Alter
    29
    Beiträge
    45
    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)

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    07.01.2008
    Ort
    Aachen
    Alter
    29
    Beiträge
    45
    ja danke das wäre gut
    aber lerne erst einmal dafür

    solange werde ich mich mal daran begeben

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    Hast du schonmal mit Interrupts gearbeitet? Wieviel Erfahrung hast du denn insgesamt so?

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    07.01.2008
    Ort
    Aachen
    Alter
    29
    Beiträge
    45
    also ich habe schon einmal mit interrupts gearbeitet,
    kann lcds ansteuern ...etc

    müsste ja eigentlich hierfür reichen =)

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    07.01.2008
    Ort
    Aachen
    Alter
    29
    Beiträge
    45
    habe es leider immrnoch nicht hinbekommen

    kann mir denn wer anders noch helfen??

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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