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 :
beim Umsetzen in eine hex gibts folgende Meldungen, welche soweit ich weiß weiter nicht schlimm sind: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 Brennen gibts auch keine Fehler.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.
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







Zitieren

Lesezeichen