Config PINB.1 oder config PORTB.1 ?

riesen

Mitglied
10. Sep. 2010
108
1
16
Liebe Forums-Mitglieder

Ich habe heute eine Art Basic-Frage. Obschon ich schon recht lange mit Bascom programmiere, habe ich eine
Unsicherheit bezüglich der Konfiguration eines einzelnen Port-Pins. Was ist nach Bascom-Regeln richtig?
- Config PINB.1 = Input
- Config PINB.1 = Output
- Config PORTB.1 = Input
- Config PORTB.1 = Output

Bis jetzt folgte ich der Regel PIN für Eingaben, PORT für Ausgabe:
- Config PINB.1 = Input
- Config PORTB.1 = Output

In Büchern und Artikeln habe ich verschiedene Varianten gefunde. Der Befel Config PINB.1 = Output hat
neulich bei mir zu einem nicht zuverlässigen Verhalten des Ports geführt, darum die Frage.....

Vielen Dank für euren Input.
Grüsse
Thomas
 
Warum nicht gleich das entsprechende Register (oder auch dessen einzelne Bits) selbst beschreiben?

Für die Datenrichtung ist das - Trommelwirbel - Datenrichtungsregister verantwortich. Auf Neudeutsch also Data Direction Register. Kurz: DDR. Jetzt noch den entsprechenden Port-Buchstaben dahinter, hier also DDRB. Jedes Bit entspricht dem jeweiligen Bein, eine 0 ist ein Eingang, eine 1 ein Ausgang.
Bascom verwendet für den separaten Zugriff auf einzelne Bits innerhalb eines Registers die Schreibweise mit dem Punkt:
Code:
DDRB.1=1
schaltet das Bein auf Ausgang, alle anderen bleiben, wie sie vorher waren
Code:
DDRB.1=0
dito als Eingang
(wobei mir hier nicht klar ist, ob generell eine Read-Modify-Write-Zuweisung erfolgt, oder ob (wenn möglich) SBI/CBI genutzt wird - das Register sollte die unterstützen - ein einzelnes Bein kannst Du also auch mit SBI Datenrichtungsregister,Pinnummer zum Ausgang machen, mit CBI analog zum Eingang)
aber Vorsicht:
Code:
DDRB=&B00000010
schaltet Dir das Bein auch als Ausgang - alle anderen allerdings gleichzeitig als Eingang - Du weist ja alle Bits in einem Rutsch zu.

Für den angelegten(!) Pegel ist das jeweilige PORT-Register verantwortlich. Bei einem Ausgang wird zwischen Hi-Pegel (=1) und lo-Pegel (=0) geschaltet, bei einem Eingang zwischen dem Pullup (=1) und tristate/hochohmig (=0) (Ob der Pullup auf der anderen Seite überhaupt auf Vcc liegt, ist 'ne andere Geschichte (Stichwort "pullup disable" - PUD))

Zum Auslesen des tatsächlich(!) anliegenden logischen Pegels liest man das (entsprechende Bit des entsprechenden) PIN-Register(s). 1=Hi, 0=low, klar.
Achtung: versucht man dieses Register zu beschreiben, werden alle Beinchen, denen eine 1 zugewiesen wird getoggelt (also die entsprechenden Bits im PORT-Register, und damit auch die Beinchen)

Edit: zu beachten ist auch, daß alternative Funktionen (über Fuses oder I/O-Register) ein Bein von einzelnen/mehreren Registern abkoppeln können. Dann sind Änderungen der Register erstmal wirkungslos. Allerdings sollte man diese etwaigen Veränderungen nicht vergessen - schaltet man die alternative Funktion ab, wird das Bein also wieder "angekoppelt", werden die Register sofort wieder wirksam.
 
Hallo LotadaC, vielen Dank für die ausführlich Antwort. Ja, das wäre wohl die sicherste, universellste Lösung. Habe das auch schon so gelöst, aber mit Config schien mir die Sache noch etwas übersichtlicher. Dankende Grüsse Thomas (PS: Bei mir funktioniert das Enter nicht mehr hier bei der Eingabe, kann keinen Zeilenumbruch eingeben...)
 
(PS: Bei mir funktioniert das Enter nicht mehr hier bei der Eingabe, kann keinen Zeilenumbruch eingeben...)

PC-Tastaturen haben wir noch nicht im Shop ;) Spaß beiseite. Ich weiß im Moment nicht, woran dies bei dir liegen könnte. Wenn das Problem weiterhin besteht, melde dich nochmal, ggf. per PN.

