Forum: Mikrocontroller und Digitale Elektronik Mehrere Variable auf einen Port ausgeben in bascom


von Detlef K. (deka65)


Lesenswert?

hallo, MC-Gemeinde.
Ich bin ganz neu hier , und wende mich an euch mit einem Problem, das 
mich schon eine Weile umtreibt, mir aber weder Goooogel noch andere 
Foren die Augen geöffnet haben. Als Programmiersprache kommt nur Bascom 
in Frage.
Jetzt mein Problem:
Ich möchte auf einem Port mehrere Ausgänge (verschiedene Variablen) 
schalten, wobei eine Variable zwei, drei oder mehr Pins belegt. Die 
Variablen liegen auch zu unter-schiedlichen Zeiten an (verschiedene 
Frequenz). Einen Port als Ausgang zu konfigurieren scheidet aus, da sich 
ja immer der gesamte Port angesprochen fühlt. Die einzelnen Variablen in 
Bits zu zerhacken und dann einzelne Portpins anzusprechen verbraucht 
auch sehr viel Rechenzeit und Speicherplatz. Also meine Frage, gibt es 
in Bascom einen Befehl oder eine Möglichkeit, einer Variablen mehrere 
Portpins zuzuordnen ?

Ich würde mich auf die helfende Hand freuen.

Gruß deka65

P.S. die 65 müsste 65+ heißen (so alt,wie unsere Republik)

von leluno (Gast)


Lesenswert?

du willst vermutlich einen Port(=> 8Pins eines AVR) mit verschiedenen 
Variablen ansteuern. Die Zuordnung geschieht mit diesem Zeichen:"="

PORTB=var1
PortB=var2

setzt die Pins jeweils entsprechend den Bits der Variable var1, var2, 
etc.

von Detlef K. (deka65)


Lesenswert?

Hi, leluno
vielen Dank für die Antwort. Vielleicht habe ich mich auch falsch 
ausgedrückt. Meine Frage zielte daraufhin , z.B. Variable1 schaltet die 
Pins
B.0,B.1,B.2 , eine andere Variable die Pins B.3,B.4,B.5 . Jede Variable 
soll aber auch gleichzeitig ihre entsprechenden Ausgänge schalten.

Dein Vorschlag würde ja immer den gesamten Port ,wenn als Output 
definiert, setzen.

Ich hoffe, ich habe mich jetzt verständlicher ausgedrückt.

Gruß
deka65

von leluno (Gast)


Lesenswert?

Dafür gibt es die Verknüpfungen And, Or etc. Musst du im Handbuch 
nachlesen

von life (Gast)


Lesenswert?

Detlef Kahrmann schrieb:
> ausgedrückt. Meine Frage zielte daraufhin , z.B. Variable1 schaltet die
> Pins
> B.0,B.1,B.2 , eine andere Variable die Pins B.3,B.4,B.5 .

Geht in Bascom nicht so, wie du die das vorstellst. Per Overlay könnte 
man eine Bytevariable auf einen Port legen und byteweise oder bitweise 
ansprechen.

> Jede Variable
> soll aber auch gleichzeitig ihre entsprechenden Ausgänge schalten.

Bitte? Wie ist das gemeint.

von Paul Baumann (Gast)


Lesenswert?

Was Du tun kannst, wäre, einzelne Bits aus der Variablen einzelnen Port-
pins zuzuweisen.
Beispiel:

Dim Horst as Byte
Dim Alfred as Byte

....und dann:

Portb.0=Horst.0
Portb.1=Horst.3
Portb.2=Alfred.5

usw.

MfG Paul

von Detlef K. (deka65)


Lesenswert?

Hi, leluno
Wie And, Or und Xor geht,weiss ich ja . Hatte weiter oben schon 
geschrieben "die einzelnen Bits zerhacken" . Das würde aber bedeuten, 
bei jeder Änderung eine Variablen ,alle Variablen zu bearbeiten. Das 
sollte, so meine Frage , Bascom für mich erledigen. Aber ich bekomme 
langsam das Gefühl, man kann nicht alles haben. Einige Sachen muss man 
halt "zu Fuß" machen.
Trotzdem vielen Dank für deine Bemühungen, mir zu helfen.

Gruß
deka65

von Detlef K. (deka65)


Lesenswert?

Hallo Paul
da haben sich einige Antworten überschnitten. Erst mal vielen Dank für 
die Antwort. Das könnte ich mal probieren, muss es aber erst sacken 
lassen.
komme gegebenenfalls nochmal darauf zurück.

Gruß
deka65

von Detlef K. (deka65)


Lesenswert?

