Forum: Mikrocontroller und Digitale Elektronik Starthilfe zum AT89S52


von Marcus G. (mgoettler)


Lesenswert?

Guten Abend mitteinander,

ich sollte mich beruflich ein bisschen mit den 8051er auseinandersetzen. 
Irgendwie komm ich damit nicht so ganz klar.

Ich habe einen AT89S52 von Atmel mit dem folgendem Programm beschrieben:
1
$NOLIST
2
$INCLUDE (89s52.mcu)
3
$LIST
4
5
; Programmbeginn
6
;---------------------------------------------------------------
7
 ORG 0h
8
        jmp start
9
10
; Initialisierung
11
;---------------------------------------------------------------
12
start:
13
14
; Stackpointer initialisieren
15
        mov SP,  #60h
16
17
; Hauptprogramm
18
;---------------------------------------------------------------
19
main:
20
21
clr  P0.0
22
call  delay
23
setb  P0.0
24
call  delay
25
26
jmp main
27
28
; Warteschleife
29
; --------------------------------------------------------------
30
delay:
31
        mov 2,#16
32
delay_1:
33
        mov 1,#144
34
        
35
delay_2:
36
        djnz 1,delay_2
37
        djnz 2,delay_1
38
  
39
  ret
40
41
END

Nach anfänglichen Schwierigkeiten mit dem flashen (über das Atmel Kabel 
AT89ISP), habe ich es nun endlich geschaft, den Prozessor zu 
programmieren.

Leider macht er aber keinen Mucks mit dem obigen Programm. Im Simulator 
(MIDE-51) funktioniert es einwandfrei.

An P0.0 ist eine LED über einen Vorwiderstand gegen Plus angeschlossen. 
Diese sollte eigentlich blinken, leuchtet aber noch nicht einmal. Am 
Prozessor selbst ist ein 12 MHz Quarz mit zwei 33pF Kondensatoren 
angeschlossen, am Reset PIN sind ein 8,2k Widerstand gegen Masse und ein 
1µF Kondensator gegen Plus angeschlossen.

Ich wäre sehr dankbar, wenn mir jemand auf die Sprünge helfen kann. Wo 
ist da der Wurm drin?


-Marcus

von Joe (Gast)


Lesenswert?

P0 benötigt externe Pullups.

von Dirk H. (arm-dran)


Lesenswert?

Wie groß ist der Widerstand ?

Hast Du Dir mal ausgerechnet, wie groß die Frequenz ist, die Du mit der 
Delay-Routine erzeugst ?

Dirk

von Dirk H. (arm-dran)


Lesenswert?

Achso,

2 Dinge noch.

Auch wenn Du die Interruptvectoren hier nicht benutzt, so schließe sie
sicherheitshalber mit RETI ab und leg die Startadresse deines Programmes
auf die Speicheradresse jenseits des Vector-Bereichs.

Um zu sehen, ob Dein µC wirklich arbeitet, schalte die LED
einfach mal nur über den Befehl

            clr P0.0
loop
            sjmp loop

ketzt müsste die LED gegen 0 geschaltet werden.
Wenns das nicht ist, dann läuft auch das Programm nicht.

von Peter D. (peda)


Lesenswert?

EA an VCC ?

Peter

von Sigint 112 (sigint)


Lesenswert?

@Joe: Die LED hängt an VCC, sollte also ok sein.

@Dirk: Ich glaube die Delay-Funktion verzögert nur um ein ca. 1ms... 
also sollte das Blinken nicht sichbar sein. Aber die LED sollte etwas 
leuchten.

Gruß,
  SIGINT

von Marcus G. (mgoettler)


Lesenswert?

Ich danke euch für die Antworten.

Bin leider noch nicht dazu gekommen die Tipps auszuprobieren. Im Moment 
sind leider andere Dinge dringender.

Sobald ich wieder mehr Luft habe, werde ich, so wie Dirk geschrieben 
hat, einfach nur den Ausgang setzen und schauen was passiert.

