Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem programmieren PIC16F84A


von Steven B. (veterano)


Angehängte Dateien:

Lesenswert?

Hey @ all

ich bin neu in der Microcontollertechnik und habe ein Problem mit dem 
Programmieren.
Zum Programmieren benutze ich Parsic. Ich wollte zum Test eine 
Wendeschütz-schaltung auf meinen PIC ziehen um erst mal zu testen wie 
das ganze läuft.
Doch nachdem ich das Prog auf meinen PIC geladen habe und dies testen 
wollte lief nichts. Ich habe auf die Eingänge RA0,RA1 und RA2 5V 
angelegt und an die Ausgänge RB0 und RB1 lötete ich LED´s, doch nichts 
lief. Ich habe erst gedacht das es ein hardware fehler war und ladete 
ein fertiges prog von sprut auf meinen PIC und es stellte sich heraus 
das alles stimmt. Nun denke ich das es ein software fehler ist.

Hier ist das Programm:

; Source created with Parsic Version 3.x

; at              : 28.03.2010 16:47:49


; Project File    : C:\Dokumente und Einstellungen\wende\wende.pic

; Project Version : 1.0.5

; Created         : 07.07.2000 04:14:00

; Last change     : 28.03.2010 16:47:44

  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

S0  = 12  ; located in Bank 0, 1
RAM  = 13  ; 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 143
  BSF STATUS,RP0  ; Bank 1
  MOVWF OPTION_REG


; Richtung setzen

  MOVLW B'11111111'
  MOVWF TRISA

  MOVLW B'11111100'
  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
  BTFSS S0,0
  GOTO LABEL_LG1_FALSE
LABEL_LG1_2
  BSF STATUS,RP0  ; Bank 1
  BTFSC PORTB,1
  GOTO LABEL_LG1_FALSE

LABEL_LG1_TRUE
  BSF STATUS,RP0  ; Bank 1
  BSF PORTB,0
  GOTO LABEL_LG1_ENDE
LABEL_LG1_FALSE
  BSF STATUS,RP0  ; Bank 1
  BCF PORTB,0
LABEL_LG1_ENDE
;***************************************************
; UND - Gatter -> LG2
;***************************************************

LABEL_LG2_1
  BSF STATUS,RP0  ; Bank 1
  BTFSC PORTB,0
  GOTO LABEL_LG2_FALSE
LABEL_LG2_2
  BTFSS S0,1
  GOTO LABEL_LG2_FALSE

LABEL_LG2_TRUE
  BSF STATUS,RP0  ; Bank 1
  BSF PORTB,1
  GOTO LABEL_LG2_ENDE
LABEL_LG2_FALSE
  BSF STATUS,RP0  ; Bank 1
  BCF PORTB,1
LABEL_LG2_ENDE
;***************************************************
; RS-FLIP-FLOP -> RS1
;***************************************************

  BSF STATUS,RP0  ; Bank 1
  BTFSC PORTA,0
  GOTO LABEL_RS1_RESET
  BSF STATUS,RP0  ; Bank 1
  BTFSS PORTA,1
  GOTO LABEL_RS1_ENDE
  BSF S0,0  ; Ausgang setzen
  GOTO LABEL_RS1_ENDE
LABEL_RS1_RESET
  BCF S0,0  ; Ausgang zurücksetzen
LABEL_RS1_ENDE

;***************************************************
; RS-FLIP-FLOP -> RS2
;***************************************************

  BSF STATUS,RP0  ; Bank 1
  BTFSC PORTA,0
  GOTO LABEL_RS2_RESET
  BSF STATUS,RP0  ; Bank 1
  BTFSS PORTA,2
  GOTO LABEL_RS2_ENDE
  BSF S0,1  ; Ausgang setzen
  GOTO LABEL_RS2_ENDE
LABEL_RS2_RESET
  BCF S0,1  ; Ausgang zurücksetzen
LABEL_RS2_ENDE

;****************************************

  GOTO MAIN


  END

Ich hoffe Ihr könntet mir helfen den Fehler zu suchen. Vieleich kennt 
sich jemand mit Parsic gut aus und könnte mir sagen was ich falsch 
gemacht habe.

Vielen Dank im Vorraus

Mfg
Veterano

von stepp64 (Gast)


Lesenswert?

Bei mir ist das Assembler und nicht Parsic...

