8051 Pin Zustand

OP #1153377
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
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
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
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
@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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.