Dirk :ciao:
 
Hallo zusammen

Das Enter geht wieder, lag am IE 10, muss hier den Kompatibilitätsmodus einschalten ...

Zum Thema mit der Port-Config. Würde gerne etwas mehr Licht in Port-Dunkel bringen lassen.
Mit DDR lässt sich viel machen, aber spielt es z.B. eine Rolle, ob ich den Alias mit Pin oder Port
(LedA Alias PinB.1 oder LedA Alias PortB.1) definiere?

Gruss
Thomas
 
Hi Thomas,

Zum Thema mit der Port-Config. Würde gerne etwas mehr Licht in Port-Dunkel bringen lassen.
Mit DDR lässt sich viel machen, aber spielt es z.B. eine Rolle, ob ich den Alias mit Pin oder Port
(LedA Alias PinB.1 oder LedA Alias PortB.1) definiere?
Mit Alias gibst du dem Kind nur einen neuen Namen. Im Endeffekt sind PIN, PORT und DDR drei unterschiedliche Register mit natürlich auch drei unterschiedlichen Adressen im Speicher. Es macht also einen Unterschied. Sieh dir mal im Datenblatt die Register-Summary an dann klärt sich das alles auf. Da sind alle Register mit allen Bits verzeichnet.

Beispiel:
m8def.dat ...
PORTB =$18
DDRB =$17
PINB =$16


Register-Summary ...
M8_RegSum_B.png

LedA Alias PinB.1

ergibt ---> LedA --> Register PinB --> IO-Addr 0x16 oder Mem-Addr 0x36 und davon Bit 1

... und ...

LedA Alias PortB.1

ergibt ---> LedA --> Register PortB --> IO-Addr 0x18 oder Mem-Addr 0x38 und davon Bit 1


Gruß
Dino
 
Das hatte ich ja oben schon mal auseinandergenommen - das (Verständnis-) Problem liegt woanders.

Man darf das PORTx-Register nicht mit der Schnittstelle, also den 8 Beinchen durcheinander bringen. Wird nämlich beides als Port bezeichnet, und zwar schon von ATMEL. Bascom greift das dann bei dem Config-Befehl auf. Config Port... und Config Pin.. verstehen sich aber nicht in Bezug auf die Register, sondern eben auf alle Beinchen einer Schnittstelle (einen Port, ein Tor;)), beziehungsweise nur auf ein Beinchen (einen Pin).
Beide Befehle manipulieren also das entsprechende DDRegister. Config Port als ganzes, Config Pin nur in einem Bit. In beiden Fällen kann als Argument das Schlüsselwort Input/Output stehen, bei Pin gehen auch 1 und 0 (Bit), bei Port dementsprechend eine Zahl (Byte)...
Steht alles in der Bascom Language Reference unter 6.145 (S.569)
 
Hallo,

Bascom greift das dann bei dem Config-Befehl auf. Config Port... und Config Pin.. verstehen sich aber nicht in Bezug auf die Register, sondern eben auf alle Beinchen einer Schnittstelle (einen Port, ein Tor;)), oder nur auf ein Beinchen (einen Pin).
Beide Befehle manipulieren also das entsprechende DDRegister. Config Port als ganzes, Config Pin nur in einem Bit. In beiden Fällen kann als Argument das Schlüsselwort Input/Output stehen, bei Pin gehen auch 1 und 0 (Bit), bei Port dementsprechend eine Zahl (Byte)...
Steht alles in der Bascom Language Reference unter 6.145 (S.569)
waaahhhhhh :p :vollkommenauf: :hmmmm: :fie: :stupid: Gehirnsausen :flute:

Ich weiß schon warum ich bei diesem Blödsinn nicht mitmache und die Register direkt beschreibe :cool:

Gruß
Dino
 
Hallo,


waaahhhhhh :p :vollkommenauf: :hmmmm: :fie: :stupid: Gehirnsausen :flute:

Ich weiß schon warum ich bei diesem Blödsinn nicht mitmache und die Register direkt beschreibe :cool:

Gruß
Dino


Hallo Dino,

dem kann ich nur zustimmen - mache es selber auch lieber direkt über die Register. Meiner Meinung nach hat das auch den Vorteil,
dass man sich einmal mehr Gedanken macht. Finde es auch etwas näher an der Hardware.