Du schaltest immer auf Bank1 und sprichst dann die PORT-Register an. Die 
liegen aber in Bank0. Weiter habe ich erst mal nicht gelesen...

Gruß
Sven

von Steven B. (veterano)


Lesenswert?

Danke erstmal das du dir mein Assembler duchgelesen hast, dies ist der 
Assembler der mir Parsic generiert hat. In meinen beigefügten Bildern 
ist mein Programm von Parsic dabei.

Mfg
Veterano

von stephan_ (Gast)


Lesenswert?

Es wird nirgendwo auf Bank 0 geswitcht, mit Ausnahme des 
Programmanfangs, wo das STATUS_Register gecleared wird (was eine sehr 
ungewöhnlich Massnahme zum Bank-Switching ist, es muss nämlich nur 1 Bit 
geswitcht werden). Also gibt es nirgendwo Zugriffe auf die Ports. Da 
macht Parsic wohl Mist.

von Steven B. (veterano)


Lesenswert?

Ok, kennt sich jemand vill mit Parsic aus und kann mir sagen wie ich es 
richtig programmieren kann oder ob ich irgendeine einstellung falsch 
getroffen habe.

Mfg
Veterano

von Steven B. (veterano)


Lesenswert?

Hat sonst keiner Erfahrung mit diesem Programm?

von R. M. (exp)


Lesenswert?

Alle Stellen mit BSF STATUS,RP0 im
Hauptprogramm auskommentieren
und dafür BCF STATUS,RP0 in Main einfügen
und es sollte funktioneren.





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

MAIN

BCF STATUS,RP0

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

LABEL_LG1_1
  BTFSS S0,0
  GOTO LABEL_LG1_FALSE
LABEL_LG1_2
  ;BSF STATUS,RP0  ; Bank 1
  BTFSC PORTB,1
  GOTO LABEL_LG1_FALSE

LABEL_LG1_TRUE
;  BSF STATUS,RP0  ; Bank 1
  BSF PORTB,0
  GOTO LABEL_LG1_ENDE
LABEL_LG1_FALSE
;  BSF STATUS,RP0  ; Bank 1
  BCF PORTB,0
LABEL_LG1_ENDE
;***************************************************
; UND - Gatter -> LG2
;***************************************************

LABEL_LG2_1
 ; BSF STATUS,RP0  ; Bank 1
  BTFSC PORTB,0
  GOTO LABEL_LG2_FALSE
LABEL_LG2_2
  BTFSS S0,1
  GOTO LABEL_LG2_FALSE

LABEL_LG2_TRUE
  ;BSF STATUS,RP0  ; Bank 1
  BSF PORTB,1
  GOTO LABEL_LG2_ENDE
LABEL_LG2_FALSE
  ;BSF STATUS,RP0  ; Bank 1
  BCF PORTB,1
LABEL_LG2_ENDE
;***************************************************
; RS-FLIP-FLOP -> RS1
;***************************************************

  ;BSF STATUS,RP0  ; Bank 1
  BTFSC PORTA,0
  GOTO LABEL_RS1_RESET
  ;BSF STATUS,RP0  ; Bank 1
  BTFSS PORTA,1
  GOTO LABEL_RS1_ENDE
  BSF S0,0  ; Ausgang setzen
  GOTO LABEL_RS1_ENDE
LABEL_RS1_RESET
  BCF S0,0  ; Ausgang zurücksetzen
LABEL_RS1_ENDE

;***************************************************
; RS-FLIP-FLOP -> RS2
;***************************************************

  ;BSF STATUS,RP0  ; Bank 1
  BTFSC PORTA,0
  GOTO LABEL_RS2_RESET
 ; BSF STATUS,RP0  ; Bank 1
  BTFSS PORTA,2
  GOTO LABEL_RS2_ENDE
  BSF S0,1  ; Ausgang setzen
  GOTO LABEL_RS2_ENDE
LABEL_RS2_RESET
  BCF S0,1  ; Ausgang zurücksetzen
LABEL_RS2_ENDE

;****************************************

  GOTO MAIN


  END

von fresh (Gast)


Lesenswert?

Veterano S. schrieb:
> Hat sonst keiner Erfahrung mit diesem Programm?

Ich habe damit vor einigen Jahren auch gearbeitet.
Hast Du in Parsic die Eingänge bzw. Ausgänge auch definiert?

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.