mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Starthilfe zum AT89S52


Autor: Marcus G. (mgoettler)
Datum:

Bewertung
0 lesenswert
nicht 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:
$NOLIST
$INCLUDE (89s52.mcu)
$LIST

; Programmbeginn
;---------------------------------------------------------------
 ORG 0h
        jmp start

; Initialisierung
;---------------------------------------------------------------
start:

; Stackpointer initialisieren
        mov SP,  #60h

; Hauptprogramm
;---------------------------------------------------------------
main:

clr  P0.0
call  delay
setb  P0.0
call  delay

jmp main

; Warteschleife
; --------------------------------------------------------------
delay:
        mov 2,#16
delay_1:
        mov 1,#144
        
delay_2:
        djnz 1,delay_2
        djnz 2,delay_1
  
  ret

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

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P0 benötigt externe Pullups.

Autor: Dirk Hofmann (arm-dran)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie groß ist der Widerstand ?

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

Dirk

Autor: Dirk Hofmann (arm-dran)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EA an VCC ?

Peter

Autor: Sigint 112 (sigint)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus G. (mgoettler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Hofmann (arm-dran)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus G. (mgoettler)
Datum:

Bewertung
0 lesenswert
nicht 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:

$NOLIST
$NOMOD51
$INCLUDE (89s52.mcu)
$LIST

; Programmbeginn
;---------------------------------------------------------------
 ORG 0h
        jmp start

; Initialisierung
;---------------------------------------------------------------
start:

; Stackpointer initialisieren
         mov SP,  #60h

; Hauptprogramm
;---------------------------------------------------------------
main:

         clr  P0.0

loop:

         jmp loop

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

Autor: Erik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den Reseteingang beschaltet?

Einen Quarz angeschlossen ?

Erik

Autor: Erik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht mal ein Bild von Deiner Schaltung und ein Schematic (auch 
wenns von Hand ist)

Erik

Autor: jack (Gast)
Datum:

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

Autor: Dirk Hofmann (arm-dran)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus G. (mgoettler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk Hofmann (arm-dran)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus G. (mgoettler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Werner (michelw)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus G. (mgoettler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.