Forum: Mikrocontroller und Digitale Elektronik PIC16F84 Logik Programm erstellen


von Steven B. (veterano)


Angehängte Dateien:

Lesenswert?

Hy @ all

bin neu im programmieren von Assembler, habe bereits Bücher über 
Assembler doch nun bräuchte ich eine kleine Inspiration. Ich möchte 
nämlich meinen PIC16F84 als Art Kleinsteuerung verwenden und würde gerne 
logikbausteine einprogrammieren. Wäre jemand so nett und könnte mir ein 
kurzes ASM File schreiben mit ein paar Logik-Verknüpfungen wie in meinem 
Anhang abgebildet.

Mfg
Veterano

von weißgradnich (Gast)


Lesenswert?

Na, dann mache ich mal den Anfang.
Nur LG1:
1
bcf PORTB, 0
2
movf PORTA, W
3
andlw 0x03
4
xorlw 0x03
5
btfsc STATUS, Z
6
bsf PORTB, 0

von weißgradnich (Gast)


Lesenswert?

...besser
1
movf PORTA, W
2
andlw 0x03
3
xorlw 0x03
4
btfsc STATUS, Z
5
bsf PORTB, 0
6
btfss STATUS, Z
7
bcf PORTB, 0

von Steven B. (veterano)


Lesenswert?

Hy danke schon mal für die mühe hier ist mein fertiges prog:

  list p=16f84
  #include <P16f84.INC>
  __CONFIG  _PWRTE_ON & _WDT_OFF & _XT_OSC
Init
    movf PORTA, W
    andlw 0x03
    xorlw 0x03
    btfsc STATUS, Z
    bsf PORTB, 0
    btfss STATUS, Z
    bcf PORTB, 0


End


MPLAB hat es ohne probleme assembilier doch dann auf dem PIC passierte 
garnichts. Als ich 5V an RA.0 und RA.1 anlegte passierte leider nichts. 
besteht noch irgendeinen Fehler den ich eingebaut habe.

Mfg
Veterano

von stephan_ (Gast)


Lesenswert?

1. Willst Du wirklich eine 16F84 nehmen, der ist uralt und sauteuer.

2. Da wird die Logik nur ein einziges Mal nach dem Start durchgeführt, 
dann versinkt der PIC im Nirwana ... ausserdem fehlt die init-Routine, 
die dem PIC sagt, was Eingang und was Ausgang ist  etc.


Besser ist folgendes:

   org 0x00

init
    bsf STATUS, RP0
    crlf TRISA
    bsf TRISA, 0
    bsf TRISA, 1
    crlf TRISB
    bcf STATUS, RP0
    crlf PORTA
    crlf PORTB

start
    movf PORTA, W
    andlw 0x03
    xorlw 0x03
    btfsc STATUS, Z
    bsf PORTB, 0
    btfss STATUS, Z
    bcf PORTB, 0

    goto start

    end

von Steven B. (veterano)


Angehängte Dateien:

Lesenswert?

Hy
habe eben versuch das Programm zu schreiben, doch leider kam dauernt die 
Fehlermeldung: Error [122] Illegal opcode
in der Zeile 8, 11, 13, 14
könntet ihr mir bitte helfen.

Mfg
Veterano

von Reinhard Kern (Gast)


Lesenswert?

Veterano S. schrieb:
> Hy
> habe eben versuch das Programm zu schreiben, doch leider kam dauernt die
> Fehlermeldung: Error [122] Illegal opcode
> in der Zeile 8, 11, 13, 14
> könntet ihr mir bitte helfen.
>
> Mfg
> Veterano

Hallo,

den Befehl crlf gibts nicht, das heisst clrf (clear f).

Gruss Reinhard

von R. M. (exp)


Lesenswert?

In Deinem Fall

Beitrag "Probleme mit dem programmieren PIC16F84A"

Beitrag "Welchen Assembler kann ch benutzen?"

ist es am Besten, Du freundest Dich doch mit Parsic an.

von Steven B. (veterano)


Lesenswert?

Ja da hast du recht dass Parsic für mich besser wäre da ich ja nur 
Logikfunktionen mit meinem PIC programmieren möchte, doch leider kam ich 
nicht weit mit parsic, da ich da nicht ganz durchgestiegen bin wo meine 
Fehler sind. Deshalb möchte ich mir die Assembler sprache anlernen.

Mfg
Veterano

von Steven B. (veterano)


Lesenswert?

Hey habe eben das gleiche Programm in Parsic geschrieben doch da kam 
folgendes raus:

  PROCESSOR 16F84A

  INCLUDE P16F84A.INC

  RADIX DEC


  __IDLOCS H'0100'

  __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

; Diverses

ZERO  EQU Z  ; ZERO-Flag
CARRY   EQU C  ; CARRY-Flag


; Variable

RAM  = 12  ; located in Bank 0, 1

  ERRORLEVEL -302  ; disable warning (Bankswitching)
  ERRORLEVEL -306  ; disable warning (Pageswitching)

;****************************************
;Programmanfang
;****************************************

  ORG 0

  CLRF STATUS  ; switch to RAM-Bank 0
  GOTO SYS_INIT
  NOP
  NOP
  RETURN

