Forum: Mikrocontroller und Digitale Elektronik Basic ganzen PORT A als Ausgang bzw Eingang


von Basic (Gast)


Lesenswert?

hi all, wollte mal ganz schnell wissen ob das hier so geht.
Wollte eigentlich in Basic, den ganzen Port A und C als Eingang 
definiert haben mit aktivierten Pullups an jedem Pin. und Die Ports B 
und D sollten einfach als Ausgänge definiert sein.
Jedoch spuckt Bascom nen Fehler aus und will nicht compilieren.
Kann man mit Basic alle Pins am Port direkt definieren oder muss ich 
ales einzen machen?

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb = Output
Config Portd = Output
Config Pina = Input
Porta = 1
Config Pinc = Input
Portc = 1


Do
  If Pina.0 = 1 Then
    Portb.0 = 1
  End If
    If Pina.1 = 1 Then
    Portb.1 = 1
  End If
    If Pina.2 = 1 Then
    Portb.2 = 1
  End If
    If Pina.3 = 1 Then
    Portb.3 = 1
  End If
    If Pina.4 = 1 Then
    Portb.4 = 1
  End If
    If Pina.5 = 1 Then
    Portb.5 = 1
  End If
    If Pina.6 = 1 Then
    Portb.6 = 1
  End If
    If Pina.7 = 1 Then
    Portb.7 = 1
  End If
    If Pina. = 1 Then
    Portb. = 1
  End If
    If Pinc.7 = 1 Then
    Portd.0 = 1
  End If
      If Pinc.6 = 1 Then
    Portd.1 = 1
  End If
      If Pinc.5 = 1 Then
    Portd.2 = 1
  End If
      If Pinc.4 = 1 Then
    Portd.3 = 1
  End If
      If Pinc.3 = 1 Then
    Portd.4 = 1
  End If
      If Pinc.2 = 1 Then
    Portd.5 = 1
  End If
      If Pinc.1 = 1 Then
    Portd.6 = 1
  End If
      If Pinc.0 = 1 Then
    Portd.7 = 1
  End If

Loop


End

von Rolf I. (for_ro)


Lesenswert?

Schreib es mal so:

Config Portb = Output
Config Portd = Output
Config Porta = Input
Porta = 255
Config Portc = Input
Portc = 255

Und lass das hier weg

Du kannst auch schreiben:

PORTB=PINA

    If Pina. = 1 Then
    Portb. = 1
  End If

Gruß

Rolf

von Basic (Gast)


Lesenswert?

hi danke, eine frage noch.
was macht

"Portc = 255"

und wird hiermit:
PORTB=PINA

    If Pina. = 1 Then
    Portb. = 1
  End If
auch jeweils der gegenüberliegende Pin angesprochen?

Also das auch nur Pina.1 high bekommt und somit dann auch NUR Pinb.1 zum 
beispiel?

von D. S. (jasmin)


Lesenswert?

bitte schaue doch einfach in die Bascom-Hilfe.
Da steht alles haarklein und verständlich erklärt.

Oder sollen wir das für Dich tun ???

von Basic (Gast)


Lesenswert?

sorry das ich dich jetzt angepisst habe wegen 2 kleinen fragen. ich 
verkriech mich jetzt auch sofort in mein loch. trotzdem danke ich rolf 
und nicht dir du nichthelfer. und falls du mal jemals fragen hast dann 
schreib ein buch darüber und ein buch über die antworten.

solche leute wie dich verschmutzen nur thread wo ein anfänger fragen 
stellt.

sowas wie "benutz die SuFu, google, guck ins handbuch.." bla nervt.

es gibt schon gründe warum ich hier schreibe und nicht 10min irgendwo 
anders was lesen will.

von D. S. (jasmin)


Lesenswert?

lies doch einfach statt 10 Minuten zu schreiben ;-), dann hast Du mehr 
Zeit ins Handbuch zu schauen.
Es bringt Dich wirklich viel schneller weiter.
Und wenn Du dann mal wirkliche Probleme hast, hilft Dir hier gern jeder 
weiter; sofern er nicht gerade selber in Bücher schaut und lernt...

von Hannes Lux (Gast)


Lesenswert?

> sowas wie "benutz die SuFu, google, guck ins handbuch.." bla nervt.

Die Tips sind aber gut gemeint und auch berechtigt.

> es gibt schon gründe warum ich hier schreibe und nicht 10min irgendwo
> anders was lesen will.

Nunja, wenn Du an der richtigen Stelle liest, erreicht Du mehr, als wenn 
Du andere Leute für Dich arbeiten lässt.

