Forum: Mikrocontroller und Digitale Elektronik Hilfe AT89C2051


von Marcel K. (misterxx)


Lesenswert?

Hi,

ich habe ein Problem mit dem AT89C2051.

ich habe folgendes Programm (siehe unten) geschrieben und auf den uC 
überspielt, jedoch funktioniert es nicht! Was habe ich falsch gemacht?

Zum Programm: Es soll über ein Drehschalter drei Zeiten (5s, 10s und 
20s) ausgewählt werden und mit einer Start Taste gestartet. Der Notaus 
hängt am INT0.
1
include reg52.inc
2
3
start    equ  p1.7
4
notaus  equ  p3.2
5
int    equ  p3.3
6
pwahl1  equ  p1.6
7
pwahl2  equ  p1.5
8
pwahl3  equ  p1.4
9
relais  equ  p1.2
10
fehler  equ  p1.3
11
12
code at 0
13
14
pstart:  sjmp init
15
16
      org 0003h
17
      clr relais
18
      setb fehler
19
      reti
20
    
21
init:    setb ex0
22
      setb it0
23
      clr ie0
24
      setb ea
25
26
haupt:  mov p1, #0
27
      jb start, pwahl
28
      sjmp haupt
29
30
pwahl:  jb pwahl1, prog1
31
      jb pwahl2, prog2
32
      jb pwahl3, prog3
33
      sjmp haupt
34
35
prog1:  setb relais
36
      call zeit
37
      clr relais
38
      sjmp haupt
39
40
prog2:  setb relais
41
      call zeit
42
      call zeit
43
      clr relais
44
      sjmp haupt
45
46
prog3:  setb relais
47
      call zeit
48
      call zeit
49
      call zeit
50
      call zeit
51
      clr relais
52
      sjmp haupt
53
54
zeit:    mov r0, #40
55
zeit1:  mov r1, #250
56
zeit2:  mov r2, #250
57
zeit3:  djnz r2, zeit3
58
      djnz r1, zeit2
59
      djnz r0, zeit1
60
      ret
61
62
end
Wie muss ich den uC beschalten? Ich habe nur ein 12Mhz Quarz und zwei 
33pF Kondensatoren verwendet.

von Ralf (Gast)


Lesenswert?

> ich habe folgendes Programm (siehe unten) geschrieben und auf den uC
> überspielt, ...
Das ist kein Programm, das ist eine Abfolge von Assembler-Instruktionen. 
Ein Programm ist dokumentiert.

> jedoch funktioniert es nicht! Was habe ich falsch gemacht?
Ein Fehler ist (und das meine ich ernst und nicht böse) dass wie gesagt 
keine Kommentare drin sind, somit ist es schwer zu verstehen, was wo wie 
passieren soll - und Kommentare sind nicht für andere da, sondern zuerst 
mal für den Programmierer selbst!
Desweiteren ist "es funktioniert nicht" die Obermenge ALLER Fehler die 
das Universum zu bieten hat... oder andersrum ausgedrückt: Was erwartest 
du und was funktioniert nicht wie erwartet? Informationen darüber helfen 
dir und uns.

Ralf

von Sebastian (Gast)


Lesenswert?

Tip am Rande: Der Reset-Pin sollte nicht unbeschaltet bleiben. Siehe 
Datenblatt.

von Peter D. (peda)


Lesenswert?

Marcel K. schrieb:
> haupt:  mov p1, #0

Du weißt schon, daß der 8051 open-drain Ausgänge mit Pullups hat?

Tasten und Lasten schaltet man daher auch low-aktiv.


Peter

von Marcel K. (misterxx)


Angehängte Dateien:

Lesenswert?

Ok danke schonmal:)

Angenommen ich habe das Programm richtig, würde es auf der Schaltung im 
Anhang funktionieren?

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

Reset ist falsch beschaltet. Siehe Datenblatt.

von Thomas E. (thomase)


Lesenswert?

Marcel K. schrieb:
> würde es auf der Schaltung im Anhang funktionieren?
Nein. An Reset gehören noch 10µF gegen Vcc.
Stützkondensator fehlt.

mfg.

von Peter D. (peda)


Lesenswert?

Der AT89C2051 hat keinen Port P0.

Peter

von Marcel K. (misterxx)


Lesenswert?

Ok. Danke.

Im Datenblatt steht folgendes:

The P1.0 and P1.1 should be set to “0” if no external pull-ups are used, 
or set to “1” if
external pull-ups are used.

Da ich nicht vorhabe externe pull-ups zu verwenden muss ich P1.0 und 
P1.1 auf "0" setzen und kann diese zwei Pins dann nicht verwenden oder?

Marcel

von Marcel K. (misterxx)


