www.mikrocontroller.net

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


Autor: PIC´er (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: bleifrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
int16 Schlupf
int16 drehzahl1
int16 drehzahl2

   #int_ccp1
   ccp1_isr()
   {
      drehzahl1=CCP_1;
   }

   #int_ccp2
   ccp2_isr()
   {
      drehzahl2=CCP_2;
   }

void main()

{
...
Schlupf=(drehzahl1-drehzahl2)/drehzahl1*100;
...
}

Autor: bleifrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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; }
   }
 }


Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bleifrei (Gast)
Datum:

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

Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss dann einfach nur
else
{
cab1:=false
cab2:=false
}

unten an die timer-if bedingung?

Autor: bleifrei (Gast)
Datum:

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

Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leuchtet ein! ich werds gleich mal ausprobieren

Autor: bleifrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bin grad dabei das mal umzusetzen, aber der mein compiler kennt 
zum ersten den operator
:=
 nicht und eine Vergleichbare option hab ich auch nicht gefunden. es sei 
denn, dass ein einfaches
=
 dasselbe bewirken würde.
nochn Tipp???

Autor: bleifrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ein := ist eine Zuweisung.

Autor: PIC´er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hab ich ja kappiert, ich wollte wissen ob ein einfaches
=
 auch reicht

Autor: bleifrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: PICnewbie (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: bleifrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.