DS89S450 lässt keine Unterprogramme aufrufen

Gast #1084059
Lesenswert?

Hi,

Ich habe da eine Problem mit der 8051 Variante DS89C450 von Maxim.

Programmieren über RS232 funktioniert. Ich habe nun eine LED an P0.4 
angschlossen und ein kleines blinkprogramm geschrieben, ganz einfach nur 
mit for schleifen als verzögerung.

Solange alles in main drinnen steht funktioniert es aber sobald ich 
versuche die for schleife in eine delay-Funktion auszulagern geht nichts 
mehr und auf auf der auf Port P0.4 angeschlossenen LED ist nur ganz 
leichtes glimmen zu sehen. Habe mir das mit dem Ozi angeschaut und da 
sind ganz komische RC-mässige Funktionen zu sehen mit ca 4V und 200kHz.

Weis nicht woran es liegen kann, dachte zuerst an einen externen 
adresszugriff aber EA ist auf High gezogen und das erklärt auch nicht 
die komischen Analogsignale auf dem Port 0

Hoffe es kann mir wer tipps geben.

mfg Jonny
Gast #1084118
Lesenswert?

Hi,

Also Stack is glaub ich nicht dran schuld, hab den Startupcode 
eingebunden.
Ich programier das Ding übrigends in C mit Keil uVision.

Kann mir keinen Reim auf die komischen analogspannungen machen, die 
Versorgung ist vollkommen sauber.

mfg Jonny
Gast #1084991
Lesenswert?

Hi,

Hab mir auch schon überlegt das die schleifen wegrationalisiert werden 
aber das erklärt nicht das komische ausgangssignal am Port, selbst wenn 
ich mit maximaler geschindigkeit toggle hab ich ein sauberes 
rechtecksignal von ca. 1MHz.
Aber sobald ich das toggeln in ein unterprogramm lege hab ich ein einige 
undefineirte RC-Ladefunktionen periodisch mit ca 200kHz 4V
Hab mir schon alles angeschaut, Versorgung sauber, Quarz schwingt wie er 
soll, EA pulldown...

Ich weis einfach nicht mehr weiter :(

lg Jonny
Gast #1085104
Lesenswert?

Hi,

Die LED ist über einen Vorwiderstand an +5V geschaltet, auch wenn ich 
die LED weggeb und nur einen pullup draufhäng ist das selbe zu sehen.

Das komische ist ja das das blinken funktioniert wenns nur toggeln im 
main ist. Sobald was aufwenigeres gemacht wird (unterprogramme, if 
abfagen...) geht nichts mehr und diese analogsignale treten auf.


mfg Jonny
Gast #1085128
Lesenswert?

Hi Jonny,

muss doch mal einen loader für den ds89 in meinem MacroAssembler 
reinschreiben, dann werde ich das mal testen.
Bin aber mehr Assembler-Freak, eventuell auch sdcc.

Was passiert, wenn man z.B. P2.4 toggelt?

mfg
Pieter
Gast #1085396
Lesenswert?

Hi,

Habs jetzt auch mit Port 1 und 2 auspropiert, das gleiche Problem, nur 
die analogspannung schaut etwas anders aus. Weil ich dachte der uC ist 
hinüber hab ich auch noch einen DS89C420 ausprobiert, das gleiche 
Problem. Also müsste es wohl an der Software liegen, aber welcher 
Prorammierfehler kann eine Analogspannung an einem Digitalport 
verursachen...?

lg Jonny
#1085402
Lesenswert?

Die Projekteinstellungen von µVision sollten überprüft werden:
*Prozessortyp?
*Speichermodell?
*zum Speichermodell passender Rambereich und Startadresse?
*zum Speichermodell passender Programmbereich und Startadresse?
Wenn diese Einstellungen nicht im Widerspruch zueinander stehen, und 
innerhalb des Programms keine weitere(n) Modifikation(en) der 
Variablenspeicherklasse(n) stattfindet, sollte es eigentlich 
funktionieren.

mfg
Gast #1085564
Lesenswert?

Hallo Jonny,

mach 's doch nicht so spannend. Wenn 's mit µV v. Kei* gemacht wurde, 
dann pack das ganze Projekt mal ein und poste es hier in den beiden 
Varianten.

Es lassen sich Code u. Einstellungen einfachst prüfen.

tschü Dude

PS:
Die Startup-Datei muss ggf. ans eigene Projekt angepasst werden.
(Aber das weisst Du sicherlich, manchmal sieht man den Wald ...)
Gast #1086019
Lesenswert?

Hi Jonny,

sorry, hat etwas länger gedauert, muste erst noch eine Kiste voll 
Kohlrouladen "bauen"...
Softwareloader läuft und dann dieses kleine Prog laufen lassen:
;-------------------
  Model  DS89C450.MCU

Loop:  Call  Blick
  JMP  Loop

Blick:  CPL  P0.4
  CLR  A
  DJNZ  ACC, $
  RET

  END
;-------------------
P0.4 geht auf 2K3, der auf Kathode LED und Anode auf 5P. Das Signal an 
P0.4 ist ein Rechteck, nix mit analog.

Was nun?

mfg
Pieter
Gast #1103497
Lesenswert?

Hi,

Tut mir leid das ich mich so lange nicht gemeldet hab, hatt viel zu tun.

Im Keil Simulator funktionierts mit und ohne Unterprogramm, die Ports 0 
und 2 blinken abwechselnd.

Hab jetzt die beiden Projekte raufgeladen;

Projekt ist das Blinken was funktioniert, direkt mit Schleifen
ProjektmPU ist das gleiche aber die Werteschleifen in Unterprogramme 
gelegt.
Wave.jpg ist das was am Port P0.4 wo die LED dranhängt bei ProjektmPU 
rauskommt.

Hoffe es kann mir jetzt jemand weiterhelfen, bin schon leicht am 
verzweifeln, habe vor Jahren schonmal mit dem Teil gearbeitet da hat 
alles perfekt funktioniert.

mfg Jonny
Angehängte Dateien:
#1103566
Lesenswert?

Dein Argument von wait ist vom Type long. Deine Zaehlervariable i aber 
nur vom Type int. Das koennte Probleme bereiten ....

Probiers mal so:
1
void wait(unsigned long ms)
2
{      
3
    unsigned long i=0;
4
    int j=0;
5

6
    for(i=0 ; i<ms ; i++){
7
        for(j=0 ; j<1106 ; j++){
8
        } 
9
    } 
10
}

PS: Und formatier deinen Code mal ordentlich, das hilft den Ueberblick 
zu bewahren :-)
#1104846
Lesenswert?

