8051er in C Programmieren - Programm wird nicht ausgeführt

Gast #878122
Lesenswert?

Hallo,
Ich programmiere einen 8051er in C und lade das erstellte Programm 
mittels ISP auf meinen Mikrocontroller.

Ich wollte zu Testzwecken einfach mal alle Ports auf Low setzen.
1
sfr P0 = 0x80;
2
sfr P1 = 0x90;
3
sfr P2 = 0xA0;
4
sfr P3 = 0xB0;
5

6
void main (void) {
7
  P0 = 0;
8
  P1 = 0;
9
  P2 = 0;
10
  P3 = 0;
11
  
12
  while (1);
13
}

Leider habe ich auf fast allen Ports immer noch VCC.

Das Programm wird ohne Probleme auf meinen Controller übertragen. Das 
HEX File auf derm Prozessor ist ident mit downgeloadeten.

Würde mich über ein paar Ratschläge freuen.

Gruß Daniel
Gast #878128
Lesenswert?

Hallo Daniel,
was für einen 8051 benutzt Du ?
Hat er den Daten- und Programmspeicher extern angeschlossen ?
Denn dann kann das Programm nicht funktionieren, da über Port P0 und 
über Port 2 der externe Daten- und Adressbus des 8051ers realisiert 
wird.
Laß diese beiden Ports einfach mal weg.

Das Gleiche gilt für einige Pins von Port P3, da hierüber die RD\- und 
WR\-Steuersignale für externe Daten-Speicher bzw. Peripherie-Bausteine 
realisiert werden.

Wie mißt Du den Pegel an den Port-Pins ?
Nicht mit einem Multimeter, sondern besser mit einem Oszilloskop, denn 
dann siehst Du sehr schnell, ob sich noch etwas anderes tut.

Gruß
Carlos
#878139
Lesenswert?

Diese Syntax mit dem "sfr" sieht mir irgendwie verdächtig aus. Wenn das 
ein Compiler für den 8051 ist, binde das headerfile für deinen µc ein 
und greife dann auf P0 usw zu.
P0...P3 sind normalerweise "fertige" Zeiger, die du einfach so verwenden 
kannst.
Ansonsten (gesetzt den Fall, das mit dem sfr geht so überhaupt) könnte 
auch ein "volatile" davor helfen.
Gast #878142
Lesenswert?

Danke für die schnelle Antwort.

Ich benutze den AT89S52 von Atmel.

Es wundert mich sowieso, dass die einzelnen Prots nicht als Ein- oder 
Ausgänge definiert werden.

Nein, ich habe keine externen Speicher dazugeschalten.

Ja, ich messe mit einem Oszilloskop.

Daniel
#878147
Lesenswert?

Beim 8051 musst die Datenrichtungsumschaltung vom AVR nicht machen. Bei 
nem Lesezugriff ist es ein Eingang und beim Schreiben ein Ausgang. Kein 
DDR-Register.

Hau mal den ganzen Block

sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;

weg und lass den Rest. Dazu noch irgendwas in der Richtung #include 
<AT89S52.h> oben reinschreiben (näheres dazu in der Doku deines 
Compilers) und es sollte sich was tun.
Gast #878154
Lesenswert?

Also Du hast nichts externes an P0 und P2 angeschlossen und arbeitest 
nur mit den internen Einheiten des µC´s.

Port P0 benötigt dann aber externe Pull-Ups, um als Ausgang zu arbeiten.

Die Port brauchst Du generell nicht beosnders als Ausgänge zu 
programmieren, Du gibt einfach das Bit-Muster aus.
Versuche einfach nur einmal an Port P1 eine Rechteckschwingung 
auszugeben:

void main (void)
{
   while(1)
   {
      P1=0xaa;
      P1=0x55;
   }
}

Das kannst Du gut mit dme Oszilloskop messen.

Allerdings sehen Deine SFR-Definitionen etwas merkwürdig aus.
Welchen Compiler benutzt Du ?

Gruß

Carlos
Gast #878166
Lesenswert?

So viele Antworten in so kurzer Zeit. Ist ja super hier =).

So ich habe den EA Pin nun auf Vcc gelegt.

Die Bilbliothek heißt AT89X52.h.

Nein ich benutze keine externen Pull Up Widerstände. Braucht die nur der 
P0 oder alle 4 Ports?

Also das Ausgeben des Rechtecks hat wunderbar funktioniert danke.

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