Interrupts sind im Moment noch nicht freigegeben, dürfte ja ansich auch 
nichts passieren? Der nächste Schritt wäre dann die Verzögerung mit dem 
Timer zu realisieren.
Wo finde ich eigentlich die Interrupt-Vektoren? Die Datenblätter von den 
8051er sind mir irgendwie nicht ganz geheuer. Mir kommt es so vor, als 
ob hier schon einiges Wissen vorrausgesetzt wird. Bei den AVRs ist alles 
immer schön ausführlich beschrieben und damit komme ich meistens ganz 
gut klar.

@Peter:
Muß ich EA an VCC legen, damit der Prozessor überhaupt arbeitet? Im 
Moment hängt der PIN in der Luft.


Sonnige Grüsse
Marcus

von Dirk H. (arm-dran)


Lesenswert?

Marcus Göttler wrote:
> Ich danke euch für die Antworten.
>
> Bin leider noch nicht dazu gekommen die Tipps auszuprobieren. Im Moment
> sind leider andere Dinge dringender.
>
> Sobald ich wieder mehr Luft habe, werde ich, so wie Dirk geschrieben
> hat, einfach nur den Ausgang setzen und schauen was passiert.
>
> Interrupts sind im Moment noch nicht freigegeben, dürfte ja ansich auch
> nichts passieren? Der nächste Schritt wäre dann die Verzögerung mit dem
> Timer zu realisieren.
> Wo finde ich eigentlich die Interrupt-Vektoren? Die Datenblätter von den
> 8051er sind mir irgendwie nicht ganz geheuer. Mir kommt es so vor, als
> ob hier schon einiges Wissen vorrausgesetzt wird. Bei den AVRs ist alles
> immer schön ausführlich beschrieben und damit komme ich meistens ganz
> gut klar.
>
> @Peter:
> Muß ich EA an VCC legen, damit der Prozessor überhaupt arbeitet? Im
> Moment hängt der PIN in der Luft.
>
>
> Sonnige Grüsse
> Marcus

EA muß!! auf VCC sonst versucht er das Programm vom externen (nicht 
vorhandenen) Speicher auszuführen.

Bei den Atmel C51ern mußt Du Dir die Datenblätter teilweise als 
Fragmente zusammensetzen, wobei die Beschreibung der PINS im 
Hauptdatenblatt relativ am Anfang gut beschrieben ist.

Dirk

von Marcus G. (mgoettler)


Lesenswert?

Guten Morgen,

am Freitag hatte ich mal wieder Gelegenheit, mich mit dem 89S52 zu 
beschäftigen.

Als erstes habe ich EA auf VCC gelegt und das Programm getestet. Leider 
ohne Erfolg. Beim anlegen der Spannung leuchtet die LED mal heller, mal 
dunkler oder gar nicht.

Als nächstes habe ich das Programm abgeändert:

1
$NOLIST
2
$NOMOD51
3
$INCLUDE (89s52.mcu)
4
$LIST
5
6
; Programmbeginn
7
;---------------------------------------------------------------
8
 ORG 0h
9
        jmp start
10
11
; Initialisierung
12
;---------------------------------------------------------------
13
start:
14
15
; Stackpointer initialisieren
16
         mov SP,  #60h
17
18
; Hauptprogramm
19
;---------------------------------------------------------------
20
main:
21
22
         clr  P0.0
23
24
loop:
25
26
         jmp loop
27
28
END


Auch bei diesem Programm, hat die LED nicht immer zuverlässig, beim 
einschalten, geleuchtet. Anstatt clr P0.0 habe ich auch setb P0.0 
ausprobiert. Auch hier das selbe Problem: mal leuchtet die LED, mal 
wieder nicht.

