Forum: Mikrocontroller und Digitale Elektronik uVision2


von Gerald Schaden (Gast)


Lesenswert?

Hallo!
Ich bin ein uC Anfänger, hab zwar schon ein wenig in der schule damit
gebastelt aber nie richtig verstanden. nun hab ich privat begonnen, mit
dem uvision2. Ich möchte einen AT89C4051 programmieren, komm aber mit
dem Compilieren nicht zurecht. (der programmer funktioniert ganz
sicher)
Kann mir jemand erklären was ich nacheinander genau schreiben muss
(also programmcode) für z.b. Port1 alle Pins auf Low. - und was ich
nach fertigstellung des codes alles machen muss bis ich (mit uvision2)
zum HEX-File komme?

Wäre sehr nett, danke im Voraus

von Malve (Gast)


Lesenswert?

Willst Du das Programm in C schreiben?

Mfg Malve

von Gerald Schaden (Gast)


Lesenswert?

ja
-denn da kenn ich mich ein wenig aus wie man schreibt, nur halt weniger
speziell für uC

von Malve (Gast)


Lesenswert?

Nun ja mit dem Controller selbst kenne ich mich nicht aus, aber Du musst
zunächst einmal eine Headerdatei ins Programm einbinden, in der die
Ports & Co. deklariert sind.
Anschließend eine main Routine schreiben, in der Du die gewünschten
Port-Pins auf Low setzt. Zuvor musst Du allerdings den jeweiligen Port
als Ausgang schalten. Ich selbst arbeite mit Infineon XC167
Controllern. Da sieht das etwa so aus.

Das ganze sieht in etwa so aus:

#include XC167.h

void main (void)
{
 DP9=0xFF;   //Port9 ist Ausgang
 P9=0x00;    //Alle Pins von Port9 Low
 P9=0xFF;    //Alle Pins von Port9 High
}

Sobald Du Deinen Code fertig hast, musst Du bei µVision2 einige
Einstellungen vornehmen, damit Du Deinen Controller programmieren
kannst.
Im Menü Projekts -> Options for Target musst Du erstmal Deinen
Controller auswählen (Device)
Anschließend stellst Du Deine Speicherbereiche ein und was Du sonst
noch so weißt. Das Datenblatt hilft Dir da weiter.
Versuch mal ob Du damit einigermaßen klar kommst, ansonsten meldest
Dich nochmal.

Mfg Malve

von Gerald Schaden (Gast)


Lesenswert?

naja....gerade das ist das problem dass ichs nicht GENAU weiß wies geht.
dass zuerst die header datei (das ist doch einanderer NAme für
include-datei oder?) kommt und dannn der hauptcode ist schon klar.
aber eben ob ich auch für den 4051er die headerdatei AT89C2051
verwenden kann, oder wie genau ich die ports ansprechen muss.....
ports kann man ja au viele schreibweisen auf low legen:
P1.3=0;
P1^3=0;
P1_3=0;
-solche schreibweisen sind mir schon untergekommen. aber welche ich
jezt nehmen muss weiß ich nicht, auch in der hilfe von uvision finde
ich dazu nichts.
das mit den speicherbereichen einstellen wie du schreibst ist mir
ohnehin schleierhaft welche daten ich vom datenblatt in uvision
übertragen muss.

von Malve (Gast)


Lesenswert?

Ich weiß, dass das nicht ganz einfach ist.
Die Headerdatei ist die include-datei.
In der Headerdatei, die Du benötigst sind den einzelnen Ports
Speicheradressen zugeteilt. Durchsuch mal deine Headerdatei(en), ob Du
da sowas findest. Ob man die AT89C2051-Headerdatei auch für den 4051er
verwenden kann, weiß ich leider auch nicht, aber am besten versuchst Du
es mal. Die Speicheradressen für die einzelnen Ports findest Du im
Datenblatt, da kannst Du nachschauen, ob die in der Headerdatei
angegebenen Adressen übereinstimmen. Ich weiß es nicht genau, aber ich
denke, wenn Du den ganzen Port1 ansprechen willst, dann schreibe
einfach
P1=0; bzw.
P1=1;
Ich glaube, wenn Du bei µVision2 anstatt einen Speicherbereich
anzugeben einfach USE on-chip ROM anklickst, müsste das ganze auch
gehen. Bei meinem Controller hats jedenfalls funktioniert. Das kommt
daher, weil µVision2 für etliche verschiedene Mikrocontroller ausgelegt
ist und bereits einige Einstellungen der jeweiligen Mikrocontroller
gespeichert hat.

