PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel AT89S8252 Ports ansprechen



Unrealfighter
27.04.2005, 20:23
Hi!

Bin ziemlich neu in der Szene der µc's. Habe nun ein lauffähige Platine mit dem µc AT89S8252. Nun wollte ich wissen wie ich mit C-Quelltext einzelne Ports ansprechen kann. Zum Beispiel ob der Signal Pegel am Port 2.7 HIGH oder LOW ist. Keiner mir einer verraten wie das geht?

Danke schonmal im vorraus

cya

Schwabix
27.04.2005, 21:41
Hi,
Wahrscheinlich willst Du ein Programm schreiben, das auf dem µC läuft, oder?
Dafür brauchst Du einen Compiler und die Möglichkeit, das resultierende Hex- oder Bin-File in den Speicher des Controllers zu laden.

Ich selbst habe zwar diesen Controller schon mehrfach eingesetzt, aber in Assembler. Das Prinzip bleibt das gleiche.
8051 und die meisten Abkömmlinge sprechen die Ports über SFRs (Special Function Register) an. Mit bestimmten Befehlen kann man dann das Bit-Muster in das SFR für den gewünschten Port schreiben. Vorher muss man noch den Port als Ausgabeport konfigurieren, wiederum über ein anderes SFR. Die Liste der SFRs und Ihrer Funktion entnimmst Du am besten dem Datenblatt (erhältlich z.B. bei www.reichelt.de) des AT89S8252 und seines Urahnen 8051 oder einem Buch über die 8051 Familie. Die "Bibel" der 8051 Programmierung ist nmM das "8051 Kochbuch".

In C sind diese SFRs in Form von globalen Variablen erreichbar (zumindest habe ich das mal in einer C-Source für 8051 so gesehen, es könnte auch per Funktionsaufruf gelöst werden).

Wenn Du eher an ein C-Programm denkst, das auf dem PC läuft, kommt es auf die Firmware Deiner µC-Karte an. Es gibt solche Controller, die als Steuerkarte für den PC gedacht sind. Wie man dabei den µC dazu bringt, einen seiner Ports zu bedienen ist sehr unterschiedlich.

Schwabix

Unrealfighter
27.04.2005, 21:54
Nein nicht direkt. Ich habe bereits ein Programm geschrieben und ein LCD Display damit angesteuert und auch Text drauf ausgegeben. Nun möchte ich einen Taster an Port 2 Pin 7 anschliessen und beim betätigen dieses Taster wird der Signal Pegel ja auf 0 gesetzt. Nur wie kann ich den Zustand von Port 2 Pin 7 abfragen ob der HIGH oder LOW ist?

cya

Schwabix
27.04.2005, 22:37
Ach, wahrscheinlich hast Du ein Problem mit einer Marotte der 8051er (möglicherweise auch bei anderen µCs vorhanden):

Ein Ein- und Ausgang eines Ports ist dieselbe Leitung. Soll es ein Eingang sein, muss das entsprechende Ausgangs-Bit auf logisch "!" gesetzt werden, ansonsten würde der Ausgangstransistor auf logisch "0" ziehen.

Also:
setb P2.7 ; als Eingang konfigurieren
...
mov A,P2 ; Port 2 einlesen
anl A,#80h ; Bit 7 maskieren, dann vergleichen
jz key_pressed
; Nix gedrückt
...
key_pressed
; Taste gedrückt

Das geht mit Bitadressierung noch sehr viel schöner, aber dann lässt es sich nicht mehr so einfach nach C übersetzen.

Schwabix

Unrealfighter
27.04.2005, 22:40
Danke nur kann mir das mal einer in C übersetzen ich kann noch kein Assembler
Sry

cya

Schwabix
27.04.2005, 22:58
Ich könnte mir vorstellen, dass das dann ungefähr so aussieht:

port2 = port2 | 0x80; // bit 7 in Port 2 setzen

if ((port2 & 0x80) == 0) {
// Nix gedrückt
}
else {
// Taste gedrückt
}

Statt "port2" könnte es auch "P2" heißen. Hilft das weiter?

Unrealfighter
27.04.2005, 23:20
Ja tut es nur muss ich noch was deklarieren damit der weiss was mit p2 gemeint is? Wenn ja wie?

cya

Sandro
28.04.2005, 08:03
Hallo Unrealfighter

