Hallo,

hatte folgendes bereits bei microcontroller.net schon geschrieben:

"
Hallo,

ich bin grade dabei ein elektronisches Handrad für eine CNC-Fräse zu
bauen.
Für die Anzeige der aktiven Achse breuchte ich eine Logik, die mir aus 2
Leitungen 4 LED ansteuert.
Ich weiß das könnte man auch einfach mit der 74 TTL reihe (4 and und 2
invertern) realisieren. Aber ich wollte jetzt doch etwas mal mit einem
PIC16F84A machen. Also dachte ich mir ich les mal ein bisschen im I-Net
nach, bin aber leider noch nicht auf einen grünen Zweig gekommen.
Ich weiß durch spurt mittlerweile, dass ich erstmal die ein ung augänge
initalisieren muss mit dem TRISx-Register soweit ich das verstanden
habe, nur dann wird es schwierig.
Könnte mir vielleich jemand einen einfachen und übersichtlichen
Lösungsweg zeigen? Das soll jetzt nicht so sein lass einfach mal die
anderen das machen, ich hab jetzt mittlerweile 1,5 Tage investiert aber
sehe leider immer noch keinen richtigen Ansatz´, wäre also für jede Hilf
dankbar.
Ich hab mir das so gedacht, den Port A des PIC16F84A nehme ich als
Eingang und den Port B als Ausgang.
Input #1 = RA2
Input #2 = RA3
LED x = RB4
LED y = RB5
LED z = RB6
LED a = RB7

