Betr.: 89C2051 für einfache Schaltaufgabe, kann jemand bei Software
helfen?
Hallo,
ich will einen "Uralt"-AT89C2051 zu Steuerzwecken umprogrammieren.
Bin dafür auch Hardware-mässig ausgerüstet, alleine die Software fehlt.
Der Chip soll für Experimentierzwecke eine Drumbox mit Takt versorgen,
d.h.
-alle acht Bits sollen wie bei einem Lauflicht in einem Zyklus
nacheinander ein mal auf hi geschaltet werden, bevor alles wieder von
vorne beginnt.
-ausserdem soll die Taktfrequenz mit zwei Druckschaltern an den
Eingängen hoch- und runtergeregelt werden können.
Die Grundfrequenz soll bei ca. 4 Sekunden pro Durchlauf liegen.
Das Programm kann ganz einfach gehalten sein, also keine
Tempobegrenzungen, Speicherung des Ist-Wertes o.ä. erforderlich.
Weiß jemand, wie man so ein Programm mit Bascom-8051 realisiert?
Wie es für den PC mit Basic geht, weiß ich, aber Bascom ist doch schon
was anderes...
Schönen Sonntag!!!
Keiner antwortet, na so was ;-)
Also,
bin jetzt mittlerweile auf folgendes Einfach-Programm gekommen (kann man
natürlich mit DIM noch kürzer gestalten):
$regfile = "89c2051.dat"
$crystal = 8643600
$baud = 1200
Los:
Waitms 250
P1.0 = &B00000001
Waitms 250
P1.0 = &B00000010
Waitms 250
P1.0 = &B00000100
Waitms 250
P1.0 = &B00001000
Waitms 250
P1.0 = &B00010000
Waitms 250
P1.0 = &B00100000
Waitms 250
P1.0 = &B01000000
Waitms 250
P1.0 = &B10000000
Goto Los
Wenn ich das richtig sehe, fehlt nur noch ein Befehl, der die Port-Bits
als Ausgänge definiert.
Habe in der Richtung leider im Bascom-Handbuch bis jetzt nichts
gefunden.
Weiß jemand etwas darüber???
Wäre sehr dankbar, wenn das hier klappt,bräuchte ich keinen diskreten
Taktgeber aufzubauen...
VG
beim 8051 gibt es keine Datenrichtungsregister - dafür aber auch nur
einen sehr mickrigen H-Strom. Der Aus/Eingang besteht nur aus einem
Transistor und einem Pullup.
Dein Programm ist irgendwie sehr gewöhnungsbedürftig :-)
Auf jeden Fall dürfte es nicht so funktionieren, wie du erwartest, da du
immer nur P1.0 beschreibst (ich kann aber kein Basic, vielleicht tut es
sogar, was du willst).
Als Zeitbasis solltest du einen Timerinterrupt verwenden statt delay.
Bertram W. wrote:
> Keiner antwortet, na so was ;-)
Nö.
Ohne etwas eigene Überlegungen fertig aufm Silbertablett liefern, ist
hier unüblich.
> bin jetzt mittlerweile auf folgendes Einfach-Programm gekommen (kann man> natürlich mit DIM noch kürzer gestalten):
crazy horse hat recht, Du mußt den ganzen Port P1 beschreiben, nicht nur
einen Pin.
Ich würde das Delay aber über nen Timer machen.
> Wenn ich das richtig sehe, fehlt nur noch ein Befehl, der die Port-Bits> als Ausgänge definiert.
Nö.
Der 8051 hat doch Open-Drain-Ausgänge mit internen Pullups.
Eine Richtungsumschaltung ist daher unnötig.
Die neuen AT89LP4052 können aber auch auf Gegentaktausgang umgeschaltet
werden.
Peter
Hallo,
Danke für die Antworten!
Hatte es nach dem Posten auch gemerkt, die Ports sind noch nicht richtig
durchnummeriert, hier die "bereinigte" Version:
$regfile = "89c2051.dat"
$crystal = 8643600
$baud = 1200
Los:
Waitms 250
P1.0 = &B00000001
Waitms 250
P1.1= &B10000000
Waitms 250
P1.2 = &B00000010
Waitms 250
P1.3= &B00000100
Waitms 250
P1.4= &B00001000
Waitms 250
P1.5 = &B00010000
Waitms 250
P1.6 = &B00100000
Waitms 250
P1.7 = &B01000000
Goto Los
Echt, funktioniert ohne Definierung von Ein/Ausgängen, kratz-am-kopf, na
gut!
Die Sache mit Timer-Interrupt statt Delay ist möglicherweise für einen
dauerhaft sauberen Takt gar nicht so verkehrt, jetzt soll aber erst mal
das hier ans Laufen gebracht werden...
P1.x ist ein bit grosser Wert. Also nur mit 0 oder 1 beschreiben. Den
Rest macht der Compiler/Interpreter selbst. Was du machst ist allen P1
Pins Werte zuzuschreiben. Aber dann auch ohne ".x".
Und dann sind die Bitmuster ab P1.1 falsch (bzw versetzt).
JL
Beim AT89C2051 gibt es nur die ursprünglichen Modes der Portpins als
Ausgang oder Eingang (Px.y=1). Deshalb mußt du an den Pins auch nichts
konfigurieren. Neuere 8051 Derivate dagegen besitzen diverse Modes wie
Open-Collector oder andere, welche man für seinen jeweiligen Fall
richtig konfigurieren muß.
Dann gibts bei dem Controller wohl auch nicht die Möglichkeit, den
ganzen Port auf einmal anzusteuern wie z.B. Portx=255, um alle acht Bits
von Portx gleichzeitig auf hi zu setzen?!
Bertram W. wrote:
> Dann gibts bei dem Controller wohl auch nicht die Möglichkeit, den> ganzen Port auf einmal anzusteuern wie z.B. Portx=255, um alle acht Bits> von Portx gleichzeitig auf hi zu setzen?!
Du bist doch derjenige, der bisher darauf beharrt, immer nur einzelne
Bits anzusprechen.
Den ganzen Port auf ein Bitmuster zu setzen, wurde schon mehrfach
erwähnt.
Es geht natürlich beides.
P1 = 255
Peter