Ich selbst programmiere eigentlich auch nur in Assembler.
Aber ich habe hier etwas Code für den Reads51 C-Compiler.
Um die SFRs zu deklarieren mußt du nur ein
#include <sfr51.h>
in deinen Code mit aufnehem.
Das ist eine Headerdatei. Darin sind bereits alle SFR deffiniert.
Danach kannst du einfach mit
n = p2
auf den Port2 zugreifen.
Wenn du einen anderen Compiler benutzt muß die Headerdatei evtl. auf eine andere Art eingebunden werden. Das steht bestimmt in der Beschreibung. Es kann auch sein das er dann andere Schlüsselwörter benutzt. Öffne also einfach die sfr51.h und schau was darin steht.

Sandro
28.04.2005, 08:20
Hi,
Mit bestimmten Befehlen kann man dann das Bit-Muster in das SFR für den gewünschten Port schreiben. Vorher muss man noch den Port als Ausgabeport konfigurieren, wiederum über ein anderes SFR.


Das finde ich etwas missverständlich.
Alle 8051-Derivate die ich kenne haben quasi-bidirektionale Ports. Es existiert also kein Richtungsregister in dem man den Port als Ein- oder Ausgang deklarieren könnte. Um ihn als Eingang zu benutzen setzt man ihn einfach auf high. Dann kann er dem extern anliegenden Signal folgen.
Benutzt man ihn als Ausgang setzt man die Bits einfach wie man das gerne möchte.
Möglicherweise gibt es da Ausnahmen.
Sollte das so sein lasse ich mich gerne eines besseren belehren.

Ps.
@Schwabix
Ich sehe gerade du hast das ja selbst auch schon so erklärt.

Ach, wahrscheinlich hast Du ein Problem mit einer Marotte der 8051er (möglicherweise auch bei anderen µCs vorhanden):

Ein Ein- und Ausgang eines Ports ist dieselbe Leitung. Soll es ein Eingang sein, muss das entsprechende Ausgangs-Bit auf logisch "!" gesetzt werden, ansonsten würde der Ausgangstransistor auf logisch "0" ziehen.

Unrealfighter
28.04.2005, 10:18
Hab mir jetzt mal den Reads51 runtergeladen nur ich bekomm immer einen Fehler.Habe folgendes im Queltext stehen:

#include <sfr51.h>
int main()
{

return 0;
}

Und jetzt der Fehler:


Error Count = 1
"C:\Program Files\Rigel\Reads51\Work\test\test" 0, External "_main" defined in module "C:\Program Files\Rigel\Reads51\Include\\c0.OBJ" is not exported by any module


Was mache ich falsch und kann mir vlt mal einer von euch nen kleines Prog in C geben damit ich mal sehen kann wie ihr das so macht

cya

Sandro
28.04.2005, 10:23
Wie ich schon gesagt hab programmiere ich nur in Assembler.
Das Porgramm von dem ich gesprochen hab ist aus einem Buch. Ich müsste es erst mal abtippen.
Ich werd mir jetzt einfach mal Reads51 installieren und das Program testen.
Wenn ich was funktionstüchtiges hab meld ich mich wieder.

Schwabix
28.04.2005, 10:44
@Sandro,


Das finde ich etwas missverständlich.
Alle 8051-Derivate die ich kenne haben quasi-bidirektionale Ports.

Hast recht, das war nicht richtig. Hatte das von zu Hause gepostet und die "Bibel" lag im Büro. Da ich gerade einen AN2131 traktiere - auch ein 8051-Erbe, aber eben mit separatem Richtungskonfigurationsregister - hatte ich das verwechselt.

Hat sich ja geklärt und bei den verbliebenen Probleme kann ich als Assembler-Nutzer nicht helfen ...

Sandro
28.04.2005, 11:02
So, ich hab jetzt mal schnell bisschen Blödsinn geschrieben. Nicht erschrecken. Ich kann eigentlich kein C.
Eine einfache Portausgabe. Um den Port zu lesen mußt du es halt umderehen.
Wird bei mir zumindest richtig compiliert.
Probier das mal aus und sag bescheid wenns immer noch Probleme gibt.

Unrealfighter
28.04.2005, 11:11
Danke für Programm bei mir Compiliert der das auch ohne Fehler.
Kannst du mir vllt noch verraten wie ich zum Beispiel Port2.7 auf 0 (Low Signal) setze?

Sandro
28.04.2005, 11:13
Ja, du schreibst einfach
P2_7 = 0

Unrealfighter
28.04.2005, 11:26
Jo danke es funktioniert.
Ihr seit die besten ;)

cya