Forum: Mikrocontroller und Digitale Elektronik SourceCode in den AT89C2051


von chris_s (Gast)


Lesenswert?

ich muss den unten stehenden source code in den atmel flashen.

habe aber null ahnung wie.

klar ist mir, dass der code erstmal in hex umgewandelt werden muss. nur
wie?? ich hab versucht mit µc51 und keil aber das zeug ist für mich
unvertsändlich.

habe gedacht das ich den code einfach in ein proggi reinkopiere und es
mir dann ne hex rauswirft.



// komfort.c
// Komfortschließung, copyright Julian Baker 2004
// 2x Tastendruck innerhalb 2 sek.(t1) --> Ausgang(P1.7)PIN19 nach
  t_Einschalt_delay für
// 10sek(t2) High, dann wieder Low
// weiterer Tastendruck: Ausgang Low
// Taster: ext. Interrupts INT0 (P3.2)PIN 6
// PIN 1 Reset(bei High)
// PIN 4,5 XTAL + 2 x 22pF
// PIN 10: GND, PIN 20. VCC(5V)

#include

# define Quarzfrequenz 11059  // f in khz
# define T0_1msec 0xFFFF-Quarzfrequenz/12     // Ladewert von T0
  (TH0+TL0), t=1mS

#define t1 2000      // 2sec
#define t2 10000    // 10sec (Wert mit SSD muss 15000 -> 15sec
sein!!!)
#define t_Einschalt_delay 500  // 500 msec

# define T0HI_1msec    T0_1msec / 256    // T0 High-Order (durch
  int.Division)
# define T0LO_1msec    T0_1msec % 256    // T0 Low-Order (Modulo
liefert
  Rest)
#define start_T0 TR0=1;            // Timer 0 starten
#define stop_T0  TR0=0;            // Timer 0 abschalten

#define Out P1_7      // Ausgang P1.7
#define Out_High Out=1
#define Out_Low  Out=0

unsigned char status;

unsigned int msec;        //Variable für Zeitverzögerung

void main(void)
{

  TH0 = T0HI_1msec;  // Timer0 High-Order Register für 1ms laden
    TL0 = T0LO_1msec;  // Timer0  Low-Order Register für 1ms laden
    TMOD &= 0xF0;      // Timer0 Einstellungen zurücksetzen
    TMOD |= 0x01;        // T0 Modus1, 16bit Zeitgeber
  ET0 = 1;      // Freigabe des Interrupts bei Überlauf T0
     EX0 = 1;        // Freigabe des ext. Interrupts INT0 (P3.2)
         IT0 = 1;        // externer Interrupt0 wird flankenaktiviert


  EA = 1;          // alle Interruptquellen möglich

  ausgangszustand();

  while (1)         // Beginn Endlosschleife
  {

    PCON=0x01;       // enter idle mode
  }
}

void ext_INT0 (void) interrupt 0    //
{
  unsigned char i;
  //Tastenentprellung;
  EX0 = 0;
  for (i=0; i<255; i++);
  IE0=0;
  EX0 = 1;


      switch (status)
      {
          case 4:  // 3.Tastendruck = Abbruch
      ausgangszustand();
      break;

    case 3:  // 3.Tastendruck = Abbruch
      ausgangszustand();
      break;

    case 2:

        status=3;  // Verzögerung aktivieren
        msec=0;


    case 1:    // 1.Tastendruck: starte T0, msec werden gezählt

      stop_T0;
      msec=0;
      TH0 = T0HI_1msec;  // Timer0 High-Order Register für 1ms laden
        TL0 = T0LO_1msec;  // Timer0  Low-Order Register für 1ms laden

      start_T0;
      status=2;
      break;

       }
}


void random_time (void) interrupt 1 using 1  // Timer0
Interruptroutine

{
  TH0 = T0HI_1msec;  // Timer0 High-Order Register für 1ms laden
  TL0 = T0LO_1msec;  // Timer0  Low-Order Register für 1ms laden
  msec++;    // msec inkrementieren

    if (msec>t2)      // wenn Zeit t2 abgelaufen
    {
      ausgangszustand();
    }
    if (msec>t1 && status== 2)  // kein weiterer Tastendruck->
    {
      ausgangszustand();
    }
    if (msec>t_Einschalt_delay && status==3) // Verzögerung vorbei
    {
    status=4;
    Out_High;    // Ausgang für t2 sec = High
    msec=0;
    }

}

