mikrocontroller.net

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


Autor: Bertram W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Bertram W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube so: Config Portc = Output

Otto

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bertram W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch das funktioniert nicht.

Autor: jl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bertram W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Bertram W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bertram W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das hast du wahr ;O) !

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.