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.