Forum: Mikrocontroller und Digitale Elektronik 8051 Pin Zustand


von Em W. (emwe)


Lesenswert?

Hallo,

ich bin absoluter neuling, auf dem Gebiet Mikrocontroller.
Ich habe einen AT89C2051.
Nun will ich ein C-Programm schreiben mit dem ich den Zustand von P1.7 
an dem eine LED hängt ändern kann.

Hier mal mein bisheriger Code
1
#include <reg51.h>
2
3
4
sbit SEGa = P1^7;                  //Segment "a" an Port P1.7
5
sbit SEGb = P1^6;                  //Segment "b" an Port P1.6
6
sbit SEGc = P1^5;                  //Segment "c" an Port P1.5
7
sbit SEGd = P1^4;                  //Segment "d" an Port P1.4
8
sbit SEGe = P1^3;                  //Segment "e" an Port P1.3
9
sbit SEGf = P1^2;                  //Segment "f" an Port P1.2
10
sbit SEGg = P1^1;                  //Segment "g" an Port P1.1
11
sbit SEGdp = P1^0;                //Segment "dp" an Port P1.0
12
sbit PWMout = P3^7;                //PWM Output an Port 3.7
13
14
15
16
void main(void)
17
{
18
SEGa = 0;
19
}

Durch das SEGa = 0; in der main funktion ändert sich leider der Zustand 
nicht. Was muss ich dann schreiben?

von Ralf (Gast)


Lesenswert?

Hi,

deine Main() braucht am Ende ein "while(1);" oder alternativ (und 
gebräuchlicher) ein "while(1) {...}", an ... steht dann dein Code, und 
der wird ständig wiederholt, bei der ersten Variante wird an "while(1);" 
die Ausführung gestoppt.
Das braucht man, weil ein Controller niemals "nichts" tun kann, er 
braucht immer was zum ausführen. Soviel mal dazu...

Dein Code müsste eigentlich funktionieren, was sagt das 
Assembler-Listing bzw. der Simulator? Ich vermute, du verwendest den 
Keil C-Compiler, in der Demoversion wird dein Programm nicht laufen, da 
immer ein Offset von 2kB eingearbeitet wird, d.h. auf Devices mit 2kByte 
oder weniger laufen die Programme nicht.

Ralf

von Ralf (Gast)


Lesenswert?

Ach so, ganz vergessen, die LEDs hängen mit Vorwiderstand und Anode an 
Plus, die Kathode am Port-Pin? Hast n Schaltplan?

Ralf

von Em W. (emwe)


Lesenswert?

Genau, also wie im Code zu erkennen ists ne 7-segment anzeige. Ich will 
das ganze jetzt erstmal simulieren. Ich verwende RIDE als 
Entwicklungsumgebung.
In der Simulation zeigt er mir für SEGa "TRUE"
und ich will das eben jetzt in meinem main programm erstmal schaffen das 
ding umzuschalten.
Der code sieht jetzt so aus:
1
#include <reg51.h>
2
#include <stdio.h>
3
4
5
sbit SEGa = P1^7;                  //Segment "a" an Port P1.7
6
sbit SEGb = P1^6;                  //Segment "b" an Port P1.6
7
sbit SEGc = P1^5;                  //Segment "c" an Port P1.5
8
sbit SEGd = P1^4;                  //Segment "d" an Port P1.4
9
sbit SEGe = P1^3;                  //Segment "e" an Port P1.3
10
sbit SEGf = P1^2;                  //Segment "f" an Port P1.2
11
sbit SEGg = P1^1;                  //Segment "g" an Port P1.1
12
sbit SEGdp = P1^0;                //Segment "dp" an Port P1.0
13
sbit PWMout = P3^7;                //PWM Output an Port 3.7
14
15
16
17
void main(void)
18
{
19
while (1)
20
  {
21
  SEGa = 0;                    //Segment "a" einschalten
22
  }
23
}

Hat sich aber leider nichts geändert

von Ralf (Gast)


Lesenswert?

Dann poste mal bitte das entsprechende ASM-File, dann kann man sich mal 
den Assembler Code angucken...

Ralf

von 12er Dude (Gast)


Lesenswert?

Hallo Em We,

bist Du nur Neuling im µC Bereich, oder auch bei der "C" Programmierung?

mit dem Ausdruck:
1
 sbit SEGa = P1_7;
definierst Du eine neue Variable (reservierst also Speicher) vom Type 
"Bit im SFR" und weist ihr den aktuellen Wert von P1_7 (also eine "1" 
nach Reset) zu. Mit dem Ausdruck:
1
 SEGa = 0;
weist Du der Variblen SEGa den Wert "0" zu, schreibst aber nicht auf den 
Port!!!

Damit der Start erstmal klappt, folgende Tips:
1
#include <atmel\at892051.h>           // z. B. Keil c51
2
3
void main (void ) {
4
5
  while (1) {
6
7
    P1_7 = 0;                        // P1_7 ist in at892051.h deklariert
8
9
  }
10
11
}
oder mit Deinen Bezeichnern
1
#include <atmel\at892051.h>          // z. B. Keil c51
2
3
#define SEGa           P1_7;         // anderer Bezeichner für P1.7
4
5
void main (void ) {
6
7
  while (1) {
8
9
    SEGa = 0;                        // SEGa wird autom. durch P1_7 ersetzt
10
11
  }
12
13
}

Dann sollt 's geh 'n.

tschü Dude

von Michael D. (Gast)


Lesenswert?

@12er Dude

Das mit dem sbit funktioniert so. Zumindest unter Keil.

Mike

von 12er Dude (Gast)


Lesenswert?

@Michael
So wie von mir beschrieben, isses schon recht; gibt aber einen Compiler 
Fehler. Aber der OP hat ja nicht "P1_7" verwendet, sondern "P1^7". Mit 
"P1^7" passt die Sache dann schon.

Dann liegt das Problem woanders :(

tschü Dude

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.