Lesenswert?

Ich habe das Programm nochmal überarbeitet und mit Kommentaren versehen, 
wird das Programm mit der oben gezeichneten Schaltung + (Kondensator am 
Reset) funktionieren.

Kann es leider nicht ausprobieren und würde es erst merken wenns zu spät 
ist.
1
;Es gibt einen Drehschalter mit dem mann die Zeit (5sec, 10sec, 20sec) ;einstellen kann. Drückt mann die Start-Taste wird über ein Transistor und ;ein Relais eine UV-Lampe angeschaltet. Nach ablauf der Zeit get die ;UV-Lampe wider aus. Wir der Notaus oder der Enschalter (in Reihe) betätigt
2
;geht die UV-Lampe sofort aus und eine LED (fehler) leuchtet.
3
4
include reg52.inc    ;reg51.inc oder reg52.inc ???
5
6
start   equ  p1.7    ;Taster zum starten
7
notaus  equ  p3.2    ;Notaus und Endschalter in Reihe
8
pwahl1  equ  p1.6    ;Drehschalter Stellung 1 -> 5sec Leuchtdauer
9
pwahl2  equ  p1.5    ;Drehschalter Stellung 2 -> 10sec Leuchtdauer
10
pwahl3  equ  p1.4    ;Drehschalter Stellung 3 -> 20sec Leuchtdauer
11
relais  equ  p1.2    ;Ausgang der über Transistor und Relais eine Lampe
12
                     ;anschaltet
13
fehler  equ  p1.3    ;LED welche leuchtet wenn Notaus oder Endschalter
14
                     ;betätigt
15
16
code at 0
17
18
pstart:  sjmp init     ;Programmstart 
19
20
        org  0003h     ;Einsprungadresse Interrupt0
21
        setb relais    ;Ausgang Relais=1 ->Lampe aus
22
        clr  fehler    ;Ausgang fehler=0 -> LED leuchtet
23
        reti           ;Rücksprung
24
    
25
init:                  ;Initialisierung INT0
26
        setb ex0    
27
        setb it0
28
        clr  ie0
29
        setb ea
30
31
haupt:  
32
        mov relais, #1    ;schaltet Ausgang relais auf 1-> LED aus
33
        jnb start, pwahl  ;wenn Start=0 springt auf pwahl
34
        sjmp haupt        ;zurück zu haupt
35
36
pwahl:  
37
        jnb pwahl1, prog1  ;wenn pwahl1=0 springt zu prog1
38
        jnb pwahl2, prog2  ;wenn pwahl2=0 springt zu prog2
39
        jnb pwahl3, prog3  ;wenn pwahl3=0 springt zu prog3
40
        sjmp haupt         ;zurück zu haupt
41
42
prog1:  
43
        clr  relais    ;setze relais auf 0 -> Lampe leuchtet
44
        call zeit      ;rufe Unterprogramm zeit auf (5sec)
45
        setb relais    ;setze relais auf 1 -> Lampe aus
46
        sjmp haupt     ;zurück zu haupt
47
48
prog2:  
49
        clr  relais    ;setze relais auf 0 -> Lampe leuchtet
50
        call zeit      ;rufe Unterprogramm zeit auf (5sec)
51
        call zeit      ;rufe Unterprogramm zeit auf (5sec -> gesammtzeit
52
                       ;10sec)
53
        setb relais    ;setze relais auf 1 -> Lampe aus
54
        sjmp haupt     ;zurück zu haupt
55
56
prog3:  
57
        clr  relais    ;setze relais auf 0 -> Lampe leuchtet
58
        call zeit      ;rufe Unterprogramm zeit auf (5sec)
59
        call zeit      ;rufe Unterprogramm zeit auf (5sec -> gesammtzeit
60
                       ;10sec)
61
        call zeit      ;rufe Unterprogramm zeit auf (5sec -> gesammtzeit
62
                       ;15sec)
63
        call zeit      ;rufe Unterprogramm zeit auf (5sec -> gesammtzeit
64
                       ;20sec)
65
        setb relais    ;setze relais auf 1 -> Lampe aus
66
        sjmp haupt     ;zurück zu haupt
67
68
zeit:                      ;Zeitschleife   
69
         mov r0, #40
70
zeit1:   mov r1, #250
71
zeit2:   mov r2, #250
72
zeit3:   djnz r2, zeit3
73
         djnz r1, zeit2
74
         djnz r0, zeit1
75
         ret
76
77
end                        ;Ende

MfG Marcel

von Karl H. (kbuchegg)


Lesenswert?

Marcel K. schrieb:

> Kann es leider nicht ausprobieren und würde es erst merken wenns zu spät
> ist.

