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

Re: Ports abfragen Kategorie: Programmierung (von André H. - 7.01.2012 19:27)
Als Antwort auf Ports abfragen von Volker - 7.01.2012 17:43
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
Hallo Volker,

> Ich möchte 3 Digitalports abfragen (Wechsel von low nach high). Allerdings wei� ich nicht wann
> und welcher Port auf high geht. Ich müsste also alle drei Port regelmä�ig in einer Schleife abfragen.

Um mehrere Ports abzubragen, kannst Du diese zusammenfassen.
Bei drei Ports fragst Du am besten einen Nibble-Port ab.
Das geht nur, wenn es 3 benachbarte Ports sind (P1L.0 bis .3, P1L.4 bis 7, P1H.0 bis 3, P1H.4 bis .7)
Nehmen wir mal die drei Pins P1H.0 bis P1H.2 an.
So kannst Du die Ports mit folgender Zeile Prüfen, ob einer oder mehrere Port
einen High-Pegel besitzen:

 Zustand=ports.getn(3) and 0b0111;

Nun hast Du den Portzustand in den ersten drei Bits.
Wenn man nun den Zutsand mit der vorherigen Abfrage mit Hilfe ein paar Logischen
verknüpfungen vergleicht, kann man auf die Flankenänderung reagieren.

Alternativ kannst Du die Counterports verwenden.
Wenn Du immer dieselbe Routine ausführen möchtest, egal welcher Port auf High
geht, kannst Du einfach folgendes machen:

if ports.getcount(0)+ports.getcount(1)+ports.getcount(1) tuedies();


Allerdings reagieren die Counterports standardmä�ig nur auf High-Low-Flanken.
Man kann dies aber umkonfigurieren.
Dazu muÃ? man aber einen Blick ins Manual des C164CI werfen.
zuständig ist das EXICON-Register: (Fast External Interrupts)

inline function setEXICON(int value)
{
 inline vmcodes.VM_STORE_ABSOLUTE_INT;
 inline 0xF1C0;
}


Im Register werden die unteren 8 Bit benutzt.
Bit 0,1 : P1H.0
Bit 2,3 : P1H.1
Bit 4,5 : P1H.2
Bit 6,7 : P1H.3

Kurz mal aus dem Manual kopiert:
External Interrupt x Edge Selection Field (x = 7 â?¦ 0)
0 0: Fast external interrupts disabled: standard mode
0 1: Interrupt on positive edge (rising)
1 0: Interrupt on negative edge (falling)
1 1: Interrupt on any edge (rising or falling)

Standardmä�ig ist für alle Ports 0b10 konfiguriert.
Im Register steht also 0b10101010.
Sollen nun die Ports P1H.0 bis .2 auf eine steigende Flanke reagieren, aber
P1H.3 unverändert bleiben, mu� der Wert 0b10010101 geschrieben werden.

> Eigentlich ein Fall für Hardwareinterrupts.
> Geht so etwas mit der C-Control Station? Oder gibt es noch eine andere Möglichkeit?

Mit der CC2 (egal, ob CC2-Unit oder CC2-Station) sind prinzipiell Interruptroutinen möglich.
Allerdings nur in Assembler.
Der Weg über die Counterports sollte aber in den meisten Fällen reichen.

Eines noch, wenn Du die CC2-Station nutzt.
Derjenige, der die Station-Platine entworfen hat, (das war keiner der an der CC2 entwickelt hat)
hat leider ein paar Designfehler "eingebaut".
Es fehlen die Pull-Up-Widerstände an den Counter-Ports. (P1H.0 bis .3)
Wenn diese Ports nun unbeschaltet und als Eingänge(=Standard) definiert sind, sind
diese sehr anfällig für Störungen. das kann dazu führen, da� soviele Interrupts
ausgeführt werden, da� das Programm langsamer wird.
In einem Fall man es mal fast zum Erliegen der Ausführung.
Darum müssen die Coutner-Ports bei der CC2 immer beschaltet werden, damit
ein definierter Pegel anliegt.
Die einfachste Möglichkeit, wäre, unbenutzt Ports bei Programmstart auf Ausgang zu schalten.
Das sinnvollste sind Pull-Widerstände.
Alternativ kann man über das EXICON-Register auch nicht benötigte Interrupts einfach abschalten.

Davon nicht betroffen sind folgende Platinen:
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
Advanced CC2-Station.


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:

Re: Ports abfragen (von Volker - 9.01.2012 20:44)
    Re: Ports abfragen (von André H. - 12.01.2012 1:11)
        Re: Ports abfragen (von Volker - 13.01.2012 22:59)