Forum: Mikrocontroller und Digitale Elektronik unterschied zwischen direction und ausgabe


von Scales O. (scales)


Lesenswert?

ich versteh etwas mi den I/O-Ports nicht:

angenommen ich will P3 für den Input verwenden,
dann müsste ich ihn erstmal auf Input stellen:

mov P3,#0ffh

aber was, wenn ich ihn nicht auf Input stellen will,
sondern Werte ausgeben (also die Spannung erhöhen, wenn ich das richtig
weis)
wenn ich also jeden Pin von P3 auf 1 stellen will (das meinte ich mit
Werte ausgeben)
dann würde ich das ja genauso machen:

mov P3,#0ffh

also wie soll man das Unterscheiden?

oder gibts Ports die nur für Input sind und welche die nur für Output
sind?
bei den AVR Dingern gabs immer ein extra Register um die Direction ein
zu stellen

von Mischa W. (luchs2a)


Lesenswert?

nur kurz
beim avr gibts 3 register
1.  das direktion register  DDRb sagt ob ein oder ausgang
3. das "inputregister" gibt aktuellen zustand zurück
3.1  das ausgaberegister wenn der port / pin ein ausgang ist. steht
dort drin welche spannung ausgegeben wird 0V oder 5V nix mit erhöhen!
3.1 das selbe register aber wenn es ein eingang ist wird heir
festgelegt ob der pull up widerstand zugeschaltet wird.

was aber zuerst machen solltest ist LESEN
1. das AVR-tutorial auf dieser seite der 2. link von oben
2. http://www.avr-asm-tutorial.net dieses
und noch vieles  mehr du machst sonst nur was kaputt

von Mischa W. (luchs2a)


Lesenswert?

oder mal ne grundsatzfrage  meinst du eigentlich die avr kisten oder
.... nen anderen µc ?
ja allgemein gibts prozessoren dei nur outs oder nur in haben

von crazy horse (Gast)


Lesenswert?

er redet vom 8051...
Und im Prinzip ist es so, wie du es beschreibst.

von Scales O. (scales)


Lesenswert?

ah mist, sorry, hab vergessen zu sagen dass ich 8051er meine

>>ja allgemein gibts prozessoren dei nur outs oder nur in haben

wie darf ich das jetzt verstehen?
ich denk mal du meinst, es gibt PINS die nur outs oder nur ins haben

ich hab das Ganze aus dem Tutorial:
http://www.erikbuchmann.de/

Zitat:
"Ein Pin des Microcontrollers hat grundsätzlich zwei Funktionen zu
erfüllen: Zum einen die Aufnahme des anliegenden Wertes als Input, zum
anderen die Ausgabe des darauf geschriebenen Wertes als Output."

Er schreibt EIN Pin hat ZWEI Funktionen, also müssen die Pins
eigentlich beides können
oder gibts vielleicht Pins die man gleichzeitig mit P1 und P3 oder
sowas ansprechen kann?

und was sollte es dann eigentlich bringen einen Pin, der angenommen mal
nur für Input wäre, auf Input zu stellen?
Oder heist dass das ich dadurch eine Spannung auf den Pin lege?

und welche Pins sind dann eigentlich Input und welche Output?
soweit ich weis gibts P1, P2, P3, P4
aufjedenfall ist P1 dann für Output und P3 für Input,
sonst würde das Tutorial keinen Sinn ergeben,
aber was ist mit P2 und P4?
und wa sist mit controllern die mehr Pins haben wie andere?

von norad (Gast)


Angehängte Dateien:

Lesenswert?

@scales

Zuerst mal solltest Du mal ins Datenblatt deines 8051 µC schauen, dort
steht nämlich drin wie die Portausgänge intern beschaltet sind.

Grundsätzlich sind die Ports wie im Anhang aufgebaut.

Also:

Mit  MOV   P1,#0FFh   werden lauter 1 ins Port-Latch gerschrieben,
dadurch wird der Transistor T2 gesperrt.

Also beim Lesen von Informationen vom Port-Pin sollte T2 gesperrt
sein.

So! Nun gibt es Befehle die den Inhalt des Port-Latch lesen und andere
die den Pegel am Port-Pin lesen.

Befehle die vom Port-Latch lesen bezeichnet man al Read-Modify-Write
Befehle.

D.h. alle Befehle bei denen der Port bzw. eine Port-Leitung das Ziel
ist, lesen das Port-Latch aus und nicht den Pin.

z.B.     ANL   P1,A

Also bei Eingabe mit

           MOV  P1,#0FFh
           MOV  A,P1
liest Du auf jedenfall die Informationen an den Port-Pins.


Bei der Ausgabe mit  MOV P1,A  werden alle Port-Latch beschrieben
abhänig vom Akkuihnhalt.

