Forum: Mikrocontroller und Digitale Elektronik Assembler Programm - 68332


von Waldi O. (walderon852)


Angehängte Dateien:
  • x_1 (827 Bytes)

Lesenswert?

Hallo,

ich bräuchte Hilfe für eine Übungsaufgabe, mit der ich nicht so richtig 
zurecht komme und ergänzen muss.


68332 - 1MB FEPROM - 256 KB SRAM


Aufgabe: (im Anhang)

Bei einem 68332 soll nach Ablauf des PIT das Register D0 in einer ISR 
inkrementiert werden, das Programm dazu ist im EPROM. Stack 1 KB. EVT so 
durch ergäzen des ORG Befehls so legen, dass aus dem ROM gebootet wird. 
EVT und SSP so legen, dass sie beim Label STACK beginnen. IPC soll bei 
$200 beginnen. Eintrag fü den Exceptionvektor $60 des PIT hinzufügen.

Ich müsste jetzt an den 6 Stellen mit ... noch etwas ergänzen, würde 
mich freuen wenn Ihr mir helfen könnt.

von Gast (Gast)


Lesenswert?

>Ich müsste jetzt an den 6 Stellen mit ... noch etwas ergänzen,

Mach doch, hier hält Dich keiner davon ab.

von Tobias P. (hubertus)


Lesenswert?

Ich kenne den '332 relativ gut.
Was ist nicht klar?
Den Code solltest du vielleicht als .asm-Datei posten... so kann man den 
net so gut anschauen ;)

Gruss

von Waldi O. (walderon852)


Lesenswert?

Danke erstmal für deine Antwort,

wie ich den Code jetzt als .asm  Datei posten soll weiß ich ehrlich 
gesagt nicht. (bin neu, auch auf dem Gebiet)

Was nicht klar ist, ist was in die Exception Vektor Tabelle reingehört, 
hab ehrlich gesagt kein plan wie man des macht.

Danke

von Waldi O. (walderon852)


Lesenswert?

Nochmals zu dem was unklar ist,

ich hätte folgendermaßen ergänzt, weiss aber nicht ob es richtig ist.


INCLUDE      initareg.inc


***EVT

      ORG     $0
SSP   DC.L    STACK + 1024
IPC   DC.L    $200


aber des wars dann auch schon was mir dazu einfällt.

von Tobias P. (hubertus)


Lesenswert?

Ja, das ist fase richtig.
Also offenbar weisst du schon, dass nach dem Reset die ersten beiden 
Longwords zum System Stack Pointer werden (A7 im Supervisor Mode), bzw. 
zum Programmcounter. Ich empfehle dir folgendes:

ORG $0
DC.L STACK (Das war soweit richtig)
DC.L $400

ORG $400
;dein Programmcode

Das aus folgendem Grund:
Die Länge der Vektortabelle ist maximal 1024 Bytes (256 Vektoren * 4 
Bytes). Da sie ab Adresse $0 beginnt, reicht sie bis $3FF, und ab $400 
kann dein eigentliches Programm beginnen.

Damit der PIT funktioniert, musst du im SIM erst mal einen 
Interrupt-Arbitrationslevel eingeben (Im SIMCR die letzten 4 Bits), 
sofern du mehrere Interrupts hast. Wenn nur der PIT aktiv ist, reicht 
es, wenn du den Standard-Level von $F beibehältst.
Dann musst du dem PIT einen Interrupt-Vektor zuweisen (PICR) und einen 
Interupt-Level (1..7). Nehmen wir an, du gibst dem PIT den Vektor Nr. 
$80. Dann musst du in der Interrupt-Vektortabelle beim Vektor Nr. $80 
die Adresse deines Interrupt-Programms eintragen. Klar?
Dann über das PITR normal den PIT initialisieren & starten (schau im 
Manual auf S. 47).
Dann noch die Interrupts freigeben (über das SR), und es sollte 
funktionieren.

Grüsse

von Waldi O. (walderon852)


Lesenswert?

Danke für deine Antwort,

hat mir weitergeholfen, wenn ichs richtig verstanden hab dann siehts 
folgendermaßen aus:



***EVT
ORG     $0
DC.L    STACK   (muss da nicht noch +1024 hin, da er 1KB sein soll?)
DC.L    $400

ORG     $180    (da mein Exception Vektor $60 ist)
DC.L    ISR


***Program
COUNT   ORG          $400
        MOVE.B       #$0C,SYPCR
        MOVE.W       #$1000,RAMBAR

*Initialize PIT
        MOVE.W       #$0760,PICR    ;Vektor = $60 und IPL = 7
        MOVE.W       #$0102,PITR

*Initialize CPU32 registers
        CLR.L        D0

