Forum: Mikrocontroller und Digitale Elektronik 8051er Microcontroller Programm


von Rolf (Gast)


Lesenswert?

Hallo

Ich habe in einem anderen Forum was gefunden und es mal ausprobiert.
Der Code ist:


    mov   tmod, #00100000b
    mov   tcon, #01000000b
    mov   th1, #-1   ;57.6kbaud at 11.0592MHz
    mov   pcon, #10000000b
    mov   scon, #01110010b
    mov   dptr, #0
loop:
    jnb   ti, $
    clr   ti
    movx   a, @dptr
    mov   sbuf, a
    inc   dptr
    mov   a, dpl
    orl   a, dph
    jnz   loop
    sjmp   $
end

Nun habe ich mal eine Frage:

Dieses kleine Programm erzeugt eine genau 64kB Große Datei und man kann
sehr gut Eproms damit auslesen. (27C512, 87C510...)
Genutzt wird ja der Port0 und 2 vom µC.
Ist es denn möglich das man den Port 1 mit einbeziehen kann um noch
größere Eproms auszulesen??
Und könnte man den µC so programmieren das folgende Konfiguration
möglich ist:

P0.0 = AD0
P0.1 = AD1
P0.2 = AD2
P0.3 = AD3
P0.4 = AD4
P0.5 = AD5
P0.6 = AD6
P0.7 = AD7

P2.0 = A8
P2.1 = A9
P2.2 = A10
P2.3 = A11
P2.4 = A12
P2.5 = A13
P2.6 = A14
P2.7 = A15

P1.0 = A16
P1.1 = A17
P1.2 = A18
P1.3 = A19
P1.4 = A20
P1.5 = A21
P1.6 = A22
P1.7 = Doppel so schnelle Taktung wie auf P0.0 = AD0??

Ist das möglich??

Vielen Dank

Rolf

von thkais (Gast)


Lesenswert?

Um exakt auf die Fragestellung zu antworten: Ja, es ist möglich.
Ein klein wenig größer wird das Programm dann aber schon...

von Thomas (Gast)


Lesenswert?

Hallo Rolf,

was meinst du mit P1.7 ??? doppelt so schnell ?

Ansonsten läßt du alle 64k einfach das Port 1 ebenfalls soweit zählen
wie du es brauchst. Dann geht das ganze bis zur 256*64kB = 16385 kB
oder 131MBit (E)proms, die ich bishe rnoch nicht kenne.

Gruß Thomas

von Peter Dannegger (Gast)


Lesenswert?

mov p1, #0

... ;alter Code ohne "sjmp $"

inc p1
cjne p1, #endwert, loop
sjmp $


Das mit dem p1.7 mußt Du selber machen.


Peter

von Rolf (Gast)


Lesenswert?

Hallo

Wow mit solch einen Feedback hätte ich nicht gerechnet.
Also wenn ich Peter richtig verstanden habe sollte der Source so

    mov p1, #0
    mov   tmod, #00100000b
    mov   tcon, #01000000b
    mov   th1, #-1   ;57.6kbaud at 11.0592MHz
    mov   pcon, #10000000b
    mov   scon, #01110010b
    mov   dptr, #0
loop:
    jnb   ti, $
    clr   ti
    movx   a, @dptr
    mov   sbuf, a
    inc   dptr
    mov   a, dpl
    orl   a, dph
    jnz   loop
    inc p1
    cjne p1, #endwert, loop
    sjmp $
end

aussehen???

Was bitte ist mit Endwert gemeint??? Hexdezimal?? Also bei 22
Adressleitungen 7FFFFF???

Vielen Dank

Rolf

von Rolf (Gast)


Lesenswert?

Hallo

Natürlich am Ende ohne sjmp $!!!!!!!!!!!

Gruß Rolf

von Rolf (Gast)


Lesenswert?

Hallo

Also in der Zeile

cjne p1, #endwert, loop