Willst Du z.B. P1 als Ein- und Ausgabe benutzen, solltest Du nicht
die Eingangs-informationen mit den Ausgangs-Informationen verodern oder
verunden  sonst gibts böse Überraschungen.
Schön nach EVA prinzip arbeiten.

Noch was! P0 und P2 werden normalerweise für den Zugriff  auf den
Externen Datenspeicher benutzt.
Hast Du keinen kannste die als Ein-Ausgänge benutzen.
Der Port 0 hat normalerweise keine Internen Pull-Ups die musste extern
beschalten sonst haste nur flattern drauf wenn der als Eingang benutzt
wird.

Ich hoffe dem Verständnis weitergeholfen zuhaben.

Gruß Norad

von Scales O. (scales)


Lesenswert?

danke, jetzt hab ichs einigermasen verstanden
eine Frage hätt ich noch:

mov P3,#11111111b
mov P1,P3

hier wird in der 1.Zeile P3 ja auf Input gestellt
in der 2. Zeile soll dann laut dem Tutorial die Werte von P3 auf P1
angelegt werden
aber nach dem was du geschrieben hast müsste dann doch das Zeug in P3
in den Port-Latch von P1 geschrieben werden

und wie funktioniert dann überhaupt der Output?
wenn ich in P3 etwas ausgeben will und

mov P3,#10001011b

schreibe, schreibe ich ja ins Port-Latch

von peter dannegger (Gast)


Lesenswert?

Der 8051 hat open-drain outputs, d.h. die 0 ist dominant und die 1 ist
rezessiv (kann extern auf 0 gezogen werden).

Zusätzlich sind 3 pullups drin (stark, mittel, schwach). Der schwache
ist immer an (~50µA), der mittlere nur bei high (~0,5mA) und der starke
(~5mA) nur für 2 Takte beim Setzen von 0->1, um eine steile Flanke zu
erreichen.

Der starke ist auch bei externen Speicheranschluß aktiv, dann aber
während des gesamten MOVX-Zugriffs und dann hat auch P0 den starken
Pullup (P0 hat sonst gar keinen).

Eine Richtungsumschaltung ist also nicht nötig und gibt es daher gar
nicht. Daher lassen sich I2C, 1-Wire usw. ganz leicht in Software
basteln.
Man kann auch bei Vernetzung mehrerer MCs über die UART einfach alle
RXD und TXD parallel schalten.


Peter

von Scales O. (scales)


Lesenswert?

ah, jetzt hab ich das mit der richtung verstanden,
wenn ich

mov P3, #0ffh

tut theoretisch den Input öffnen und auf P3.0 - P3.7 eine logische 1
ausgeben

aber warum muss man das dann überhaupt am Anfang machen um von P3 lesen
zu können?
Standardeinstellung nach einem Reset ist doch sowiso ffh

von crazy horse (Gast)


Lesenswert?

mov P3, #0ffh
man muss es nicht unbedingt so machen, aber man kann...,

Peter D. ist ein grosser Freund dieser I/O-Struktur, ich finde es eher
eine behelfsmässige Krücke.
Nachteile:
-kein nennenswerter Strom bei H-Pegel
-verbraucht allerhand Strom, manchmal kommts drauf an, sobald der Pin
auf L geht, egal ob intern oder extern

Ich finde die Portstruktur beim AVR deutlich besser, und wenn man will,
kann man das Verhalten nachbilden.

von Scales O. (scales)


Lesenswert?

das versteh ich jetzt nicht, von welchen Strukturen redest du?
so wie ich das jetzt verstanden habe, müsste das gleiche rauskommmen,
wenn man

mov P3, #0ffh

weglässt, da im Reset Zustand eh alle Pins auf 1 sind,
also warum sollte man sie nochmal auf 1 Stellen?

von crazy horse (Gast)


Lesenswert?

war vielleicht missverständlich ausgedrückt. Es steht nach reset auf
0xff, es schadet aber auch nicht, wenn du es noch mal machst. Und es
kann sogar von Nutzen sein, wenn du den Chip komplett initialisierst.
Es ist übersichtlicher, und die manchmal gewünschte Funktion eines
Software-reset steht  dir dann zur Verfügung (jmp 0), da werden dann
nämlich die power-on Resetzustände nicht automatisch eingestellt.
Falls irgendwann die letzten Bytes im Programmspeicher fehlen sollten,
kannst du die paar Init-Zeilen ja auch wieder auskommentieren. Laufzeit
spielt nach Reset i.a. auch keine Rolle.

von norad (Gast)


Lesenswert?

@Scales

Wer lesen kann ist klar im vorteil. siehe oben

>aber warum muss man das dann überhaupt am Anfang machen um von P3
>lesen.

