Forum: Mikrocontroller und Digitale Elektronik Assembler mit PIC18F458


von Heiko H. (daheik)


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

von Schoasch (Gast)


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

von Heiko H. (daheik)


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

von tastendrücker (Gast)


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

von Heiko H. (daheik)


Lesenswert?

Juhuuuuuuuuuuu,

genau die Info hab ich gebraucht!


Dankeschöööön

von tastendrücker (Gast)


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.

von Heiko H. (daheik)


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

.
.
.
.

von tastendrücker (Gast)


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.

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.