Hallo zusammen, also, ich hab da folgendes problem: Ich verwende einen PIC16F767, und möchte über CCP1 und CCP2 den Unterschied zwischen zwei Frequenzen messen, also einen Shlupf. habe mir zum ausprobieren ein 50 Hz Signal generiert, und ich gebe den Unterschied über zwei LED aus. Wenn ich dieses Signal nun an CCP2 anlege, aber nicht an CCP1, dann wird eins a Schlupf erkannt. wenn ich nun hingehe, und das Signal (bei laufendem programm) auch auf CCP1 lege wird auch sofort erkennt, dass kein schlupf mehr vorhanden ist. (gleiches Signal) Wenn ich jetzt aber (programm läuft immer noch) hingehe und nehme das Signal von CCP1 wieder weg ändert sich nix mehr, der PIC gibt mir immer noch 0% Sclupf weiter. kann mir da einer nen Tipp geben? Ich hab irgendwo was aufgeschnappt vonwegen in der ISR ein Flag setzen oder löschen, aber verstanden hab ich das nicht. noch eins, ich kann nur C, assembler ist für mich ein bömisches dorf.
Ja, fuer diese Messung mochte man beide captures haben und dann vergleichen welche kuerzer ist. Dh ein Durchgang im main wartet auf beide capture interrupts. Dies macht man, indem der Capture interrupt jeweils den Zaehler in eine Variable speichert, und ein flag setzt. Das main wartet auf beide flags. Wenn dieses Beobachtungsfenster unendlich ist, kann es vorkommen, das das eine der beiden Signale nicht mehr anliegt, der Wert aber noch da ist. Daher sollte man das Beobachtungsfenster begrenzen, zB auf eine Sekunde.
>Daher sollte man das >Beobachtungsfenster begrenzen, zB auf eine Sekunde. und wie mache ich das? >Zaehler in eine Variable speichert sag ich dann in C einfach sowas wie
1 | int16 Schlupf |
2 | int16 drehzahl1 |
3 | int16 drehzahl2 |
4 | |
5 | #int_ccp1
|
6 | ccp1_isr() |
7 | {
|
8 | drehzahl1=CCP_1; |
9 | }
|
10 | |
11 | #int_ccp2
|
12 | ccp2_isr() |
13 | {
|
14 | drehzahl2=CCP_2; |
15 | }
|
16 | |
17 | void main() |
18 | |
19 | {
|
20 | ...
|
21 | Schlupf=(drehzahl1-drehzahl2)/drehzahl1*100; |
22 | ...
|
23 | }
|
Etwa so : interrupt CP1 { capture_1:=CP1; cap1:=true; } interrupt CP2 { capture_2:=CP2; cap2:=true; } interrupt timer1 { timercame:=true; reload_timer() } main while true do { if timercame then { timercame:=false; if cap1 and cap2 then { schlupf :=capture1-capture2)/capture2; cap1:=false; cap2:=false; } } }
sehe ich das richtig? cap1, cap2, timercame sind demnach einfach irgendwelche variablen sagen wir mal "int", die dem programm sagen, so ereignis ist da also tu was capture1, capture2 ebenfalls Variablen, die aber die Timerwerte weitergeben sollen?! und was genau sagt jetzt := aus ist das eifach eine variablenzuweisung? hab ich nämlich nirgends gefunden. Wenn ich das so richtig sehe, bedanke ich mich schonmal ansonsten wäre mir jede Aufklärung recht ;) Gruß MOI
So ist es. Allerdings wurde vergessen die Flags cap1 und cap2 mit dem timer zu loeschen wenn nichts kam.
muss dann einfach nur
1 | else
|
2 | {
|
3 | cab1:=false |
4 | cab2:=false |
5 | }
|
unten an die timer-if bedingung?
main while true do { if timercame then { timercame:=false; if cap1 and cap2 then { schlupf :=capture1-capture2)/capture2; } cap1:=false; cap2:=false; } }
Dabei sollte man nicht vergessen dass das letzte resultat stehenbleibt. Dh wenn nichts mehr kommt ist der Schlupf immer noch derselbe. Allenfalls muesste man das auch beruecksichtigen. Nicht null setzen !
Also ich bin grad dabei das mal umzusetzen, aber der mein compiler kennt zum ersten den operator
1 | :=
|
nicht und eine Vergleichbare option hab ich auch nicht gefunden. es sei denn, dass ein einfaches
1 | =
|
dasselbe bewirken würde. nochn Tipp???
das hab ich ja kappiert, ich wollte wissen ob ein einfaches
1 | =
|
auch reicht
Das ist eine Sache der Sprache. Jede Sprache hat ihre eigenen Definitionen. Ich verwende kein C, um das mal so zu sagen. Ja, in c hat = dieselbe finktion.
Ich hab da mal was ausprobiert, aber nix geht. in dem programm im anhang erkennt er zwar nun immer andere Werte für die CCP-variablen, aber er gibt diese nicht an die capture_1/2-Variablen weiter??? und die cap-variablen werden auch nicht auf eins gesetzt. Ich brauche dringend nen ProgDoc
#int_CCP2 void Drehzahl() { capture_1=CCP_1; capture_2=CCP_2; cap2=1; } Was soll das ? Ein Interrupt und beide Zaehler werden gelesen ? Die beiden Signale werden ja kaum synchron sein. setup_ccp1(CCP_CAPTURE_RE); setup_ccp2(CCP_CAPTURE_RE); Da werde die Teiler und die Flanke gesetzt?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.