INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[Anfänger] Verständnisfrage Codeschnipsel
30.12.2018, 17:22
Beitrag #9
RE: [Anfänger] Verständnisfrage Codeschnipsel
(30.12.2018 09:10)MicroBahner schrieb:  ....

P.S. wenn man direkt auf die Ports zugreift, muss man ja um einzelne Bits zu beeinflussen mit Read-Modify-Write arbeiten. Gerade wenn bei so einem 8-Bit Port gemischt Eingänge und Ausgänge konfiguriert sind, muss man sehr gut unterscheiden zwischen dem PIN- und dem PORT-Register. Will man einen Ausgang umschalten, muss das PORT-Register gelesen, das entsprechende Bit manipuliert, und dann das PORT-Register wieder beschrieben werden. Will ich wirklich den Status am Pin wissen, muss ich das PIN-Register lesen.
Wenn man also mit Direktzugriff auf die Ports ein Ausgangsbit invertieren will, braucht man PIN nicht, sondern muss das direkt mit dem PORT-Register machen. Die IDE-Methode ist zwar bequem, an der Stelle aber letztendlich umständlich, denn sowohl digitalRead, als auch digitalWrite sind nicht besonders schnell. In den meisten Fällen spielt das aber keine Rolle.

...deine Aussage ist nicht ganz vollständig...kommt auch darauf an wie man das programmiert. Also einzelne Port-Pins lassen sich per Assembler direkt setzen oder löschen mit SBI und CBI. Auch kann das nur lesen des PORT Registers zu falschen Informationen führen wenn man z.B. einen Eingang mit Pull-Up Widerstand eingeschaltet hat ist mir nicht sicher das dann auch eine 0 am Port Pin auch als 0 im Port Register erscheint...da hier ja die 1 für den Pull-Up Widerstand gesetzt ist.
Also da würde ich lieber den PIN abfragen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2018, 17:49 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2018 17:53 von MicroBahner.)
Beitrag #10
RE: [Anfänger] Verständnisfrage Codeschnipsel
(30.12.2018 17:22)Bitklopfer schrieb:  Also einzelne Port-Pins lassen sich per Assembler direkt setzen oder löschen mit SBI und CBI.
Ich bin jetzt mal von Programmierung in C ausgegangen Smile . Wobei ich schon gesehen habe, dass der Compiler teilweise das auch entsprechend optimiert und die SBI/CBI Befehle nutzt. Das geht aber nur bei den kleineren ATMegas durchgehend. Bei den größeren mit vielen IO's liegen die teilweise außerhalb des bitadressierbaren Bereiches.

(30.12.2018 17:22)Bitklopfer schrieb:  Auch kann das nur lesen des PORT Registers zu falschen Informationen führen wenn man z.B. einen Eingang mit Pull-Up Widerstand eingeschaltet hat ist mir nicht sicher das dann auch eine 0 am Port Pin auch als 0 im Port Register erscheint...da hier ja die 1 für den Pull-Up Widerstand gesetzt ist.
Also da würde ich lieber den PIN abfragen.
lgbk
Achtung: Das PORT-Register spiegelt NIE den Zustand am Pin wieder. Bei einem Ausgang ist das zwar gleich, aber da spiegelt der Pin den Zustand im Portregister wieder. Wenn ich den Pin als Eingang nutze muss ich das PIN-Register lesen. Das PORT-Register ist ein reines Schreib-Lese Register. Da steht immer nur das drin, was ich per Programm da reingeschrieben habe.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2018, 18:54
Beitrag #11
RE: [Anfänger] Verständnisfrage Codeschnipsel
(30.12.2018 17:49)MicroBahner schrieb:  
(30.12.2018 17:22)Bitklopfer schrieb:  Also einzelne Port-Pins lassen sich per Assembler direkt setzen oder löschen mit SBI und CBI.

Ich bin jetzt mal von Programmierung in C ausgegangen Smile . Wobei ich schon gesehen habe, dass der Compiler teilweise das auch entsprechend optimiert und die SBI/CBI Befehle nutzt. Das geht aber nur bei den kleineren ATMegas durchgehend. Bei den größeren mit vielen IO's liegen die teilweise außerhalb des bitadressierbaren Bereiches.
...welche Typen meinst du hier mit den "größeren", der 2560 ist noch Bit-Adressierbar und sonst haben wir keine größeren ATMEGA's am Start.

Zitat:
(30.12.2018 17:22)Bitklopfer schrieb:  Auch kann das nur lesen des PORT Registers zu falschen Informationen führen wenn man z.B. einen Eingang mit Pull-Up Widerstand eingeschaltet hat ist mir nicht sicher das dann auch eine 0 am Port Pin auch als 0 im Port Register erscheint...da hier ja die 1 für den Pull-Up Widerstand gesetzt ist.
Also da würde ich lieber den PIN abfragen.
lgbk
Achtung: Das PORT-Register spiegelt NIE den Zustand am Pin wieder. Bei einem Ausgang ist das zwar gleich, aber da spiegelt der Pin den Zustand im Portregister wieder. Wenn ich den Pin als Eingang nutze muss ich das PIN-Register lesen. Das PORT-Register ist ein reines Schreib-Lese Register. Da steht immer nur das drin, was ich per Programm da reingeschrieben habe.
...sach ich doch...

lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2018, 22:15 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2018 22:30 von MicroBahner.)
Beitrag #12
RE: [Anfänger] Verständnisfrage Codeschnipsel
(30.12.2018 18:54)Bitklopfer schrieb:  der 2560 ist noch Bit-Adressierbar und sonst haben wir keine größeren ATMEGA's am Start.
Da sind bei weitem nicht alle Register bit-adressierbar. Beim 328P sind es zwar alle Standard IO/Register ( PORTx, DDRx, PINx ), aber für die sonstige Peripherie gilt das da bereits auch schon nicht mehr generell.
Beim 2560 sind bereits die Standard I/O Register der Ports H...L nicht mehr bit-adressierbar. Nur Register im Adressbereich x00..x1F sind bitadressierbar. Selbst die IO-spezifischen IN OUT Befehle gehen nicht bei allen Registern
Siehe Datenblatt:
2. I/O registers within the address range $00 - $1F are directly bit-accessible using the SBI and CBI instructions. In these registers, the value of single bits can be checked by using the SBIS and SBIC instruction
4. When using the I/O specific commands IN and OUT, the I/O addresses $00 - $3F must be used. When addressing I/O registers as data space using LD and ST instructions, $20 must be added to these addresses.
The ATmega640/1280/1281/2560/2561 is a complex microcontroller with more peripheral units than can be supported within the 64 location reserved in Opcode for the IN and OUT instructions. For the Extended I/O space from $60 - $1FF in SRAM, only the ST/STS/STD and LD/LDS/LDD instructions can be used.

Die Ports H..L liegen bereits in diesem Extended I/O space, können also noch nicht mal über IN/OUT angesprochen werden.

(30.12.2018 18:54)Bitklopfer schrieb:  ...sach ich doch...
Sorry, klang aber eher nach vermuten als nach wissen Wink

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.12.2018, 08:19
Beitrag #13
RE: [Anfänger] Verständnisfrage Codeschnipsel
(30.12.2018 22:15)MicroBahner schrieb:  ....
(30.12.2018 18:54)Bitklopfer schrieb:  ...sach ich doch...
Sorry, klang aber eher nach vermuten als nach wissen Wink

Sorry, du hast natürlich Recht.
.... habe mich einfach davon verleiten lassen das im Register Summary vom Datenblatt auch jedes PortBit schön benannt wird...und daneben kein Hinweis das man es nicht mit Bit Befehlen ansprechen kann.
Dann habe ich mir mal das AVR Instruction Set Manual angesehen weil da sind dann die Assemblerbefehle bis aufs einzelne Bit beschrieben und dann wird es auch klar das es mit den höheren Ports mit den Bit Befehlen nicht mehr geht... und dann fällt einem wieder ein das es ja eine RISC Architektur ist was nichts anderes bedeutet als das nicht jeder gewünschte Befehl im Opcode wiederfindet... und zudem sind die Atmel Prozessoren schon recht alt... vor rund 20 Jahren habe ich mal mit einem AT90S4433 was aufgebaut gehabt... 4K Flash... aber wie ich erst letzte Woche mal aus Jux es verifiziert habe ist der Pin kompatibel zum ATmega328... sprich damals gab es noch nicht so viele interne Register als das im OP-Code mehr Adressen verarbeitbar sein mußten... von daher erklärt sich dann vieles... und meistens wie bei mir ist eben der Wunsch der Vater des Gedanken.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.12.2018, 10:05 (Dieser Beitrag wurde zuletzt bearbeitet: 31.12.2018 10:05 von MicroBahner.)
Beitrag #14
RE: [Anfänger] Verständnisfrage Codeschnipsel
Alles klar SmileWink

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Kann auf A.Uno nichts hochladen - Anfänger sucht Hilfe ardeche 25 1.379 21.01.2019 22:06
Letzter Beitrag: ardeche
  [Anfänger] Char Array Problem fp.blues2013 1 302 07.01.2019 13:06
Letzter Beitrag: Tommy56
  Verständnisfrage schleife Rasa 12 605 06.01.2019 17:00
Letzter Beitrag: Tommy56
  Anfänger mit Problem/Gärtenbewässerungsprojekt Bommes 13 1.266 13.11.2018 20:17
Letzter Beitrag: fraju
  Anfänger bekommt den Sketch nicht zum Laufen Maschinenbauer 6 1.202 06.10.2018 21:01
Letzter Beitrag: Tommy56
  Speichern von Messwerten *Anfänger* wutschler 5 1.219 24.09.2018 20:56
Letzter Beitrag: MicroBahner
  Anfänger hängt in der Schleife mt14516 2 515 24.09.2018 20:54
Letzter Beitrag: MicroBahner
  Verständnisfrage zu RTClib und speziell: rtc.ajust Karli 13 1.904 15.02.2018 18:50
Letzter Beitrag: hotsystems
  Anfänger sucht erfahrene Hilfe Customizer 21 3.213 11.07.2017 21:37
Letzter Beitrag: Customizer
  Verständnisfrage: Instanz innerhalb einer Klasse tuxedo0801 6 1.380 28.03.2017 19:40
Letzter Beitrag: georg01

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste