PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Variable am Port ausgeben



HM
06.08.2011, 13:08
Hallo Wissende,
ich möchte eine Variable am Port ausgeben. Leider wird im Simulator nur bis 5 hochgezählt aber an dem PortB tut sich nichts, woran kann das liegen.
Wie funktioniert sowas eigentlich prinzipiell?
Könnt Ihr mir bitte helfen, wär sehr nett?
Vielen Dank für Antworten. MfG

Hier ist das Programm dazu:



$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 60

Ddrb = &B0001_1111
Portb = &B0000_0000

Dim A As Byte

Portb = A

Do

For A = 0 To 4
Waitms 10
Next A

Waitms 200

Loop

End

Kampi
06.08.2011, 13:36
Du hast auch zwei Fehler in deinem Programm.
Mit diesem Befehl:

Portb = A

schreibst du den Inhalt der Variable A in das Register von PortB. Dies machst du in deinem Programm vor der eigentlichen Schleife.
Wenn du das regelmässig ändern willst muss das so aussehen:

Do

For A = 0 To 4
Waitms 10
Next A

Waitms 200

Loop

End

Wenn du das vor dem "Do" machst wird das nur 1x beim starten des Programmes gemacht. Desweiteren wird im Simulator nur bis 5x gezählt, weil die "For"-Schleife nur von 0-4 geht. Wenn du höher zählen willst musst du:

For A = 0 To 100

oder sowas schreiben.
Das fertige Programm sieht dann etwa so aus:



$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 60

Ddrb = &B0001_1111
Portb = &B0000_0000

Dim A As Byte

Do

For A = 0 To 255
Waitms 10
Next A
Portb = A

Waitms 200

Loop

End


Nun wird alle 200ms etwa die Variable um 1 erhöht und das wird dann am PortB ausgegeben. Mit "For A = 0 To 255" legst du eine "For"-Schleife fest die die Variable A von 0-255 zählt. Dann mit "Next A" wird die Variable dann um den festgelegten Schritt erhöht. Da du in der "For"-Schleife keinen Schritt festgelegt hast wird die Variable bei "Next A" um 1 erhöht. Mit "PortB = A" schreibst du die Variable in das PortB-Register.

Sauerbruch
06.08.2011, 13:59
Na ja, auch Deine Version hat noch einen Schönheitsfehler, Kampi:

Zwar wird A von 0 bis 255 hochgezählt, aber der Befehl PORTB = A kommt erst danach! Und so wird auch immer nur 255 am PORTA ausgegeben.

@ HM:

Wenn Du alle 200 Milisekunden den PortB um einen Zähler erhöhen möchtest, würde ich das so machen:



...
...

Dim A as Byte

Do
For A = 0 to 15 (limitiert das ganze auf die "unteren" 4 Bits von PORTB)
PORTB = A
waitms200
Next A
Loop

Kampi
06.08.2011, 14:06
Stimmt. Sorry hab leider nur geguckt ob es Kompilierungsfehler gibt und nicht ob der Code funktioniert :(

Richard
06.08.2011, 16:00
Wenn du das vor dem "Do" machst wird das nur 1x beim starten des Programmes gemacht. Desweiteren wird im Simulator nur bis 5x gezählt, weil die "For"-Schleife nur von 0-4 geht. Wenn du höher zählen willst musst du:

For A = 0 To 100

oder sowas schreiben.
Das fertige Programm sieht dann etwa so aus:



$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 60

Ddrb = &B0001_1111
Portb = &B0000_0000

Dim A As Byte

Do

For A = 0 To 255
Waitms 10
Next A
Portb = A

Waitms 200

Loop

End




Jetzt wird nur 1 x am Ende etwas passieren Portb = A gehört VOR dem Next A

For A = 0 To 255
Waitms 10
Portb = A
Next A

Gruß Richard

Kampi
06.08.2011, 16:16
Ja das hat sauerbruch auch gemeint :D

HM
06.08.2011, 18:00
Hallo Kampi, Sauerbruch und Richard,
ich bin wieder zu Hause, vielen Dank für eure kompetenten Antworten, super.
Also das mit dem "PortB" hatte ich auch schon in der "Do Loop" drinstehen, nur nich vor dem "Next". So wie Ihr das geschrieben habt funktioniert es, die Ports schalten sich ein und aus.
Ich wollte PortB.0 bis PortB.4 der Reihe nach ein und ausschalten (H/L) (immer nur ein Port), jetzt habe ich gemerkt, das die Ports beim Weiterschalten die vorhergehenden nachziehen (jedenfalls im Simulator), das soll aber nicht so sein.
Was kann man da machen?
Vielen Dank. MfG

Kampi
06.08.2011, 19:05
Wenn du nur PortB.0-4 anschalten willst hat du nur 5 Bit also musst du 5x zählen aber nicht mit +1 sondern mit +2. Und nach dem
PortB = A
Waitms 200
schreibst du dann
PortB = 0
Next A
So sollte das eigentlich funktionieren. Kann es leider im Moment nicht prüfen, weil mir der PC fehlt ;)

HM
06.08.2011, 19:28
Hallo Kampi,danke für Deine Antwort.Bei mir im Zimmer sind 28Grad Wärme, da muß ich morgen weitermachen. Ich melde mich dann.MfG

Sauerbruch
06.08.2011, 20:53
Wenn du nur PortB.0-4 anschalten willst hat du nur 5 Bit also musst du 5x zählen aber nicht mit +1 sondern mit +2.