Langsam vermute ich das der Prozessor gar nicht arbeitet. Entweder 
verrennt er sich irgendwohin (vielleicht falsch initialisiert? Stack?), 
kein richtiger Reset (vielleicht falsch beschaltet mit 8k2 und 1µF?), 
oder der Quarz schwingt nicht an. Wenn ich mit dem Tastkopf vom Oszi an 
den Quarz gehe, messe ich nichts. Wenn ich mich recht entsinne, konnte 
ich bei einem Mega16 den Quarz schwingen sehen.


Vielleicht hat jemand von euch noch eine Idee?

-Marcus

von Erik (Gast)


Lesenswert?

Hast Du den Reseteingang beschaltet?

Einen Quarz angeschlossen ?

Erik

von Erik (Gast)


Lesenswert?

Vielleicht mal ein Bild von Deiner Schaltung und ein Schematic (auch 
wenns von Hand ist)

Erik

von jack (Gast)


Lesenswert?

Laß doch den Stack in Ruhe. Wieso willst Du den auf 60h legen?

von Dirk H. (arm-dran)


Lesenswert?

jack wrote:
> Laß doch den Stack in Ruhe. Wieso willst Du den auf 60h legen?

Was ist den daran falsch, den Stack zu setzen. Der steht nach Reset auf
07h, also nach Registerbank 0.
In seinem Beispiel ist es zwar egal, trotzdem setzt man den Stack auf ne
andere Adresse.

Zum Beispiel in den indirekt adressierbaren Bereich zwischen 80-FF

@Marcus

Mach vielleicht mal eine Skizze von Deinem Schaltplan und posten.

Dirk

von Marcus G. (mgoettler)


Angehängte Dateien:

Lesenswert?

Reseteingang ist beschaltet:
von GND ein 8k2 Widerstand auf Reset, von Reset ein 1µF Kondensator 
gegen VCC

An XTAL1 und XTAL2 ist ein 12 MhZ Quarz mit zwei 33pF Kondensatoren 
gegen Masse angeschlossen.

EA mittlerweile an VCC ;)

Der 89S52 ist auf einer SMD-Adapterplatine eingelötet (PLCC44 auf 
Buchsenleisten). An Stifleisten ist die LED, der Quarz, der ISP-Stecker 
und die Reset Beschaltung angeschlossen und auf den Sockel aufgesteckt.

Foto kann ich leider keines machen, da die Schaltung in der Firma liegt.

von Dirk H. (arm-dran)


Lesenswert?

Marcus Göttler wrote:
> Reseteingang ist beschaltet:
> von GND ein 8k2 Widerstand auf Reset, von Reset ein 1µF Kondensator
> gegen VCC
>
> An XTAL1 und XTAL2 ist ein 12 MhZ Quarz mit zwei 33pF Kondensatoren
> gegen Masse angeschlossen.
>
> EA mittlerweile an VCC ;)
>
> Der 89S52 ist auf einer SMD-Adapterplatine eingelötet (PLCC44 auf
> Buchsenleisten). An Stifleisten ist die LED, der Quarz, der ISP-Stecker
> und die Reset Beschaltung angeschlossen und auf den Sockel aufgesteckt.
>
> Foto kann ich leider keines machen, da die Schaltung in der Firma liegt.

Also ich bin von einem RC-Glied am Reset Eingang des AT89S52 nicht so 
begeistert. Da gab es schon manche Probleme. Ich mach hier immer nen 
kleinen
Reset IC von Micrel oder ETC ran.

Ganz wichtig. Du solltest den Reset Eingang vom Programmer kommen mit 
einer
Diode zum Reset anschluss entkoppeln. Hast Du das gemacht ?

Dirk

von Marcus G. (mgoettler)


Lesenswert?

Hallo Dirk,

nein, eine Diode habe ich keine drin. Die Schaltung ist so aufgebaut wie 
oben gezeichnet. Nach erfolgter Programmierung habe ich in der 
Atmelsoftware immer auf "Run target" geklickt, die Spannnung weggenommen 
und den ISP Stecker abgezogen. Danach wieder Spannung dran.