void ausgangszustand (void)
{
  Out_Low;
  status=1;
  stop_T0;
  msec=0;
}

von Thomas (Gast)


Lesenswert?

beten ???? :o))))

Spaß beiseite:

Das ganze ist ein C Programm und wird mit einem passenden C-Compiler
übersetzt. Dazu sind allerdings gewisse Kenntnisse über C und den 8051
nötig und das bedeutet:

LESEN !!!!

z.B. die Dokumentation von den Keil tools

Gruß Thomas

von Elektrikser (Gast)


Lesenswert?

Hast du einen Programmer für den Controller?
Der kleine Kerl will über seine Ports programmiert werden und hat keine
Möglichkeit, dass man ihn einfach über die serielle Schnittstelle oder
SPI programmiert.

Gruß Elektrikser

von chris_s (Gast)


Lesenswert?

erstmal danke für eure antworten.

ich wollte den chip mit dem teil von ebay und dem programm ic-prog
flashen.
[url]http://cgi.ebay.de/spezial-AT89C2051-Programmer-AVR-Atmel_W0QQitemZ9714813243QQcategoryZ12949QQssPageNameZWDVWQQrdZ1QQcmdZViewItem[/url]

mir gehts nur darum den sourcecode in den hex zu bekommen.

von Elektrikser (Gast)


Lesenswert?

Keil µC51 weigert sich das zu compilieren.

Was soll am Anfang des Programms includet werden? Vielleicht die
Header-Datei für den Controller?

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

moin moin,

wegen 205 Byte solchen Aufwand?
wenn alles gut gelaufen ist, anbei der HexCode.

Mit Gruß
Pieter

von chris_s (Gast)


Lesenswert?

includet muss was werden. die daten findent man bei atmel
http://www.atmel.com/dyn/products/product_card.asp?family_id=604&family_name=8051+Architecture&part_id=1938

ich danke schonmal für´s wandeln.
aber als nixwisser:
prn?

wie wurde das jetzt gemacht? brauch ja ne 2. version mit 15sec.

vielen dank

von Markus_8051 (Gast)


Lesenswert?

Wenn Du die Demoversion von dem Keil-Compiler benutzt: die ist leider
für den 89C2051 ungeeignet, da der vom Compiler benutzte Speicher da
anfängt, wo der vom 89C2051 aufhört :-((

Markus_8051

von Stephan H. (stephan-)


Lesenswert?

In der 1 . Spalte siehst du Die Adressen zB. 0000, 0003 usw.
in der 2 und 3 Spalte steht dann der Code. 02 02 0D.
Alle Zahlen der 2 und 3. Spalte hintereinander ohne Leerzeichen in
einen Hexeditor zB. Hex Workshop ergeben nach dem Speichern das Hexfile
wenn
man sie abschreibt. 205 Bytes sind nicht viel ;-)

ODER.....
Pieter fragen ob er das Hexfile mal hoch lädt.

Gruß Stephan

@Pieter, der arme Kerl....
hast nich ne Main.BIN oder HEX übrig ???
Machs gut

von chris_s (Gast)


Lesenswert?

danke.

das ins hex sollte ich hinbekommen.

das problem ist das umwandeln mit dem compiler.
brauch nämlich noch das ganze mit dem 15sec anstatt den 10 sec ;)

das mit prn ist mir mitlerweile klar. dient nur zur veranschaulichung
mit erklärung usw.

der eigentliche code für den atmel ist dann die 2. und 3. spalte. diese
muss man dann rauskopieren und inx hex wandeln

danke nochmals.

von Stephan H. (stephan-)


Lesenswert?

nicht wandeln !!!! nur die Zahlen so nehmen wie sie sind !!!
00 02 0D .....  Das ist der HEX Code.
im Hex Editor steht dann aber nur " 00020D......."

Dann als Datei xy.hex speichern !!!!

von chris_s (Gast)


Lesenswert?

schon klar ;)
nur ich meinte den sourcecode umwandeln für die 2. version.

von chris_s (Gast)


Lesenswert?

achso. sorry.

ja nicht in hex wandeln, sondern einfach die daten als hex speichern.
hab mich da schlecht ausgedrückt.

