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!
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!
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.
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!
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!
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..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.