>Mit  MOV   P1,#0FFh   werden lauter 1 ins Port-Latch gerschrieben,
>dadurch wird der Transistor T2 gesperrt.

Schau  dir das Schaltbild genauer an dann wird dir ein Licht aufgehen.


Wenn Du es nicht machst den Port den Du verwenden möchtest mit #0ffh zu
initialiseren werden nur dort informationen an den Pins geändert wo
zuvor der Port-Latch ne 1 eingeschrieben wurde alle anderen werden eine
0 einlesen, weil ja T2 leitet und den Port-Pin auf masse zieht.

Also wenn als Eingang ein Port verwendet wird immer mit 0ffh
initialisieren dies brauch aber nur einmal geschehen solange am
gleichen Port nichts ausgegeben wird.

Ist dir das jetzt klarer geworden???

Gruß Norad

von peter dannegger (Gast)


Lesenswert?

>aber warum muss man das dann überhaupt am Anfang machen um von P3
>lesen.

Garnichts, nachm Reset sind alle Ports auf 0xFF.

Allerdings gibt es einige 8051 (Philips LPC900-Serie), da kann man auch
festlegen, daß die Portpins nachm Reset low sein sollen und auch, daß er
als Gegentakt-Ausgang arbeiten kann.


Peter

von norad (Gast)


Lesenswert?

@Peter

Bring den Jungen nicht durcheinander.

Du hast selbstverständlich recht das nach dem Einschalten oder einem
reset die Ports high sind.

Aber er wollte ja an dem selben Port ja was einlesen und wieder
ausgeben. Da sollte er schon das oben erwähnte beherzigen.

Nicht böse sein.


Gruß norad

von google hupf (Gast)


Lesenswert?

ich glaub nun hab ichs ungefähr verstanden,
durch was wird den überhaupt 1 signalisiert?
durch eine höhere Spannung?
oder ist 0 die höhere?

und wenn ja, welche Spannung ist 0 und welche 1?
kann es sein, dass das 0V und 5V sind?

von norad (Gast)


Lesenswert?

Klar und scharfsinnig erkannt! ;)

von google hupf (Gast)


Lesenswert?

also eine 0 ist 0V
und eine 1 ist 5V

das ist doch irgendwie dämlich,
beim starten werden ja alle Pins auf 1 geschaltet,
das heist alle angeschlossenen Geräte gehen dann erstmal an,
bis man die ganzen Pins wieder auf 0 stellt

wo ist da der Sinn?


und das mit dem Input und Output hab ich auch noch nicht ganz
verstanden:

also wenn ich

mov P1, 0ffh

schreibe, leg ich eine Spannung von 5V auf den 8 Pins an (also Output)

aber laut dem was oben geschrieben wurde landet

mov P1, 0ffh

im Port-Latch, um die 8 Pins für den Input zu aktivieren,
es wird also gar kein Wert ausgegeben

oder geht das gleichzeitig,
das Zeug wird in den Port-Latch geschrieben und ausgegeben?

leider hilft mir den Schaltplan auf den norad verwiesen hat nicht
weiter, da ich die Dinger noch nicht wirklich lesen kann

von peter dannegger (Gast)


Lesenswert?

@google hupf,

"das ist doch irgendwie dämlich,
beim starten werden ja alle Pins auf 1 geschaltet,
das heist alle angeschlossenen Geräte gehen dann erstmal an,
bis man die ganzen Pins wieder auf 0 stellt"


Du mußt nicht dämlich sein.
Mache die Schaltung einfach so, daß die Geräte low-aktiv sind, d.h. bei
0 angehen (Last gegen VCC).
Ob 0 oder 1 = An bedeutet, ist reine Vereinbarungssache.


Peter

von google hupf (Gast)


Lesenswert?

angenommen ich will eine einfache LED anschliesen
dann geht diese bei 5V und nicht bei 0V an

wie soll ich das ändern?

von niemand (Gast)


Angehängte Dateien:

Lesenswert?

@google hupf

leider hilft mir den Schaltplan auf den norad verwiesen hat nicht
weiter, da ich die Dinger noch nicht wirklich lesen kann

Schaltplan lesen ist elemantar wichtig um zuverstehen was da passiert.

Also kann man ich davon Ausgehen das Du von der Elektronik keinen
blassen schimmer hast, da kann man sich ja die Finger wund schreiben.

>angenommen ich will eine einfache LED anschliesen
>dann geht diese bei 5V und nicht bei 0V an

>wie soll ich das ändern?

Für dieses Beispiel (siehe Anhang) aufbauen und folgenden Code
Schreiben.


     CLR P3.0

     oder

     MOV P3,#00

Gruß norad

von norad (Gast)


Lesenswert?

@google hupf

Du hättest auch alles Lesen sollen was auf wwww.erikbuchmann.de/
steht.

