Forum: Mikrocontroller und Digitale Elektronik Capture-Interrupt irgendwas läuft falsch


von PIC´er (Gast)


Angehängte Dateien:

Lesenswert?

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.

von bleifrei (Gast)


Lesenswert?

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.

von PIC´er (Gast)


Lesenswert?

>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
}

von bleifrei (Gast)


Lesenswert?

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; }
   }
 }


von PIC´er (Gast)


Lesenswert?

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

von bleifrei (Gast)


Lesenswert?

So ist es. Allerdings wurde vergessen die Flags cap1 und cap2 mit dem 
timer zu loeschen wenn nichts kam.

von PIC´er (Gast)


Lesenswert?

???

von PIC´er (Gast)


Lesenswert?

muss dann einfach nur
1
else
2
{
3
cab1:=false
4
cab2:=false
5
}

unten an die timer-if bedingung?

von bleifrei (Gast)


Lesenswert?

main
 while true do {
  if timercame then {
    timercame:=false;
    if cap1 and cap2 then {
     schlupf :=capture1-capture2)/capture2;
     }
    cap1:=false;
    cap2:=false;
   }
 }

von PIC´er (Gast)


Lesenswert?

leuchtet ein! ich werds gleich mal ausprobieren

von bleifrei (Gast)


Lesenswert?

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 !

von PIC´er (Gast)


Lesenswert?

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???

von bleifrei (Gast)


Lesenswert?

Ja, ein := ist eine Zuweisung.

von PIC´er (Gast)


Lesenswert?

das hab ich ja kappiert, ich wollte wissen ob ein einfaches
1
=
 auch reicht

von bleifrei (Gast)


Lesenswert?

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.

von PICnewbie (Gast)


Angehängte Dateien:

Lesenswert?

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

von bleifrei (Gast)


Lesenswert?

#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
Noch kein Account? Hier anmelden.