btw:
ist jetzt was dran das der sourcecode fehlerhaft ist?

von Stephan H. (stephan-)


Lesenswert?

ich schreibe zwar kein "C" aber was ich sehe sieht so aus als wenn ein
Timer läuft und bei Tastendruck auf eine Taste oder anderen Schalter
einfach die Zeit zwischen 2 Betätigungen gemessen wird.
Darauf wird ein Port geschaltet. Simple Geschichte.

Ob die "C" Mnemonik richtig geschrieben ist ....... Ich Assembler !!
Da mußt du schon Pieter oder Peter Dannegger fragen.
Aber der Compiler hat ja wohl nicht gemeckert.
So gehe ich davon aus das es i.O. ist.

Woher stammt denn die Quelle ???? suche solche Links.

ps.:

Habe für E34 ohne ZKE !! ne eigene steuerung für ESSD gebaut und bei
mir drin. Mit org. Getriebe wegen der Abschaltung und org. Kabelbaum.
Und.... ich muß nicht den Finger drauf lassen um zu schließen. !!!
Und Gong macht es auch noch ...... ( extra für mich gemacht )

Machs gut

von chris_s (Gast)


Lesenswert?

bmw-secrets.de

bei zke geht das über zentralsichern. wenn man den schlüssel im schloss
gedreht hält, fährt alles zu.
da bmw ein gepulstes signal in der ffb verwendet (sicherheitsgründe,
einklemmschutz etc. pp.) geht es so nicht.

das modul macht nix anderes als beim tastendruck 10sec lang das 12v
signal zum pin13 durchzuschalten. so ne art zeitrelais. beim
wiederholten male  stoppt das ganze. man muss also nicht den knopf
gedrückt halten und man kann das ganze auch bei halb geschlossener
scheibe unterbrechen.

von Elektrikser (Gast)


Lesenswert?

@Markus_8051

Ich verwende Demo-Versionen von Keil, allerdings noch die
Uralt-Versionen von µVision1 und 2. Der AT89C2051 lässt sich damit
programmieren. Meinen ersten Templogger habe ich in Assembler mit
µVision1 geschrieben. Das Programm hatte fast 2k und ich hatte laut
Hex-File noch 96 Bytes frei. Das Programm fing bei 0000h an und wurde
nicht verschoben, wie es bei den späteren Keilversionen üblich wurde.
Den 8051 habe ich nie mit Keil in C programmiert.

Gruß Elektrikser

von Markus_8051 (Gast)


Lesenswert?

@Elektrikser: Na, eben auf diesen C-Compiler-Teil bezieht sich meine
Äußerung von oben. Der Assembler hat diese Einschränkung nicht.
(Zumindest nicht µVision2 - ich weiß nicht, wie es jetzt bei aktuellen
Versionen aussieht).

Markus_8051

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

moin moin,

ich habe das Prog mit sdcc compiliert, die Headerdatei zum µC fehlte
allerdings.

Die source hat einen Fehler:

    case 2:

        status=3;  // Verzögerung aktivieren
        msec=0;
>>>     Break;    das fehlt hier!!!!!

    case 1:    // 1.Tastendruck: starte T0, msec werden gezählt

Die beiliegende Assemblersource habe ich dann auf meinen Assembler
bearbeitet.

Mit Gruß
Pieter

von chris_s (Gast)


Lesenswert?

ich bin verblüfft.
danke.

also fehlte beim case 2 der break. den hast du dann hinzugefügt, oder?

du hast also das ganze mit sdcc compiliert und dann mit assembler
bearbeitet. wieso? wegen der fehlenden  headerdatei??
oder hast du die source in assembler umgewandelt und dann mit assembler
den zahlencode gemacht??

hast  du den 1. code mit 10sec programmiert?? würdest mir dann bitte
den nochmal mit 15sec machen?? wär nett ;)
für mich unbezwingbar. steig da überhaupt net durch :((

von chris_s (Gast)


Lesenswert?

sorry für meine fragen.

habe jetzt das ganze im editor geschrieben und als hex gespeichert.
muss ich die zeilen normal untereinander schreiben wie in dem code oder
alle alle zeichen hintereinander??

wenn ich die hex mit dem mx hex editor aufmache, bekomme ich bei dem
unterienandergeschriebem den text daneben. bei dem
nebeneinandergeschriebenem nicht. da ist dann eine zahlenfolge.

kann ich eigentlich diese bearbeiten?? habe bemekrt das 22pF angeben
wurden aber 33er verbaut sind und so könnte ich auch die zeit ändern.
sprich ich gehe einfach da hin und tippe die 10000 bzw 10sec in 15000
bzw. 15sec um. dann ändert sich der hexcode, oder??

von chris_s (Gast)


Lesenswert?


von Stephan H. (stephan-)


Angehängte Dateien:

Lesenswert?

sollte dann in etwa so aussehen !!!
Aber nicht abschreiben !!!! Nimm Deine Zahlern.

von Stephan H. (stephan-)


Lesenswert?

ps.: die 10000 und 15000 wirst Du nie finden !!!
dort steht für 10000 dann 27 10 und für 15000 eben 3A 98.
könnte sogar sein das ers Low und dann High kommt.
dann steht da 10 27 und 98 3A.
Ob 22 oder 33 pF ist fast wurscht. Müssen aber drin sein.

Schreibe nur die Zahlen im großen fenster. vergisss den text auf der
rechten seite einfach.

Aber ich sehe Chris war schneller.

Also, los gehts !!

von chris_s (Gast)


Angehängte Dateien:

Lesenswert?

also nebeneinander. nicht wie bei mir oben?

kann ich da die daten ändern? also wie oben geschrieben. 10000--->15000
umändern und dann sinds 15sec im chip?? dann wieder alles nebeneinander
setzen. denn den text bekomm ich ja nur wenn ich untereinander die
zahlen schreibe

von chris_s (Gast)


Angehängte Dateien:

Lesenswert?

also praktisch so.
aber dann kann ich ja die zeit nimmer ändern. das muss ich dann im
assembler oder wie das heißt machen.

von chris_s (Gast)


Lesenswert?

muss mich für meine eigene dummheit entschuldigen. habe das .c file
geladen gehabt. dann zeigts den text an rolleyes

aber untereinander oder nebeneinander??

btw:
wär nett wenn Pieter mir das file noch mir 15sec erstellen könnte ;)

von Stephan H. (stephan-)


Lesenswert?

nebeneinander ohne irgenwelche Leerzeichen !!!!!
Wir haben doch Bilder geschickt !!!

von Stephan H. (stephan-)


Lesenswert?

Ps.: Pieter könnte Dir sogar des fertige Hex File geben.
Da er es noch nicht getan hat, denke ich das Du auch was tun sollst.
Und ich komme nicht umhin, ihm recht gebe zu wollen.

Wir müssen auch Hausaufgaben machen. Macht aber aich nicht immer Spaß.

Los ghets

von chris_s (Gast)


Lesenswert?

is schon klar. tu auch was. bin keiner der alles machen lässt.
nur mit dem umwandeln von c in ... und dann nochmal
bearbeiten...steigts aus bei mir.

bilder schon. allerdings von hexeditoren. ich habs im normalen
microsofteditor abgetippt und als hex gespeichert. da seh ich das nicht
so. wenn ich das untereianderschreibe bekomme ich (im hexeditor) auch
solche punkte (wie bei dir oben geposted). wenn ich alles
nebeneinanderschreibe bekomme ich nen reinen zahlencode. ist halt etwas
verwirrend ;)

von Pieter (Gast)


Lesenswert?

moin moin,

sorry, aber die Überarbeitung meines Assemblers hat etwas länger
gedauert. Ist jetzt so wie bei Compilern, jede Include-Datei stellt
einen eigenen Namensbereich dar.

@chris
Du solltest erstmal viel lesen. Solange Dir nicht klar ist, was z.B.
ein Compiler, Assembler, c oder Hex-File bedeuten,wirst Du nicht
weiterkommen.
Oder, wenn Du nur den fertigen Chip haben willst, such Dir eine Bude
die so etwas macht. Die Jungs (und Mädels!!) werden Dir auch Deine
Änderungen einbauen. Kosten natürlich etwas, dafür hast Du dann
keinerlei Aufwand.
Für den Anfang habe ich Dir gezeigt, wo m.M. nach ein Fehler im C ist
und habe das ganze noch als Assemblerquelle hier eingestellt.
Keil und µC51 kenne ich nur vom Namen her. Bei c nehm ich den sdcc und
für Assembler schon immer eigene Programme. Der ASEM51 ist auch eine
brachbare (Not-)Lösung. Zu allen diesen Programmen gibt es Tutorials
wie man's macht. Muss man nur lesen.

Mit Gruß
Pieter

von chris_s (Gast)


Lesenswert?

hallo,

ich weiß was die ganzen sachen bedeuten.

einfach ausgedrückt. c muss in hex umgewandelt werden. die schritte
über assembler waren mir nicht bewusst.

ich dachte das ich den sourcecode in ein programm eingebe und der mir
dann die fertige hex ausspuckt. da habe ich wohl falsch gedacht.

aber das ganze kann doch nicht so schwer sein!? das schwerste daran ist
ja den source code zu programmieren. das andere ist ja bloß umwandeln.

aber dann weiß ich nicht was mir deine dateien oben helfen sollen, wenn
sie garnicht mit meinem sourcecode übereinstimmen?

desweieteren sind die ganzen progs in dos. es wäre schön wenns da halt
was mit benutzeroberfläche gibt.

ich hatte schon div. progs aufm rechner. angefangen von wavrsm, µc,
keil etc. pp. kein proggi war für mich irgendwie verständlich.

wenn der sourcecode existiert, kann es doch nicht so schwer und
aufwendig sein einen hexcode für den chip zu machen?

von chris_s (Gast)


Angehängte Dateien:

Lesenswert?

habe jetzt mi sdcc gespielt.

habe mit sdcc die c datei umgewandelt. sieht aber spanisch aus! habe
die header datei von keil verwendet. gibts für sdcc spezielle?? denn
die von der atmel seite stehen zwar bei 2051 dabei, hab aber nirgends
ne datei für gefunden.

auf jedenfall muss ich c in asm umwandeln. dann die assemblersprache in
hex. richtig?

von Stephan H. (stephan-)


Lesenswert?

nicht in ASM.
ASM ist Assembler und was ganz anderes als C.
sieht zB so aus: mov A,#22h#
Sind beides Programmiersprachen. Aber Assembler ist Low Level und C ist
High level. Dir die Unterschiede jetzt aufzuzeigen, bringt dich aber
auch nicht weiter. du hast ein Source File in C.
Das muß jetzt für eine 89c2051 MCU  "Compiliert" werden.
Heist übersetzt. Die MCU kann kein C nur HEX.

Ich würds ja tun aber ich verstehe nur sehr wenig von C und vom
Compilieren noch viel weniger.

von chris_s (Gast)


Lesenswert?

ist schon klar.

c ist hoch. das muss mit sdcc in assemblersprache (maschinensprache)
gewandelt werden. das versteht der chip aber immernoch nicht und muss
in die zahlenkombi (hex) gewandelt werden.

das ganze ist mir schon klar. nur komme ich einfach nicht weiter. wenn
ich mit sdcc compile dann spuckt der mir den schrott oben aus. das
sieht ganz anders aus als das was pieter geposted hatte.

ich muss also mein c in asm wandeln. dieses asm kann ich dann mit
wavrsm etc. weiter bearbeiten.

von Stephan H. (stephan-)


Lesenswert?

ne ne,
Assembler ist Maschinensprache. Umgangssparchlich.
Die MCU kann nur Hex. Punkt.
Jatzt kann man RPgramme schreiben in zB. C oder Asssembler.
In Assembler müssen die Programme nur in den Hex Code übersetzt
werden,
da ein ASM Progger die MCU so anspricht wie sie es erwartet.
In C kann ich aber schreiben: B=A+C/X. Das geht in ASM nicht in einer
Zeile. Dafür würde ich wenisgtens 4 Zeilen in ASM bauchen.
Außerdem...... und genau da liegt der Kanckpunkt....
C ist MCU übergreifend. Bedeutet:
Dein Proggi würde auch auf ner Z80 MCU laufen.
Soll heißen das Programm kann auf einer x-beliebigen MCU laufen.
Ein ASM Programm aber nicht.
Das ist für eine MCU für zB. 8051 Architektur geschrieben.
Läuft aber nicht auf nem Z80.
Daher muß das C Programm compiliert (übersetzt) werden.
Dazu muß der Compiler aber wissen welche MCU mit welchen Parametern
benötigt wird. Und genau dabei kann ich Dir leider nicht helfen.
Ich schreibe ASM  !!! Und habe mich mit dem compilieren von C nie
beschäftigt.
offensichtlich hast du dem sdcc richtig verklickert das es un 8051
geht. Der Rest........... I Don´t know !!!

