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