Schlecht. Ganz schlecht.
Man geht NIE mit der Erstversion eines Programmes sofort in Produktion!
Niemals. Es gibt IMMER eine Testphase. Denn so einfach kann ein Programm 
gar nicht sein, so simpel können last-minute Änderungen gar nicht sein, 
dass man nicht doch einen kapitalen Bock reingebaut haben könnte. (Und 
ich spreche da aus leidvoller Erfahrung!)

Wenn du mit der Zeit nicht hinkommst, dann hast du zu spät angefangen 
und den ganzen Vorgang gewaltig unterschätzt.

Die Programmlogik sieht auf den ersten Blick grundsätzlich ok aus (wenn 
man die unproduktive Warterei akzeptiert). Die Registereinstellungen für 
den Interrupt such ich mir nicht raus und ob das
1
zeit:                      ;Zeitschleife   
2
         mov r0, #40
3
zeit1:   mov r1, #250
4
zeit2:   mov r2, #250
5
zeit3:   djnz r2, zeit3
6
         djnz r1, zeit2
7
         djnz r0, zeit1
8
         ret
bei 12Mhz eine Wartezeit von 5 Sekunden ergibt, glaub ich auch erst, 
wenn du es mir vorgerechnet hast.

von Dietrich L. (dietrichl)


Lesenswert?

Du hast den Stackpointer noch nicht gesetzt, benutzt aber ein 
Unterprogramm und eine Interruptroutine.

Gruß Dietrich

von Marcel K. (misterxx)


Lesenswert?

Karl Heinz Buchegger schrieb:

>
> Wenn du mit der Zeit nicht hinkommst, dann hast du zu spät angefangen
> und den ganzen Vorgang gewaltig unterschätzt.
>

Die geeagelte Testplatine kam nicht bei und als sie entlich da war hab 
ich gemerkt wie viele Fehler mann in einem eigentlich simplen Programm 
und Platine machen kann. ich habs unterschätzt.

von Karl H. (kbuchegg)


Lesenswert?

Marcel K. schrieb:
> Karl Heinz Buchegger schrieb:
>
>>
>> Wenn du mit der Zeit nicht hinkommst, dann hast du zu spät angefangen
>> und den ganzen Vorgang gewaltig unterschätzt.
>>
>
> Die geeagelte Testplatine kam nicht bei und als sie entlich da war hab
> ich gemerkt wie viele Fehler mann in einem eigentlich simplen Programm
> und Platine machen kann. ich habs unterschätzt.

Dann heißt es Überstunden machen. Oder Nachtschichten. Oder beides.
Wenn du morgen abgeben musst, hast du ja noch ein paar Stunden Zeit.
(Und sag jetzt bitte nicht, du hättest die Platine samt Zubehör nicht 
bei dir. Denn dann gehörst du gestraft.)

von Dietrich L. (dietrichl)


Lesenswert?

Marcel K. schrieb:
> Die geeagelte Testplatine kam nicht bei und als sie entlich da war hab
> ich gemerkt wie viele Fehler mann in einem eigentlich simplen Programm
> und Platine machen kann.

Da kann man aber noch mit Messer und Draht reparieren - so komplex ist 
die Schaltung doch nicht. Ober besser gleich auf einem Steckbrett 
aufbauen.

Gruß Dietrich

von Marcel K. (misterxx)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die Registereinstellungen für
> den Interrupt such ich mir nicht raus und ob das
>
1
> zeit:                      ;Zeitschleife
2
>          mov r0, #40
3
> zeit1:   mov r1, #250
4
> zeit2:   mov r2, #250
5
> zeit3:   djnz r2, zeit3
6
>          djnz r1, zeit2
7
>          djnz r0, zeit1
8
>          ret
9
>
> bei 12Mhz eine Wartezeit von 5 Sekunden ergibt, glaub ich auch erst,
> wenn du es mir vorgerechnet hast.

2*250*250*40=50000000 -> 5s

hab extra meine Schulunterlagen rausgesucht.

von Karl H. (kbuchegg)


Lesenswert?

Marcel K. schrieb:

>> bei 12Mhz eine Wartezeit von 5 Sekunden ergibt, glaub ich auch erst,
>> wenn du es mir vorgerechnet hast.
>
> 2*250*250*40=50000000 -> 5s

Und wo stecken da jetzt die 12Mhz drinnen?
Die müssen ja in der Rechnung irgendwo vorkommen.

ein mit 12Mhz getakteter µC arbeitet eine gewisse Anzahl an Befehlen nun 
mal in 1/12 der Zeit eines mit 1Mhz getaktetem µC ab. Wenn eine 
Verzögerung daher über eine gewissen Anzahl an Befehlen realisiert wird, 
dann muss in dieser Anzahl in irgendeiner Form die Taktfrequenz des µC 
vorkommen. ein 12Mhz µC muss 12 mal so viele Befehle abarbeiten, wie ein 
mit 1Mhz getakteter, damit es auf die gleiche Zeit rausläuft.