von chris_s (Gast)


Lesenswert?

ich danke dir schonmal.

vielleicht meldet sich ja doch noch einer.

hab´s jetzt mir keil versucht. leider schmeisst der mir dauernd
fehlermeldungen raus. bei dem "ausgangszustand" gefällt ihm das erste
bei main nicht "missing function-prototype". und zum schluss gefällt
ihm bei "ausgangszustand" die klammern nicht "redefinition".

von Joe (Gast)


Angehängte Dateien:

Lesenswert?

kannst du damit was anfangen ? habs mit SDCC mal compiliert und nen
bischen umgebaut.

Joe

von Joe (Gast)


Lesenswert?

Saug dir mal die passende Umgebung:

http://www.opcube.com/home.html

und dann mach nen eigenen Versuch, sollte keine Fehlermeldung mehr da
sein.

von chris_s (Gast)


Lesenswert?

super. vielen dank.
hab´s versucht und funktioniert einwandfrei mit sdcc.

aber ist das nicht die falsche header datei?? das ist eine AT89X51.h
muss da nicht die AT89C2051.h rein??

btw:
wieso umgestellt?? war das ganze falsch?

jetzt funktionierts sogar mit keil. spitze. lag es anscheinend am
sourcecode.

von Joe (Gast)


Lesenswert?

na, soviel hab ich nicht gemacht, denk mal nach und vergleich das mit
deinem original. Lass mich wissen ob du es dir selbst erklären kannst.
Aller Anfang ist schwer aber alles mag ich auch nicht frei haus
liefern.

Willst du programmieren lernen oder nicht ? gehts nur um deine
Schaltung ?

Also, warte mal ab ob noch was kommt ;-)

von chris_s (Gast)


Lesenswert?

vielen dank.

du hast das void ausgangszustand vorgezogen. weil das void vor den
ausgangszustandbefehlen stehen muss. stimmts??

danke für den mide51. das ist ein spitzenteil. compiler und assembler
in einem. einfach c-file laden und machen lassen. ohne viel in dos
rumzutippen. danke.

nur damit ich richtig liege. das hex file das mide51 ausspuckt kann ich
direkt in den 2051 brennen?? weil nämlich nur compiling... .hex has been
generated dasteht.

ich will programmieren lernen. aber schon seit jahren. mich fasziniert
was man mit so nem kleinen chip alles anstellen kann. hätte viele ideen
(steuerungen für´s heimkino, autodisplay etc.). leider fehlt die zeit
das ganze richtig zu erlernen. hab einfach zuviel stress mit anderen
dingen (angehender maschinenbautechniker ;) ....) und jetzt ist mir
diese schaltung in die hände gefallen und hat mir wiedermal gezeigt,
dass es nicht sooo einfach ist.

von Joe (Gast)


Lesenswert?

Hi Chris,

na also, geht doch. Ja, das mit der Zeit ist in der Tat so ein Problem.
Aber du siehst die Tools gibts mittlerweile alle auf Freeware Basis und
das macht doch vieles einfacher.

Folgender Ratschlag von meiner Seite, C ist ne feine Sache aber C ist
eben nicht C, speziell wenn man MC's programmieren will. Beschäftige
dich mit den Assembler Grundlagen und wechsel dann auf C. Nen Assembler
hast ja nun auch und wenns Fragen gibt dann hilft sicherlich ein posting
in dieses Forum weiter. Beginne mit einfachen Aufgaben, lass ne LED
blinken etc., der Rest kommt schritt für schritt.

Das .h File ist übrigens noch das falsche, haste ja gemerkt, aber
schaus dir mit nem Editor an und schreib es dir passend.

Viel Spass und Erfolg

Semmel

von chris_s (Gast)


Lesenswert?

ja danke.

hab schon die einsteigersachen gesehen. blinky, hello world,...

h-file. genau. das ist für die s51er. aber bei mide51 ist ja bei sdcc
ein at89x51.h dabei. das auf dem 8051 aufbaut und für die
at89c2051/4051 ist.

werd ich dann schon merken wenn der chip später nicht das tut was er
soll ;)