Auch das stimmt nicht ganz - denn dann würde A ja die Werte 2,4,6,8 und 10 annehmen. Und wenn diese Werte auf den PORTB ausgegeben werden, entsteht zwar ein interessantes Muster, aber kein "durchlaufendes" Bit.

Wenn ich Dich richtig verstanden habe, HM, möchtest Du so ´ne Art Lauflicht realisieren. Also die folgenden Bytes ausgeben:

00000001
00000010
00000100
00001000
00010000

Richtig? Dann mach´ doch mal den Windows-Rechner auf und wandle diese Binärzahlen in Dezimalzahlen um. Herauskommen wird 1,2,4,8 und 16. Heißt also im Klartext, dass Du mit A=1 anfängst, dann alle 200 ms den Befehl A=A*2 machst, und A wieder auf 1 setzt, nachdem es 16 gewesen ist. In Code also etwa so:




...
...
Dim A as byte
A=1

Do
PORTB = A
Waitms200
If A=16 then A=1 else A=A*2
Loop



Und das müsste auch bei > 28 Grad funktionieren :cool:

HM
06.08.2011, 22:10
Hallo Sauerbruch,vielen Dank für Deine Antwort Du kannst wohl Gedanken lesen, mit "If Then" habe ich auch schon rumexperimentiert. Das muß ich alles morgen machen, jetzt lieg ich im Bett.Mit den 28Grad habe ich auch an meinen Computer gedacht, der wird schon unter normalen Umständen heiß.Vielen Dank und bis morgen. MfG

Sauerbruch
06.08.2011, 23:18
Übrigens: Für Lauflicht-Experimente sind die Befehle "Shift" und "Rotate" auch sehr interessant! Näheres findest Du in der Bascom-Hilfe!

HM
07.08.2011, 09:11
Hallo Kampi u. Sauerbruch,
wieder vielen Dank für eure Antworten.
Die Beispiele sind wirklich sehr gut erklärt, sie funktionieren und das hilft mir schon weiter.
Mit "Shift u. Rotate" habe ich auch schon experimentiert, nur weiß ich noch nicht, wie ich das von "PortB.0 bis PortB.4" einschränke.
Vielen Dank für die Hilfe. :) MfG


$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 32
$framesize = 60

Ddrb = &B1111_11111
Portb = &B0000_0000

Dim A As Byte

A = 1

Do

Waitms 200

Portb = A

Rotate A , Left , 1

Loop

End

radbruch
07.08.2011, 09:27
Ungetestet:

Rotate A , Left , 1
If A.5=1 Then A=1
Loop

HM
07.08.2011, 09:52
Hallo radbruch,
vielen Dank, das funktioniert und leuchtet ein.
Dank euch habe ich jetzt unterschiedliche und richtige Erklärungen/Beispiele und die Möglichkeit verschiedene Varianten auszutesten und evtl. zu
erweitern.=D>


Vielen Dank.:)
Ach ja, ich hätte bald etwas wichtiges vergessen.
Gibt es irgendwo eine ausführliche Beschreibung des Bascom-Simulators auf deutsch?
Ich habe gemerkt das der Simulator sehr hilfreich ist.
MfG

Kampi
07.08.2011, 10:11
Hallo radbruch,
vielen Dank, das funktioniert und leuchtet ein.
Dank euch habe ich jetzt unterschiedliche und richtige Erklärungen/Beispiele und die Möglichkeit verschiedene Varianten auszutesten und evtl. zu
erweitern.=D>


Vielen Dank.:)
Ach ja, ich hätte bald etwas wichtiges vergessen.
Gibt es irgendwo eine ausführliche Beschreibung des Bascom-Simulators auf deutsch?
Ich habe gemerkt das der Simulator sehr hilfreich ist.
MfG

Musst du mal googlen :)
Aber du findest auch sehr viel Hilfe zu den Befehlen wenn du auf "Help" und dann auf "Index" und dann auf "Suchen"
Dort kannst du dann Befehle suchen und zu jedem befehl findest du auch eine Erklärung + Beispielcode mit Erklärung

HM
07.08.2011, 10:38
Hallo Kampi,
danke für Deine Antwort.
Ja also da habe ich schon nachgeschaut, mein Problem ist, daß ich kein englisch in der Schule hatte (das war eben damals so), ich kann nur etwas Computerenglisch und technische Daten lesen.
Ich glaube der Simulator ist da auch nicht in allen Einzelheiten erklärt.
Gegoogelt habe ich auch schon, da habe ich einiges gefunden und konnte es für mich anpassen, nur eine deutsche Beschreibung des Simulators habe ich noch nicht gefunden.
Meist finde ich was, wo Leute Probleme mit ihren Programmen im Simulator haben, also ich bin noch nicht so richtig fündig geworden.
Im "RN-Wissen" gibt es auch keine Beschreibung oder ist dort doch was?
Vielen Dank. MfG

HM
10.08.2011, 17:26
Hallo Kampi, Sauerbruch, Richard und radbruch,
ich möchte mich bei Euch für die guten Beispiele und Anregungen nochmals ganz herzlich bedanken.:):):)
Es hat alles sehr gut funktioniert, damit habt Ihr mir sehr weitergeholfen und ich habe eine Grundlage zum weiter üben.
Bis zum nächsten Mal.
Viele Grüße HM

HM
20.08.2011, 15:57
Hallo Leute,
allen die mir so gut und hilfsbereit geholfen haben, möchte ich mit diesen Video ein kleines Dankeschön sagen.
Es hat bestens funktioniert.

http://youtu.be/dq6TwCBTRQI
Vielen Dank. HM