LEDx= nicht(Input #1) und nicht(Input #2)
LEDy= Input #1 und nicht(Input #2)
LEDz= nicht(Input #1) und Input #2
LEDa= Input #1 und Input #2

ich weiß etwas blöd geschrieben aber wusste nicht wie sonst.
Und wie bereits gesagt ich weiß ein PIC ist dafür etwas Oversized, aber
ich habe mich bewusst dafür entschieden, um mal mit etwas einfachen in
Assembler anzufangen.
Oder ist Assembler nicht so gut für den Anfang? Ich kann leider bis
jetzt keine Programmiersprache, außer Java, das lernen wir gerade an der
UNI.

Ich hoffe mir kann jemand helfen und schon mal vielen vielen Dank für
eure Mühe.

Danke Jo
"

leider habe ich keine für mich gute Antwort bekommen
also habe ich mich daran gemacht mal etwas zu experimentieren,
nach ettlichen verschiedenen Ansätzen bin ich nun zu diesem Ergebnis gelangt :

Code:
	list p=16f84a
;**************************************************************
;*  	Pinbelegung
;*	----------------------------------	
;*	PORTA: 	Eingänge
;*		0 - PIN 17 - Tastereingang
;*		1 - PIN 18 - n.c.
;*		2 - PIN 01 - Input #4
;*		3 - PIN 02 - Input #5
;*		4 - PIN 03 - n.c.
;*	PORTB:
;*		0 - PIN 06 - Tastersignal 
;*		1 - PIN 07 - n.c.	
;*		2 - PIN 08 - n.c.
;*		3 - PIN 09 - n.c.
;*		4 - PIN 10 - LED x-Achse
;*		5 - PIN 11 - LED y-Achse
;*		6 - PIN 12 - LED z-Achse
;*		7 - PIN 13 - LED a-Achse
;*	
;**************************************************************
;
;jorues 30.03.2007
;
; Handradlogik
;
; Taktquelle: 4 MHz
;
;**************************************************************
; Includedatei für den 16F84A einbinden

	#include <P16f84a.INC>

; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator

	__CONFIG	_PWRTE_ON & _WDT_OFF & _XT_OSC

;**************************************************************
; Variablen festlegen

Input  Equ	0x20
Input_kor	Equ	0x21
Result	Equ 0x22

; Constanten festlegen
	
Ini_con Equ	B'00000000'		; TMR0 -> Intetupt disable
Ini_opt	Equ	B'00000010'		; pull-up
digit0 Equ B'00000000'		; Wert0 festlegen
digit1 Equ B'00000100'		; Wert1 festlegen
digit2 Equ B'00001000'		; Wert2 festlegen
digit3 Equ B'00001100'		; Wert3 festlegen
LED_X Equ B'00010000'		; LED für X-Achse
LED_Y Equ B'00100000'		; LED für Y-Achse
LED_Z Equ B'01000000'		; LED für Z-Achse
LED_A Equ B'10000000'		; LED für A-Achse
;*************************************************************
; Das Programm beginnt mit der Initialisierung

Init	bsf     STATUS, RP0	; Bank 1
	movlw   Ini_opt     	; pull-up on
	movwf   OPTION_REG 		;
	movlw	B'11111111'		; PortA alle inputs 
	movwf	TRISA			; 
	movlw	B'00000000'		; PortB alle outputs 
	movwf	TRISB			;
	bcf     STATUS, RP0		; Bank 0
	clrf	PORTA		
	clrf	PORTB		
				
	movlw   Ini_con     	; Interupt disable
	movwf   INTCON
	clrw
;****************************************************************

Main
	
	movfw	PORTA	     	; Port A lesen und nach W kopieren
	movwf	Input			; von W in Input (0x20) kopieren
	clrw					; W löschen
	bcf	Input,0			;
	bcf	Input,1			; alle Bits von Input1 bis auf entscheidende Bits 2 und 3 werden 			
	bcf	Input,4			; auf 0 gesetzt
	bcf	Input,5			;
	bcf	Input,6			;
	bcf	Input,7			;
	movfw	Input			; Input in Input_kor schreiben
	movwf	Input_kor
	clrw					; W löschen		


;****************************************************************
; Input vergleichen	

X_achse

	movfw	Input_kor 			; Input_kor wird in W geladen
	xorwf	digit0,0 			; Input_kor und digit0 werden verglichen, Ergenbins in W
	movwf	Result				; Ergebnis wird in Result gespeichert
	clrw						; W löschen

	btfss	Result,2			; nächste Zeile überspringen wenn Bit Nr.2 den Wert 1 hat
	btfsc	Result,3			; nächste Zeile überspringen wenn Bit Nr.3 den Wert 0 hat
	goto	Y_achse				; sprung zu Y_achse
	bsf	PORTB,7					; Bit 7 von PORTB wird auf high gesetzt, die LED für X-Achse leuchtet
	goto Main
	
;****************************************************************
Y_achse

	clrf	PORTB

	movfw	Input_kor 			; Input_kor wird in W geladen
	xorwf	digit1,0 			; Input_kor und digit1 werden verglichen, Ergenbins in W
	movwf	Result				; Ergebnis wird in Result gespeichert
	clrw						; W löschen

	btfss	Result,2			; nächste Zeile überspringen wenn Bit Nr.2 den Wert 1 hat
	btfsc	Result,3			; nächste Zeile überspringen wenn Bit Nr.3 den Wert 0 hat
	goto	Z_achse				; sprung zu Z_achse
	bsf	PORTB,6					; Bit 6 von PORTB wird auf high gesetzt, die LED für Y-Achse leuchtet
	goto Main
	
;****************************************************************
Z_achse

	clrf	PORTB

	movfw	Input_kor 			; Input_kor wird in W geladen
	xorwf	digit2,0 			; Input_kor und digit2 werden verglichen, Ergenbins in W
	movwf	Result				; Ergebnis wird in Result gespeichert
	clrw						; W löschen

	btfss	Result,2			; nächste Zeile überspringen wenn Bit Nr.2 den Wert 1 hat
	btfsc	Result,3			; nächste Zeile überspringen wenn Bit Nr.3 den Wert 0 hat
	goto	A_achse				; sprung zu A_achse
	bsf	PORTB,5					; Bit 5 von PORTB wird auf high gesetzt, die LED für Z-Achse leuchtet
	goto Main
;****************************************************************
A_achse

	clrf	PORTB

	movfw	Input_kor 			; Input_kor wird in W geladen
	xorwf	digit3,0 			; Input_kor und digit3 werden verglichen, Ergenbins in W
	movwf	Result				; Ergebnis wird in Result gespeichert
	clrw						; W löschen

	btfss	Result,2			; nächste Zeile überspringen wenn Bit Nr.2 den Wert 1 hat
	btfsc	Result,3			; nächste Zeile überspringen wenn Bit Nr.3 den Wert 0 hat
	goto	X_achse				; sprung zu X_achse
	bsf	PORTB,4					; Bit 4 von PORTB wird auf high gesetzt, die LED für A-Achse leuchtet
	goto Main

;****************************************************************
	end
beim Umsetzen in eine hex gibts folgende Meldungen, welche soweit ich weiß weiter nicht schlimm sind:

Code:
Message[302] C:\ASM\ROUTINE.ASM 63 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\ASM\ROUTINE.ASM 65 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\ASM\ROUTINE.ASM 67 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Beim Brennen gibts auch keine Fehler.

Aber leider funktioniert das ganze auf dem Testboard garnicht. Es geschieht nichts. Der ResetPin liegt auf VDD daran kanns also nicht liegen.

Kann jemand den Code mal anschauen, sicher gibt es einfachere Lösungen aber das war das einzige was mir in meinem ersten Code so eingefallen ist.


Vielen Vielen Vielen Dank
Jo