Hilfe AT89C2051

OP #2934685
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.
Gast #2934704
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
OP #2934878
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
OP #2934927
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
#2934936
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.
#2934955
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.)
OP #2934965
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.
#2934969
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.
#2935031
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.
#2935059
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.
#2935064
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren