PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Impulse messen - Fehlmessung



Pitt1986
18.01.2006, 07:49
hi,

ich versuche ca. 800 impulse in einem abstand von 500 mikrosekunden im pic zu speichern, aber irgendwie kommen manchmal nicht alle impulse an oder werden aus irgend einem grund nicht gespeichert.

wenn ich die impulse aber am lpt-port vom pc abfrage bekomm ich immer alle rein.

vor kurzem gings fast gar nicht am pic, weil ich die impulse am PORTD abgefragt ab und weil des ja ein Schmitt-Trigger-Eingang ist ging des nicht jetzt frag ich die Impulse am PORTB ab, welches ja TLL-Eingänge sind und da hat sich des mit dem speichern ziemlich gut verbessert aber trotzdem geht es am pc immer noch besser und des muss auch noch am pic so gehen.

der pic wird mit 10mhz quarz versorgt, daran sollte es normal nicht liegen.

was könnte ich noch machen.
entstören mit kondensator vielleicht?

mfg
pitt

el_net_fun
18.01.2006, 08:57
Hallo,
wie werden die abgefragt:
pollen oder interrupt.
ich habe keine Probs damit wenn ich Impulse über ein RB0/INT Eingang
im ISR-Routine Zähle. (INTE muss initialisiert werden).
Oder kannst du auch CCP-Eingang benutzen.
Grüß,
Alex

kalledom
18.01.2006, 10:10
Hallo pitt,
was nennst Du speichern ?
Falls Du Daten im Eeprom speicherst / reinschreibst, dieser Vorgang dauert wenige MilliSekunden; da können Daten verloren gehen.

Pitt1986
18.01.2006, 21:13
hi,

des is so ein abgefackter scheiss warum geht des net, man seit fünf tagen arbeite ich an diesem problem jetzt tag bis sieben uhr in der früh und ich krieg den scheiss einfach nicht hin.

also nein ich schreib des nicht in eine eeprom rein sonst würd ich wahrscheinlich nicht einmal 200 impulse reinbekommen.

ich zähle nicht die impulse sondern der pic schaut wie lange die impulse an sind.
des wird mit nem timer gemessen und dann in der sram abgelegt.

jedenfalls weiss ich zu 100% dass es nicht am programm oder an der schnelligkeit vom pic liegt es hat ganz sicher was mit der elektronik zu tun.

weil es geht ja jetzt schon besser weil ich von schmitt-trigger-eingängen auf tll-eingänge umgestiegen bin.

aber der pc liest immer noch alle impulse und nicht weil er schneller ist als der pic sondern weil der lpt-port ganz sicher besser entstört oder sonst was ist als die eingänge von meinem pic.

mfg
pitt

stegr
18.01.2006, 22:00
wie sieht denn dein messablauf aus?

Auf Flankenwechsel warten -> Timer starten -> auf nächsten Flankenwechsel warten -> Timer stoppen -> Wert im Ram speichern
?

machst du irgendwas, das auf interrupts basiert?
wenn ja, hast du die interruptprioritäten richtig eingestellt?
wie sehen denn die impulse aus? hast du zufällig ein oszi-bild davon?

MfG
Stefan

kalledom
18.01.2006, 22:09
Hallo,
ich habe externe Signale am liebsten über Schmitt-Trigger-Eingänge, weil das sauber und sicher ist.
Vielleicht kommt ja schon mal ein Impuls schneller, als Dir lieb ist bzw. die SIO noch nicht fertig ist. Ich weiß ja nicht was und womit Du programmiert hast.
Wenn Du Assembler nimmst, kannst Du bei meinen PIC Assembler-Beispielen reinschauen. Dort ist eine serielle Kommunikation mit Ringpuffer zum Senden und Empfangen (und natürlich noch mehr): http://www.domnick-elektronik.de/picasm.htm Vielleicht hilft es Dir weiter ?

Pitt1986
19.01.2006, 07:16
hi,

also ich programmiere mit assembler.

aber um die ganzen fragen zu beantworten kann ich euch ein programm-beispiel zeigen bei dem des nicht funktioniert.



list p=18f4525
#include <P18f4525.INC>


__config _CONFIG2L, _PWRT_ON_2L
__config _CONFIG2H, _WDT_OFF_2H
__config _CONFIG1H, _OSC_HS_1H
__config _CONFIG4L, _LVP_OFF_4L & _ENHCPU_OFF_4L


movlw B'00000001'
movwf TRISB
movlw B'00001111' ; analoge Eingänge ausschalten
movwf ADCON1
clrf PORTB
clrf LATB


clrf TRISD
clrf PORTD
clrf LATD


clrf statenew2 ; Speicherzelle leeren
clrf stateold2 ; Speicherzelle leeren



main
movlw D'0' ; Zahl 0 in Arbeitsspeicher
btfsc PORTB,0 ; Falls PORTD,7 auf LOW, dann überspringe nächsten Befehl
movlw D'1' ; Zahl 1 in ARbeitsspeicher
movwf statenew2 ; Zahl 0 oder 1 in Speicherzelle aus Arbeitsspeicher kopieren
xorwf stateold2,0 ; Arbeitspeicher mit neuem Zustand mit Speicherzelle mit altem Zustand vergleichen
btfss STATUS,Z ; Falls beide Zustände gleich dann überspringen nächsten Befehl
call savestate2 ; Routine aufrufen
goto main

savestate2
movff statenew2,stateold2 ; Jetzigen Zustand speichern, für später zum Vergleich
btfss statenew2,0
bcf PORTD,5
btfsc statenew2,0
bsf PORTD,5
return

end



hier in dem beispiel wird nichts anderes gemacht als wenn ein signal empfangen wird einfach weiterzuleiten.
des mit dem timer und speichern habe ich alles rausgenommen.

woran könnte es jetzt noch liegen.
obwohl ich langsam glaube dass man da gar nichts von aussen, also an der elektronik entstören müsste weil ich mir so schaltpläne von rs232 schnittstellen angeschaut habe und da ist auch nichts entstört.

also muss es etwas ganz blödes kleines sein.

mfg
pitt

el_net_fun
19.01.2006, 07:50
Morgen,
also bei dir können die Messungen verloren gehen, weil du den Port in Main-Schleife abfragst.
Und wenn du schon PORTB0 als Eingang hast, wäre viel eifacher und sichere über INTE-Interrupt die Impulse zählen.
Ob alles korrect am Port kommt kannst du auch mit Oszi prüfen.
Grüß,
el_net_fun

Pitt1986
19.01.2006, 08:37
hi,

und was is wenn ich nicht den portb und damit keine interrupts benutzen würde wie soll ich des dann machen geht des dann nicht mehr oder was?

oszi habe ich leider nicht.

mfg
pitt

el_net_fun
19.01.2006, 08:44
Dann musst du mit timer-interrupt Port abfragen.
timer so einstellen dass dir keine Impulse verloren gehen können,
und im ISR-Routine (timer overload) Portzustand abfragen.
Ohne Interrup bist du nie auf sichere Seite.

Pitt1986
19.01.2006, 08:55
aber wie kann es sein dass ich nicht alles signale reinbekomme wenn der pic zwischen den signalen minimal 200 mikrosekunden bei einem takt von 4mhz zählt.
dann kann doch schon gar net bei einem 10mhz irgendwas verloren gehen.
und mit einem 40mhz hab ich des auch schon probiert ändert sich nichts.

also soll ich des jetzt mit den interrupts probieren oder könnte ich mir des jetzt ersparen?

mfg
pitt

el_net_fun
19.01.2006, 09:04
Schwer zu sagen, weil ich kenne das Programm nicht, du hast nur das
Stück rausgenommen, und den Rest, wo alles bearbeitet und gespeichert wird ist nicht bekannt.
Aber wenn du mit ISR probierst dann siest du gleich ob den Fehler an Auswertung liegt oder an Störingen im Schaltung.
Also du kannst Portb-Interrupt (RB4-RB7), INTE-Intrrupt(RB0) oder CCP-Engang(RC1,RC2) benutzen.
Grüß,
el_net_fun

