Hallo,
ich arbeite gerade an einem Schulprojekt, und habe ein paar
Schwierigkeiten beim programmieren.
Unsere Aufgabe ist es, ein Programm und später auch die Schaltung dazu
aufzubauen, welche folgendes machen:
- 2 Displays sollen an 2 beliebigen Ausgängen des Microcontrollers
AT89S51 angebracht werden;
- Wenn die Schaltung gestartet wird, sollen die Displays ausgeschaltet
bleiben;
- Es soll einen Schalter geben, der, wenn er gedrückt wird, auf den
Displays 5 Sekunden lang die Zahl 33 zeigt, und danach die Dispays
ausschaltet;
- Es soll einen zweiten Schalter geben, der, wenn er gedrückt wird, auf
den Displays 5 Sekunden lang die Zahl 04 zeigt, und danach die Dispays
ausschaltet;
- Es soll einen dritten Schalter geben, der, wenn er gedrückt wird, auf
den Displays 3 Sekunden lang die Zahl 03, dann weitere 3 Sekunden lang
die Zahl 23 zeigt, und danach die Dispays ausschaltet;
Da ich noch nicht viel Kenntnisse im Programmieren habe, habe ich
beschlossen das Programm erst einmal in C aufzubauen (der Lehrer möchte
eigentlich ein Programm in Assembly), und es danach umwandeln.
Ich habe versucht das Programm in C zu schreiben:
1
#include<reg51.h>
2
3
voidwaitasecond();
4
chardisplay1=00;
5
chardisplay2=00;
6
charbotao1;
7
charbotao2;
8
charbotao3;
9
10
voidmain(void){
11
display1=P0;
12
display2=P1;
13
botao1=P2_0;
14
botao2=P2_1;
15
botao3=P2_2;
16
17
if(botao1=0x01){
18
display1=03;
19
display2=03;
20
waitasecond();
21
waitasecond();
22
waitasecond();
23
waitasecond();
24
waitasecond();
25
display1=00;
26
display2=00;
27
}
28
29
elseif(botao2=0x01);{
30
display1=00;
31
display2=04;
32
waitasecond();
33
waitasecond();
34
waitasecond();
35
waitasecond();
36
waitasecond();
37
display1=00;
38
display2=00;
39
}
40
41
else(botao3=0x01){
42
display1=00;
43
display2=03;
44
waitasecond();
45
waitasecond();
46
waitasecond();
47
display1=02;
48
display2=03;
49
waitasecond();
50
waitasecond();
51
waitasecond();
52
display1=00;
53
display2=00;
54
}
55
}
56
57
voidwaitasecond(){
58
intx;
59
for(x=0;x<3300;x++);
60
61
}
Da tauchten folgende Fehler auf:
*** ERROR C014 IN LINE 14 OF D:\Anna Programme\haha.c : Undefined
'P2_0'
*** ERROR C014 IN LINE 15 OF D:\Anna Programme\haha.c : Undefined
'P2_1'
*** ERROR C014 IN LINE 16 OF D:\Anna Programme\haha.c : Undefined
'P2_2'
*** ERROR C103 IN LINE 41 OF D:\Anna Programme\haha.c : Misplaced
'else'
*** ERROR C000 IN LINE 11 OF D:\Anna Programme\haha.c : Character '}'
missing
Könnte mir jemand bitte dabei helfen?
Vielen Dank!
Anna
> display1 = 00;> display2 = 00;
So wird aber nichts angezeigt... Deine waitasecond-Funktion ist Murks,
schmeißt der Optimierer komplett weg. Hau das Programm weg und fang von
vorne an, erst auf dem Papier planen und dann direkt in Assembler.
> *** ERROR C014 IN LINE 14 OF D:\Anna Programme\haha.c : Undefined> 'P2_0'
Steht doch da: P2_0 ist nicht definiert.
> *** ERROR C000 IN LINE 11 OF D:\Anna Programme\haha.c : Character '}'> missing
Formatier deinen Code richtig, dann wird es auch dir auffallen: Ein }
fehlt.
Anna schrieb:> botao1 = P2_0;> botao2 = P2_1;> botao3 = P2_2;
Wo werden P2_0, P2_1 und P2_2 deklariert?>
> if(botao1=0x01){> display1=03;> display2=03;> waitasecond();> waitasecond();> waitasecond();> waitasecond();> waitasecond();> display1 = 00;> display2 = 00;> }
Bitte den Code einrücken, so ist er unlesbar!
>> else if(botao2=0x01);{
Da gehört kein Semikolon hin.
> waitasecond();> waitasecond();> waitasecond();> waitasecond();> waitasecond();
Wie wäre es mit
for (i=0; i<5; i++)
waitasecond;
Noch besser wäre du schreibst waitasecond() so um, dass du der Funktion
einen Parameter (Anzahl der Sekunden) übergeben kannst.
> *** ERROR C014 IN LINE 14 OF D:\Anna Programme\haha.c : Undefined> 'P2_0'
"Undefined" sagt eingentlich alles
> *** ERROR C014 IN LINE 15 OF D:\Anna Programme\haha.c : Undefined> 'P2_1'> *** ERROR C014 IN LINE 16 OF D:\Anna Programme\haha.c : Undefined> 'P2_2'> *** ERROR C103 IN LINE 41 OF D:\Anna Programme\haha.c : Misplaced> 'else'> *** ERROR C000 IN LINE 11 OF D:\Anna Programme\haha.c : Character '}'> missing
'}' missing, was könnte das heißen?
>
Anna schrieb:> Also, ich habe das Programm neu aufgebaut, diesmal sofort in Assembly.
Neu aufgebaut oder neu zusammenkopiert? Oder haben die spanischen(?)
Bezeichnungen einen anderen Grund? Für welchen µC ist das überhaupt?
> Könnte mir jemand bitte dabei helfen?
Sicher nicht in Assemblerkauderwelsch.
> *** ERROR C014 IN LINE 14 OF haha.c : Undefined 'P2_0'
Warum schreibst du in dein Programm ein P2_0 rein,
wenn du nicht weisst, was es bedeuten soll ?
In http://www.keil.com/dd/docs/c51/reg51.h gibt's das jedenfalls nicht.
> *** ERROR C000 IN LINE 11 OF haha.c : Character '}' missing
Eines der 3 if's ist wohl anders als die anderen.
Mustererkennung hat nichts mit Programmierkenntissen zu tun,
sondern mit simplem (richtigen) abschreiben.
Abschreiben hast du noch nicht gelernt ?
Dein Programm hat mindestens ein Problem:
Es läuft nur ein mal durch.
Dabei wird genau ein mal geguckt ob Taster 1 gedrückt ist
(wohl noch nicht), dann ob Taster 2 gedrückt ist (wohl
auch nicht) und ob wenigstens Taster 3 gerückt ist (sicher
auch nicht) und dann ist es zu Ende.
Das war schnell.
Das ging schnell vorbei.
Ich nehme mal an, daß Kein nicht main() erneut aufruft, w
wenn main() beendet wurde.
So lange du dein Programm nicht so auslegst, daß es immer
wieder guckt, welcher Taster jetzt gedrückt wurde, wird
es sowieso nichts sinnvolles tun.
Ausserdem sollte man nicht nur gucken, ob ein Taster
gedrückt wurde, sondern auch ob er wieder losgelassen
wird, sonst kommt es dem Programm so vor als ob er immer
wieder erneut gedrückt wird.
Auch alle diese Überlegungen haben nicht mit wirklichen
Prorammierkenntnissen zu tun, sondern mit simplem
normalen Menschenverstand.
Dann ist es zwar ein netter Versuch, durch Ausgeben von
03 an ein Port die daran angeschlossene Anzeige zur
Darstellung einer 3 zu bewegen, aber ob das tatsächlich
der Fall ist, weiß man erst, wenn man die dazugehörige
Schaltung sieht.
Da zu vermuten ist, daß normale 7-Segment Diplays ohne
Decoder angeschlossen werden, führt ein 03 noch lange
nicht zur Anzeige einer 3, zumal die 0 vorweg noch so
was scheussliches wie Oktalzahlendarstellung bedeutet.
Du solltest bei deinem Schulkurs also noch mal von vorne
zuhören.