*Main
LOOP    BRA          LOOP


***ISR
ISR     ADD.L        #1,DO
        RTE
STACK   DC.W         0


END COUNT


wär schön wenn Ihr noch mal drüberschaut

von Tobias P. (hubertus)


Lesenswert?

Hoi Waldi,
sorry dass ich mich so spät erst melde. Hab mir 'Ein Fall für Zwei' 
angeschaut ;) (Matula ist einfach cool ;))

Also:
> DC.L    STACK   (muss da nicht noch +1024 hin, da er 1KB sein soll?)

Ja da hast du natürlich Recht. Der Stack wächst beim '332 (wie bei allen 
68k's) von oben nach unten - also

DC.L STACK + 1024.

Sonst siehts eigentlich gut aus. Sollte funktionieren (sollte! wie das 
halt bei Software so ist.... ;)).

Schau dir evtl. mal noch folgende App Note von Motorola an:

http://www.freescale.com/files/microcontrollers/doc/app_note/AN437.pdf?fpsp=1&WT_TYPE=Application%20Notes&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation

(sch... Link :p)

Dann hast du den PIT sicher voll im Griff.
Morgen wünsche ich dir noch viel Glück bei deiner Prüfung. Berichte dann 
wies gegangen ist ;)

Grüsse und schönen Abend

von Waldi O. (walderon852)


Lesenswert?

danke dass du noch mal zurückgeschrieben hast,

heut um 13:00 werd ichs wissen wies gelaufen is.


bis später

von Waldi O. (walderon852)


Lesenswert?

so, hat ein bisschen gedauert,

war ehrlich gesagt schwerer als angenommen, mal sehen was dabei 
rauskommt.
Es ist ein ziemlich ähnliches Programm drangekommen, da hab ich dank 
deiner Hilfe dann doch was zusammenbekommen.

Danke noch mal für deine Hilfe

Schönen Gruss

von Artur L. (arser05)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe auch Fragen zu der Aufgabe.

In der Lösung der Aufgabe wurde in der Zeile über Stack folgendes 
eingefügt:
ORG $100400

also so:

      ORG $100400 ;$100400…1007FE
STACK DC.W 0 ;Fill memory with $0000

und der erste Eintrag in der VectorTable ist nicht STACK + 1024 sondern:
      ORG 0
      DC.L STACK ;Init Stack

Der PC wird also auf 1kB nach Beginn des int. SRAM gestellt und dort 
eine Konstante #0 definiert?

Meine Frage warum?
Wieso wird nicht A7 mit dem Wert von STACK geladen?

vielen Dank

von Tobias P. (hubertus)


Lesenswert?

Also, der Stack wächst nach unten, deshalb muss der SP auch mit einem 
Wert initialisiert werden, der ausreichend hoch ist, sodass nichts 
anderes überschrieben wird.
Aer ich verstehe deine Frage nicht so ganz .... ?

von Artur L. (arser05)


Lesenswert?

Ja, der Stack wächst mit fallenden Adressen.

Meine Frage(n):

Für welchen Wert ist STACK der Platzhalter? für §100400?
Und wozu "DC.W 0"? Ist es nur ein Dummy? Könnte in der Zeile sonstwas 
stehen?

von Tobias P. (hubertus)


Lesenswert?

Also, das DC.W 0 ist sinnlos, denn das definiert NUR an der Adresse, an 
der es steht, eine Null. Der Programmierer wollte aber hier, wie man dem 
Kommentar entnehmen kann, den Speicher (besser gesagt den Stack) zuerst 
mit 0 initialisieren. Das kann man machen, bringt aber nichts, und 
funktioniert in der Form, wie das in deinem Code steht, auch gar nicht, 
weil so, wie gesagt, nur eine einzelne Null gespeichert wird.
Wenn du den Stack ab Adresse $100400 haben möchtest, dann schreibe doch:

org $0
dc.l $100400
dc.l start


start:
; hier beginnt dein programm


Der Stackpointer, also A7, wird dann mit der Konstanten $100400 
initialisiert und wächst nach unten. Blöd ist es, wenn du an Adresse 
$100400 wichtige Daten hast. Dann kannst du festlegen: der Stack darf 
max. 1024 Bytes gross werden, somit wird der Stackpointer nicht mit 
$100400 initialisiert, sondern mit $100400 + 1024 = $100800. Damit hast 
du $400 Bytes 'Luft' bis zur Adresse $100400. Klar soweit?

Gruss

von Artur L. (arser05)


Lesenswert?

Klar! Danke!

...man vergleiche das Datum vom Vorposter mi dem 
heutigen...Prüfungszeit)

von Tobias P. (hubertus)


Lesenswert?

Haha, jaaa :-)
Viel Erfolg!

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.