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.
> 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
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
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
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.
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.
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.
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.)
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
> 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.
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.
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.
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.
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.
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?
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 :-)
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.
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.
>> 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...