Das mit den Problemen mit dem RC-Glied am Reset, könnte doch hier auch 
durchaus sein, oder? Würde zumindest erklären, warum die LED mal 
leuchtet und mal wieder nicht.

Ich zweifel langsam an mir selbst. So eine popelige Schaltung nebst 
Programm und ich bekomms nicht hin.

von fubu1000 (Gast)


Lesenswert?

hallo,
also beschalte deinen reset eingang mal rischtisch, dann funzt das 
au!!!!
du hast da nen hochpass und da kann keine gleichspannung durch!!!!!
mach da mal nen tiefpass raus, dann klappts auch mit deinem nachbarn 
atmel!!!

gruss fubu

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

fubu1000 wrote:
> hallo,
> also beschalte deinen reset eingang mal rischtisch, dann funzt das
> au!!!!
> du hast da nen hochpass und da kann keine gleichspannung durch!!!!!
> mach da mal nen tiefpass raus, dann klappts auch mit deinem nachbarn
> atmel!!!
>
> gruss fubu


Quark mit Soße

Die Beschaltung grundsätzlich richtig. Der 89S52 hat nen highaktiven 
Reset wie alle 51erKlone und der wird während Poweron und etwas länger 
über den C auf High gezogen und fällt danach auf Low. Leider braucht der 
52 aber ne bessere  Resetbeschaltung,  mit speziellen Resetbausteinen 
welche eine definierte Flanke und ein ordentliches Brownoutverhalten 
aufweisen. Sonst hängt er sich gerne auf.

von fubu1000 (Gast)


Lesenswert?

hallo,
shame on me. wer lesen kann iss klar im vorteil!!!!
habe an atmega müll gedacht.

@winfried: gerade datenblatt angeschaut vom 89s52 und du hast recht!!!!

bitte um entschuldigung für meinen bes...... beitrag!!!

gruss fubu

von Michael W. (michelw)


Lesenswert?

Hallo,
häng die LED doch mal an einen anderen Portpin, P1 oder P3. Vielleicht 
ist ja irgendwas mit dem Port nicht in Ordnung.

In solchen Fällen mache ich immer

label:
   inc PortX
jmp label

da kann man jeden Port mit dem Oszi auf doppelte oder halbe frequenz 
überprüfen.

Du schreibst in Deinem Programm:

delay:
        mov 2,#16
delay_1:
        mov 1,#144

delay_2:
        djnz 1,delay_2
        djnz 2,delay_1

versuch mal folgendes:

delay:
        Mov r2,#16
delay_1:
        mov r1,#144

delay_2:
        djnz r1,delay_2
        djnz r2,delay_1

von Matthias (Gast)


Lesenswert?

Ich hatte mit der Atmel-Programmiersoftware auch oft Probleme, jedoch 
beim AT89S53, solange beim brennen der Kondensator am Reseteingang dran 
war. Versuchs mal ohne oder schalte noch einen Widerstand von einigen 
100 Ohm dazu in Reihe. Der Programmieradapter schafft es möglicherweise 
nicht, den Reset-Pin zeitnah auf H zu ziehen.

Eine deutlich bedienfreundlichere Programmiersoftware findest Du hier:
http://www.amwaw.edu.pl/~adybkows/elka/ispprog.html

Deinen Adapter kannst Du weiterverwenden, es können dort verschiedene 
einstellt werden.

Gruß
Matthias

von Marcus G. (mgoettler)


Lesenswert?

Sodele, mal wieder Neuigkeiten.

Ich Danke allen die mir versucht haben zu helfen.

Es lag, wie von Dirk vermutet, am Reseteingang. Geht aber nur wenn ich 
in der Atmel Software auf "Run target" gehe. Sobald ich den ISP Stecker 
abziehe, oder die Spannung einschalte hängt er sich auf. Der braucht 
scheinbar wirklich ein extra Reset IC.

Komische Knilche, die 51er.

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.