Assembler Programm - 68332

OP #923501
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.
Angehängte Dateien:
  • x_1 (827 Bytes)
#923578
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
OP #923746
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
#923858
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
#1329757
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
Angehängte Dateien:
#1329804
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

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