Hallo,

ich möchte vorausschicken, dass ich mit dem PIC keine Erfahrung habe, also prozessor- und hardwarespezifische Einstellungen kann ich nicht kommentieren, und mit CNC-Fräsen kenn' ich mich auch nicht aus. Aber ich komme mit Deinem Code nicht so recht klar. Der Assembler-Einstieg ist (von Java kommend) schon etwas heftig (aber zweifellos lohnenswert; einfacher wäre C). Mein Tip: zeichne Dir mal die Register Deines PICs auf, nimm das Handbuch und führe jeden einzelnen Befehl auf dem Papier aus lt. Handbuch. Da lernst Du viel und findest auch so manches Problem.

Ich hab' das jetzt mal anhand von http://www.sprut.de/electronic/pic/a...e/befehle.html (schau da mal hin!) versucht:

Code:
Main 
    
   movfw   PORTA         ; Port A lesen und nach W kopieren >> W = PORTA
   movwf   Input         ; von W in Input (0x20) kopieren >> Input = W, brauchen wir aber nicht mehr
			
>> jetzt soll W "gereinigt" werden, also alle Bits = 0 außer Bits 2 und 3
>> das geht einfach mit W = W & 0x0C, also bitweises AND mit 00001100

   andlw   12            ; W = W & 0x0C, Zero-Flag in STATUS ggf. auf 1 wenn Ergebnis 0

>> folgender Code ergo unnötig

   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

>> hier geht's weiter

   movwf   Input_kor 	 >> Input_kor = W

>> jetzt haben wir also den Originalzustand von PORTA in Input und den sauberen Zustand in Input_kor und W

   clrw               ; W löschen  >> nicht nötig, wir brauchen Input_kor ja gleich wieder


X_achse 	 >> Du willst PORTB auf 00010000 (LED_X) wenn Input_kor = 00000000 (digit0)

   movfw   Input_kor          ; Input_kor wird in W geladen >> hier nicht nötig, aber für die anderen Achsen schon

>> jetzt W mit digit0 vergleichen

   xorwf   digit0,0          ; Input_kor und digit0 werden verglichen, Ergenbins in W 

>> wenn W gleich digit0, dann liefert XOR 0; das setzt das Zero-Flag in STATUS, und das kannst Du testen

   movwf   Result            ; Ergebnis wird in Result gespeichert >> wenn Du magst, brauchen wir aber nicht

>> ab hier löschen
   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 

>> hier geht's weiter
   bnz     Y_achse	     ; >> ungleich 0, war's also nicht (Branch on Non Zero)

>> kapier ich nicht: Ergebnis ist 10000000 in PORT B; LED_X ist aber als 00010000 definiert
>> sollte das nicht bsf PORTB,4 sein (Bits von rechts nach links numeriert, also 76543210 )?
>> ein Fehler, der mir auch schon das Leben schwer gemacht hat, ist, dass mit 1 die Leitung auf +5V geht
>> das klappt nur, wenn die LED richtig herum eingebaut ist, also Prozessor, Vorwiderstand, LED, Masse
>> wenn LED zwischen Prozessor und +5V, dann muss der Port auf 0
   bsf   PORTB,7               ; Bit 7 von PORTB wird auf high gesetzt, die LED für X-Achse leuchtet 

>> dann solltest Du da noch eine Pause einbauen, und alle Leitungen z.B. in Main auf 0 setzen
>> siehe http://www.sprut.de/electronic/pic/p...t/lauflich.htm

   goto Main
Wie gesagt, bin kein PIC-Experte und mache auch viele Fehler (aber am ATmega12 Bild  ... Hoffentlich hilft's trotzdem etwas.

LG
Wolfgang