Hallo live,
habe deine Antwort zu spät gesehen, war gerade am schreiben. Diese 
knallharte Aussage,
life schrieb
> Geht in Bascom nicht so, wie du die das vorstellst.
nehme ich jetzt zur Kenntnis. das deckt sich in etwa mit den meisten 
Aussagen, die ich gelesen habe. Also doch selber Hand anlegen.

Trotzdem vielen Dank für die Bemühung, mir zu helfen.

Gruß
deka65

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

hallo detlef

ich weiss nicht ob dein Problem gelöst ist, aber hier mal eine Anregung
mit inline Assebler für Bascom.

entweder nur eine Variable ändern oder alle variablen setzen.

'####################################################################### 
########
'              Demo Projekt
'              ************
'              inline Assembler
'
' By COOL-DMX.DE
'####################################################################### 
########

$regfile = "attiny2313.dat"
$crystal = 16000000
'------------------------------------
$hwstack = 32
$swstack = 8
$framesize = 24
'------------------------------------
'Variablen
Dim Tmp1 As Byte                                            'Variable 1
Dim Tmp2 As Byte                                            'Variable 2
Dim Tmp3 As Byte                                            'Variable 3


'------------------------------------
Config Portb = &B11111111                                   'Port's 
Configurieren
Portb = 0
'####################################################################### 
########
' Hauptschleife
'####################################################################### 
########
'einmal alle Var. einen Wert Zuweisen
Tmp1 = &B00000010
Tmp2 = &B00000001
Tmp1 = &B00000101
Gosub All_var

Do
'simple Zählschleife
Incr Tmp1
If Tmp1 > 8 Then
      Tmp1 = 0
      Incr Tmp2
End If

If Tmp2 > 8 Then
      Tmp2 = 0
      Incr Tmp3
End If
Waitms 50

' Wahlweise Proc 1 oder 2
'Gosub All_var
Gosub One_var


Loop

'####################################################################### 
########
' nur eine Variable aktualiesieren
One_var:
!     IN   R20,PortB

!     LDS   R17,{Tmp2}                                      'lade 
Variavlen in Hilfsregister
!     andi  R17,&B00000111                                  '3 Bit 
benötigt Filtern

!     ROL   R17                                             'Bit's an 
pos. rollen (PB5-7)
!     ROL   R17
!     ROL   R17
!     ROL   R17
!     ROL   R17

!     andi  R20,&B00011111                                  'entferne 
bit 5-7
!     ADD   R20,R17                                         'setze neue 
Werte

!     Out PortB , R20                                       'Port neu 
setzen
Return
'####################################################################### 
########
' nur eine Variable aktualiesieren
All_var:
!     clr   R20

!     LDS   R16,{Tmp1}                                      'lade 
Variavlen in Hilfsregister
!     LDS   R17,{Tmp2}
!     LDS   R18,{Tmp3}

!     andi  R16,&B00000111                                  '3 Bit 
benötigt Filtern
!     andi  R17,&B00000111                                  '3 Bit 
benötigt Filtern
!     andi  R18,&B00000011                                  '2 Bit 
benötigt Filtern

!     ROL   R17                                             'Bit's an 
pos. rollen (PB5-7)
!     ROL   R17
!     ROL   R17
!     ROL   R17
!     ROL   R17

!     ROL   R18                                             'Bit's an 
pos. rollen (PB3-4)
!     ROL   R18
!     ROL   R18

!     ADD   R20,R16
!     ADD   R20,R17
!     ADD   R20,R18
!
!     Out PortB , R20                                       'Port neu 
setzen
Return
'####################################################################### 
########

von Detlef K. (deka65)


Lesenswert?

@ Dirk
Vielen Dank für die Bemühungen. Komme gerade aus dem Urlaub zurück.
Das Problem habe ich aber schon, dank Paul Baumann, lösen können.
Die Variablen werden als Byte dimensioniert.
     DIM Var1 as Byte
     DIM Var2 as Byte

dann werden den Portpins die Variablenbits zugeordnet.
     PORTB.0 = Var1.0
     PORTB.1 = Var1.1
     PORTB.2 = Var1.2

     PORTB.3 = Var2.0
     PORTB.4 = Var2.1
     PORTB.5 = Var2.2

Das ist nur ein Beispiel, bei dem die Variablen einen Zählumfang von
0 - 7 haben. Die portübergreifende Variante habe ich noch nicht 
getestet,
denke aber, das es auch funktioniert.

Damit hat sich meine Frage erledigt.
Ich danke allen, die versucht haben, mir zu helfen
Gruß deka65

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.