Servus,

wie hast du denn die LED angeschlossen? Port P0 hat hat keine internen 
Pullups, und kann auch nicht nach High treiben.

Ich vermute mal, so hat so verdrahtet:

Plus - Widerstand - LED - Portpin

Setzt Du nun P0.4 auf 1 so wird er hochohmig, und deine LED wirkt quasi 
als Pullup und zieht den Pin nach VCC. Das erklaert das Oszibild.

Bei P0.4=0 sollte allerdings die LED dann laeuchten.

Gruss,
rweber
Gast #1106523
Lesenswert?

Hallo Jonny,

das ist ja wirklich ein interessantes Phänomen ;))

Hast Du externes RAM bei Deiner HW? Wahrscheinlich nicht, sonst könntest 
Du ja keine LED an P0 hängen.

Schau Dir mal die beiden "main.lst" Dateien an. Bei der Varinate mit dem 
UP-Aufruf wird XDATA verwendet. Erzeuge mal Assemblercode (z. B. 
"#pragma CODE" am Anfang des Quelltextes), da dürften dann "movx" 
Befehle enthalten sein. Also wird extern adressiert und P0, P2 werden 
durch den µC selbst verwendet!

Ändere das Speichermodell für RAM auf "SMALL" und lege damit die (alle) 
Variablen auch bei der Version mit den UP-Aufruf ins interne RAM.

Dann alles wir gut :)))

tschü Dude
#1106622
Lesenswert?

12er Dude wrote:
> Ändere das Speichermodell für RAM auf "SMALL" und lege damit die (alle)
> Variablen auch bei der Version mit den UP-Aufruf ins interne RAM.

Ja, steht im Listing, er verwendet LARGE, was für ein Unsinn.

Die Keil-Entwickler haben sich schon was dabei gedacht, daß sie als 
Default SMALL eingestellt haben.

LARGE ist nur in Ausnahmenfällen zu empfehlen, wenn man die Vor- und 
Nachteile weiß.
In der Regel ist man mit den Memory-Spezifier idata, pdata, xdata 
deutlich effizienter als mit der Brechstange LARGE (alles xdata).


Peter
Gast #1106679
Lesenswert?

@Peter
Die Sinnfälligkeit möchte ich gar nicht duskutieren. Geschwindigkeit und 
Optimierung sind ein anderes Thema. Hier soll das Ding erstmal laufen.

