Forum: Compiler & IDEs Drehzahlmessung über Capture_Interrupt Probleme?


von Richard P. (richard_)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche seit 2 Wochen mein Programm ans Laufen zu bekommen, aber 
irgendwas funktioniert nicht .. ich denke es liegt an den Interrupts, im 
speziellen an "TIMER1_OVF_vect" in Kombi mit dem Aufrauf des TIMSK = 
(1<<TOIE1) Registers.

Zumindest hängt sich alles auf, wenn ich das drin hab..Beim Debuggen 
habe ich festgestellt, dass an der Stelle die Register OCIE1A & OCIE1B 
geschaltet werden, warum weiß ich nicht, gewollt ist das zumindest 
nicht, ich denke dass das vlt den Fehler verursacht ?!

Ich hoffe, dass mir jemand helfen kann, bin inzwischen ziemlich am 
verzweifeln deswegen :(

Dazu sei noch gesagt, dass ich mir das Prog aus anderen Codes zusammen 
gebastelt habe und ich nicht so viel Ahnung vom Programmieren hab, daher 
ist der Code sicherlich nicht optimal. Bis auf das Auslesen des Timer1 - 
Overflow-Register (TOIE1) funktioniert es einigermaßen..



Aber gut, einige relevante Infos fehlen ja noch:


Ziel ist es über den Input Capture Pin - ICP1 (Pin PD4 des Olimex Boards 
AVR-MT-128) ein getriggertes Signal aufzunehmen und daraus die Frequenz 
zu ermitteln. Anschließend soll daraus eine Drehzahl berechnet werden.
Über ein Menü solls dann aufgerufen werden etc.

Das Board verfügt über einen ATmega128 und LCD/Taster.

Im Anhang ist der Code.

Ich verwende das AVR Studio Version 5 und den AVR Dragon.



Nochmal die Problembeschreibung:

Wird das Register

TCCR1B = ((1<<ICES1)| (1<<CS10));
und
TIMSK = (1<<TICIE1)| (1<<TOIE1);

aufgerufen, dann hängt sich das Programm auf. Nach rumprobieren hat es 
sich dann auf das Register

TIMSK = (1<<TOIE1);

eingegrenzt. Ob es letztlich nur daran liegt oder woran genau, das 
konnte ich nicht herausfinden und hoffe daher, es weiß jemand ne Lösung.

Schonmal Danke!

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
#ifndef TIMER1_OVF_vect
2
#define TIMER1_OVF_vect
3
#endif
4
5
#ifndef TIMER1_CAPT_vect
6
#define TIMER1_CAPT_vect
7
#endif

ist eine gaaaanz schlechte Idee. Du musst Fehler schon beheben und nicht 
kaschieren!

AUch wenn du C-Anfänger bist, solltest du wissen, dass in C 
Gross-/Kleinschreibung wichtig ist
1
ISR (Timer1_CAPT_vect)              //Interrupt für Timer/Counter1 Capture-Event
2
{
3
   ...                         
4
} // ISR1  
5
6
7
// Interrupt für den Overflow
8
9
ISR (Timer1_OVF_vect)           // Interrupt Vector 
10
{
11
   ...
12
}

Du versuchst nicht zb den TIMER1_OVF_vect zu instantiieren, sondern du 
versuchst dienen Timer1_OVF_vect zu instantiieren. Das ist ein 
Unterschied! Der Name und seine Schreibweise sind dir vorgegeben! Die 
kannst du nicht einfach nach Gutdünken verändern.

Compiler Warnungen zu ignorieren ist nie eine gute Idee!

von Karl H. (kbuchegg)


Lesenswert?

PS:
1
// Einbindung Standart-Bibliotheken

Standard schreibt sich hinten mit 'D' und nicht mit 'T'
Das hat nichts mit 'Art' (engl. für "Kunst") zu tun.

von Richard P. (richard_)


Lesenswert?

Vielen Dank erstmal!

Das ist mir ja schon ein bisschen peinlich, ich gucke mir seit Tagen 
alles genau durch und mir fällt die Schreibweise nicht auf.

Wobei ich mir die Compiler Warnungen schon angesehn habe, aber wohl 
nicht genau genug.

.. und danke für die Rechtschreibkorrektur..das hätte mir auch auffallen 
sollen..

Dann versuche ichs mal mit den Änderungen, vielleicht klappts ja dann 
schon..und nochmals danke!

von Karl H. (kbuchegg)


Lesenswert?

Richard P. schrieb:
> Vielen Dank erstmal!
>
> Das ist mir ja schon ein bisschen peinlich, ich gucke mir seit Tagen
> alles genau durch und mir fällt die Schreibweise nicht auf.
>
> Wobei ich mir die Compiler Warnungen schon angesehn habe, aber wohl
> nicht genau genug.

Nur zur Info:

Es gibt harmlose Warnungen und es gibt Warnungen, die tatsächlich auf 
schwerwiegende Probleme hinweisen können.

Da es mühsam ist, bei jedem Compilierdurchgang wieder erneut alle 
Warnungen durchzugehen und den Spreu vom Weizen zu trennen, gelten im 
professionellen Umfeld (und das sollten Amateure auch so sehen) 
normalerweise die unmissverständlichen Direktiven:

* der Warning-Level des Compilers wird auf die höchste mögliche
  Stufe gestellt oder zumindest auf die vorletzte dieser Stufen.
  das bedeutet: Der Compiler mäkelt in Form einer Warnung an
  allem rum, was auch nur irgendwie nach 'Problem' aussieht.

* Warnungen werden wie Fehler behandelt.
  D.h. sie sind zu beheben. Der Code ist so zu gestalten, dass
  das die Warnung auslösende Element verschwindet.

* Warnungen sind ausnahmslos zu beseitigen. Ein Code, egal wie groß
  er ist, seien es 20 Zeilen oder 20 Millionen Zeilen, hat ohne
  eine einzige Warnung zu compilieren.

* Die Warnung dadurch zu beseitigen, dass man den Warning-Level senkt
  oder im Compiler einzelne Warnungen abschaltet, gilt NICHT!
  (Da mag es Ausnahmen geben. Bei einzelnen Compiler Warnungen weiß
  man, dass sie immer harmlos sind. Die können dann schon mal einzeln
  abgeschaltet werden. Aber: Das sind Ausnahmen! Und die
  Projektverantwortlichen entscheiden, ob und auf welche Warnung der
  Fall zutrifft.)


Zusammengefasst:
Warnungen werden ernst genommen und sie werden beseitigt!
Immer?
Immer!

von Richard P. (richard_)


Lesenswert?

Danke für die Info, werds jetzt beherzigen.

Nach erneuter Compilierung - 0 Errors und 0 Warnungen - funktionierts 
leider immernoch nicht. Aber zumindest hängt sich das Programm nicht 
mehr auf.

Ich versuche mich jetzt nochmal mit dem Debuggen..

von Karl H. (kbuchegg)


Lesenswert?

Tja.
Blöde Geschichte.

Da das ganze offenbar ein Drehzahlmesser werden soll: Du hast viel zu 
viel Code auf einmal geschrieben!
Man macht das nicht, dass man seitenweise Code runterschreibt, in der 
Hoffnung keinen logischen Fehler zu machen.
Ganz im Gegenteil: Du willst so schnell wie möglich in einen Zustand 
kommen, in dem du die 'wichtige' Funktionalität deines Programmes testen 
kannst. Dass dein Drehzahlmesser auch die Aussentemperatur anzeigen 
kann, ist ein nettes Gimmick, aber für einen Drehzahlmesser erst mal 
nicht notwendig. Das beim Einschalten erst mal 78 Zeilen mit Copyright 
Meldungen kommen inklusive Danksagung an die Oma, ist zwar nett, aber 
für einen Drehzahlmesser nicht notwendig. Eine Menü Auswahl ist zwar 
nett, aber für eine erste Version nicht notwendig - für eine erste 
Version reicht es völlig aus, wenn all das was man mit dem Menü 
einstellen kann einfach mal als gegeben angenommen wird.

Für einen Drehzahlmesser notwendig ist die Messaufnahme, die Auswertung 
(wobei es für eine erste Version nicht notwendig ist, zwischen 2 Blatt 
und 3 Blatt Luftschrauben zu unterscheiden) und die Anzeige. Mehr 
braucht man nicht, um mit einem Drehzahlmesser loszulegen.

Erst kommt das Display drann, damit man eine Ausgabefläche hat, um dort 
Zwischenergebnisse und sonstiges anzuzeigen. Läuft die, dann kommt die 
Messaufnahme. Sehen die Messwerte gut aus (die man sich dank 
funktionierendem LCD ausgeben lassen kann), dann wird in die endgültige 
Anzeige umgerechnet. Passt das dann, dann kommen die Zwischenergebnisse 
wieder von der Anzeige weg.

Und erst dann, kommen all die anderen Gimmicks dazu.

Immer mit dem wichtigsten Bestandteil einer App anfangen! Und der erst 
nun mal in den meisten Fällen die innere Maschinerie. Noch wichtiger ist 
nur noch eine Ausgabemöglichkeit, um von Anfang an das 'Stochern im 
Nebel' abzustellen.

Und zwischendurch testen, testen, testen! Was immer du testen kannst - 
teste es!

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.