Code:
;**********************************************************************
; *
; Filename: Impulsgeber_Neu.asm *
; Date: 11.05.2013 *
; File Version: 001 *
; *
; Author: Bernd Kunz *
; Company: private *
; *
; *
;**********************************************************************
; *
; Files Required: P12F675.INC *
; *
;**********************************************************************
; *
; Notes: Schrittmotor drehen mit Impulsen *
; Richtungssignal für links oder rechts Drehen. *
; Endschalter beendet Drehung am Ende des Verfahrweges *
; Halten des Tasters erhöht die Drehgeschindigkeit *
; Einsatz am Drehkondensator einer Magnetic-Loop *
;**********************************************************************
;**********************************************************************
;* Pinbelegung *
;* ---------------------------------- *
;* GP: 0 < ein links drehen *
;* 1 < ein rechts drehen *
;* 2 < ein linker Endschalter *
;* 3 < ein rechter Endschalter *
;* 4 > Ausgang Impulse *
;* 5 > Ausgang Richtungssignal *
;* *
;**********************************************************************
list p=12f675 ; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF
;******************************Wichtig*************************************************
; Variablennamen vergeben
CBLOCK 0x20
w_temp ;variable used for context saving
status_temp ;variable used for context saving
loops ;Zähler für Warteschleife
loops2 ;Zähler für Warteschleife
Endwert ;Wieviele Impulse vergehen bis auf schnelle Warteschleife umgeschaltet wird.
Merker ;Endwert erreicht
Endwert2 ;Wieviele Impulse vergehen bis auf schnelle Warteschleife umgeschaltet wird.
Merker2 ;Endwert erreicht
links1gesetzt
rechts1gesetzt
ENDC
;***********************************************************************
org 0x00
call Init
goto main ; go to beginning of program
org 0x4
goto main
;***********************************************************************
; Initialisierung
Init
; IO-Pins
bcf STATUS, RP0 ; Bank 0 Im Register Status wird was? auf 0 gesetzt !!!!Umschaltung auf Bank 1
clrf GPIO ; aus! CLRF GPIO ;In das Register GPIO wird 0 geschrieben
movlw b'00111111' ;Set GP<5:0> to digital IO !!!!!!!WICHTIG!!!!!!! Digital setzen nicht analog
movwf CMCON ; Comparator aus CMCON — COMPARATOR CONTROL REGISTER setzen
;Ab hier die Aus- und Eingänge setzen.
bsf STATUS, RP0 ; Bank 1
clrf ANSEL ;Digital I/O
movlw b'00001111' ;Setze GP<3:2:1:0> als Eingang und setze GP<5:4> ist Ausgang
movwf TRISIO ;movwf TRISIO ;Schreibe das Trioregister mit den Werten
;Endwert setzen je höher um so länger wird gewartet bis es schneller geht
MOVLW 0xA ;Lade Wert dezimal 10 in W
MOVWF Endwert ;Lade W in Variable Endwert
MOVLW 0 ;Merker mit 0 intialisieren
MOVWF Merker ;Lade W in Variable Merker
MOVLW 0
MOVWF links1gesetzt
;************************************************
MOVLW 0xA ;Lade Wert dezimal 10 in W
MOVWF Endwert2 ;Lade W in Variable Endwert2
MOVLW 0 ;Merker mit 0 intialisieren
MOVWF Merker2 ;Lade W in Variable Merker2
MOVLW 10
MOVWF rechts1gesetzt
bcf STATUS, RP0 ; Bank0
; ; internen Taktgenerator kalibrieren
; bsf STATUS, RP0 ; Bank 1
; call 0x3FF
; movwf OSCCAL ; 4-MHz-Kalibrierung
; bcf STATUS, RP0 ; Bank 0
; Interrupt
bcf INTCON, GIE ; Int deaktiviert
; *****************************Unterprogramme***************************
prüfen ;Wie lange wurde die Taste gedrückt?
DECFSZ Endwert,f ;Endwert ist Anfangs mit 10 geladen subtrahiere 1
;Falls das 0 ergibt, dann ignoriere den nachfolgenden Befehl
INCF Merker,f ;Erhöhe Merker um 1 wenn Endwert nicht auf 0 ist
DECFSZ Merker,f ;Verringere den Wert von Merker um 1. Falls das 0 ergibt, dann ignoriere den nachfolgenden Befehl
call links1 ;Solange der Endwert zwischen 1 und 10 ist ist der Merker auf 0, Wenn der Merker auf 0 ist gehe links
;Springe da hin und nicht wie mit call wieder zurück
DECFSZ links1gesetzt,f
call links
;Hier muß eine initlinks hin Endwert auf 1 und Merker auf 0 damit das schnelle bleibt
return
inilinks ;********************************Rücksetzen wenn Eingang GPIO0 auf 0 geht*****************************
MOVLW 0xA ;Lade Wert dezimal 10 in W
MOVWF Endwert ;Lade W in Variable Endwert
MOVLW 0 ;Merker mit 0 intialisieren
MOVWF Merker ;Lade W in Variable Merker
MOVLW 0
MOVWF links1gesetzt
;BTFSC GPIO,0
;call links
return
inirechts ;********************************Rücksetzen wenn Eingang GPIO0 auf 0 geht*****************************
MOVLW 0xA ;Lade Wert dezimal 10 in W
MOVWF Endwert2 ;Lade W in Variable Endwert
MOVLW 0 ;Merker mit 0 intialisieren
MOVWF Merker2 ;Lade W in Variable Merker
MOVLW 0
MOVWF rechts1gesetzt
;BTFSC GPIO,0
;call links
return
prüfenrechts ;Wie lange wurde die Taste gedrückt?
DECFSZ Endwert2,1 ;Endwert ist Anfangs mit 10 geladen subtrahiere 1
;Falls das 0 ergibt, dann ignoriere den nachfolgenden Befehl
INCF Merker2,f ;Erhöhe Merker um 1 wenn Endwert nicht auf 0 ist
DECFSZ Merker2,1 ;Verringere den Wert von Merker um 1. Falls das 0 ergibt, dann ignoriere den nachfolgenden Befehl
call rechts1 ;Solange der Endwert zwischen 1 und 10 ist ist der Merker auf 0, Wenn der Merker auf 0 ist gehe links
;Springe da hin und nicht wie mit call wieder zurück
DECFSZ rechts1gesetzt,f
call rechts
;Hier muß eine initlinks hin Endwert auf 1 und Merker auf 0 damit das schnelle bleibt
return
; DECFSZ Verringere den Wert aus der Speicherzelle f um 1. Falls das 0 ergibt, dann ignoriere den nachfolgenden Befehl.
; Syntax: DECFSZ f,d
; Bedeutung: wenn d=0:
; Vom Wert in f wird 1 abgezogen, und das Ergebnis in W gespeichert.
; wenn d=1:
; Vom Wert in f wird 1 abgezogen, und das Ergebnis wieder in f gespeichert.
; Ist das Ergebnis der Subtraktion Null, dann wird der nächste Befehl im Programm übersprungen, und mit dem übernächsten weitergebacht.
; Beispiel: DECFSZ 0x20,1 ; Der Inhalt der Speicherzelle mit
; der Adresse 20h wird um 1 erniedrigt
links1 ;Schnelle Impulse
MOVLW 1 ;Lade Wert dezimal 1 in W Läd immer wieder Endwert mit 1 Um wieder hierhin zu springen.
MOVWF Endwert ;Lade W in Variable Endwert
MOVLW 0 ;Merker mit 0 intialisieren
MOVWF Merker ;Lade W in Variable Merker
bsf GPIO,5 ;PIN 5 ist auf Masse Richtungssignal
BTFSC GPIO,2 ;Endschalter abfragen (Wenn Eingang auf Masse dann übergehen)
bcf GPIO,5 ;PIN 5 ist auf PLUS, (Richtungssignal umkehren, wenn der Endschalter kommt)
;*******************
bsf GPIO,4 ; LED an
call warten1 ; 250 ms warten
bcf GPIO,4 ; LED aus
call warten1 ; 250 ms warten
MOVLW 1
MOVWF links1gesetzt
return
links ; langsame Impulse und Richtung links ein/aus-schalten
bsf GPIO,5 ;PIN 5 ist auf Masse Richtungssignal
BTFSC GPIO,2 ;Endschalter abfragen (Wenn Eingang auf Masse dann übergehen)
bcf GPIO,5 ;PIN 5 ist auf PLUS, (Richtungssignal umkehren, wenn der Endschalter kommt)
;*******************
bsf GPIO,4 ; LED an
call warten ; 250 ms warten
bcf GPIO,4 ; LED aus
call warten ; 250 ms warten
return
;**********************************************************************
;Schnelle Impulse und Richtung rechts ein/aus-schalten
rechts1
MOVLW 1 ;Lade Wert dezimal 1 in W Läd immer wieder Endwert mit 1 Um wieder hierhin zu springen.
MOVWF Endwert2 ;Lade W in Variable Endwert
MOVLW 0 ;Merker mit 0 intialisieren
MOVWF Merker2 ;Lade W in Variable Merker
bcf GPIO,5 ;PIN 5 ist auf PLUS Richtungssignal
BTFSC GPIO,3 ;Endschalter abfragen (Wenn Eingang auf Masse dann übergehen)
bsf GPIO,5 ;PIN 5 ist auf Masse (Richtungssignal umkehren, wenn der Endschalter kommt)
;*****************
bsf GPIO,4 ; LED an
call warten1 ; 250 ms warten
bcf GPIO,4 ; LED aus
call warten1 ; 250 ms warten
;*****************
MOVLW 1
MOVWF rechts1gesetzt
return
rechts ;Langsame Impulse
bcf GPIO,5 ;PIN 5 ist auf PLUS Richtungssignal
BTFSC GPIO,3 ;Endschalter abfragen (Wenn Eingang auf Masse dann übergehen)
bsf GPIO,5 ;PIN 5 ist auf Masse (Richtungssignal umkehren, wenn der Endschalter kommt)
;*****************
bsf GPIO,4 ; LED an
call warten ; 250 ms warten
bcf GPIO,4 ; LED aus
call warten ; 250 ms warten
;*****************
return
;*****************************Neue Warteschleifen*********************************************
warten1
;schnell
;************************************************************
; Warteschleife 10 ms
movlw D'10' ; 100 ms Pause
movwf loops
goto Wai
warten
; Langsam
;*********************************************************
; Warteschleife 250 ms
; Wait250
movlw D'250' ; 250 ms Pause
movwf loops
goto Wai
;*********************************************************
Wai
movlw .110 ;Zeitkonstante für 1ms
movwf loops2 ;inizialisieren von loops2
Wai2 nop
nop
nop
nop
nop
nop
decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
;
decfsz loops, F ; 250 ms vorbei?
goto Wai ; nein, noch nicht
retlw 0 ; das Warten hat ein Ende
;*************************************************************************
;Hauptprogramm
main
; call 0x3FF ; retrieve factory calibration value
; bsf STATUS,RP0 ; set file register bank to 1
; movwf OSCCAL ; update register with factory cal value
; bcf STATUS,RP0 ; set file register bank to 0
; bcf GPIO,4 ;Erst mal alles Ausschalten
; bcf GPIO,5 ;Erst mal alles Ausschalten
clrf GPIO
BTFSC GPIO,2 ;Endschalter abfragen Wenn Eingang auf Masse dann übergehen
bcf GPIO,5 ;PIN 5 ist auf PLUS (Wenn Eingang auf 1 dann Pin 5 auf Plus)
BTFSC GPIO,3 ;Endschalter abfragen Wenn Eingang auf Masse dann übergehen
bsf GPIO,5 ;PIN 5 ist auf Masse (Wenn Eingang auf 1 dann Pin5 auf Masse)
;****************************links herum*********************************
BTFSC GPIO,0 ;wenn der Eingang 1 ist, Links herum einschalten
call prüfen
BTFSS GPIO,0 ;Wenn der Eingang 0 ist
call inilinks ;Endwert und Merker wieder auf Anfang setzen
;*************************** rechts herum *******************************
BTFSC GPIO,1 ;wenn der Eingang 1 ist, Rechts herum einschalten
call prüfenrechts
BTFSS GPIO,1 ;Wenn der Eingang 0 ist
call inirechts ;Endwert und Merker wieder auf Anfang setzen
goto main
; initialize eeprom locations
ORG 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'
Lesezeichen