Mfg Malve

von Gerald Schaden (Gast)


Lesenswert?

hier hätte ich einen auszug aus der headerdatei (hab jez eine auch für
4051 gefunden), wo port1 "behandelt" wird:
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
wie funktioniert das jezt, (ich weiß nicht wie man diese operation
nennt) mit "sbit"

man schreibt doch so irgendwie: sbit P1.0 = P1_0;
was bedeuted das und wofür das ganze? kann man ohne der zeile dem
portpin keinen wert zuweisen?

von Malve (Gast)


Lesenswert?

Wenn mich nicht alles täuscht, dann bedeutet sbit P1_0 :

Setze Bit(=sbit) 0 von Port1(=P1_0) auf die Adresse 90Hex(=0x90).

Damit Du in deinem Programm dem Controller überhaupt sagen kannst, dass
er mit irgendeinem Port etwas machen soll, benötigt er die
Informationen in der Headerdatei. Das mit dem sbit sieht schon mal gut
aus! Binde die Headerdatei in dein Programm.
Als nächstes mußt Du in Deiner main Routine versuchen den Port so zu
setzen, wie Du es gerne hättest.
Am besten nimmst Du eine LED (Vorwiderstand nicht vergessen!!) und
verbindest sie mit dem Port, mit dem Du arbeiten willst.
Wenn in der Headerdatei schon mal P1_0 drinsteht, dann würd ich
versuchen genau das auch im Programm zu schreiben.

P1_0=1; bzw
P1_0=0;

Versuch mal die beiden Befehle einzeln. Mit einem der beiden Befehle
müsstest Du den Port auf Low, mit dem anderen auf High schalten können.
Achte darauf eine Warteschleife nach den Befehlen aufzurufen, falls Du
beide Befehle nacheinander laufen lässt, da Du sonst nicht viel siehst,
weil der Controller sehr schnell ist.
Ich hoffe ich kann Dir damit einigermaßen weiterhelfen.

Mfg Malve

von Gerald Schaden (Gast)


Lesenswert?

hab jez was neues gefunden: beispielprogramm von Keil für uvision2 für
den 4051:

sfr P1 = 0x90;        /* SFR for P1 */
sbit P1_0 = P1^0;     /* SFR for P1.0 */
sbit P1_1 = P1^1;     /* SFR for P1.1 */

void main (void)
{
P1_0 = 1;                  /* Configure P1.0 as an input */
}
while (1)
  {
  P1_1 = P1_0;            /* Copy P1.0 to P1.1 */
  }

***********
und jez das arge: hab daraus ein HEX erstellt für meinen programmer -
und es geht nicht!!  dann hab ich verschiedenste librarys probiert die
möglich wären, und wieder nix!!
der programmer ist aber 100%ig in ordnung ( ich hab bereits damit ein
prog in assembler geschrieben reinprogrammiert)

von Peter D. (peda)


Lesenswert?

Wie Du daraus ein HEX machen kannst, ist mir ein Rätsel.

Bei mir hagelt es jedenfalls Errors, da Dein while() ja schon außerhalb
des main() ist.


Peter

von Gerald Schaden (Gast)


Angehängte Dateien:

Lesenswert?

ja, ich hab zeilenweise kommentare gelöscht, vielleicht zuviel
weggegeben.
im Anhang hab ich im ZIP das ganze UV2 Projekt. der C-Code ist

von Gerald Schaden (Gast)


Lesenswert?

der code aus dem der auszug stammt ist in main.c zu finden
- wollt ich eigentlich noch sagen

von Gerald Schaden (Gast)


Lesenswert?

so, jez hab ich das endlich zum laufen gebracht
aber das wann/warum ich die sache mit sbit brauche is mir immer noch
nicht restlos klar, tut mir leid.
denn in meinem testprogramm hab ich auf ports geschrieben, aber nirgens
was von sbit. - und es geht auch

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.