Re: Assembler einbinden Kategorie: Programmierung (von André H. - 8.05.2006 16:51) | ||
Als Antwort auf Re: Assembler einbinden von Erich - 8.05.2006 12:43 | ||
| ||
Hallo Erich, > danke für die Antworten und Entschuldigung dafür, dass ich mich etwas schwer tue. Ich bin ein > Einsteiger in die Mikrocontrollerei (auch wenn CC2 nicht dafür geeignet sein soll) und habe eine > Konzentrationsstörung, auf die ich nicht näher eingehen möchte. Für mich ist hardwarenahe-Program- > mierung keine Selbstverfreilichkeit, da ich bisher zwar sowohl in C(++), als auch in Pascal programmiert > habe, aber da auch nur für Windows und maximal mit Datenbankzugriffen per SQL. > Für mich ist das alles ein bisserl schwierig und diese und jene Funktion zu implementieren und zu > nutzen, scheint mir oft überflüssig (warum soll ich auf einen interrupt mit "getcount" statt mit "+ 1" > reagieren?). Dann kommt die Sache mit der PLM: da kann ich bevor ichs messe auch nur annehmen, > dass die Ports sich selbst "loopen" - sicher wei� ichs nicht von vorneherein. Mir fehlt da einfach die > Erfahrung. Krassos hat es zwar eigentlich schon gesagt, jedoch nochmal: Keep ist simple. Du mu�t, wenn Du nur Ereignisse zählen willst, nicht auf Interrupts reagieren, da das OS dies bereits unabhängig an vier Ports machen kann. (P1H.0 - P1H.3) Ich möchte Dir daher wenigstens die Kaptiel 3.3.8 "Sonderfunktionen der Digitalports", sowie 3.3.8.1 "Zähler und Interruptports" des Handbuchs empfehlen. (Das ist nichteinmal eine DIN A5 Seite) Dazu noch Kapitel 7.9.5 "Pulszählung". (7 Zeilen) Wenn Dir in einem Programm die Zeile wert=wert+ports.getcount(0); zu aufwendig ist, gibt es noch die Möglichkeit die Zähler ohne Löschen abzufragen. Denn das OS hat feste "Register" mit denen die Ereignisse gezählt werden, welche dann von ports.getcount() abgefragt und auf 0 gesetzt werden. MCU-interner RAM Adresse 0xF7A6 bis 0xF7BC, je 4 Byte. Das braucht man allerdings garnicht wissen. Denn das OS hat bereits VM-Codes, um diese Counter-Variablen ohne Löschen auslesen zu können. dazu müssen nur ein paar Inline-Funktionen ergänzt werden: //------------------------------------- inline function cnt_0 () returns long //------------------------------------- {// Counter P1H.0 inline vmcodes.VM_LOAD_SYSVAR_LONG | (vmcodes.LSYSVAR_CNT_1 << 8); } //------------------------------------- inline function cnt_1 () returns long //------------------------------------- {// Counter P1H.1 inline vmcodes.VM_LOAD_SYSVAR_LONG | (vmcodes.LSYSVAR_CNT_2 << 8); } //------------------------------------- inline function cnt_2 () returns long //------------------------------------- {// Counter P1H.2 inline vmcodes.VM_LOAD_SYSVAR_LONG | (vmcodes.LSYSVAR_CNT_3 << 8); } //------------------------------------- inline function cnt_3 () returns long //------------------------------------- {// Counter P1H.3 inline vmcodes.VM_LOAD_SYSVAR_LONG | (vmcodes.LSYSVAR_CNT_4 << 8); } Nun kann man statt wert=wert+ports.getcount(0); auch problemlos folgendes schreiben: wert=cnt_0(); Wenn man dann noch die Counter zurücksetzen will, fragt man diesen einfach mit ports.getcount() ab. Alternativ könnte man das auch direkt mit einer inline-Funktione machen und den Countern einen anderen Startwert zuweisen. MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |