Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
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: