Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] tog pulse ON OFF...
chris152
28.03.2004, 13:55
edit: aus Datenschutzgründen entfernt
Matthias
28.03.2004, 14:14
tog: Wennd der Ausgang/flag auf 1 war wird er auf 0 gesetzt und wenn er auf 0 war auf 1
pulse: der Ausgang wird kurtz auf High gesetzt (gepulst)
=1: der Speicher/Ausgang nimmt die Dezimale Zahl "1" an
=0/=off: der Ausgang/Speicher setzt alles auf "0"
=on: der Ausgang/Speicher nimmt die Hexadezimale zahl "FFFF" an
deact: versetzt einen port in den Hochohmigen zustand (der port ist nun Eingang)
chris152
28.03.2004, 14:26
edit: aus Datenschutzgründen entfernt
Matthias
28.03.2004, 14:36
Nein, weil, wenn du ein ganzes Byte auf 1 haben willst und "=1" schreibst nur das allerletzte bit auf 1 gesetzt wird. wenn du "=on" schreibst, wird das byte auf &hFFFF gesetzt, also könntest du statt "=on" auch "=65535", aber nicht "=1", schreiben.
ok danke, was ich jetzt noch nicht verstehe, sind write und read, was wird da gemacht.. und n überlagert sich ja mit daten oder?
und deact is mir immer noch unklar..
Matthias
28.03.2004, 15:21
Wenn an deact PORT1 schreibt, ist dieser ein Eingang.
Wenn man Variablen definiert, ohne ihnen einen bestimmten bereich zuzuordnen, werden sie einfach der reihe nach definiert. Man könnte auch schreiben:
define daten byte [1]
define n word[2]
Meinst du mit write und read die Routienen oder die Befehle?
Matthias
ich mein, die routinen im programm oben!
wenn man deact sagt, wie kann man den dann wieder als ausgang nutzen, den port?
und überschreibt nicht das word ganz oben das byte daten?
Matthias
29.03.2004, 14:05
Indem du sagst
port_1=123
Eingentlich muss man die ports gar nicht deaktivieren. Das macht der Compiler automatisch.
Ich lass es auf jeden fall [fast] immer aus.
Matthias
zu pulse und tog, setzen die auf 1 und 0 oder auf ON und OFF?
und wozu is beim write oben der 9. impuls, der rest is mir jetzt klar..
Der 9. Impuls gehoert zum I2C protokoll und gibt den Bus frei fuer Antworten.
Manfred
wie ich das protokoll vestanden hab.. muss der empfänger der daten nach 8 bit immer ack oder nack geben, aber der 9. impuls is mir da noch nicht untergekommen..
und warum nur bei write..
wird eigenetlich darauf eingegangen, wenn der slave nack sendet? das wird ja nicht überprüft .. hmm komisch
Ich meine, die Erlärungen oben stimmen nicht ganz:
1. PULSE:
Macht nicht einen HIGH Puls, sondern invertiert den aktuellen Zustand kurzzeitig: Wenn's vorher HIGH war, macht PULSE einen LOW Puls, sonst einen HIGH Puls.
2. DEACT:
Schaltet einen Port um auf "Eingangs-Richtung". Den Befehl braucht man wirklich: Nur das Umschalten auf "Ausgangs-Richtung" passiert automatisch (nämlich sobald man was auf den Port schreibt); Umschalten auf "Eingangs-Richtung" MUSS man immer manuell (mit DEACT). Man braucht DEACT nur dann nicht hinschreiben. wenn der Port vorher noch nie Ausgang war (nach dem Programmstart sind alle Ports auf "Eingangs-Richtung").
I2C und ACK / NACK / 9. Impuls:
Stimmt:
Auf dem I2C-Bus muss der Empfänger jedes Byte mit ACK oder NACK quittieren. Deshalb werden für jedes Byte 9 Bits übertragen: 8 Bits vom Sender zum Empfänger, und ein Bit (nämlich entweder ACK oder NACK) vom Empfänger zum Sender.
9. Impuls nur beim WRITE:
Das Basic Programm gilt für einen I2C Bus Master: Das ist derjenige, der die SCL Leitung bedient, hier die CC1.
Wenn der Master was sendet (Aufruf WRITE), schickt er zuerst seine 8 Daten-Bits jeweils mit einem SCL Puls raus, und gibt dann den 9. Puls zum Einlesen der Quittung vom Empfänger.
In diesem Programm wird allerdings die Quittung des Empfängers (absichtlich) nicht ausgwertet.
Wenn man die Quittung auswerten will, dürfte es nicht heissen
PULSE SCL
sondern müsste so ähnlich heissen wie
DEACT SDA 'SDA ist jetzt Eingang
SCL = ON
Daten = SDA ' Quittung lesen
SCL = OFF
Beim READ gibt's natürlich auch einen 9. Impuls; nur sieht man den nicht in dem BASIC-Ausschnitt oben:
Der Master muss nach dem Lesen eines Bytes entweder "ACK" oder "NACK" aufrufen, und genau da wird dann das 9. (quittungs-)Bit mit PULSE übertragen.
ok supi danke vielmals ;)
warum wird das absichtlich nicht ausgewertet, das ack bzw. nack?
verwendet pulse jetzt =1/=0 oder =ON/=OFF?
kannst du mir vielleicht noch die asm-variante erklären: http://www.the-starbearer.de/Praxis/Microkontrollerpraxis/ccontrol/CControl-I%B2C.htm#i2csystem
ist der i2c-bus jetzt tatsächlich vorhanden auf der c-control unit oder wird der nur emuliert (weil ja 2 beliebige digiports)
Na ja, ich würde mal sagen: "mit dieser Software konnen die beiden Ports als I2C Bus genutzt werden".
Mit der asm-variante können zwei andere Ports als I2C-Bus genutzt werden, und zwar die beiden Ports, die die CC1 auch selbst als I2C-Bus benutzt, um mit dem EEPROM Daten auszutauschen. Dieser Bus hat eine ganz erheblich grössere Datenübertragungsrate.
ON und OFF sind nur andere Schreibweisen: OFF ist 0 (ein WORD mit lauter 0), und ON ist -1 (ein WORD mit lauter 1).
Warum nicht ausgewertet: eigentlich aus Bequemlichkeit:
Ein Slave am I2C-Bus sollte immer ACK sagen, wenn man ihm was sendet. Wenn er das nicht tut, ist irgend was faul, zum Beispiel: Er ist kaputt, oder nicht (richtig) angeschlossen, oder ... -- und was soll man jetzt im Programm machen? Wird auf jeden Fall schwierig und kommt selten vor (hofft man zumindest, als Programmierer).
Aus Bequemlichkeit macht man deshalb im Programm gar nichts spezielles (frägt nicht mal ab, ob die Übertragung überhaupt gut gegangen ist), sondern tut so, als wäre schon alles OK.
Und der Anwender des Programms wundert sich dann, wenn nicht das passiert, was er erwartet hat, und schimpft über die Hardware, oder die Programmierer, oder das Leben an sich. Zumindest aber über Bill Gates und Windows.
ok danke..
ich hab gesehen, dass man statt sda=ON auch deact sda machen kann.. das hat irgendwas mit dem ausgabetreiber des tristate zu tun.. aber ich versteh nicht ganz was!
Heißt einfach, das der Controller dann den Bus freigibt -> durch den Pull-up Widerstand hat man dann einen High Pegel.
So einfach ist das also ;)
jo, kannst du mir das genauer auch erklären?
"DEACT port" ist NICHT dasselbe wie "port = ON":
Die CC1 hat intern für jedes Bit eines Ports ein "Datenrichtungs-Register" (DDR). Das DDR schaltet dann einen Ausgangs-Treiber ein oder aus (je nach Richtung). Der Eingangs-Puffer des Ports ist dagegen immer aktiviert und hängt zwischen Ausgangs-Treiber und dem Pin zur Aussenwelt.
Der genaue Hardware-Aufbau eines CC1 Ports inkl. DDR ist zum Beispiel in "Understanding HC05 Family" beschrieben, nur verstehe ich leider die Konsequenzen nicht ganz; da spielt vermutlich auch der Begriff "TriState" auch eine Rolle.
Egal:
Das DDR wird bei jeder CCBASIC Ausgabe-Anweisung (z. B. "port = on") von CCBASIC automatisch auf "Richtung = Schreiben" gesetzt (d.h. der Ausgangs-Treiber wird aktiviert), und erst dann wird das Bit in das Register geschrieben und über den Ausgangs-Treiber an den Pin weiter gereicht.
Mit "DEACT port" setzt CCBASIC das DDR dagegen auf "Richtung = Lesen" - der Ausgangs-Treiber wird abgeschaltet.
Mit "port = ON" passiert jetzt vermutlich folgendes:
1. Der Ausgangs-Puffer wird aktiviert, die "1" wird ins Register geschrieben, der Ausgangs-Puffer leitet das Ergebnis an den Pin weiter.
2. ABER: Eine "1" am Ausgang bedeutet NICHT "5 V anlegen", sondern bedeutet "nicht auf 0 V durchschalten" ( --- das hat der "Manf" mal hier so erklärt; vielleicht kann er mehr dazu sagen).
3. Mit "var = port" wird jetzt der momentane Wert über den Eingangs-Buffer eingelesen. Dieser Wert besteht aus dem "nicht nach 0 durchgeschaltet" des Ausgangs-Treibers, vermischt mit den "externen" Spannungen/Strömen (??) am Pin.
4. Das Ergebnis ist wahrscheinlich dasselbe wie mit "DEACT port", ABER NUR, FALLS nicht irgend welche elektrische Geschichten (Kombination von Spannungen, Strömen, Widerständen, Kapazitäten...) dagegen sprechen -- und mit denen kenne ich mich nicht aus.
Hallo Manf: kannst Du das richtig erklären?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.