Forum: Mikrocontroller und Digitale Elektronik Grundgerüst eines ASM-Programms, PIC16F84A


von Michael Z. (michael_93)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe vor längerer Zeit ein Schülerpraktikum besucht, in dem es um 
die Programmierung eines PIC16F84A ging, mit dem eine LED-Anzeigeplatine 
(siehe Bild) angesteuert wurde.

Jetzt möchte ich mich wieder mit diesem Thema beschäftigen und wieder 
mit der einfachen Programmierung eines PIC beginnen. Programmierbefehle 
sind mir noch bekannt, das einzige Problem das ich habe, ist das 
"Startgerüst" meines Programms (Assembler).
Also die Portkonfiguration usw. Sobald der eigentliche Programmstart, 
also das was ich individuell programmiere, kommt, komm ich wieder damit 
klar.

Kann mir jemand evtl. diesen Anfangsteil (von Zeile 1 bis zum Start 
meines Programms) zur Verfügung stellen bzw. kurz erklären was ich wie 
und wo festlegen muss/kann.

Vielen Dank im voraus.

Gruß Michael

von PIC N. (eigo) Benutzerseite


Lesenswert?

Das hier sollte als "Beispiel" dienen: 
http://sprut.de/electronic/pic/programm/lauflicht/lauflich.htm

Ansonsten findest du bei Sprut auch sonst alle Erklärungen in Sachen 
Assembler: http://www.Sprut.de

Falls du es mal mit C und den größeren PIC18 versuchen magst, kannst du 
hier rein schauen: http://www.PIC-Projekte.de

Viele Grüße

von Michael Z. (michael_93)


Lesenswert?

Das heißt für ein einfaches Lauflicht, oder um die LEDs blinken zu 
lassen brauch ich zu Beginn nur:

list p=16f84

#include <p16f84.inc>

__CONFIG    PWRTE_ON & _WDT_OFF & _XT_OSC       (wenn ich bis 4MHz 
Takte)

loops equ  0x22       (Die variable könnte ich auch anders benennen 
oder? für was steht equ
                                 und 0x22?)

Init
        bsf     STATUS, RP0
        movlw   B'00000000'
        movwf   TRISB
        bcf     STATUS, RP0
        clrf    PORTB

Was macht Init? (Einfach nur PORTB als Ausgang festlegen??)Eine kurze 
Erklärung zu den einzelnen Befehlen würde bereits helfen.

Mit der Warteschleife "Wait" lasse ich den PIC ja im Prinzip nur sinnlos 
zählen um eine Zeitverzögerung zu erreichen oder?

von Michael R. (elektr-hobbyist)


Lesenswert?

Hallo Micha.

Falls Du als Entwicklungsumgebung „MPLAB“ verwendest.
MPLAB bringt für jeden Controller ein Grundgerüst mit.
Es liegt als asm- file im Ordner Template bereit.

C:\Program Files\Microchip\MPASM Suite\Template\Code

Das entsprechende file öffnen, den Code rauskopieren und in deinem 
laufenden Projekt einfügen.
Schau es Dir einfach mal an.

In Sachen Portkonfiguration kannst Du auch mal einen Blick ins 
Datenblatt werfen.

> Ansonsten findest du bei Sprut auch sonst alle Erklärungen in Sachen
> Assembler: http://www.Sprut.de

Die ist auch zu empfehlen.

L.G.

Micha

von Chris B. (dekatz)


Lesenswert?

Das Datenblatt für den 16F84( inklusive einer komplette Übersicht und 
Erklärung der Befehle) findest du hier:
http://ww1.microchip.com/downloads/en/DeviceDoc/30430D.pdf

von PIC N. (eigo) Benutzerseite


Lesenswert?

Vielleicht hätte ich diesen Link noch beifügen sollen, da geht es genau 
um den Grundaufbau eines Assembler Programmes für einen PIC: 
http://sprut.de/electronic/pic/assemble/assembler.html

Mit equ sagst du dem Assembler, dass die Speicherzelle, in dem Fall 
0x22, zukünftig mit dem "Label" oder "Namen" angesprochen werden kann.

Und ja, bei dem kurzen Teil, bei dem der Bankwechsel notwendig ist, wird 
der Port B initialisiert. Steht auch alles auf der Seite.