Da steht alles ausführlich was Du Wissen musst.

µC progarmmieren und keine Ahnung von Elektronik passt irgendwie nicht
zusammen.


>INPUT

>Ein Pin des Microcontrollers hat grundsätzlich zwei Funktionen zu
>erfüllen: Zum einen die Aufnahme des anliegenden Wertes als Input,
>zum anderen die Ausgabe des darauf geschriebenen Wertes als Output.
>Beide Funktionalitäten sind vollständig unabhängig voneinander. Es
>ist mit ein wenig Unvorsichtigkeit leicht möglich, aus Versehen >einen
Pin kurzzuschließen und damit den Ausgangstreiber zu >zerstören, ohne
damit auch dessen Funktion als Input zu >beeinträchtigen. Ein so
beschädigter Chip kann sogar noch >programmiert und beschrieben werden,
nur das Vergleichen ist >natürlich nicht mehr korrekt möglich.
>Um einen Pin als Input zu verwenden, ist er unbedingt auf 1 zu
>setzen. In dieser Stellung wird der Pin nur von einem schwachen
>Pullup auf Vcc gezogen und kann von einer externen Beschaltung >leicht
auf 0 gebracht werden. Die Input-Funktion wird übrigends >keinesfalls
intern zwischengepuffert. Wenn man den Ausgang auf Masse >zieht, und
eine 1 herausschreibt, wird beim Zurücklesen eine 0 >gelesen. Es ist
also  leicht einzusehen, niemals mit einem Port >direkt zu rechnen, es
sei denn, er wird als Input genutzt.
>    Schleife:
>             inc P1
>             jmp Schleife
>
>Dieses Beispiel zählt also durchaus nicht immer P1 hoch - wenn auch
>nur ein Pin auf GND gezogen wurde, bleibt das Incrementieren an
>dieser Stelle stehen. Besser ist es also, folgendermaßen zu
>verfahren:
>    Schleife:
>             inc a
>             mov P1,a
>             jmp Schleife

von norad (Gast)


Angehängte Dateien:

Lesenswert?

@Google hupf

So wie im Anhang kann man es auch machen wenn es Low-Aktiv sein soll.

D.h. nach dem Einschalten oder Reset werden die Ports auf High = 5V =
Logisch "1" gesetzt.
Alles was im Latch steht ne "1" = 5V oder "0" = 0V wird auch am
entsprechnden Port-Pin anstehen.

von Scales O. (scales)


Lesenswert?

Jetzt hab ichs glaub ich wirklich verstanden, muss das nur noch
ausprobieren

@norad

auf der Seite hab ich mir alles angeschaut, aber die Informationen über
Input und Output kommen mir ziemlich unvollständig vor
Code ist fast gar keiner dabei und da steht auch nirgendwo das 1 = 5V
und 0 = 0V sind


Vielleich sollte ich mich echt mal mit Elekrotechnik beschäftigen,
wie lernt man sowas den am besten?

von norad (Gast)


Lesenswert?

@scales

Mich wundert es ein wenig, dass Du von der Elektronik nichts
verstehst,weil Du am Anfang ja geschrieben hast das Du AVR seit her
programmiert hast.

Hast Du noch keine Schaltungen aufgebaut mit dem AVR? z.b. Led Anzeige
oder ähnliches.


>Vielleich sollte ich mich echt mal mit Elekrotechnik beschäftigen,
>wie lernt man sowas den am besten?

Versuchs mal mit Googeln nach Grundlagen der Elektronik oder so.
oder mal einen Einsteigerkurs in Elektronik an einer VHS =
Volkhochschule belegen.

Oder besorg dir einschlägige Literatur z.b. "Einführung in die
Elekronik 1 "

Googeln ist billiger.





norad

von Scales O. (scales)


Lesenswert?

>>Mich wundert es ein wenig, dass Du von der Elektronik nichts
verstehst,
>>weil Du am Anfang ja geschrieben hast das Du AVR seit her
programmiert hast

ne, AVRs hab ich nur mal kurz im Simulator programmiert, weil ich mir
eigentlich den Programmer zu den dingern kaufen wollte,
aber dann hab ich den für 8051er kostenlos bekommen

nen VHS Kurs mach ich ganz sicher nicht, manche von den Kursen sind die
totale Katastrophe
n'Buch zu kaufen hab ich mir auch schon überlegt, aber ein Buch ist ja
nur Theorie, das bringts nicht so wirklich, ohne das ganze dann auch in
echt aufzubauen

vielleicht gibts irgendwo Lernpakete, in denen das ganze Material schon
enthalten ist, da werd ich mal nach gucken

von norad (Gast)


Lesenswert?


von Scales O. (scales)


Lesenswert?


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.