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
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
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
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?
@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
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
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
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
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.
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?
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.
@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
>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
@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
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?
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
@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
angenommen ich will eine einfache LED anschliesen dann geht diese bei 5V und nicht bei 0V an wie soll ich das ändern?
@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
@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
@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.
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?
@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
>>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
hier ein paar Links http://www.elexs.de/grundl.htm http://www.elektronik-kompendium.de/sites/grd/index.htm http://www.selfmadehifi.de/schaltgrund.htm http://www.elektronik-kurs.de/online/index.html
was haltet ihr davon?: http://www.elektronik-kompendium.de/shop/index.php?elektronik-lernpakete/lernpaket-elektronik-2006&ref=promobanner
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.