;****************************************
; Subroutines
;****************************************


;****************************************
;Initialisierung
;****************************************


SYS_INIT

  MOVLW B'00000000'
  MOVWF INTCON

; Set output before direction

  BSF STATUS,RP0  ; Bank 1
  MOVLW B'00000000'
  MOVWF PORTA

  MOVLW B'00000000'
  MOVWF PORTB

  MOVLW 15
  MOVWF OPTION_REG


; Richtung setzen

  MOVLW B'11111111'
  MOVWF TRISA

  MOVLW B'11111110'
  MOVWF TRISB

; init vars


; Clear RAM

  MOVLW 12
  MOVWF FSR
CR1
  CLRF INDF
  INCF FSR,F
  MOVFW FSR
  SUBLW 80
  BTFSS STATUS,ZERO
  GOTO CR1



;**********************************
;******* Haupt-Programm ***********
;**********************************

MAIN

;***************************************************
; UND - Gatter -> LG1
;***************************************************

LABEL_LG1_1
  BSF STATUS,RP0  ; Bank 1
  BTFSS PORTA,0
  GOTO LABEL_LG1_FALSE
LABEL_LG1_2
  BTFSS PORTA,1
  GOTO LABEL_LG1_FALSE

LABEL_LG1_TRUE
  BSF PORTB,0
  GOTO LABEL_LG1_ENDE
LABEL_LG1_FALSE
  BSF STATUS,RP0  ; Bank 1
  BCF PORTB,0
LABEL_LG1_ENDE
;****************************************

  GOTO MAIN


  END



Doch leider läuft dieses Programm nicht, worin liegt der Fehler.

Mfg
Veterano

von R. M. (exp)


Lesenswert?

Also gut,
aber das hatten wir doch schon einmal.

Ich kenne Parsic nicht, aber es sieht so aus als ob dieses
Programm ein Problem mit der Bankumschaltung hat und deshalb
keinen korrekten Assemblercode erstellt.

Grundsätzlich ist die Idee mit einem PIC16F84 Assembler zu erlernen
gar nicht so schlecht, weil dieser µC einen sehr übersichtlichen
Befehlssatz sowie nur eine Handvoll von Registern hat.

Aber bevor Du anfängst zu programmieren,
m u s s t  Du Dir das Datenblatt durchlesen.

Du m u s s t wissen wofür die Register gut sind und was die einzelnen
Instruktionen bedeuten.

Mit diesem Wissen kannst Du dann den von Parsic erstellten Code 
reparieren,
oder auch ganze eigene Programme erstellen.

Bisher hast Du nur Programme ( oder Teile davon ) die jemand anders
erstellt hat (Parsic oder Forenmitglieder) in "deine" Sourcen
kopiert und festgestellt, das es so nicht funktioniert.

Das ist ganz normal, kein Programm wird auf Anhieb fehlerfrei laufen.

Aber Du musst Dir die Mühe machen das fehlerhafte Programm
zu analysieren und zu debuggen.

Aber um soweit zu kommen:

Lies das Datenblatt, lies das Datenblatt (!)

mfg

von Steven B. (veterano)


Lesenswert?

Ok vielen Dank schon mal.
Ich muss mich in dieses Thema erstmal richtig einarbeiten, da ich ja 
keine vorerfahrung mit µC habe, sondern nur in SPS und da läuft das 
ganze ein wenig einfacher;)

Mfg

Veterano

von R. M. (exp)


Lesenswert?

Spasseshalber hab ich ein bisschen geg**elt.

Wenn Du aus der SPS Ecke kommst, könnte das hier interessant sein

http://cq.cx/ladder-de.html

mfg

von Steven B. (veterano)


Lesenswert?

jap ladderlogic habe ich auch schon, doch leider is das Programm nicht 
für de 16F84A.

Mfg
Veterano

von fresh (Gast)


Lesenswert?

...dann schau Dir mal flowcode an.

von sven (Gast)


Lesenswert?

Und bei PIC16F und Assembler hilft immer wieder www.sprut.de. Da ist das 
wichtigste alles in Deutsch erklärt. Wenn du das alles verstanden hast, 
kommst du auch mit dem Rest und dem Datenblatt klar.

von Steven B. (veterano)


Lesenswert?

Hey weis jemand vill was dieser code bedeutet un was er bezwegt: 
0b00001011.
Ich musste ihn in mein programm schreiben damit es funktioniert.

Mfg
Veterano

von R. M. (exp)


Lesenswert?

Würde ich als Binärzahl interpretieren

dezimal 11; hexadezimal 0x0B;

Ausdruck wird gerne verwendet um einzelne Bits dediziert zu setzen.

von Steven B. (veterano)


Lesenswert?

OK vielen Dank

Mfg
Veterano

von R. M. (exp)


Lesenswert?

Kein Problem ;-)

Machst Du das eigentlich als Hobby und daher gewissermassen freiwillig
oder ist das eine Aufgabe für eine Facharbeit ?

mfg

von Steven B. (veterano)


Lesenswert?

Ich mache das als Hobby ;-)
Beruflich bin ich Mechatroniker.

Mfg
Veterano

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.