Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Port Definition notwendig?!


von Michael G. (magoo)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Michael G. (magoo)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

> 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

von Michael G. (magoo)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

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

von Michael G. (magoo)


Angehängte Dateien:

Lesenswert?

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...

von Michael G. (magoo)


Lesenswert?

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ß

von Dietrich L. (dietrichl)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Michael G. (magoo)


Lesenswert?

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

von Michael G. (magoo)


Angehängte Dateien:

Lesenswert?

So...anbei mal mein aktueller Stand - ich hoffe, dass keine extremen 
Fehler zu finden sind ;)

von Peter D. (peda)


Lesenswert?

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

von Michael G. (magoo)


Lesenswert?

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ß

von Michael G. (magoo)


Lesenswert?

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
Noch kein Account? Hier anmelden.