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
Lesezeichen