AT89S52 programmieren

P

Peter

Guest
Hallo,

ich versuche einen AT89S52 ľC zu programmieren, habe dabei jedoch so
meine Probleme...
Das programmiergerät hierfür will ich mir selber bauen.
Als ersten Schritt wollte ich den Programming Enable Befehl an den ľC
senden und testen, ob dieser dann "0110 1001" zurück gibt (sollte er
doch, oder?).
Das ist mir aber noch nicht so richtig gelungen.
Um das Signal zu senden, benutze ich einen von mir programmierten
AT89C2051, der dann so ca. 2Bit pro Sekunde sendet, damit ich das
Ganze besser beobachten kann.

Der MISO-Port vom Zielcontroller bleibt jedoch immer auf high.
Ich bin mir auch nicht ganz sicher ob ich das Prinzip der seriellen
Schnitstelle wirklich richtig verstanden habe.
Z.Z. versuche ich es folgendermaßen:
Nach dem Einschalten sind MOSI und SCK low.
Dann wird MOSI je nach dem zu sendenden Bit eingestellt.
SCK wird auf high gesetzt und nach einiger Zeit (im Moment zum testen
noch 0.5s) wieder auf low. Dann wird das ganze mit dem nächsten Bit
wiederholt.
Für das 4. Byte, das ja nur gelesen werden soll werden dann beliebige
Daten gesendet und MISO überwacht.
Der Port bleibt jedoch immer auf high.

Was könnte ich falsch machen?
Ich hab noch nicht all zu viel Erfahrung (keine :) ) mit der
Programmierung von ľC. Es könnte also ein einfacher Fehler sein.

Gibt es ggf. auf der Seite von Atmel eine genaue Beschreibung der ISP
Programmierung?

Gruß + Vielen Dank schon mal,
Peter
 
Hallo Peter,

ich versuche einen AT89S52 ľC zu programmieren, habe dabei jedoch so
meine Probleme...
[...]
Was könnte ich falsch machen?
hat der Controller einen Takt?
Für die Programmierung muß ausserdem RST aktiv (5V) sein.

Gibt es ggf. auf der Seite von Atmel eine genaue Beschreibung der ISP
Programmierung?
ja, im Datenblatt:
http://www.atmel.com/dyn/resources/prod_documents/doc1919.pdf

Gruß
Ernst
 
Hi,

juchhu, jetzt klappts!
Ich habe den 22.11840 MHz Quarz gegen einen mit 12MHz ausgetauscht
und jetzt läufts!
Ich verstehe zwar nicht, warum, da es beides (laut Reichelt)
Grundwellenquarze waren, aber das ist jetzt erstmal sekundär für mich :)

Trotzdem nochmal vielen Dank für deine Hilfe

Gruß
Peter
 
Nur nochmal zur Info:
Am Quarz lag es doch nicht.
Ich hatte die beiden Controller in der falschen Reihenfolge
resettet, wodurch ein unbeabsichtigtes SCK-Signal erzeugt wurde.
 
In article <btn6sg$oj9$01$1@news.t-online.com>,
Peter <none@gmx.de> writes:
Nur nochmal zur Info:
Am Quarz lag es doch nicht.
Ich hatte die beiden Controller in der falschen Reihenfolge
resettet, wodurch ein unbeabsichtigtes SCK-Signal erzeugt wurde.

Sowas hab ich schom mal gemacht. Der Compiler ist der SDCC,
loc steht für Daten oder Programmspeicher beim 8252

#define SCK _P1_6
#define MISO _P1_4
#define MOSI _P1_5
#define RES _P1_3

uchar shout(unsigned char c)
{

c=c;
_asm
mov dph,#8
mov a,dpl
$00091:
mov c,MISO
rlc a
mov MOSI,c
nop
nop
setb SCK
nop
nop
nop
nop
clr SCK
nop
djnz dph,$00091
_endasm;

return ACC;
}

uchar shin(void)
{
_asm

mov dph,#8
mov a,dpl
$00081: setb SCK
nop
nop
mov c,MISO
rlc a
nop
nop
nop
clr SCK
nop
nop
nop
djnz dph,$00081
_endasm;
return ACC;
}
unsigned char shinit(void)
{
unsigned char tmp;
vorb();
_asm clr RES _endasm;
wait(50);

_asm
setb MOSI;
setb MISO;
clr SCK;
_endasm;

_asm setb RES _endasm;

wait(250);
tmp=0;
shout(0xac);shout(0x53);shout(0x55);
shout(0xac);shout(0x53);if(shin()!=0x53)tmp=255;
wait(50);
return tmp;
}

void iwriterom(uchar loc)
{
register unsigned int count,pos=0;
int ch;

shinit();


for(count=chiplen.word;count;count--)
{
ch=ser_getb();
if(ctlch)break;
shout(loc+2+8*(pos>>8));shout(pos&255);shout(ch);
wait(30);
if((count&15)==1)ser_putc(43);
pos++;
}
}

void ireadrom(uchar loc)
{
register unsigned int count,pos=0;

shinit();
ser_putc(CTL);
for(count=chiplen.word;count;count--)
{
shout(loc+1+8*(pos>>8));shout(pos&255);ser_putb(shin());
pos++;
}
}

void ileertest(void)
{
ser_putc(CTL);
wait(100);
ser_putc(43);
}
void iderase(void)
{
shinit();
shout(0xac);shout(0x04);shout(0x55);
wait(100);
}

void ilock1(void)
{

shinit();
shout(0xac);shout(0x07);shout(0x55);
wait(100);
}
--
MFG Gernot
 
Hi,
Sowas hab ich schom mal gemacht. Der Compiler ist der SDCC,
loc steht für Daten oder Programmspeicher beim 8252
Danke für den Quellcode, aber ich hab das jetzt schon so
hinbekommen, indem ich meinen AT89C2051 als Seriell zu Parallel
Konverter verwende und den Rest dann über den Computer steuer.
Zumindest den Programmiermodus konnte ich so aktivieren, da sollte
der Rest auch kein Problem sein ;-)

Gruß
Peter
 
Hallo,
es gab mal ein Errata von Atmel wonach manche Chips ISP nur bis 12 MHz
unterstützen. War aber eigentlich für den 89S8252.

Wieso eigentlich bauen: Schon mal nach PonyProg gesucht?

mfg
Claus
 
Hi,

Wieso eigentlich bauen: Schon mal nach PonyProg gesucht?
Ganz einfach: Ich bin Mac-User, und beim Macintosh gibt es
keine Parallele Schnittstelle.
Außerdem finde ich das so zum erlernen der ľC-Technik ganz
spannend :)

Gruß
Peter
 

Welcome to EDABoard.com

Sponsor

Back
Top