vielen dank nochmal.

von Joe (Gast)


Lesenswert?

na ja, nicht ganz, in deinem Fall wirds gehen, aber überleg mal, der
eine hat 20 Pins und der 8051 hat 40 Pins, schau mal in die
Datenblätter.

Da gibts noch nen paar Unterschiede.

Schau mal \Mide\asem51\MCU, da findest du die MCU Files und kannst
mal einen Vergleich durchführen.

von chris_s (Gast)


Lesenswert?

aha.

bei den mcu gibts nen at89c2051.mcu. aber bei sdcc baut das at89x051
auf dem 8051 auf. warum gibts dann dafür keine spezielle bzw. seperate
at89c2051.h? isses denn dann egal oder muss umbedingt ein "richtiges"
c2051.h her?
habe das von keil versucht. aber da gibts nen fehler in der main.

ein problem gelöst und schon steht das nächste an :(

von Joe (Gast)


Lesenswert?

Also, der Reihe nach.

Wenn du in Assembler programmierst dann bekommt der Compiler die MCU
(Micro Controller spezifischen Eigenschaften) mittels MCU File
mitgeteilt. Man bindet in den ASM Quellcode mittels $include die
entsprechende Datei ein.

In C verwendest du für den gleichen Vorgang ein .h File.

Druck dir die entsprechenden MCU und .h Files mal aus und dann schreibe
aus den gewonnenen Informationen einfach ein neues.

Bei deinem Programm kannst du es zunächst mal so lassen. In deinem
Sourcecode wird nichts verwendet was der 2051 nicht könnte, trotzdem
sollte man sich ein passendes .h File erzeugen.

Alles klar ?

von chris_s (Gast)


Lesenswert?

yo. habs mittlerweile gesehen.
einfacher gesagt: die umwandlung von c nach asm funzt net richtig,
weil´s das falsche .h file ist. von asm aber funzts, weil´s ein
richtiges .mcu file für den chip gibt.

bin grad dabei das spezifische 2051.h von keil mehr oder weniger
abzuschreiben.

von Joe (Gast)


Lesenswert?

das sind 2 getrennte paar Schuhe.

Wenn du in C schreibst wird ASEM nicht verwendet. Das macht SDCC
alleine.

Schau mal hier, das Pinout deines MC

http://www.iguanalabs.com/2051pin.htm

Es gibt hier keinen P0 sowie P2. Das .h File vom 8051 gaukelt das aber
vor.

Auszug aus deinem Code:

#define Out P1_7              // Ausgang P1.7

Du verwendest P1.7, den gibt es in beiden Bausteinen und daher hast du
kein Problem.
Ebenso dein Interrupt Aufruf:

void ext_INT0 (void) interrupt 0

Der ist ebenso in beiden MC's identisch, also wieder kein Problem.

Das ist aber nicht immer so, also macht die Verwendung eines korrekten
Files Sinn.

von peter dannegger (Gast)


Lesenswert?

Der 2051 ist ein waschechter 8051, ihm fehlen nur P0, P2 und P1.6.
Du kannst also ruhig das at89x51.h nehmen.
Oder Du editierst es, entfernst diese Ports und nennst es um.


Peter

von Joe (Gast)


Lesenswert?

>>> Bei deinem Programm kannst du es zunächst mal so lassen. In deinem
Sourcecode wird nichts verwendet was der 2051 nicht könnte, trotzdem
sollte man sich ein passendes .h File erzeugen.<<<

Hab ich was anderes behauptet ? Aber so lernt er was und das wollte er
auch.

von chris_s (Gast)


Lesenswert?

ich habe die unterschiede bemerkt. bin ja grad dabei das 8051.h mit den
daten des keil h-files zu editieren.

u.a. die p0, p2 existieren nicht und bei pcon bits fehlt was beim 8051.

von Joe (Gast)


Lesenswert?

Peter hat schon recht, nimm einfach das at89x51.h vom SDCC und lösche
die Einträge die nicht gebraucht werden. Dann speicher es als neues .h
File ab und gut is.

von chris_s (Gast)


Lesenswert?

ich habs mir mal genauer angeschaut. ich glaube ich kann einfach das
at89x051.h nehmen. denn das bindet die infos des 8051.h mit ein und
zugleich undef po und p2. das sollte eigentlich so passen.

von Joe (Gast)


Lesenswert?

Jap, kannste machen.

von chris_s (Gast)


Angehängte Dateien:

Lesenswert?

ich schon wieder ;)

