CC2Net.de - FAQ
 
Diese FAQs sind erst im Aufbau und werden ständig erweitert.
 

Die ersten Schritte ... / Allgemeines ...

Programmierung ...

Hardware ...

  • Was muß ich beachten, wenn ich Ports als Eingänge nutzen will ?
  • Was muß ich bei den Frequenzmess-Eingängen und Counter Ports beachten ?
  • Was soll ich mit nicht benutzten Ports machen ?
  • Wie bekomme ich mehr Ports ?
  • Ich betreibe einen PCF84574A an Adresse 116 am I²C-Bus.
    Warum spielen die Ports des Bausteins während des Systemstarts oder beim Zugriff
    auf das interne LCD verrückt ?
  • Wie schließe ich Relais an ?
  • Wie kann ich eine (Gleichstrom-)Last mit den PWM-Ports regeln ?
  • Wie kann ich 230V-Verbraucher mit den PWM-Ports in der Leistung regeln ?
  • Meine Anwendung muß sicher laufen. Wie realisiere ich einen Watchdog ?

 


Was kann man mit der CC2 alles machen bzw. 
ist sie für meine Anwendung geeignet ?
Die Grenzen für die Einsatzmöglichkeit bestimmt jeder selbst. :-)
Oder anders ausgedrückt: Man kann fast alles mit der CC2 machen.
Vom einfachem Datenlogger über komplexe Solar-/Heizungsregelungen bis hin zur Hausautomation,
von einer Aquariensteuerung bis zur Luxus-Mehrwasseraquariumsteuerung, von einfachen
Steueraufgaben bis zu einer Zentralen Steuereinheit für Roboter.
Die Grenzen für die Anwendungen liegen in der Phantasie. :-)
Sollte einmal die Geschwindigkeit der CC2 nicht reichen, kann man Teile des Programms
auch in Assembler schreiben.
 
Was ist besser ? Die CC2-Unit oder die CC2-Station ?
Das hängt von der Anwendung und den Hardwarekenntnissen ab.
Die CC2-Station besitzt den Vorteil, daß sie bereits anschlußfertig ist. Dies ist von Vorteil,
wenn man selbst nur wenig Hardwarekenntnisse besitzt. Sie besitzt ein beleuchtetes 2x16 LC-Display,
eine Tastatur, einige LEDs und zwei Relais. Somit kann sie praktisch sofort in betrieb genommen
werden. Allerdings besitzt die Station auch neben dem hohem Preis auch ein paar Nachteile:
Viele Ressourcen sind bereits fest zugeordnet und/oder nicht von außen abgreifbar.
(z.B. Handshakeleitungen der RS232, Reset-& Host-Pins, nur 8 I/Os verfügbar).
Die CC2-Unit bietet den Vorteil, daß man auf alle Ressourcen der CC2 Zugriff hat.
Für die CC2-Unit gibt es z.Zt. folgende Platinen, auf welche diese gesteckt werden kann:
- Das C-Control II-ApplicationBoard (von Conrad Electronic)
- Das CC2-StarterBoard (von CCTools)
- Das CC2-ReglerBoard - z.B. zum Einsatz in der Wärmetechnik(Heizung/Solar) (von CCTools)
Natürlich kann man auch eigene Platinen für die CC2-Unit erstellen. Dafür gibt's unter
"misc & Tools" eine passende Eagle Library zum Download.
 
Ich habe meine erste CC2 gekauft, was muß ich als erstes machen ? - Update
Zuerst sollte die IDE (Programmierumgebung) von der mitgelieferten CD installiert werden.
Anschließend sollte das letzte Service-Pack, welches unter OS & CC2-Download zu finden ist,
heruntergeladen und installiert werden.
Dies geschieht durch entpacken des ZIP in das Verzeichnis der IDE.
Nun sind die Module und die IDE auf dem Stand des Service-Packs.
Anschließend müssen noch alle Module, die seit dem Service-Pack erschienen sind,
aktualisiert werden. Welche Module dies sind, kann man über die Hauptseite mit den News ermitteln.