Nimm das Datenblatt Deines Controllers und schau Dir die 
Registerbeschreibung von PORTA, PINA_ und _DDRA genau an. Dann 
interessiere Dich mal für den Zusammenhang von Bits und Byte.

...

von Rolf I. (for_ro)


Lesenswert?

Hab mich beim Einfügen etwas vertan. Sollte eigentlich so heißen:

Und lass das hier weg

    If Pina. = 1 Then
    Portb. = 1
  End If

Du kannst auch schreiben:

PORTB=PINA

Wobei dass nicht gleich deinen If-Blöcken ist, aber wohl so wie du es 
willst.

  If Pina.0 = 1 Then
    Portb.0 = 1
  End If

Falls der Pina.0 einmal 1 ist, geht der Portb.0 nie wieder auf 0. Bei

PORTB=PINA

geht jeder PORTB.x sofort wieder auf 0, wenn der PINA.x auf 0 geht.
Das entsprechende für PINC und PORTD wäre dann
PORTD.0=PINC.7
PORTD.1=PINC.6
usw.
Das kannst du auch über eine Schleife erledigen.
Ein direktes Überkreuz-Setzen gibt es leider nicht.

Gruß

Rolf

von Basic (Gast)


Angehängte Dateien:

Lesenswert?

So hab es mal so versucht:
Bauplan laut Bild, wo ich Testweise nur eine LED angeschlossen habe. 
Anstatt einen Taster habe ich einen Fotosensor drangebaut, der wenn es 
dunkel ist einen sehr hohen Widerstand hat (ca. 5MOhm) und wenn man ihrn 
bestrahlt ca. 500 Ohm.

Ich habe im dunkeln den Fotosensor mit einer Taschenlampe bestrahlt 
jedoch hat dieser keine 1 geliefert und meine LED ging nicht an. Weis 
jemand wo der Fehler liegt?

So hoffe habe alles klar genug erklärt und hoffe das das mal keine 
anfänger frage ist.

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb = Output
Config Portd = Output
Config Pina.0 = Input
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Config Pina.4 = Input
Config Pina.5 = Input
Config Pina.6 = Input
Config Pina.7 = Input
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Porta.7 = 1
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
Config Pinc.6 = Input
Config Pinc.7 = Input
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1

Do
  If Pina.0 = 1 Then
    Portb.0 = 1
  End If
    If Pina.1 = 1 Then
    Portb.1 = 1
  End If
    If Pina.2 = 1 Then
    Portb.2 = 1
  End If
    If Pina.3 = 1 Then
    Portb.3 = 1
  End If
    If Pina.4 = 1 Then
    Portb.4 = 1
  End If
    If Pina.5 = 1 Then
    Portb.5 = 1
  End If
    If Pina.6 = 1 Then
    Portb.6 = 1
  End If
    If Pina.7 = 1 Then
    Portb.7 = 1
  End If
    If Pina. = 1 Then
    Portb. = 1
  End If
    If Pinc.7 = 1 Then
    Portd.0 = 1
  End If
      If Pinc.6 = 1 Then
    Portd.1 = 1
  End If
      If Pinc.5 = 1 Then
    Portd.2 = 1
  End If
      If Pinc.4 = 1 Then
    Portd.3 = 1
  End If
      If Pinc.3 = 1 Then
    Portd.4 = 1
  End If
      If Pinc.2 = 1 Then
    Portd.5 = 1
  End If
      If Pinc.1 = 1 Then
    Portd.6 = 1
  End If
      If Pinc.0 = 1 Then
    Portd.7 = 1
  End If

Loop


End

von Hannes Lux (Gast)


Lesenswert?

Schmeiß die verdammten Configs über Bord und benutze die I/O-Register 
gemäß Datenblatt. Anders begreifst Du die Zusammenhänge nie...

...

von Paul Baumann (Gast)


Lesenswert?

Die Config-Anweisungen machen das Programm ziemlich unübersichtlich, 
aber es geht auch anders:

Du kannst die Register auch direkt beschreiben:
DDRA=&B00000000
PORTA=&B11111111
Das bedeutet: Im DDR-Register stellt eine Null den Port auf Eingang und
im Port-Register schaltet eine Eins den Ziehwiderstand (Neudeutsch:
Pull-up) ein.
Diese beiden Zeilen haben jetzt also den gesamten Port A als Eingang
konfiguriert und alle Pull-up-Widerstände zugeschaltet.

MfG Paul

von Basic (Gast)


Lesenswert?

ok werde es mal morgen probieren

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
Noch kein Account? Hier anmelden.