8051 Pin Zustand

OP #1153377
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?
Gast #1153401
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
OP #1153416
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
Gast #1154105
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
Gast #1154175
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

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