von Skua (Gast)


Lesenswert?

Marcel K. schrieb:
> mov relais, #1    ;schaltet Ausgang relais auf 1-> LED aus

Da sollte auch besser
setb relais
stehen

Karl Heinz Buchegger schrieb:
> Und wo stecken da jetzt die 12Mhz drinnen?

12 MHz Takt ergeben 1µS Zykluszeit, oder ist das beim AT89C2051 anders.

von Georg G. (df2au)


Lesenswert?

Marcel K. schrieb:
> mov relais, #1    ;schaltet Ausgang relais auf 1-> LED aus

Diese Zeile solltest du dir noch einmal ansehen.
Welchen Assembler verwendest du? Mein uralter ASM51 wirft hier einen 
Fehler aus.

von Thomas E. (thomase)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ein 12Mhz µC muss 12 mal so viele Befehle abarbeiten, wie ein
> mit 1Mhz getakteter, damit es auf die gleiche Zeit rausläuft.
Das ist ein klassischer 8051. Der läuft mit Clock/12. Also in diesem 
Fall 1MHz. Dann passt das.

mfg.

von Marcel K. (misterxx)


Lesenswert?

Marcel K. schrieb:

> Im Datenblatt steht folgendes:
>
> The P1.0 and P1.1 should be set to “0” if no external pull-ups are used,
> or set to “1” if
> external pull-ups are used.
>
> Da ich nicht vorhabe externe pull-ups zu verwenden muss ich P1.0 und
> P1.1 auf "0" setzen und kann diese zwei Pins dann nicht verwenden oder?


Weiß darauf jemand ne Antwort?

von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Karl Heinz Buchegger schrieb:
>> ein 12Mhz µC muss 12 mal so viele Befehle abarbeiten, wie ein
>> mit 1Mhz getakteter, damit es auf die gleiche Zeit rausläuft.
> Das ist ein klassischer 8051. Der läuft mit Clock/12. Also in diesem
> Fall 1MHz. Dann passt das.

Ist ok.
Ich nehms ja auch an, wenn man mir das ordentlich begründet :-)

von Karl H. (kbuchegg)


Lesenswert?

Marcel K. schrieb:
> Marcel K. schrieb:
>
>> Im Datenblatt steht folgendes:
>>
>> The P1.0 and P1.1 should be set to “0” if no external pull-ups are used,
>> or set to “1” if
>> external pull-ups are used.
>>
>> Da ich nicht vorhabe externe pull-ups zu verwenden muss ich P1.0 und
>> P1.1 auf "0" setzen und kann diese zwei Pins dann nicht verwenden oder?
>
>
> Weiß darauf jemand ne Antwort?

Na ja. Dein Zitat gibt doch schon die Antwort.

von Thomas E. (thomase)


Lesenswert?

Marcel K. schrieb:
>> Da ich nicht vorhabe externe pull-ups zu verwenden muss ich P1.0 und
>> P1.1 auf "0" setzen und kann diese zwei Pins dann nicht verwenden oder?
Das sind die Eingänge des Analog-Komparators und deswegen ohne interne 
Pullups. Die beiden Ports können aber auch als normale Digital-IOs 
verwendet werden.

Damit sie nicht in der Luft hängen werden sie, insbesondere wenn sie 
nicht benutzt werden auf definierte Pegel gesetzt.

Ist der Ausgang eines anderen ICs angeschlossen, dann braucht man keine 
Pullups. Will man aber Schalter einlesen, geht es nicht ohne.

Benutzt man sie als Ausgang, braucht man die Pullups auf jeden Fall.

mfg.

von Bernhard S. (b_spitzer)


Lesenswert?

>> The P1.0 and P1.1 should be set to “0” if no external pull-ups are used,
>> or set to “1” if
>> external pull-ups are used.
an den beiden Pins ist der interne Komparator angeschlossen. Daher sind 
die hochohmig und können ohne externen Widerstand nur nach Masse ziehen. 
Um jetzt keine undefinierten Zustände am Komparatorausgang (P3.6) oder 
an den Eingängen P1.0/P1.1 zu haben braucht man externe Pull-Ups oder 
sollte die Pins nicht als Eingang verwenden. Dann schaltet man die auf 0 
und fängt sich keine Störungen ein.

In der ersten Programmversion war mit mov P1,#0 übrigens ein Hammer-Bug 
drin. Wenn dur den gesamten Port auf 0 legst, dann kannst Du die 
Eingänge nicht mehr verwenden...

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.