Pitt1986
19.01.2006, 09:12
ja aber mit dem programm was oben steht geht es auch nicht, also des is ja kein schnipsel aus dem großen prog sondern zur zeit is des auf meinem pic gebrannt. und mit dem geht es halt auch net.

ich könnt mir noch vorstellen dass vielleicht zu wenig strom reinkommt wegen dem pulldown widerstand, also das die signale halt so mit 3V reinkommen und dann noch wegen dem pulldown widerstand noch kleiner sind dann am eingang und dann nicht wahrgenommen werden.
könnte das sein?

el_net_fun
19.01.2006, 09:22
Kannst deine Schaltung posten?
Spannungsversorgung von Akku oder Batterie?
Kann sein das deine Spannung in die Knie geht und du
keine stabile Impulse hast, dann wurde ich einen Schmitt-trigger vorschalten, den du fein einstellen kannst.
So ein Prob habe ich bei einem meinen batteriebetriebenen Schaltung gehabt.
Die Impulse habe ich damals von eine Lichtschranke direct an Port des Kontrollers geführt, und ohne vorgeschalteten Sch-Trigger hat es auch nie richtig funkrioniert..
Grüß,
el_net_fun

Pitt1986
19.01.2006, 16:43
hi,

also dass hier ist mein schaltplan.
wie sieht so ein schmitt-trigger aus, den ich vorschalten kann?
die schaltung wird mit strom aus dem anschluss von der maus betrieben. PS/2 glaub ich heisst der anschluss. die stromspannung beträgt 4,85V.

brauchst sonst noch infos um mich näher an mein ziel zu bringen??

mfg
pitt

kalledom
19.01.2006, 20:12
Der CMOS 40106 hat 6 invertierende Schmitt-Trigger, funktioniert zwischen 3 und 15 Volt und braucht ganz ganz wenig Strom.

PS: unbenutzte Eingänge an GND oder Plus anschließen oder je einen PullUp-Widerstand 47k nach Plus.

el_net_fun
20.01.2006, 09:39
Hallo,

du hast nicht gezeigt wo eigentlich die Impulse erzeugt werden?
Lichtschranke? US-Sensor? Geber? IR-Sensor????

Muss einbisschen mehr erzählen.

Grüß,
Alex

el_net_fun
20.01.2006, 15:21
Hallo,

PORTB spezifisch:
jeder I/O hat ein INTERNER PULLUP Widerstand.
Weil du hier ein PULLDOWN hast muss du im Programm Pullups abschalten.
Du muss prüfen ob bei dir PULLUPs (PORTB) abgeschaltet sind...

Viel Erfolg!!

Grüß,
el_net_fun

Pitt1986
20.01.2006, 15:40
hi,

ja die internen pullup's hab ich schon nachgeprüft, die sind aus.
aber ich hab jetzt die pulldown's auf +5V gelegt also pullup draus gemacht und jetzt geht es schon fast perfekt. jetzt werd ich mir mal so nen schmitt-trigger zulegen und dann schau ich mal weiter.

aber mich würde noch interessieren ob ich überhaupt einen so nen schmitt-trigger brauche wenn ich die signale am PORTD empfange, des sind ja schon schmitt-trigger eingänge. oder ist der zusätzlich schmitt-trigger besser als die am pic??

mfg
pitt

stegr
20.01.2006, 20:01
die schmitt-trigger aufm pic sind schon dafür geeignet, aber ich würde dir, wie ich oben schonmal geschrieben hatte, dazu raten nen externen schmitt-trigger zu verwenden und den an portb über interrupts laufen zu lassen - das ist die einzig sichere methode um keinen puls zu verpassen...

MfG
Stefan