dank joe´s hilfe funzte alles prima.

habe jetzt das ganze überarbeitet. leider wieder das problem mit dem
code. wär super wenn da mal jemand drüberschauen könnte ;)

ich habe das alte so belassen und nur noch was hinzugefügt.

hinzugefügt wurde eine 2. interruptschaltung.

int1 (p3.3) mit timer T0 auf ausgang p1.6.

im endeffekt dasselbe wie zuvor nur halt jetzt zusätzlich mit int1 als
eingang und p1.6 als ausgang. diesselbe schaltung und zeiten nur mit
anderem ain-/ausgang.

leider bekomme ich den p1.6 nicht definiert. muss ich da ne erweiterung
vom p1.7 und p1.6 machen. also out1 p1_7 out2 p1_6??

von Pieter (Gast)


Lesenswert?

Hi Chris,

bist ja richtig fleissig...
Hatte die letzten Tage viel zu tun , Prog.schreiben um Firmware in
einen MB90F497 zu laden, wie der funktioniert..keine Ahnung:-))

Zu Deiner Sache, versetze Dich mal in die Lage eines Compiler, der
findet

  Out_Low;

und sieht bei den Defines folgendes:

#define Out P1_7              // Ausgang P1.7
#define Out_High Out=1
#define Out_Low  Out=0

Für P1.7 ist also alles definiert.

Wenn nun auch noch P1.6 bearbeitet werden soll, ist Out_Low nicht so
prickelnt.
Besser eventuell so

#define Out P1_7              // Ausgang P1.7
#define P1_7_High Out=1
#define P1_7_Low  Out=0

#define Out P1_6              // Ausgang P1.6
#define P1_6_High Out=1
#define P1_6_Low  Out=0

Damit ist das jeweilige Pin definiert.Out muss dann nur noch in der
Quelle angepasst werden.
-------
"das ganze ist mir schon klar. nur komme ich einfach nicht weiter.
wenn ich mit sdcc compile dann spuckt der mir den schrott oben aus. das
sieht ganz anders aus als das was pieter geposted hatte."
---------
Ist schon Richtig. Die Assemblerquellen die ein Compiler erzeugt sind
auf seine interne Arbeitsweise zugeschnitten. Aus diesem Quelltext habe
ich mal alles "überflüssige" rausgestrichen.

Mach nur weiter so...wirst schon sehen, was Du davon hast;-)

Mit Gruß
Pieter

von chris_s (Gast)


Lesenswert?

danke für deine antwort.
ja meine alten sachen haben sich nach und nach alle geklärt.

mit den pins ist´s eigentlich auch logisch.

kann ich dann bei void ausgangszustand den p1.6 hinzufügen und bei void
random_time für den int1 seperat, oder?

von Pieter (Gast)


Lesenswert?

moin moin,

das void bedeutet das eine Funktion keinen Rückgabewert hat.
Wenn Du bei ausgangszustand P1.6 hinzufügt, wird diese immer zusammen
mit P1.7 geschaltet. Wenns denn so sein soll.
Habe leider nicht mehr die gesamte Funktionsweise im Kopf.
Einfach ausprobieren oder mal einen PAP malen.
Gleich zur Frage PAP: ProgrammAblaufPlan, wie das Teil so funtionieren
soll, ohne auf spezielle Deteils einzugehen. Hilft bei der Festlegung
welche Funktionen gebraucht werden und wie diese funktionieren müssen.


Mit Gruß
Pieter

von chris_s (Gast)


Lesenswert?

im endeffekt soll das ganze genauso funktionieren wie vorher. nur das
das ganze jetzt mit int1 erweitert werden soll.

sprich:
1x impuls = nix
2x impuls = für t2 den ausgang p1.7 high
impuls während high = abruch des ganzen und wieder low

jetzt das ganze nochmal. aber int1 als eingang und p1.6 als ausgang
1x impuls = nix
2x impuls = für t3 (neu definiert) den ausgang p1.6 auf high
impuls während high = abbruch....

wenn ich den ausgangszustand für jeden pin seperat festlegen will,
reicht ne erweiterung. sprich: void ausgangszustand P1_7 (void)

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.