Forum: Mikrocontroller und Digitale Elektronik Programm in C


von Anna (Gast)


Lesenswert?

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
void waitasecond();
4
char display1 = 00;
5
char display2 = 00;
6
char botao1;
7
char botao2;
8
char botao3;
9
10
void main(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
else if(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
void waitasecond(){
58
int x;
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

von rat (Gast)


Lesenswert?

> 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.

von rat (Gast)


Lesenswert?

>  *** 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.

von graznik (Gast)


Lesenswert?

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?
>

von Anna (Gast)


Lesenswert?

Also, ich habe das Programm neu aufgebaut, diesmal sofort in Assembly.
1
P0 EQU 80H
2
P1 EQU 90H
3
P2 EQU 0A0H
4
ACC EQU 0E0H
5
SP EQU 70H
6
ORG 0000h
7
;main
8
MOV SP,#2FH
9
MOV P0,#0FFh
10
MOV P1,#00h
11
MOV P2,#0FFh
12
LOOP:
13
MOV A,P1
14
MOV A,#01h
15
ROTINAS:
16
JB P1.0,rotina1
17
JB P1.1,rotina2
18
JB P1.2,rotina3
19
rotina1:
20
MOV P0,#4Fh
21
MOV P2,#4Fh
22
;LCALL atrasode1segundo
23
;LCALL atrasode1segundo
24
;LCALL atrasode1segundo
25
;LCALL atrasode1segundo
26
;LCALL atrasode1segundo
27
MOV P0,#0FFh
28
MOV P2,#0FFh
29
LJMP ROTINAS
30
MOV A,P1
31
ANL A,#02h
32
rotina2:
33
MOV P0,#3Fh
34
MOV P2,#66h
35
;LCALL atrasode1segundo
36
;LCALL atrasode1segundo
37
;LCALL atrasode1segundo
38
;LCALL atrasode1segundo
39
;LCALL atrasode1segundo
40
MOV P0,#0FFh
41
MOV P2,#0FFh
42
LJMP ROTINAS
43
MOV A,P1
44
ANL A,#04h
45
rotina3:
46
MOV P0,#3Fh
47
MOV P2,#4Fh
48
;LCALL atrasode1segundo
49
;LCALL atrasode1segundo
50
;LCALL atrasode1segundo
51
MOV P0,#5Bh
52
MOV P2,#4Fh
53
;LCALL atrasode1segundo
54
;LCALL atrasode1segundo
55
;LCALL atrasode1segundo
56
MOV P0,#0FFh
57
MOV P2,#0FFh
58
LJMP ROTINAS
59
;SUBROTINA ATRASODE1SEGUNDO
60
atrasode1segundo:
61
PUSH ACC
62
PUSH 00H
63
PUSH 01H
64
MOV 00H,#10
65
LOOP_WAIT3:
66
MOV 01H,#100
67
LOOP_WAIT2:
68
MOV A,#125
69
LOOP_WAIT1:
70
DEC A
71
JNZ LOOP_WAIT1
72
DEC 01H
73
MOV A,01H
74
JNZ LOOP_WAIT2
75
DEC 00H
76
MOV A,00H
77
JNZ LOOP_WAIT3
78
POP 01H
79
POP 00H
80
POP ACC
81
RET
82
END
83
END

Er funktioniert jedoch immer noch nicht einwandfrei, wenn man ihn im 
Proteus 5 testet.

von rat (Gast)


Lesenswert?

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?

von Anna (Gast)


Lesenswert?

Neu aufgebaut, ich bin aus Brasilien, und das Programm hat ein paar 
Begriffe aus dem Portugiesich. Microcontroller AT89S51.

von MaWin (Gast)


Lesenswert?

> 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.

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.