mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port einlesen


Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hätt mal ne Anfängerfrage.
Wenn ich an einem Pin einlesen möchte ob da ne 1 oder 0 ankommt wie
mach ich das im AVR Assembler?
Kann ich da einfach schreiben:
in    r16,PinB6
zum Beispiel?
Oder liest er wenn ich alle Pins als Ausgänge und nur den einen als
Eingang gesetzt habe mit:
in    r16,PortB
dann auch nur den einen Pin ein?

Vielen Dank schonmal für eure Antworten!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du liest den kompletten Port ein

  in  r16, PinB

In r16 sind dann die 8 Bits des Port abgebildet (sowohl
Eingänge als auch Ausgänge). Mittels UND Operationen
kannst Du dann gezielt einzelne Bits in r16 auf 0 setzen,
sodass nur mehr der dich interessierende Eingang in r16
übrig bleibt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine andere Möglichkeit ist im Tutorial beschrieben.

http://www.mikrocontroller.net/tutorial/io-basics

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du nur einen enzelnen Pin abfragen willst, kannst du auch SBIC oder
SBIS verwenden. Die überspringen jeweils den nächsten Befehl, wenn das
Bit gelöscht bzw. gesetzt ist. Wenn du IN verwenden willst, mußt du
evtl. die gewünschten Portbits mit einem ANDI ausmaskieren.

Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schonmal.
Wie kann ich denn nun die ankommenden Bits in ein Register speichern?
Also es kommt ne 0 oder 1 an,die speicher ich in ein Register und
rotiere es um eine Stelle.
Danach les ich das nächste Bit ein,speichern und rotieren...usw...
Nach 8 mal (1 Byte) möchte ich den Wert als LOWByte Speichern und das
HIGHByte einlesen.
Die Daten kommen über SPI an MISO an.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe dein Problem nicht. Wenn du alle 8 Bit einlesen willst,
tust du doch genau das mit:

 in    r16,PinB

Danach stehen in den 8 Bit von r16 die 8 Bit von PinB drin.
Du mußt nicht 8 Mal den Port einlesen und jedes Mal nur ein Bit davon
speichern.

Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber ich will ja nicht den gesamten PortB einlesen sondern nur den
einen Pin MISO an dem ich Daten über SPI bekomme.
Da bekomm ich bit für bit ein Byte welche ich einlesen möchte.

oderichaufdemschlauchstehe

Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder Frage erstmal anderst gestellt.
Wie kann ich ein Bit an die erste Stelle eines Registers speichern?
Also z.B, bekomm ich ne 1,speicher die in ein Register.
00000001
So dann einmal rotieren: 00000010
Jetzt wieder an die erste Stelle das nächste Bit.
Z.B. wieder ne 1:
00000011
Dann wieder rotiere....usw.

Also wie kann ich auswählen das ein Bit immer an die erste Stelle eines
Registers gespeichert wird?
Werd langsam selbst ganz durcheinander :-)

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin nicht besonders asm-bewandert, aber so sollte es gehen:

Testen, ob SCK high ist.
Ist SCK nicht high, weiter testen (SBIS )
Ist MISO low, dann überspringe die nächste Anweisung
verodere das Register mit 1
rotiere das Regsiter
inkrementiere den Bit-zähler
wenn es schon 8 bit sind überspringe die nächste Anweisung
springe zum SCK-Test
mach das gleiche mit dem High-byte...

Autor: Sönke Gilbrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt kommt wieder das "guck doch ins Datenblatt" ;)

Beim PIC hat sich das SPI-Register immer volltakten lassen und wenn die
Übertragung fertig ist, liest man auf Schlag alle 8 Bit als Byte aus.
Halt "normale" SPI-Übertragung.

Ich habs nur kurz im AVR-Datenblatt nachgeschaut, das ist ähnlich. Wenn
du doch eine SPI-Übertragung hast, würde ich das auch so wie im
Datenblatt nutzen.

Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt noch die Befehle bst und bld gefunden.
Damit kann ich das Bit am MISO in ein Register and die Stelle des
ersten Bits speichern.
Ich lese PortB in ein Register ein,speicher Bit 6 (MISO Leitung) an die
erste Stelle eines anderen Registers und rotiere dieses dann.
Das ganze achtmal und schon müsste ich das Byte haben.
Kann dies jemand eventuell so bestätigen? :-)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast leider nicht geschrieben, welchen Controller genau du
verwendest, aber kannst du denn kein Hardware-SPI verwenden, statt das
umständlich per Software zu machen?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, ich hatte vergessen: Ja, mit BLD und BST ginge das. Erst mit IN
einlesen, dann mit BST das Bit ins T-Flag kopieren und mit BLD ins
Zielregister. Übrigens: Statt rotieren lieber ein shift, denn sonst
mußt du vorher noch das carry-flag löschen.

Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt shift ist besser,danke!
Werd mir aber die Hardware Lösung mal anschauen.
hatte ich zwar schon jedoch dacht ich mir das es auf die
"Software-Art" einfacher sein sollte aber naja....

Danke nochmal für Tipps bis hierher!

Aso Controller ist ein Atmega8

Autor: Sönke Gilbrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau den Hardware-SPI-meinte ich auch.

Mega8 Datenblatt S. 124.

Natürlich kann man das auch zu Fuss machen ("Software-Art") , aber
wenn die Funktion doch schon da ist, kann man die auch nutzen.

Dann kan nman auch die durchaus sinnvollen Features wie End Of
Transmission Interrupt Flag nutzten.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> hatte ich zwar schon jedoch dacht ich mir das es auf die
> "Software-Art" einfacher sein sollte aber naja....

Glaubst du denn, die bauen extra dafür zusätzliche Hardware ein, damit
es dann komplizierter wird, als eine Software-Implementation?
Mit der Hardware ist es einfacher, weil du dich nicht selbst um die
Bitschiebereien und das Timing kümmern mußt.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, die TWI-Einhiet gilt ja als etwas "buggy"...

Autor: Markus S. (schmidle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rahul

mir ist noch nicht aufgefallen, daß das Hardware-TWI buggy ist.
Hast du dazu weitere nähere Informationen?

Gruß
Schmidle

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Naja, die TWI-Einhiet gilt ja als etwas "buggy"...

Meines Erachtens ging es hier aber nicht um TWI sondern um SPI:

> Die Daten kommen über SPI an MISO an.

Hardware-SPI ist schon besser. Der Int meldet dir das neu empfangene
Byte, in der ISR liest du es dann aus und schon bist du fertig.

...

Autor: Porty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank werds mal damit versuchen!

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus:
Peter Dannegger hatte mal von Problemen berichtet; ich weiß jetzt aber
nicht mehr genau in welchem Zusammenhang.

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.