AT89S52 programmieren

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From German to

Threaded View
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

Re: AT89S52 programmieren
Hallo Peter,

Quoted text here. Click to load it

hat der Controller einen Takt?
Für die Programmierung muß ausserdem RST aktiv (5V) sein.

Quoted text here. Click to load it

ja, im Datenblatt:
http://www.atmel.com/dyn/resources/prod_documents/doc1919.pdf

Gruß
Ernst



Re: AT89S52 programmieren
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

Re: AT89S52 programmieren
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



Re: AT89S52 programmieren
Hi,

Quoted text here. Click to load it
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

Re: AT89S52 programmieren
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.

Re: AT89S52 programmieren
Quoted text here. Click to load it


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)tmp25%5;
        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

Re: AT89S52 programmieren
Hi,
Quoted text here. Click to load it
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

Site Timeline