Forum: Mikrocontroller und Digitale Elektronik 89C2051 für einfache Schaltaufgabe, kann jemand bei Software helfen?


von Bertram W. (Gast)


Lesenswert?

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!!!

von Bertram W. (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

ich glaube so: Config Portc = Output

Otto

von crazy horse (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Bertram W. (Gast)


Lesenswert?

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...

von crazy horse (Gast)


Lesenswert?

auch das funktioniert nicht.

von jl (Gast)


Lesenswert?

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

von Bertram W. (Gast)


Lesenswert?

Year Leute, es funzt!!! Mein erstes selbstgeschriebenes uC-Programm auf 
selbstgerösteter Hardware!!!!!! :O)

Also, nach anfänglichem Fehlversuch (jepp jl, das hab ich auch schon 
gemerkt ;O)) hier noch mal das Programm in der funktionstüchtigen Form:

(besonders beeindruckt hat mich übrigens, dass Bascom einen 89C51er 
direkt unter Win98 per BlowIT am Parallelport beschreiben kann)


$regfile = "89c2051.dat"
$crystal = 8643600
$baud = 1200


P1.0 = 1
P1.1 = 1
P1.2 = 1
P1.3 = 1
P1.4 = 1
P1.5 = 1
P1.6 = 1
P1.7 = 1


Los:

P1.0 = 0
Waitms 175
P1.0 = 1

P1.1 = 0
Waitms 175
P1.1 = 1

P1.2 = 0
Waitms 175
P1.2 = 1

P1.3 = 0
Waitms 175
P1.3 = 1

P1.4 = 0
Waitms 175
P1.4 = 1

P1.5 = 0
Waitms 175
P1.5 = 1

P1.6 = 0
Waitms 175
P1.6 = 1

P1.7 = 0
Waitms 175
P1.7 = 1

Goto Los

von R. W. (quakeman)


Lesenswert?

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ß.

von Bertram W. (Gast)


Lesenswert?

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?!

von Peter D. (peda)


Lesenswert?

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

von Bertram W. (Gast)


Lesenswert?

Ja, das hast du wahr ;O) !

Gut, dann kann ich ja das Programm jetzt schon mal ein bisschen 
verkleinern...

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.