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:
Wie gesagt, bin kein PIC-Experte und mache auch viele Fehler (aber am ATmega12Code: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... Hoffentlich hilft's trotzdem etwas.
LG
Wolfgang







Zitieren

Lesezeichen