von PIC N. (eigo) Benutzerseite


Lesenswert?


von W.S. (Gast)


Lesenswert?

Michael Zöller schrieb:
> Was macht Init?

Ich merke schon, daß die Assembler-Syntax, wie sie von Microchip 
gepflegt wird, immer noch gräßlich und anfängerverwirrend ist.

1. Init
Also "Init" macht garnix. Das ist, so wie ich das sehe, eine Marke (oder 
Label oder Identifier oder Name, wie du es nennen willst).

2. Was ist 'equ'?
Sehr einfach, nämlich die Definition eines Wertes. Beispiel:
Ottokar equ 123
Karlheinz equ 54
sozusagen "Ottokar ist gleich hundertdreiundzwanzig"

später kannst du dann anstelle
  MOVLW 123
besser lesbar schreiben
  MOVLW Ottokar

Aber da geb ich dem Anliegen hinter deinen Fragen Recht: Diese Art, 
Speichervariablen zu definieren, ist schlecht. Bei mir sehen die Anfänge 
von PIC Quellen etwa so aus:

      INCLUDE P16F627.PIC     ; Definitionen zum benutzten PIC einfügen
      SEG  RAM                ; was folgt, sind Vereinbarungen im RAM
      ORG  20h                ; Adress-Zähler auf 20h stellen
Otto: DS   1                  ; eine Speicherzelle namens Otto 
reservieren
Emil: DS   1
Anna: DS   32                 ; Feld aus 32 Bytes reservieren

und so weiter.
dann:

      SEG   CODE              ; jetzt kommt alles für den Codebereich
      ORG   2000h             ; hier sind die Id-Bytes
      DATA  0Ah               ; ein Codewort mit dem Wert 10 (=0Ah)
      DATA  'I'
      DATA  'C'
      DATA  'H'

          ORG      2007h      ; hier ist das Konfigurationswort
Config:   DATA     11111100100001b

          ORG      2100h      ; hier ist der EEPROM (wenn vorhanden)
Meldung:  DATA    'M','C','P','-','3','5','5','1',0


          ORG      0          ; hier geht das Programm los
          CLRF    Status
          CLRF    PCLATH
          GOTO    Start

          ORG     4
Interrupt:
          MOVWF    RetteW         ; W retten
          SWAPF    Status,W       ; Flags in W holen
          BCF      RP0
          MOVWF    RetteFlags     ; Flags retten
          MOVF     FSR,W
          MOVWF    RetteFSR

          hier ist der Nutzbereich des Interrupts

          MOVF     RetteFSR,W
          MOVWF    FSR
          SWAPF    RetteFlags,W   ; gerettete Flags in W
          MOVWF    Status         ; Flags restaurieren
          SWAPF    RetteW,F       ; W restaurieren
          SWAPF    RetteW,W
          RETFIE

; hier Kaltstart, alles neu aufsetzen
Start:    MOVLW    wf_PortA       ; mußt du dir selbst definieren
          MOVWF    PortA

          MOVLW    wf_PortB       ; mußt du dir selbst definieren
          MOVWF    PortB

          BSF      RP0
          MOVLW    wf_TrisA       ; mußt du dir selbst definieren
          MOVWF    TrisA          ; wfXX heißt bei mir "Wert_Für_XX"
          MOVLW    wf_TrisB       ; mußt du dir selbst definieren
          MOVWF    TrisB

          MOVLW    B'01111111'    ; nur Pullups
          MOVWF    OptionReg
          BCF      RP0

    hier beginnst du mit all den Befehlen,
    die du den PIC ausführen lassen willst

So. Das sollte als Anhaltspunkt für einen Quellcodeanfang ausreichen. 
Allerdings benutze ich meinen eigenen Assembler und der unterscheidet 
sich ein bissel von dem von Microchip. So kann ich mit
Willibald:  BIT   PortA,3
das Bit 3 vom Port A mit dem Namen Willibald versehen und brauche später 
im Code nur
         BSF  Willibald
zu schreiben. Ebenso gibt's bei mir
         SKIP Willibald
und
         SKIP NOT Willibald

was ne besser lesbare Version von BTFSS und BTFSC ist.

W.S.

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.