Aber wo liegt "xdata"? Der gute Jonny hat Speicher adressiert, der 
physikalisch nicht vorhanden ist.
=> Die Speichereinstellung muss zur HW passen!
Was auch immer als default angegeben wird, ist egal. Man sollte es eh an 
die eigene Umgebung (HW) anpassen.

tschü Dude
#1106693
Lesenswert?

12er Dude wrote:
> Aber wo liegt "xdata"? Der gute Jonny hat Speicher adressiert, der
> physikalisch nicht vorhanden ist.

Nö.
Der DS89C450 hat 1kB xdata, bloß ist das wohl nicht richtig 
konfiguriert.

Bei meinem alten C51 mußte man dazu im startup.a51 einige Änderungen 
vornehmen.

> Was auch immer als default angegeben wird, ist egal. Man sollte es eh an
> die eigene Umgebung (HW) anpassen.

Wenn man aber nicht weiß, was man tut, sollte man es auf default lassen.

Viele lassen sich einfach nur durch das Wort blenden, SMALL klingt 
mickrig, LARGE klingt besser.
Bloß LARGE bedeutet eben auch automatisch LANGSAM.


Peter
Gast #1106706
Lesenswert?

@Peter
Sorry, da hast Du natürlich recht! Habe mir den µC nicht genau 
angesehen. Das Scope-Bild passte so schön zu der Vermutung.

Es wird so sein, wie Du es beschreibst: unzureichende Konfiguration. 
Warten wir mal auf Jonny ...

tschü Dude
Gast #1110320
Lesenswert?

Hi,

Danke für das rege Interesse an meinem Problem.

Ich habe das Model nur auf large gestellt weil es von Maxim so empfohlen 
wird. (http://www.maxim-ic.com/appnotes.cfm/an_pk/3267)

Werde es wenn ich heimkomme gleichmal mit small versuchen.

Bezüglich der Adressen bin ich mir nicht sicher was ich da einstellen 
muss, hab einfach die werte der oben erwähnten application note 
verwendet.

mfg Jonny
Gast #1110900
Lesenswert?

Hi,

Vielen, vielen Dank an Peter und Dude !

Mit Small als Memorymodell funktionierts, mit Compact und Large nicht.
Wäre da wohl nicht so schnell draufgekommen weil in den Application Note 
von Maxim steht ja man solls auf large stellen.

Weis eventuell noch jemand woran das liegen könnte? Würden den XData 
gern benutzen wenn ich den schon draufhab.

mfg Jonny
Gast #1111053
Lesenswert?

Hi,

> Wäre da wohl nicht so schnell draufgekommen weil in den Application Note
> von Maxim steht ja man solls auf large stellen.
Da steht aber nicht nur drin, dass man es auf LARGE stellen soll, 
sondern auch wann, du hast es nicht richtig gelesen:

Memory Model — Set to Large: Variables in XDATA. This tells the compiler 
to locate variables in external MOVX RAM. This is appropriate when 
using a hardware setup, such as the High-Speed Microcontroller 
Evaluation Kit, which provides external data memory for the 
DS89C430/440/450.

Du hast nirgends erwähnt, ob du ein DevKit oder ne eigene Hardware 
verwendest, die einen externen RAM-Speicher verwendet.

> Würde den XData gern benutzen wenn ich den schon draufhab.
Das geht auch, wenn du auf SMALL stehst. Die Speichermodelle sagen dem 
Compiler nur, wo er Variablen standardmäßig ablegen soll, wenn nicht 
extra spezifiziert wird, wo sie abgelegt werden sollen.

Guckst du da:

http://www.keil.com/support/man/docs/c51/c51_le_memmodels.htm
http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm

Du kannst sowohl für einzelne Variablen als auch komplette Code-Module 
sagen, dass sie sich in einem anderen Speicher befinden. Das bietet sich 
z.B. an, wenn du große Buffer hast, die legst du dann in den externen 
Speicher. Oder Interrupt Variablen werden meistens im internen Speicher 
gehalten, damit der Zugriff schnell gemacht werden kann, denn ein 
Zugriff auf externen Speicher dauert länger als bei einem internen 
Zugriff.

Ich lasse das Modell immer auf SMALL, und passe für spezielle Fälle 
entweder die Variablen bzw. Module an.

Ralf

PS: Weiss jemand, wo aufgeführt ist, wie man Forumstexte formatiert?

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