Als nächstes muß man das aktuelle Betriebssystem in die CC2 laden.
(Die bei CCTools gekauften CC2-Units werden vor Auslieferung mit OSOPT V3.0, dem neuesten OS, geladen.)
Es sollten nur die Betriebssysteme OSOPT_V2 oder OSOPT V3.0(oder höher) verwendet werden.
(Siehe OS & CC2-Download
OSOPT V3.0 hat gegenüber OSOPT_V2 weitere Funktionen im Hostmode, womit auch
die bis jetzt unbenutzten Flashsegmente 1 & 2 als ASM-Speicher benutzt werden können.
Auch wird mit OSOPT V3.0 das interne LCD systemseitig nicht mehr angesteuert, womit
eine weitere I²C-Bus-Adresse für einen PCF8574A nutzbar wird.
Die Systemmeldungen werden bei OSOPT V3.0 über eine Host-LED ausgegeben.
(mehr dazu siehe in der Doku zu OSOPT V3.0)
Für die neuen CC2-Units ohne Gehäuse und die CC2-Station sollte ausschließlich OSOPT V3.0
benutzt werden.

Zum Laden des OS benötigt man ein Download-Tool. I.d.R. kann man das bei der IDE mitinstallierte Tool
verwenden. Durch Timing-Probleme kann es hiermit allerdings zu Ladeproblemen bei einigen PCs kommen.
Deshalb sollte das CC2Net.de-Download-Tool V2.x (mehr siehe unter "misc & Tools") verwendet werden.
Es sollte immer ein Betriebssystem der OSOPT-Reihe benutzt werden, um möglichen Problemen vorzubeugen !
Auf keinem Fall sollte das sich auf der mitgelieferten CD befindliche OS benutzt werden,
sofern es sich bei der CD um die "Utility Collection" bis Nr. 4 handelt !!
Dieses besitzt einige schwere Bugs, die einem leicht zum Verzweifeln bringen können.
Die aktuellen OS-Versionen sind unter "OS & CC2 Download" ladbar. (Hinweise beachten !!)

Die CC2 selbst und die IDE sollte nun auf den neuesten Stand sein.
Bevor es nun an das Programmieren geht, noch folgende Hinweise:
Einige der aktuellen Systemmodule benötigen ASM-Treiber (HEX-Dateien) in Segment 3
des CC2-Flash. Dies ist in den Modul-Headern der entsprechenden Module angegeben.
Bei OSOPT V3.0 sind bereits die ASM-Treiber capture.hex und sys0001.hex, welche für
die Module i2c.c2, lcdext.c2, rblcd.c2 und stports.c2 benötigt werden, implementiert.
Mit anderen OS-Versionen müssen die Dateien capture.hex und sys0001.hex
mit einem Download-Tool in Segment 3 geladen werden.
(Wichtig! Das aktuelle DL-Tool von Conrad (V1.5) unterstützt nicht die OSOPT-Betriebssystems-Versionen,
wenn es um das Laden von HEX-Treiber geht !)
Außerdem müssen in den entsprechenden Modulen die Konstantendefinitionen für die Einsprungadressen
durch auskommentieren ausgewählt werden. (Standardmäßig sind die Einsprungadressen für
OSOPT V3.0 ausgewählt.)

Bei der CC2-Station ist noch mehr zu beachten. Mehr dazu siehe hier.
 
Ich habe eine CC2-Station, was muß ich hier beachten ?- Update
Prinzipiell sind hier die selben Schritte nötig wie bei der Unit.
Es werden lediglich weitere Module benötigt:
- lcdext.c2 - LC-Display
- stports.c2 - erweiterte Station-Ports (LEDs, Relais, LCD-Bel.,Ports PO.0 - 4)
- stkeyb.c2 - Station Tastatur


Dies sind die neuen Alternativ-Treiber für die Station II. Diese sind, was z.B. das externe LCD angeht,
um einiges schneller als die original Stationtreiber.

Die original Stationtreiber von Conrad sollten nichtmehr benutzt werden !
Auch sollten die dazugehörigen ASM-Treiber (stationdriver.hex & adr_manager.hex) nicht mehr
geladen werden !
 
Meine neue CC2-Station reagiert nicht. Ist sie defekt ?- Update
Die häufigste Ursache, daß eine neue CC2-Station nicht funktioniert, ist ein
Herausrutschen der in der Station befindlichen CC2-Unit aus dem Sockel.
(Wahrscheinlich durch Erschütterungen beim Transport/Versand.)
Abhilfe schafft hier ein Aufschrauben der CC2-Station und prüfen, ob die CC2 korrekt
im Sockel sitzt.
 
Im LC-Display der CC2 steht "waiting" oder "service".
Was bedeutet das und was muß ich machen ?
Diese Meldungen werden nur ausgegeben, wenn sich noch kein Betriebssystem sondern
ein Testprogramm anstatt des Betriebssystems in der CC2 befinden.
Bevor mit der CC2 gearbeitet werden kann muß erst ein aktuelles Betriebssystem (OS)
installiert werden.
 
Wie installiere ich das Betriebssystem (OS) auf der CC2 ?
Hierzu muß die CC2 in den Boot-Modus versetzt werden. Um dies zu erreichen, muß man
folgendermaßen vorgehen:
- Reset und Boot drücken und halten
- Reset loslassen
- mind. 3sec warten (beim ersten Laden bis zu 30sec. warten)
- Boot loslassen
Jetzt sollte sich die CC2 im Boot-Modus befinden.
Wichtig: Es gibt keine Rückmeldung, daß sich die CC2 im Boot-Modus befindet !
Im Display sollte die letzte Meldung vor dem Reset stehenbleiben.
Nun kann man das aktuelle Betriebssystem, welches von "OS & CC2-Download" geladen werden
muß, mit einem Download-Tool laden.
Dazu kann man entweder das von Conrad benutzen, oder das CC2Net.de-Download-Tool V2.x
Bei ersterem muß man folgendes beachten:
Das OS das geladen werden soll muß "os.hex" heißen und sich im selben Verzeichnis,
in dem sich das Tool befindet, befinden. Will man das OSOPT_V2 laden heißt dies
z.B., daß das alte OS zuerst aus dem Verzeichnis entfernt, die Datei osopt.hex aus OSOPT_V2.zip
in das Verzeichnis entpackt und in os.hex umbenannt werden muß.
Leichter geht es mit dem CC2Net.de-Download-Tool V2.x . Hier kann die OS-Datei ausgewählt werden.
 
Was ist der Unterschied zwischen dem letztem offiziellem OS und
dem inoffiziellem OSOPT_V2 und dem letztem OSOPT V3.0 ?
- Update
Das OSOPT_V2 besitzt keinen DCF-Err-Bug und der Hex-Load-Bug ist behoben. Außerdem
wurden ein paar kleinerer Bugs beseitigt.
Diese OS-Version läuft außerdem ca. 20% schneller als das offizielle OS.
Darum ist es immer empfehlenswert OSOPT_V2 zu verwenden - besonders bei
größeren Programmen.
OSOPT V3.0 baut auf OSOPT_V2 auf. OSOPT V3.0 besitzt allerdings weitere Hostmode-Kommandos,
welche die Flash-Segmente 1 & 2 nutzbar machen. (Hierfür für das CC2Net.de-DL-Tool benötigt)
Auch wird bei OSOPT V3.0 das interne LC-Display der alten CC2-Unit, welches bei den neuen
CC2-Units und der CC2-Station nicht vorhanden ist, nicht mehr systemseitig angesteuert.
Somit wird diese I²C-Bus-Adresse frei. Dies hat auch geschwindigkeitstechnisch einen Vorteil.
Die CC2 startet nun ca. 1 bis 2 Sekunden schneller.
Alle Systemmeldungen, die vorher auf das interne Mini-LCD ausgegeben wurden, können nun
mit einer Host-LED ausgegeben werden, welche sich mit einer kleinen Schaltung parallel
zum Host-Taster/-Pin befindet. Diese Host-LED ist bereits auf dem CC2-StarterBoard und
dem CC2-ReglerBoard vorhanden. (mehr zur CC2-Host-LED siehe in der Doku zu OSOPT V3.0)

  
Ich komme nicht in den Bootstrap-Modus, um das OS zu installieren.
Was mache ich falsch ?
Bei neuen Units kann es sein, daß beim ersten Laden die Boot-Taste länger als 3 sek. gedrückt
werden muß.
Darum sollte folgende Sequenz benutzt werden: 
(Es wird angenommen, daß sich an Reset und Boot Taster gegen GND befinden)
- RESET drücken und halten
- BOOT drücken und halten
- RESET loslassen
- 30 Sekunden warten
- BOOT loslassen
Jetzt sollte sich die CC2 im Boot-Modus befinden.
 
Wo finde ich die neuesten Dateien (Module, Treiber, OS) ?
Wie erkenne ich, ob es neuere Dateien gibt ?
Die neuesten Dateien befinden sich auf CC2Net.de unter den entsprechenden Bereichen.
(z.B. Module unter "Module & Funktionen")
Befindet sich ein C2-Modul unter "Module & Funktionen" ist es auf jeden Fall eine neuere Version
als mit der IDE installiert wurde.
Um rechtzeitig zu erkennen, ob neuere Versionen verfügbar sind, sollten die News
auf der Hauptseite beachtet werden.
 
Wie und wohin installiere ich neue Module ?
Was muß in der Datei modules.txt stehen ?
Im Verzeichnis der IDE gibt es zwei Ordner: Lib und UserLib
In Lib stehen die Systemmodule und in UserLib die gemeinsamen Module.
Soll nur eine neuere Version eines vorhandenen Moduls installiert werden, muß nur
das entsprechende Modul in den jeweiligen Ordner kopiert werden.
Wird ein neues Modul installiert, so muß zusätzlich zum Kopieren, das Modul
in die modules.txt des Ordners eingetragen werden.
Ein Ausrufezeichen hinter dem Modulnamen bewirkt, daß ein Modul bei jedem neuem
Projekt nicht extra aktiviert werden muß.
  
Wo finde ich Literatur zur C-Control II ?
Zur C-Control II gibt es erst ein Buch: "Messen, Steuern, Regeln mit C-Control II"
Dieses kann man unter "Bücher" finden und auch bestellen.
Jedes über CC2Net.de bestellte Buch unterstützt die Site.
Außerdem befinden sich weitere nützliche Bücher unter "Bücher".
Wie z.B. für den CAN-Bus.
  
Wie komme ich in den Host-Modus ?
In den Host-Modus kommt man mit folgender Sequenz:
- RESET drücken und halten
- HOST drücken und halten
- RESET loslassen
- 3 Sekunden warten (oder, falls ein Piezoschallwandler angeschlossen ist, bis zum "Klicken")
- HOST loslassen
Außerdem kann man softwareseitig ebenfalls in den Host-Modus gelangen,
wenn man im Programm quit mit einem Wert größer Null aufruft.
  
Wie lade ich ein Programm ?
Ein Programm muß zuerst mit der IDE (Entwicklungsumgebung) kompiliert werden, bevor
es geladen werden kann. Dazu drückt man entweder Strg+F9 oder wählt im Menü "Projekt"
den Punkt "Projekt neu erstellen".
Anschließend kann man mit F12 oder mit dem Menüpunkt "Projekt>In C-Control-Unit übertragen" laden.
Allerdings gibt es mit manchen PCs Timing-Probleme mit den Lader-Routinen der IDE.
Hier sollte der folgende FAQ-Punkt beachtet werden
  
Das mitgelieferte Download-Tool oder die IDE brechen
beim Laden immer ab. Was soll ich tun ?
Bei manchen PCs gibt es Timing-Probleme mit den Lader-Routinen der IDE und
dem mitgeliefertem Download-Tool.
Abhilfe schaffen hier das Conrad-Download-Tool V1.5 oder das komfortable
CC2Net.de-Download-Tool V2.x
 
Meine CC2 befindet sich nicht beim Computer. Wie lade ich Programme,
ohne daß ich immer auf Tasten drücken muß ?
Dies geht am einfachsten mit dem CC2Net.de-Download-Tool V2.x .
Mit diesem kann man den Hostmode einleiten, das Programm übertragen und die CC2
anschließend wieder starten.
 
Kann man Programm auch über eine Modem-Verbindung laden ?
Prinzipiell funktioniert dies.
Jedoch ist ein entsprechendes Tool erst in der Entwicklung und es kann noch ein wenig dauern,
bis es verfügbar sein wird.
 
Die Relais der C-Control II Station schalten die ganze Zeit, ohne
daß ich sie ansteuere ! Was ist da los ?
Dies liegt an einem kleinem Bug der original Stationtreiber und an einem Layoutfehler
in der Station selbst. Es fehlt leider ein Pull-Down-Widerstand an Strobe.
Werden die original-Stationtreiber verwendet, sollte bei einem Programmstart entweder
Port P1L.3 auf low gesetzt oder die Relais einmal angesteuert werden. (z.B. Ausschalten)
Bei den alternativen Stationtreiber mit stports.c2 wird dies durch den Aufruf von stports.init()
erledigt und auch alle extra Station-Ports, die am internen SR hängen, auf low gesetzt.
(LEDs, Ports PO.0 bis PO5, Relais)
 
Wie finde ich die Größe meines Programms heraus ?
Wieviel Platz belegt mein Programm ?
Dies findet man am einfachsten heraus, wenn man die VMC-Datei des Projekts mit einem
Texteditor wie Notepad öffnet.
In der zweiten Zeile kann man die Anzahl der Konstantenbytes ablesen und
in der dritten Zeile die Anzahl der VMC-Words.
Die Anzahl der VMC-Words muß man zuerst mit zwei multiplizieren bevor man
den belegten Speicherplatz des Programms erfährt.
Insgesamt dürfen Programme und Konstanten jeweils 128kByte, also 131.072 Bytes, belegen.
Das sind 65.536 VMC-Words.
 
Wie kann ich Daten ausfallsicher speichern ?
Bei der C-Control II ist es noch nicht möglich Benutzer-Daten im Flash zu speichern.
Dazu müssen externe Speicher benutzt werden. Am einfachsten kann man dies
mit seriellen EEProms vom Typ 24Cxx und dem Modul eeprom.c2 erreichen.
 
Ich erhalte bei der Programmausführung auf dem Mini-Display der Unit
die Meldung "ILL OPA". Was heißt das ?
Die Meldung "ILL OPA" bedeutet "Illegal Word Operand Access". D.h. es wurde auf eine 
ungerade Adresse des Speichers (Flash/RAM) zugegriffen. Beim 16Bit-Controller C164 müssen
Speicherzugriffe, sofern diese nicht Byteweise durchgeführt werden, immer an Geraden
Adressen stattfinden. Diese Meldung kann jedoch verschiedene Ursachen haben:
- Es wird noch die alte Compiler-DLL benutzt. Hier tritt der Fehler meist im Zusammenhang mit
  Byte-Array-Variablen auf, wenn ungerade Längen für diese angegeben werden. Es sollte auf jeden Fall
  die neueste Compiler-DLL(FIX3/Beta) benutzt werden.
- Ein ASM-Treiber wurde mit dem Original Download-Tool V1.5 geladen, während sich OSOPT in
  der CC2 befindet. Bzw. es wurde ein ASM-Treiber mit dem Original Download-Tool bis V1.3 geladen,
  während sich eine offizielle OS-Version in der CC2 befindet. (Am besten immer das
  CC2Net-.de Download-Tool V2.x verwenden. Dieses kann die OS-Version automatisch erkennen)
  In Fällen werden so das Lo-und High-Byte der 16Bit-Daten vertauscht, was zu diesem Fehler führt.
- In einer ASM-Routine wird mit einem Integer-Zugriff auf eine ungerade Adresse des Flash oder RAMs
  zugegriffen.(z.B. MOV R2, 051h)
 
Die Uhr fängt nach jedem Reset bei Null an. Ich benötige aber
sofort die aktuelle Zeit. Was kann ich tun ?
Hier wird ein externer Uhrenbaustein benötigt, der unabhängig von der CC2
laufen kann. Passende Platinen, basieren auf den I²C-RTC-Baustein PCF8583,
sind bei CCTools erhältlich. Angesteuert wird diese externe Uhr mit dem Modul pcf8583.c2 .
 
Was muß ich bei Berechungen beachten ?
Wie führe ich Berechnungen richtig durch ?
- Beim Dividieren mit anschließendem Multiplizieren kommt es immer meist zu Abweichungen, da es,
  außer bei float, keine Nachkommastellen gibt.
  Hier ist es Sinnvoller zuerst zu Multiplizieren und dann zu Dividieren:
  x=(a / b) * c // Bsp: x= (27 / 2) * 5 ergibt 65
  x=(a * c) / b // Bsp: x= (27 * 5) / 2 ergibt 67
- Beim Modulo-Operator (%) muß beachtet werden, daß dieser, anders als im Handbuch beschrieben,
  fälschlicherweise im Rang zwischen den Additions/Subtraktions und Schiebeoperatoren ausgeführt 
  wird. Deshalb sollte hier sicherheitshalber immer eine Klammer gesetzt werden. (Bsp: x=a+(b%c);)
- In vielen Berechnungen werden Nachkommastellen benötigt. Hier ist es aber of nicht nötig auf
  den float-Typ auszuweichen. Man kann Integer und Long sehr gut als Festkomma Zahlen verwenden.
  Da der Typ float viel Rechenzeit benötigt, ist dies oft von Vorteil.
  Bsp: 2 Kommastellen mit Integer. Hier bewegt sich der Wertebereich zwischen -327,68 bis +327,67
  Das Komma ist so nur Definitionssache und muß nur bei der Ausgabe (z.B: am LC-Display) manuel
  gesetzt werden. (siehe Zahl-Funktionen in lcdext.c2)
  Allerdings muß man bei Multiplikationen und Divisionen beachten, daß sich das Komma "verschiebt",
  wenn zwei solche "Festkommazahlen" miteinander multiplizier/Dividiert werden.
  Bsp: (Festkomma mit einer Nachkommastelle) 2,5 * 4,1: hier wird 25*41 gerechnet und ergibt 1025.
  Dies entspricht 10,25. Kurz: das Ergebnis hat bei einer Multiplikation so viele Nachkommastellen, wie
  beide Multiplikatoren zusammen.
  Bei einer Division verhält es sich genau umgekehrt:
  (z.B. Festkomma mit 2 Nachkommastellen geteilt durch Festkomma mit einer Nachkommastelle)
  4,82 / 1,5: hier wird 482 / 15 gerechnet und ergibt: 32. Dies entspricht 3,2. Kurz: das Ergebnis hat bei
  einer Division so viele Nachkommastellen, wie die des Dividenten minus des Divisors.
- Berechnungen mit Zahlen größer als der Integerbereich bzw. mit Float siehe nächster Punkt.
 
Ich bekomme bei Berechnungen mit Long/Float immer falsche Ergebnisse.
Was mache ich falsch ?
Berechnungen laufen prinzipiell immer im Integerbereich ab, außer einer der Werte besitzt den Typ Float
oder Long.
Werden z.B. zwei Integer-Werte miteinander multipliziert und das Ergebnis liegt außerhalb
des Integerbereichs, so kommt es einem Überlauf des 16Bit-Werts. Dabei spielt es keine Rolle, ob
das Ergebnis in einer Long oder Float-Variable gespeichert werden soll.
Bsp:
long x; int a,b;
a = 9500;
b = 15;
x= a * b;
Als Ergebnis würde man jetzt 142.500 erwarten. Dieser Wert liegt jedoch außerhalb des Integerbereichs
und es werden nur die ersten 16Bit der Zahl beachtet: 142500 = 0x15BE68 Als Ergebnis wird
0xBE68 verwendet, was wiederrum die Integer-Zahl 48744 ergibt.
Bei solchen Berechnungen muß mindestens eine der Variablen vom Typ des Ziel-Typs für das Ergebnis
sein, damit diese Berechnung korrekt durchgeführt wird:
long x,a intb;
a = 9500;
b = 15;
x= a * b;
oder, wenn a weiterhin Integer sein soll:
long x; int a,b;
a = 9500;
b = 15;
x = a;
x= x * b;

Ähnliches gilt für Float-Berechnungen. Die Berechnung wird erst als Float behandelt, wenn mindestens
ein Wert vom Typ-Float ist. Egal ob Konstante oder Variable:
Bsp:
float x; int a;
a=154;
x = a / 10;
Hier ist das Ergebnis 15, da die Berechnung zuerst als Integer durchgeführt wird.
Es gibt nun zwei Möglichkeiten, dies zu lösen:
1. Man setzt einen der Werte in eine float-Variable:
float x; int a;
a=154;
x= 10;
x = a / x;
2. Man ändert die Berrechnung so, daß die Konstante schon vom Typ Float ist:
float x; int a;
a=154;
x = a * 0.1;
 
 
 
Was muß ich bei der Verwendung der seriellen Schnittstelle (hwcom) beachten ?
Laut Spezifikationen kann man hwcom bis 115.200 Baud verwenden.
Jedoch ist hier die Abweichung der Geschwindigkeit so groß, daß nur wenige Geräte mit der CC2
kommunizieren können. Daher sollte mit max. 57.600 Baud gearbeitet werten, um dieses Problem zu
umgehen.
Bei hwcom sollte man bevorzugt immer mit Hardwarehandshake arbeiten, um Pufferüberläufe
zu verhindern. Im Betriebssystem ist das HW-Handshake fest implementiert.
Dazu müssen bei der CC2-Unit die Pins dig. RTS mit µC RTS und dig. CTS mit µC CTS verbunden sein.
Beim CC2-StarterBoard und CC2-ReglerBoard ist dies z.B. der Fall.
Beim Appl.Board müssen hier die entsprechenden Jumper gesetzt werden.
Bei der CC2-Station sind leider keinerlei Handshakeleitungen herausgeführt, sodaß man hier
nur ohne Hardwarehandshake arbeiten kann.

Man sollte bei den seriellen Schnittstellen immer nur mit einem Thread zugreifen.
Ansonsten wären erweiterte Captures und ein umfangreicheres Protokoll notwendig.
Das Einlesen von Daten darf nur von einem Thread erfolgen ! 
 
 
Warum werden die Zeichenfolgen/Bytearrays beim Senden mit hwcom.print() oder
hwcom.send() verstümmelt ?
Das Senden von Datenrahmen geschieht bei den seriellen Schnittstellen im Hintergrund in einem
eigenen im OS implementierten Thread. An diesen wird lediglich die Startadresse und die Länge
des Datenrahmens im RAM als Referenz übergehen.
D.h. die Funktion zum Senden kehrt bereits zum C2-Programm zurück, bevor der zu sendende
Datenrahmen komplett gesendet wurde.
Wird z.B. einem String nach Übergabe an hwcom.print2() ein neuer Text zugewiesen oder gelöscht,
dann wird ab der Stelle des Strings, wo sich die Senderoutine gerade befindet, der neue String bzw.
Null-Zeichen ausgegeben.
Bsp.:
string s;
s="Das ist ein Test";
hwcom.print2(s);
s="Ein anderer Text";

Man sollte daher immer vor den schreibenden Zugriff auf die zu sendende Stringvariable/Bytearray
immer auf hwcom.ready() prüfen.
Wird mit beim Senden mit Stringvariablen gearbeitet, empfiehlt es sich zwei verschiedene abwechselst
zu benutzen, um dieses Problem zu umgehen. Die Abarbeitung ist hier sogar schneller, als wenn
man nur eine Stringvariable verwendet und immer auf hwcom.ready() wartet.
Bsp.:
string s1,s2;
s1="Das ist ein Test"+13+10;
hwcom.print2(s1);
s2="Ein anderer Text"+13+10;

hwcom.print2(s2);
s1="Und noch ein paar Zeichen"+13+10;
hwcom.print2(s1);

 
Was ist ein Capture und wofür benötige ich dieses ?
Ein Capture dient dazu den gemeinsamen Zugriff auf Ressourcen (Ports, Schnittstelle, Variablen)
zu kontrollieren.
Ein Capture benötigt man sobald mind. zwei Threads auf eine Ressource schreibend zugreifen.
Beim I²C-Bus ist beispielsweise ein eigenes Capture implementiert, damit mehrere Threads
beliebig auf den I²C-Bus zugreifen können, ohne daß hier ein "Durcheinander" geschieht.
Eine weitere Möglichkeit für ein Capture wäre die Ausgabe auf ein LCD mit zwei Threads:
byte flag;
thread a
{
 //... Routinen vor der LCD-Ausgabe, z.B. Datenaufbereitung
 //...
 capture flag;
  lcdext.line(1);
  lcdext.print(text);
  lcdext.zahl(xy);
  lcdext.line(2);
  lcdext.zahl(xx);
 release;
 //... Routinennach LCD-Ausgabe
 //...
}

thread b
{byte second;
 wait second!=system.second();
 second=system.second();
 capture flag;
  lcdext.line(3);
  lcdext.time(0);
  lcdext.date(0);
 release;
}


Das ist natürlich nur ein Beispiel.
Die nächste Anwendung wären z.B. Arrays. Hier kann es erforderlich sein, daß während
des Füllens auch keine Lesezugriffe erwünscht sind, da hier teilw. neue und teilw. alte Daten
aus dem Array entnommen werden könnten.
Hier muß dann wieder in allen Stellen im Programm der Zugriff geschützt werden.
Das Capture wird bei der/den schreibende(n) Routine(n) gesetzt, bevor der erste Wert geschrieben
wird, und wieder gelöst, wenn der letzte Wert geschrieben wurde.
Genauso wird bei den lesend zugreifenden Routinen vor dem Zugriff ein Capture gesetzt und danach
wieder gelöst.

In manchen Anwendungen kann es erforderlich sein, daß man ein verschachteltes Capture benötigt.
Da dies mit dem systemseitigen Capture nicht möglich ist, muß man hierfür das Modul cap.c2
verwenden. Mehr Infos dazu sind in der Hilfe-html zu diesem Modul.

Sollen relativ kurze Programmstücke gecaptured werden, so kann man dies auch
ohne Capture realisieren, indem man die Prio eines Threads hochsetzt und anschließend
die Ausführung an den nächsten Thread abgibt. Bekommt der eigentliche Thread wieder
Rechenzeit, so werden die nachfolgenden Anweisungen in einem Stück ausgeführt, sofern
diese nicht mehr VM-Codes haben, wie die Prio mit run festgesetzt wurde:
//...
run 255;// neue Prio= 255 VM-Intruktionen in einem Stück
yield; // Threadwchsel, danach 255 VM-Instruktionen bevor nächster Wechsel
// .. Routinen
resume; // alte Prio
//..


 
 

Stand: 23. April 2004