Wenn man sich dann auch zu Beginn eines Projekts die Arbeit macht und alle benötigten Ein und Ausgänge sauber dokumentiert, geht das fast ohne Fehler.

Wollte vor einigen Wochen auch mal eben schnell bei einem Kleinprojekt über
Config Pinb.2 = Input
Portb.2 = 1
Taster_hgbl Alias Pinb.2
einen Taster als Eingang schalten und hatte doch fälschlicherweise das Pinb.2 durch ein PortB.2 verwechselt - Ergebnis: längere Fehlersuche...:(

Hinterher dachte ich mir nur: hätte ich doch lieber die direkte Registerzuweisung einsetzen sollen:confused::confused:
Hochsprachen haben eben nicht nur Vorteile - Hirn ist immer nötig! :D:D

Ganz zu schweigen davon, dass die direkte Registerzuweisung Speicherplatz einspart.



MfG

FreeVee
 
Deswegen habe ich ja in #2 auch gensu so geantwortet. Thomas hatte aber in #5 nochmal wegen alias im speziellen (da hat Dino bereitsgeantwortet) und Licht für Config Port im allgemeinen gefragt - deswegen hab ich im Handbuch mal nachgeschlagen.
Ich meine mich sogar zu erinnern, daß ich diese PDF auf einen Link Dinos hin überhaupt erst kenne... (Die Bascom-Online-Hilfe ist bei mir (gemäß dem Gesetz der größtmöglichen Gemeinheit) grundsätzlich dann nicht verfügbar, wenn ich grad was nachschlagen will...)
 
Hallo zusammen

Erst mal wieder vielen Dank! Das ich früher noch recht viel in Assembler geschrieben habe, ist mir die
Sache mit dem direkten Schreiben ins Memory und die Register schon bekannt. Nur eben, für die
Wartung ist mir heute ein sprechender Text auch angenehm. Bei meinen ATmega2560 muss ich zudem
auch nicht mehr jedes Byte sparen ... :)

Ich wüsste einfach gerne, was sicher funktioniert:
- Config PINB.1 = Input --> ich möchte diesen Pin (Beinchen) lesen
- Config PINB.1 = Output --> ich möchte auf diesen Pin (Beinchen) schreiben
- Config PORTB.1 = Input --> ich möchte diesen Pin (Beinchen) lesen
- Config PORTB.1 = Output --> ich möchte auf diesen Pin (Beinchen) schreiben

Welche Varianten sind korrekt?

Gruss
Thomas
 
Hallo!

Beide Versionen sind korrekt.
Siehe Bascom Hilfe.

Pin kann man für einen einzelnen Pin verwenden.
Port verwendet man dann für einen ganzen Port.

Kannst Du recht einfach im Simaulator testen.


MfG
 
Ok, so ist das gedacht - offensichtlich fragt/will/kann er config Port aber auch für einzelne Beinchen nehmen...
Schauen wir uns das doch mal an. Ich hatte doch hier irgendwo mal einen ... hmm... wo war es doch gleich...
ahja
also, Bascom:
Code:
$crystal = 8000000
$regfile = "m88def.dat"
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space

nop

Config Pinb.1 = Input                                       '- - > Ich Möchte Diesen Pin(beinchen) Lesen
Config Pinb.1 = Output                                      '- - > Ich Möchte Auf Diesen Pin(beinchen) Schreiben
Config Portb.1 = Input                                      '- - > Ich Möchte Diesen Pin(beinchen) Lesen
Config Portb.1 = Output                                     '- - > Ich Möchte Auf Diesen Pin(beinchen) Schreiben

Nop

'und jetzt noch ein paar besondere

Config Portb = Input
Config Portb = Output

Config Portb = &B00001010

Config Portb.1 = 1
Config Portb.1 = 0

nop

