Assembler mit PIC18F458

OP #445597
Lesenswert?
• ▲
▼
Hallo Leute,

möchte meinen PIC18F458 für erste Tests mit Assembler programmieren.
Habe mir die PDF MPASM & MPLINK USER GUIDE geholt und versucht mich 
einzuarbeiten.

Habe folgende Fragen an Euch:

1.) WIe gliedere ich am Besten mein Programm
    (STATUS REGISTER - INTERRUPT BEREICH - CODE ???)

2.) Wenn ein Interrupt auftritt, springt dieser bei entsprechend 
gesetzem Priority Bit zur Adresse 0x18 (HighPriority). Wie definiere ich 
diesen Punkt in meinem Programm.

Hab nur soviel Ahnung, das durch org 0x00 das Programm bei 0x00 startet. 
Jeder weitere Befehl ist 2 Adressen weiter (in Dissassembly List 
nachgeschaut).

Am hilfreichsten wäre ein kleines Demoprogramm.


Vielen Dank schon im Vorraus

Greetz DaHeik
Gast #445609
Lesenswert?
• ▲
▼
Hi

Wieso willst du unbedingt ASM programmieren bei den PIC18F? Wieso nicht 
gleich C? Der Compiler wär auch gratis und die PIC18f sind ja für 
C-Compiler optimiert worden, soweit ich weis.

Nunja... aber da du sichtlich gerade beim anfange bist, solltest du dir 
die Seite von Sprut(www.sprut.de) zu gemüte führen.
Weitere Beispielprogramme findest du im Forum: www.fernando-heitor.de 
und dort sind auch einige Links zu finden für weitere Beispiele.

mfg Schoasch
OP #445620
Lesenswert?
• ▲
▼
Hab den C18 Compiler, werd auch mit dem weitermachen.
Ich möchte die Grundzüge des Assemblerprogrammierens verstehen.

Dafür hätt ich nur noch die Info gebraucht, wie ich geeignet auf einen 
Interrupt reagiere (Sprungmarke im Programm ...)

Bisheriger Code:

      LIST P=18F458          ;der Typ des Prozessors
        #include c:/proggies/ba/micro/mcc18/mpasm/p18F458.inc 
;processor-

;Configuration bits
    CONFIG      OSC = HS             ; HS 16 MHz
    CONFIG      PWRT = ON            ; power up timer on
    CONFIG      BOR = OFF            ; brown out detect off
    CONFIG      WDT = OFF            ; watchdog off
    CONFIG      LVP = OFF            ; lvp off

  org 0x00000

Main:
  bsf  INTCON,7    ; GIEH
  bsf  RCON,7    ; IPEN
  bsf  INTCON3,3    ; INT1IE
  bsf  INTCON2,5    ; INTEDG1
  bsf  INTCON3,6    ; INT1IP

           clrf        TRISD     ; All Pins Output
           clrf        PORTD                  ; Turn off all Pins

           bsf         PORTD,7                ; Vcc to Pin7

Schleife:
  NOP      ; No Operation    goto Schleife
end


Wie du siehst fehlt mir noch die Info, wie ich die Sprungmarke 0x18 
setze


Gruß Heiko
Gast #445624
Lesenswert?
• ▲
▼
> 2.) Wenn ein Interrupt auftritt, springt dieser bei entsprechend
> gesetzem Priority Bit zur Adresse 0x18 (HighPriority). Wie definiere ich
> diesen Punkt in meinem Programm.

Laut Datenblatt ist die Adresse für

  High Priority Interrupt Vector:  0x008
  Low  Priority Interrupt Vector:  0x018


In Assembler sollte das dann ungefäh so aussehen:

; Inrerruptvektoren
  org 0x0000
  goto Reset

  org 0x0008
  goto ISR_High

  org 0x0018
  goto ISR_Low

  org 0x0020
Main:
  ;
  ;
  goto Main

Reset:
  ; Mach Init-Kram
  retfi

ISR_Low:
  ; Mach ISR-Low-Kram
  retfi

ISR_High:
  ; Mach ISR-High-Kram
  retfi
Gast #445640
Lesenswert?
• ▲
▼
>  org 0x00000
>
>Main:
>  bsf  INTCON,7    ; GIEH
>  bsf  RCON,7    ; IPEN
>  bsf  INTCON3,3    ; INT1IE
>  bsf  INTCON2,5    ; INTEDG1
>  bsf  INTCON3,6    ; INT1IP
>
>  clrf        TRISD     ; All Pins Output
>  clrf        PORTD                  ; Turn off all Pins
>
>  bsf         PORTD,7                ; Vcc to Pin7

So geht das nicht. Dein Programm darf nicht bei 0x0000 beginnen, sonst 
überschreibst Du Dir doch die Interrupt-Vektoren mit Programmcode. (Es 
sei denn, du verwendest keine Interrupts, was du aber eigentlich 
möchtest). bei den INT-Vektoren sollten nurgotos auf die ISR's stehen. 
Die ISR sollten dann mit 'retfi' verlassen werden.
OP #445749
Lesenswert?
• ▲
▼
Folgendes Problem:

Programm ist in einer Schleife, die eine LED blinken lässt.
- Interrupt taucht auf durch anlegen einer Spannung an Int1
- Programm springt zur Adresse 0x18
- Dort wird auf Programmstelle verwiesen
- Dort wird einmal NOP durchgeführt und Interrupt SOLL dann mit retfie 
verlassen werden.

PROBLEM:
- Das Programm springt zu 0x18 anstatt zu der Adresse, an der Interrupt 
ausgelöst wurde

????????????????????????????????

Code:

CONFIG      OSC = HS             ; HS 16 MHz
CONFIG      PWRT = ON            ; power up timer on
CONFIG      BOR = OFF            ; brown out detect off
CONFIG      WDT = OFF            ; watchdog off
CONFIG      LVP = OFF            ; lvp off

cblock 0x30
  Delay1
  Delay2
  Delay3
endc

org 0x00
  goto Main

org 0x08
  goto ISR_Low

org 0x18
  goto ISR_High

ISR_Low;
  retfie

ISR_High;
  NOP
  retfie


Main:
bsf    INTCON,7    ; GIEH
bsf    RCON,7    ; IPEN
bsf    INTCON3,3    ; INT1IE

.
.
.
.
Gast #446057
Lesenswert?
• ▲
▼
Wenn ein Interrupt aufgetreten ist, musst du in der ISR vor dem 'retfie' 
erst das entsprechende Interrupt-Flag (PIR Register) wieder löschen, 
sonst wird sofort wieder der Vektor angesprungen (steht alles im 
Datenblatt, DS41159E-page 82 oben rechts).

Wenn deine ISR angesprungen wurde, solltest du sowieso mithilfe des PIR 
ersteinmal kontollieren, welcher Interrupt überhaupt aufgetreten ist. 
Sind mehrere "gleichzeitig" aufgetreten, kannst Du so auch die 
Reihenfolge der Abarbeitung festlegen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.