mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input


Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versteh das immernoch nicht ganz mit dem Input:

wenn ich einen Pin z.B. P3.0 als Input verwenden will,
dann muss ich den ja erst auf Input stellen indem ich eine 1 auf in
schreib

also erst
setb P3.0

und dann kann ich ihn z.B. so benutzen:
jb P3.0, sonstwohin


zwei Sachen versteh ich daran nicht:

1. warum muss ich denn erst eine 1 auf ihn schreiben?
alle Pins sind doch von anfangan schon auf high, also Input

2. wenn ich erst
setb P3.0

und dann
jb P3.0

benutze, springt er dann nicht immer sonstwohin?
ich stell ja sowiso P3.0 auf high

oder kann der dann extern trotzdem auf low gezogen werden, und ich les
0 ein?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Angabe des verwendeten Controllers sowie der Programmiersprache
könnten hier sicherlich hilfreich sein.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 8051 (und viele seiner Derivate) hat als Ausgang keine
Push-Pull-Endstufe, sondern nur einen Open-Kollektor-Ausgang (teilweise
mit internem Pull-Up).
Wenn man jetzt mit "setp P3.0" den Ausgang auf H-Pegel setzt, dann
gibt es keine Verbndung mehr zur Masse, und der Ausgang ist eher
hochohmig, als dass er H-Pegel liefert (deswegen benutzt man bei diesen
Controllern auch invertierte Logik, bspw. LEDs gegen + statt gegen Masse
anschliessen).
Wenn der Ausgangstransitor dann sperrt, kann man einen von aussen
anliegenden Pegel "messen" (feststellen...).
Zum "jb P3.0" müsste IMHO noch eine Adresse gehören (oder überspringt
er einfach nur die folgende Zeile?) zu der er je nach logischem Wert
springt.

>kann der dann extern trotzdem auf low gezogen werden, und ich les
>0 ein?
ja genau.

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry hab ich vergessen,
ist ein 8051er: AT89C51ED2

Programmieren tu ich mit Assembler, aber das sieht man ja eigentlich

>Wenn man jetzt mit "setp P3.0" den Ausgang auf H-Pegel setzt, dann
>gibt es keine Verbndung mehr zur Masse

eben das versteh ich nicht, beim starten des Mikrocontrollers sind ja
alle ausgänge schon auf high,
also warum erst nochmal auf high stellen bevor man die benutzen kann?


>Zum "jb P3.0" müsste IMHO noch eine Adresse gehören

ja stimmt mein Fehler, sollte so aussehen:
jb P3.0, sonstwohin

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>also warum erst nochmal auf high stellen bevor man die benutzen kann?

Dann hat man zumindest einen gültigen Zustand am Pin.
Hast du schon ausprobiert, ob man das wirklich machen muß?
Ich würde dir sonst das Buch "Mikrocontroller Kochbuch" von Andreas
Roth ans Herz legen. Darin wird ausschliesslich der 8051 behandelt,
dafür aber auch sehr grundlegend.

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dann hat man zumindest einen gültigen Zustand am Pin

klar, aber ich müsste auch so schon einen haben,
laut Atmel sind alle Pins von anfang an high


ausprobieren tu ichs noch, im Moment hab ich auch wenn ich auf high
stelle ein Problem mit dem einlesen,
aber das kapier ich noch von alleine irgendwann


hier hab ich das mit dem auf high schalten her:
http://wwwiti.cs.uni-magdeburg.de/~buchmann/privat...

klar ist das ein anderes 8051 Derivat, aber ich denke in dem Punkt sind
die alle gleich

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habs jetzt mal mit folgendem Code ausprobiert:

mov P3,#11111111b  ; Die Quell-Pins auf Input stellen

main:
mov P1,P3    ; die Arbeit durchführen
jmp main    ; zurück zum Programmanfang springen

den Code hab ich aus dem o.g. Tutorial,
wenn ich die erste Zeile weglass, funktioniert das ganze nicht

aber wozu nochmal auf high stellen wenn die Pins laut Atmel eh schon
alle auf high sind?

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich probier jetzt nochmal mein Problem breiter auszulegen:


also intern siehts ja so aus dass es für jeden I/O Port ein SFR gibt,
die glaub ich auch Latch-Register genannt werden (P0, P1, P2, P3)

jedes von den dingern umfasst 8 Bit, z.b. P3.0 - P3.7

steht jetzt bei P3.0 eine 0 in dem SFR von P3, so wird der Pin P3.0
direkt auf Masse gezogen,
kann also schlecht extern auf high geschaltet werden, weswegen man ihn
um ihn als Input zu verwenden erst auf high stellen muss

steht bei P3.0 eine 1 im SFR, so wird Pin P3.0 mit einem Pullup
Widerstand auf Vcc gezogen,
ohne externe Beschaltung ist er dann also high, wegen dem Pullup
Widerstand kann man ihn aber auch leicht extern auf low ziehen,
dadurch lässt sich dann die Input Funktion realisieren

ich hoff mal das hab ich soweit richtig verstanden


das einzige was ich daran nicht versteh ist warum man wenn man z.B. P3
komplett als Input verwenden will,
erst "mov P3, #11111111b" schreiben muss um alle Pins auf Input zu
stellen
der Reset Zustand ist doch in den SFRs von den einzelnen Ports sowiso
11111111b, also high

wofür dann nochmal auf high stellen damit der Input funktioniert?
es kann ja eigentlich nichts ändern wenn man einen Wert nochmal mit dem
gleichen überschreibt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.