hallo
es wäre einfacher zu helfen, wenn du genau beschreibst, was funktioniert und was nicht.
aber generell kann man sagen:
- du brauchst vor dem init ein "ORG 0x00". das legt fest, wo das programm überhaupt im pic geschrieben werden soll. und bei 0x00 (hexadezimal für 0 ;-) fängt der prozessor immer an die befehle abzuarbeiten.
- man sollte auch immer noch "ORG 0x04" einfügen. das ist die adresse zu dem der prozessor springt, sobald ein interrupt ausgeführt wird. ist jetzt bei deinem programm nicht vorgesehen, aber du machst das zeug ja auch nicht exziplit aus, also lieber mal noch direkt darunter ein retfie (damit springt er dann wieder dahin zurück, wo er zum interrupt gerufen wurde.)
- dann würde ich auch noch ganz am anfang, um sicher zu sein, dass man überhaupt auf der bank 1 ist bcf STATUS,RP1 bsf STATUS,RP0 machen. sonst kann es ja sein, dass man auf der bank 4 landet, wenn in STATUS, RP1 auch eine 1 ist.
du brauchst auch nicht für jede änderung von TRISX auf die bank eins zu springen, und dann wieder auf die bank 0.
also würde ich das ungefähr so machen:
Code:
list p=16f870
#include <P16f870.INC>
__config _LVP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _CPD_OFF & _BODEN_OFF & _DEBUG_OFF
;Programmablauf: Wenn kein PIN an Port A high ist, dann alle LEDs einschalten. Wenn ein PIN an Port A high ist, dann das entsprechende LED einschalten
ORG 0x00
NOP ;manche pics machen da irgendwie zicken, deswegen kommt da immer ein nop rein.
goto Init
ORG 0x04 ;ein interrupt?
retfie ;dann zurück!
Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
bcf STATUS, RP1 ; auf Bank 1 umschalten
MOVLW 0x06 ;
MOVWF ADCON1 ;macht den ad-wandler aus, d.h. alle ein/ausgänge ist digital
movlw 0xFF ; ist bisschen schneller und kürzer. B'11111111' geht aber auch!; PortA alle input
movwf TRISA
clrf TRISB ; ist bisschen schneller und kürzer. movlw D'0'; movwf TRISB, geht auch! PORTB alle als output
bcf STATUS, RP0 ; auf Bank 0 umschalten
clrf PORTA
clrf PORTB
int
;nop ;wenn du das so lässt, macht er ein nur 2-3 befehle davor die leds an, (zeile 48)
;clrf PORTB ;und dann machst du sie für 8-10 befehle wieder aus -> sie schauen evtl. so aus,
;nop ;als ob sie gar nicht an währen.
movfw PORTA ;der Inhalt von PORTA wird in W geschoben
btfsc STATUS, Z ;überspringe den nächsten befehl, wenn Z = 0 -> wenn W != 0 -> wenn PORTA = 0
goto main1 ; W = 0
;goto main2 ;braucht man eigentlich nicht, weil ja direkt darunter schon main2 steht;
main2
movwf PORTB ; Tastencode zu LEDs
goto int
main1
movlw B'11111111'
movwf PORTB
goto int
end
das meiste habe ich schon im code kommentiert. nach meiner logik, hast du main1 und main2 vertauscht. da kann ich mich aber auch irren. das ist für mich immer rel. kompliziert, diese btfss sachen.
ich weiß zwar nicht wie das bei dir und deiner programmierumgebung ist, aber ich gebe da immer noch das config word mit an. das musst du aber evtl. noch deinen gegebenheiten anpassen. ich weiß ja nicht was für einen oszillator du verwendest.
ich hoffe meine ganzen behauptungen stimmen,..
edit: natürlich auch noch ein herzliches willkommen im forum!
SEIDL.
Lesezeichen