End
wird zu ASM:
Code:
     1: $crystal = 8000000
 RJMP PC+0x001A		Relative jump 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 RETI 		Interrupt return 
 RETI 		Interrupt return 
     1: $crystal = 8000000
 SER R24		Set Register 
 OUT 0x3D,R24		Out to I/O location 
     1: $crystal = 8000000
 LDI R28,0xE0		Load immediate 
 LDI R30,0xC6		Load immediate 
     1: $crystal = 8000000
 MOV R4,R30		Copy register 
 LDI R24,0x04		Load immediate 
     1: $crystal = 8000000
 OUT 0x3E,R24		Out to I/O location 
 LDI R29,0x04		Load immediate 
     1: $crystal = 8000000
 LDI R31,0x04		Load immediate 
 MOV R5,R31		Copy register 
     1: $crystal = 8000000
 WDR 		Watchdog reset 
 IN R24,0x34		In from I/O location 
     1: $crystal = 8000000
 MOV R0,R24		Copy register 
 ANDI R24,0xF7		Logical AND with immediate 
     1: $crystal = 8000000
 OUT 0x34,R24		Out to I/O location 
 LDI R24,0x18		Load immediate 
     1: $crystal = 8000000
 CLR R25		Clear Register 
 STS 0x0060,R24		Store direct to data space 
 STS 0x0060,R25		Store direct to data space 
 LDI R30,0xFE		Load immediate 
     1: $crystal = 8000000
 LDI R31,0x03		Load immediate 
 LDI R26,0x00		Load immediate 
     1: $crystal = 8000000
 LDI R27,0x01		Load immediate 
 CLR R24		Clear Register 
     1: $crystal = 8000000
 ST X+,R24		Store indirect and postincrement 
 SBIW R30,0x01		Subtract immediate from word 
     1: $crystal = 8000000
 BRNE PC-0x02		Branch if not equal 
 CLR R6		Clear Register 
     7: nop
 NOP 		No operation 
 [COLOR="#0000CD"][B]
    9: Config Pinb.1 = Input                                       '- - > Ich M�chte Diesen Pin(beinchen) Lesen
 CBI 0x04,1		Clear bit in I/O register 
    10: Config Pinb.1 = Output                                      '- - > Ich M�chte Auf Diesen Pin(beinchen) Schreiben
 SBI 0x04,1		Set bit in I/O register 
    11: Config Portb.1 = Input                                      '- - > Ich M�chte Diesen Pin(beinchen) Lesen
 CBI 0x04,1		Clear bit in I/O register 
    12: Config Portb.1 = Output                                     '- - > Ich M�chte Auf Diesen Pin(beinchen) Schreiben
 SBI 0x04,1		Set bit in I/O register [/B][/COLOR]
    14: Nop
 NOP 		No operation 
[COLOR="#0000CD"][/COLOR][COLOR="#0000CD"][B]
    18: Config Portb = Input
 LDI R24,0x00		Load immediate 
 OUT 0x04,R24		Out to I/O location 
    19: Config Portb = Output
 SER R24		Set Register 
 OUT 0x04,R24		Out to I/O location 
    21: Config Portb = &B00001010
 LDI R24,0x0A		Load immediate 
 OUT 0x04,R24		Out to I/O location 
    23: Config Portb.1 = 1
 SBI 0x04,1		Set bit in I/O register 
    24: Config Portb.1 = 0
 CBI 0x04,1		Clear bit in I/O register [/B][/COLOR]
    26: nop
 NOP 		No operation 
    28: end
 CLI 		Global Interrupt Disable 
 RJMP PC-0x0000		Relative jump 
    28: end
 SBIW R30,0x01		Subtract immediate from word 
 BRNE PC-0x01		Branch if not equal 
    28: end
 RET 		Subroutine return 
 SET 		Set T in SREG 
    28: end
 BLD R6,2		Bit load from T to register 
 RET 		Subroutine return 
    28: end
 CLT 		Clear T in SREG 
 BLD R6,2		Bit load from T to register 
    28: end
 RET 		Subroutine return
Erkentnisse:
-verwendet man die Port-Punkt-Bit-Schreibweise, ergibt config Port/Pin dasselbe. In beiden Fällen wird das entsprechende Bit im entsprechenden Datenrichtungsregister direkt gesetzt/gelöscht. Mittels SBI/CBI.
-Da das Argument auf ein Bit angewendet wird, sind nur die diskreten werte 0 und 1 zulässig - Input wird als 0 interpretiert, Output als 1

-config Port (ohne -Punkt-Bit) lädt das Argument über ein rechenregister in das entsprechende Datenrichtungsregister (LDI/SER->OUT)
-Da das Argument auf ein Byte angewendet wird, werden numerische Werte als Byte interpretiert/akzeptiert. Input wird als 0 interpretiert, Output als 255 (SER)
-config Pin (ohne -Punkt-Bit) akzeptiert Bascom nicht
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)