Hallo, ich bin gerade dabei einen Mikrocontroller (Infineon C515C) zu programmieren. Dabei stehe ich momentan vor dem Problem der Initialisierung. Bisher war ich es so gewöhnt, dass ich die verschiedenen Ports zu Beginn des Programms als Aus- oder Eingänge deklarieren musste. Das Ganze sah dann i.d.R. in etwa so aus.... " ... P3_DIR = 0x00; // P3 als Eingang definiert P0_DIR = 0xFF; // P0 als Ausgang P1_DIR = 0xFF // P1 als Ausgang ... " Mit dem aktuellen Mikrocontroller habe ich leider bisher noch nicht gearbeitet. Über das Handbuch werde ich leider nicht wirklich schlau. Im Bereich zu den Ports heißt es, dass der Mikrocontroller mit "quasi - bidirectional" Ports ausgestattet ist. Was das für die Programmierung bedeutet erschließt sich mir nicht aus dem Handbuch. Über die "Suche" und google komme ich leider auch nur auf bedingt hilfreiche Infos. In einem Thread habe ich gelesen, dass man die Ports scheinbar ohne besondere Definition als Ein- und Ausgänge verwenden kann. Kann mir denn jm etwas genauer beschreiben, was es damit auf sich hat?! Der Vollständigkeit wegen noch kurz eine Beschreibung, was mit den Ports passieren soll: An zwei der Pins von P3 sollen externe Taster angeschlossen werden, die bei Betätigung einen Interrupt auslösen sollen. An P0 und P1 sollen jeweils 3 LEDs geschalten werden. Mit freundlichen Grüßen Michael
Beim C515 handelt es sich um einen aufgemotzten 8051. Port = 0 bedeutet 'Ausgang auf low' mit ein paar mA Treiberleistung. Port = 1 bedeutet 'Pin als Eingang' und 'gebe high aus' mit ein paar µA Treiberleistung. Aus diesem Grund werden LEDs etc. beim 8051 immer lowaktiv angeschlossen, weil er da wesentlich mehr mA treiben kann. Im Datenblatt kannst du nachlesen wieviel mA/µA das jeweils sind. Ausserdem sollte im C515 UserManual im entsprechenden Kapitel zu den IOs auch beschrieben stehen was quasi-bidirektional bedeutet. Noch Fragen? =) Ralf
Danke für die schnelle Antwort :) Leider komme ich immer noch nicht ganz mit :P Da die Ausgangsströme extrem gering sind, sollen die LEDs über Transistorstufen geschalten werden - s. Anhang. Ralf schrieb: > Ausserdem sollte im C515 UserManual im entsprechenden Kapitel zu den IOs > auch beschrieben stehen was quasi-bidirektional bedeutet. Naja, da steht einiges, aber leider tue ich mich schwer damit, die Angaben nachzuvollziehen ;) Ralf schrieb: > Port = 0 bedeutet 'Ausgang auf low' mit ein paar mA Treiberleistung. > Port = 1 bedeutet 'Pin als Eingang' und 'gebe high aus' mit ein paar > µA Treiberleistung. Soll das heißen, dass ich die Ports generell einfach als Ausgänge nutzen kann und einfach über die entsprechenden Befehle die einzelnen Bits setzen kann?! Es ist also keine Initialisierung der Ports notwendig?! Bsp.: "P1_DATA = 1" --> Die einzelnen Pins von Port 1 haben die Werte 00000001 ?! Und wenn ich einen Pin als Eingang nutzen will, muss ich ihn zuvor mit einer 1 beschreiben?! MfG
> Ralf schrieb: >> Port = 1 bedeutet 'Pin als Eingang' und 'gebe high aus' mit ein paar >> µA Treiberleistung. Zusätzlich wird während des Schreibvorgangs auf das Port noch kurzzeitig etwas mehr "high"-Strom ausgegeben, um den Ausgang schneller umzuschalten. Michael G. schrieb: > Und wenn ich einen Pin als Eingang nutzen will, muss ich ihn zuvor mit > einer 1 beschreiben?! Ja. Gruß Dietrich
Toll, wie schnell hier die Antworten kommen :) Michael G. schrieb: > Soll das heißen, dass ich die Ports generell einfach als Ausgänge nutzen > kann und einfach über die entsprechenden Befehle die einzelnen Bits > setzen kann?! Es ist also keine Initialisierung der Ports notwendig?! > Bsp.: "P1_DATA = 1" --> Die einzelnen Pins von Port 1 haben die Werte > 00000001 ?! So richtig? Dietrich L. schrieb: >> Und wenn ich einen Pin als Eingang nutzen will, muss ich ihn zuvor mit >> einer 1 beschreiben?! > Ja Das Ganze fällt aber weg, wenn ich den Pin für Interrupts nutzen will, oder? Ich möchte an 2 Pins, auf negative Flanken getriggert Interrupts auslösen, dies sollte ja automatisch dann funktionieren, oder?! Ich habe dazu die Einstellungen für die Interrupts entsprechend vorgenommen... " IT1 = 1; // Externer Interrupt 1 auf fallende Flanke getriggert IT0 = 1; // Externer Interrupt 0 auf fallende Flanke getriggert EAL = 1; // Individuelle Einstellung für Interrupts freigeben EX1 = 1; // Externer Interrupt 1 freigegeben EX0 = 1; // Externer Interrupt 0 freigegeben " Die beiden externen Interrupts sind laut Handbuch mit zwei Pins an P3 verknüpft. Wenn ich an diese beiden Pins dann die beiden Taster anschließe und bei Betätigung auf Masse durchschalte, sollte ja bei jeder Betätigung die Interrupt-Routine ausgeführt werden, oder? MfG
Michael G. schrieb: > Michael G. schrieb: >> Soll das heißen, dass ich die Ports generell einfach als Ausgänge nutzen >> kann und einfach über die entsprechenden Befehle die einzelnen Bits >> setzen kann?! Es ist also keine Initialisierung der Ports notwendig?! >> Bsp.: "P1_DATA = 1" --> Die einzelnen Pins von Port 1 haben die Werte >> 00000001 ?! > So richtig? Ja. > Dietrich L. schrieb: >>> Und wenn ich einen Pin als Eingang nutzen will, muss ich ihn zuvor mit >>> einer 1 beschreiben?! > >> Ja > > Das Ganze fällt aber weg, wenn ich den Pin für Interrupts nutzen will, > oder? Nein. Aber es reicht ja, wenn Du es bei der Initialisierung 1x machst und später keiner mehr den Port-Pin auf 0 schreibt. > Wenn ich an diese beiden Pins dann die beiden Taster > anschließe und bei Betätigung auf Masse durchschalte, sollte ja bei > jeder Betätigung die Interrupt-Routine ausgeführt werden, oder? Beachte, das Taster prellen, Du also mehrere Interrupts bekommst... Gruß Dietrich
Dietrich L. schrieb: >> Dietrich L. schrieb: >>>> Und wenn ich einen Pin als Eingang nutzen will, muss ich ihn zuvor mit >>>> einer 1 beschreiben?! >>> Ja > >> Das Ganze fällt aber weg, wenn ich den Pin für Interrupts nutzen will, >> oder? > > Nein. > > Aber es reicht ja, wenn Du es bei der Initialisierung 1x machst und > später keiner mehr den Port-Pin auf 0 schreibt. Das heißt, ich gebe in der Intialisierung einmal, auf den Pins, die den externen Interrupt unterstützen eine 1 aus und anschließend funktionieren die Pins als Eingänge und können auf die negative Flanke reagieren?! Wenn ich externe PullUp Widerstände habe, sollte der Pin automatisch auf 1 stehen, oder?! Kann ich mir dann sparen, eine 1 auszugeben?! Oben sieht man die Ansteuerung der LEDs...
Zum Thema "Prellen": Dietrich L. schrieb: >> Wenn ich an diese beiden Pins dann die beiden Taster >> anschließe und bei Betätigung auf Masse durchschalte, sollte ja bei >> jeder Betätigung die Interrupt-Routine ausgeführt werden, oder? > > Beachte, das Taster prellen, Du also mehrere Interrupts bekommst... Eigentlich wird das Ganze nicht über Taster, sondern über Relais geschalten. Wobei dabei die mechanischen Eigenschaften ähnlich sein dürften, sodass ich in diesem Fall auch mit "Prellen" rechnen muss, oder? Dem "Prellen" sollte softwaremäßig beizukommen sein, oder?! Dazu sollten sich Informationen im Netz oder Forum finden lassen, da muss ich mich noch schlau machen :) Gruß
Michael G. schrieb: > Wenn ich externe PullUp Widerstände habe, sollte der Pin automatisch auf > 1 stehen, oder?! Wie soll denn der externe Pullup eine 1 in das Ausgangsregister schreiben? > Kann ich mir dann sparen, eine 1 auszugeben?! Wenn Du sicher bist, dass der Portpin nach Power-On oder sonstwie nicht auf 0 steht. Ich würde es zur Sicherheit immer machen. Es lohnt sich wegen des einen Befehls kaum, stundenlang Datenblätter zu lesen und Scenarien durchzudenken, was ev. passieren könnte ... Bitte lies Dir einfach mal das Datenblatt durch. Da steht das Prinzipschaltbild der Ports drin + Beschreibung der Funktion. Gruß Dietrich
Michael G. schrieb: > Eigentlich wird das Ganze nicht über Taster, sondern über Relais > geschalten. Wobei dabei die mechanischen Eigenschaften ähnlich sein > dürften, sodass ich in diesem Fall auch mit "Prellen" rechnen muss, > oder? Ja. > Dem "Prellen" sollte softwaremäßig beizukommen sein, oder?! Das ist vermutlich bei Deiner Lösung mit Interrupt schwierig. Dann musst Du z.B. die Zeit zwischen zwei Interrupts messen, um zu entscheiden, ob es Prellen oder ein erneutes Drücken ist. Gruß Dietrich
Die Pins des 8051 sind beim Reset Eingang mit Pullup (außer P0), also schwaches high. Deshalb schaltet man Lasten am Ausgang üblicher Weise low-aktiv. Peter
Michael G. schrieb: > ich bin gerade dabei einen Mikrocontroller (Infineon C515C) zu > programmieren. Sicher, daß Du Dir diesen 8051-Veteran noch antun willst? Soweit ich weiß, ist der OTP, d.h. hat nichtmal Flash. Infineon hat ja inzwischen auch 8051 mit Flash, z.B. XC888. Da sind dann auch die IO-Pins konfigurierbar als richtige push/pull Ausgänge. Peter
Danke für die rege Beteiligung... Dietrich L. schrieb: >> Dem "Prellen" sollte softwaremäßig beizukommen sein, oder?! > > Das ist vermutlich bei Deiner Lösung mit Interrupt schwierig. Dann musst > Du z.B. die Zeit zwischen zwei Interrupts messen, um zu entscheiden, ob > es Prellen oder ein erneutes Drücken ist. Es sollte doch vl möglich sein, den entsprechenden Interrupt bei der ersten Betätigung zu deaktivieren und anschließend nach Timerablauf wieder zu aktivieren?! Die Zeiten, in denen sich das Prellen abspielt, und die, in denen ich manuell erneut drücke, sollten doch in versch. Regionen liegen, oder? Dietrich L. schrieb: >> Wenn ich externe PullUp Widerstände habe, sollte der Pin automatisch auf >> 1 stehen, oder?! > > Wie soll denn der externe Pullup eine 1 in das Ausgangsregister > schreiben? Stimmt - da lag eindeutig zu wenig Überlegen hinter meiner Aussage :P --> Ich übernehme das Ganze in die Initaliserung und führe es da aus. Muss/ soll ich és dann wiederholen, wenn der Interrupt einmal ausgelöst wurde, um wieder einen festen Zustand zu erreichen und für die nächste negative Flanke bereit zu sein?! Peter Dannegger schrieb: > Die Pins des 8051 sind beim Reset Eingang mit Pullup (außer P0), also > schwaches high. > > Deshalb schaltet man Lasten am Ausgang üblicher Weise low-aktiv. D.h. meine LEDs sind nach einem Reset erst einmal eingeschalten und ich muss die entsprechenden Ports auf 0 schalten, um den richtigen Zustand zu haben?! Mit einem kurzen aufleuchten beim Reset kann ich problemlos leben ;) Peter Dannegger schrieb: > Michael G. schrieb: > >> ich bin gerade dabei einen Mikrocontroller (Infineon C515C) zu >> programmieren. > > Sicher, daß Du Dir diesen 8051-Veteran noch antun willst? > Soweit ich weiß, ist der OTP, d.h. hat nichtmal Flash. > > Infineon hat ja inzwischen auch 8051 mit Flash, z.B. XC888. > Da sind dann auch die IO-Pins konfigurierbar als richtige push/pull > Ausgänge. Ja - das Ganze muss leider mit dem Controller erfolgen. Der µC ist in einem "Starter Kit" Board verbaut, das mir zur Verfügung steht. Ich poste bei Gelegenheit mal noch mein gesamtes Programm (also den aktuellen Stand) und eine Beschreibung der Funktion, die es erfüllen soll. Vl lässt sich das Ganze dann besser nachvollziehen. Mit freundlichen Grüßen Michael
So...anbei mal mein aktueller Stand - ich hoffe, dass keine extremen Fehler zu finden sind ;)
Michael G. schrieb: > ich hoffe, dass keine extremen > Fehler zu finden sind ;) Ein großer Fehler ist: Ein *.txt kann Dein Compiler nicht verarbeiten. Du mußt es *.c nennen. Und dann wird es auch im Forum richtig dargestellt. Peter
Peter Dannegger schrieb: > Ein *.txt kann Dein Compiler nicht verarbeiten. > Du mußt es *.c nennen. Das gehört zu den wenigen Sachen, die ich auch weiß :) - mir geht´s nur um den Inhalt ;) Peter Dannegger schrieb: > Und dann wird es auch im Forum richtig dargestellt. Wo liegt das Problem bei der Darstellung? Gruß
So...leider bin ich mir beim Handling der Ports immer noch nicht ganz sicher. Die genaue Befehlsfolge ist mir einfach noch nicht klar :P Szenario: Ich möchte den Zustand eines Pins einlesen - genau genommen möchte ich abfragen, ob ein Taster, der den Pin auf Masse schaltet gedrückt ist und dann eine Aktion ausführen. Wäre dementsprechend eine derartige Befehlskette richtig? void init (void) { sbit Taster1 = P2^0; // Definition der Variablen Taster1 }; void main (void) { while(1) { Taster1 = 1; // Pin als Eingang if (Taster1 = 0) {}; }; } Meiner Meinung nach, wäre die if-Bedingung nun nie erfüllt :P Gruß
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.