sagt er mir das ein Fehler drinn wäre.
Statt den Endwert habe ich mal Hex oder 11111111b eingesetzt.
Kommt immer wieder das der sagt

Invalid Register!!!

Was könnte das sein??

Danke Rolf

von Niels H. (monarch77)


Lesenswert?

Du darfst offensichtlich p1 nicht in verbindung mit cjne verwenden. Das
sind so einer der nachteile der 51'er, die mich zu den mega-Bauteilen
von atmel getrieben haben.

Ich bin auch jetzt im 51'er bereich nicht mehr so fit; entweder lautet
die lösung

inc p1
mov a,p1
cjne a,#0ffh,loop

oder

inc p1
mov r0,p1
cjne r0,#0ffh,loop


Zum erlernen von Assembler empfehle ich übrigens die Mega-Serie z.B.
ATmega8. Benötigt für den einfachen Betrieb keine aussenbeschaltung und
man wird von sochen gotcha's verschont.

von Rolf (Gast)


Lesenswert?

Hallo

inc p1
mov a,p1
cjne a,#0ffh,loop

Damit funktioniert es.
Könnte mir denn jemand den Ansatz geben wie ich das mit dem P1.7 lösen
kann??

Gruß Rolf

von Marko B. (Gast)


Lesenswert?

Binärdaten sollte man nicht "einfach so" über die serielle
Schnittstelle schicken, besonders bei 57kbaud. Bei einem EPROM kann ein
einzelnes falsch übertragenes Bit die Daten unbrauchbar machen. Also
entweder CRC berechnen und zum Schluß separat ausgeben, oder die Daten
gleich z.B. im Intel-Hex Format übertragen.

von Niels H. (monarch77)


Lesenswert?

Ich würde gerne helfen, hab aber nicht verstanden, was p1.7 machen
soll?

Doppelt so schnelle Taktung wie P0.0? P0.0 isn Adress- bzw Datenbit. Da
taktet nix!

von Rolf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Niels

Der Zähler an P0.0 (AD0) geht ja immer L H L H L H L H L H.....
Und der Port 1.7 soll wenn P0.0 Low ist L H machen dann geht P0.0 auf
High und der P1.7 soll wieder L H machen.
Ich habe mal ein Bild mit drann wie es aussehen sollte.

Vielen Dank

Rolf

von Peter Dannegger (Gast)


Lesenswert?

Es gibt Leute, die wollen erst wissen, wozu etws nütze ist, ehe sie sich
mit einem Problem beschäftigen.

Also wozu soll der P1.7 gut sein ?


Peter


P.S.:
Füge irgendwo "setb p1.7", "clr p1.7" ein

von Rolf (Gast)


Lesenswert?

Hallo

Achso!!!!!!!!!!
Ich möchte auch gern 16 Bit Flash's z.B lesen können.
Wenn ich diese Funktion auf P1.7 habe kann ich mir einen Adapter
erstellen der erst das low Byte und dann das Highbyte liest und dann
zur nächsten Adresse geht.
Und ich kann immer noch 23 Adressleitungen benutzen.

Viele Grüße

Rolf

von Niels H. (monarch77)


Lesenswert?

jetzt, wo man weiss, was du machen möchtest, ist es definitiv einfacher,
dir zu helfen.

Um es mal technisch zusammenzufassen:
Du hättest dann 23 Adressbits und einen h/l-Byte-selektor.

Um den Programmcode so einfach wie möglich wie möglich zu halten, würde
ich dir vorschlagen, für den h/l-Byte-selektor auf einen anderen Port zu
legen. Hättest du da nochn pinchen offen?

Ansonsten würde es etwas kompliziert:
In R0 den Adresszähler für p1 auslagern und anfangs mit 0
initialisieren. dann bei jedem schleifendurchlauf:

mov p1,r0 ;adresse A16-A22 auf p1 legen
clr p1.7 ; h/l-selektor auf low
movx a,@dptr ; byte lesen
.....        ; und seriell ausgeben
set p1.7 ; h/l-selektor auf high
movx a,@dptr ; byte lesen
......       ; und seriell ausgeben

und weiter mit der schleife

von Rolf (Gast)


Lesenswert?

Hallo

Ich hätte noch

P3.2 - P3.6 frei.
Wenn das einfacher ist dann machen wir doch auf P1.7 A23!!!
Wie müsste denn dann das Programm aussehen??

Gruß Rolf

von Niels H. (monarch77)


Lesenswert?

wenn du p3.2 nimmst,
dann müssstest du deine schleife nur um einen movx erweitern:

    clr   ti
(+) clr   p3.2
    movx   a, @dptr
    mov   sbuf, a
(+) set   p3.2
(+) movx   a,@dptr
(+) mov   sbuf,a

(+)-gekennzeichnete Zeilen sind hinzugefügte zeilen....

Frage an einen 51'er spezialist: muss man nach einem 'mov sbuf,a'
nicht eigentlich warten, bis sbuf gesendet worden ist?

von Niels H. (monarch77)


Lesenswert?

ok, hab mich gerade selber mal schlau gemacht

vor jedem "mov sbuf,a" muss ein "clr ti" und unmittelbar danach ein
"jnb ti,$", damit die programmausführung solange unterbrochen ist,
solange das interace das byte sendet.

d.h. deine schleife sähe so aus:

clr p3.2
clr ti
movx a,@dptr
mov sbuf,a
jnb ti,$
set p3.2
movx a,@dptr
clr ti
mov sbuf,a
jnb ti,$

ich hoffe, das kommt als codefragment einigermaszen verständlich an.

von Rolf (Gast)


Lesenswert?

Hallo

Muss das jetzt noch unter das Programm drunter??

    mov p1, #0
    mov   tmod, #00100000b
    mov   tcon, #01000000b
    mov   th1, #-1   ;57.6kbaud at 11.0592MHz
    mov   pcon, #10000000b
    mov   scon, #01110010b
    mov   dptr, #0
loop:
    jnb   ti, $
    clr   ti
    movx   a, @dptr
    mov   sbuf, a
    inc   dptr
    mov   a, dpl
    orl   a, dph
    jnz   loop
    inc p1
    clr p3.2
    clr ti
    movx a,@dptr
    mov sbuf,a
    jnb ti,$
    set p3.2
    movx a,@dptr
    clr ti
    mov sbuf,a
    jnb ti,$
    cjne p1, #endwert, loop
    sjmp $
end

von Niels H. (monarch77)


Lesenswert?

nein...das kommt in die schleife...
Ausserdem funktioniert cjne p1 doch nicht

Der vollständigecode müsste so ausehen:

    mov p1, #0
    mov   tmod, #00100000b
    mov   tcon, #01000000b
    mov   th1, #-1   ;57.6kbaud at 11.0592MHz
    mov   pcon, #10000000b
    mov   scon, #01110010b
    mov   dptr, #0
loop:
    clr    p3.2
    movx   a, @dptr
    clr    ti
    mov   sbuf, a
    jnb    ti,$
    set    p3.2
    movx   a, @dptr
    clr    ti
    mov   sbuf, a
    jnb    ti,$
    inc   dptr
    mov   a, dpl
    orl   a, dph
    jnz   loop
    inc p1
    mov a,p1
    cjne a, #endwert, loop
    sjmp $
end

von Rolf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Hmmm.
Das lässt nich nicht kompilieren!!!
Der hat 2 Error's
Ich habe mal ein Bild mit den Fehlern als Dateianhang.

Gruß Rolf

von Rolf (Gast)


Lesenswert?

Hallo

Habe mal ein bisschen probiert.
Kann es sein das es setb p3.2 sat set p3.2 heisen muss??
Dann kan ich es auch kompilieren!!!
Habe auch mal nen andere Software genommen.

Gruß Rolf

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.