mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Pin Zustand


Autor: Em We (emwe)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <reg51.h>


sbit SEGa = P1^7;                  //Segment "a" an Port P1.7
sbit SEGb = P1^6;                  //Segment "b" an Port P1.6
sbit SEGc = P1^5;                  //Segment "c" an Port P1.5
sbit SEGd = P1^4;                  //Segment "d" an Port P1.4
sbit SEGe = P1^3;                  //Segment "e" an Port P1.3
sbit SEGf = P1^2;                  //Segment "f" an Port P1.2
sbit SEGg = P1^1;                  //Segment "g" an Port P1.1
sbit SEGdp = P1^0;                //Segment "dp" an Port P1.0
sbit PWMout = P3^7;                //PWM Output an Port 3.7



void main(void)
{
SEGa = 0;
} 

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

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

Ralf

Autor: Em We (emwe)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <reg51.h>
#include <stdio.h>


sbit SEGa = P1^7;                  //Segment "a" an Port P1.7
sbit SEGb = P1^6;                  //Segment "b" an Port P1.6
sbit SEGc = P1^5;                  //Segment "c" an Port P1.5
sbit SEGd = P1^4;                  //Segment "d" an Port P1.4
sbit SEGe = P1^3;                  //Segment "e" an Port P1.3
sbit SEGf = P1^2;                  //Segment "f" an Port P1.2
sbit SEGg = P1^1;                  //Segment "g" an Port P1.1
sbit SEGdp = P1^0;                //Segment "dp" an Port P1.0
sbit PWMout = P3^7;                //PWM Output an Port 3.7



void main(void)
{
while (1)
  {
  SEGa = 0;                    //Segment "a" einschalten
  }
} 

Hat sich aber leider nichts geändert

Autor: Ralf (Gast)
Datum:

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

Ralf

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Em We,

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

mit dem Ausdruck:
 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:
 SEGa = 0; 
weist Du der Variblen SEGa den Wert "0" zu, schreibst aber nicht auf den 
Port!!!

Damit der Start erstmal klappt, folgende Tips:
#include <atmel\at892051.h>           // z. B. Keil c51

void main (void ) {

  while (1) {

    P1_7 = 0;                        // P1_7 ist in at892051.h deklariert

  }

}
oder mit Deinen Bezeichnern
#include <atmel\at892051.h>          // z. B. Keil c51

#define SEGa           P1_7;         // anderer Bezeichner für P1.7

void main (void ) {

  while (1) {

    SEGa = 0;                        // SEGa wird autom. durch P1_7 ersetzt

  }

}

Dann sollt 's geh 'n.

tschü Dude

Autor: Michael D. (xaero80c51)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@12er Dude

Das mit dem sbit funktioniert so. Zumindest unter Keil.

Mike

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.