Koden skulle förståss vara med i första inlägget, men det glömdes försås bort.
Kod: Markera allt
;******************************************************************************
; This file is a basic code template for object module code *
; generation on the PIC12F629. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;******************************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;******************************************************************************
; *
; Files required: P12F629.INC *
; *
; *
; *
;******************************************************************************
; *
; Notes: *
; *
;******************************************************************************
;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
LIST P=12F629 ; list directive to define processor
#INCLUDE <P12F629.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------
;Konstanta variabler
TMRO_EXTRA_COUNT EQU .120 ;229
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR 0x20
W_TEMP RES 1 ; variable used for context saving
STATUS_TEMP RES 1 ; variable used for context saving
TMRO_EXTRA RES 1 ;TMROs extraräknare
STEP_COUNTER RES 1 ;
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE CODE 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; OSCILLATOR CALIBRATION VALUE
;------------------------------------------------------------------------------
OSC CODE 0x03FF
; Internal RC calibration value is placed at location 0x3FF by Microchip as
; a 0xADDLW K instruction, where the K is a literal value to be loaded into
; the OSCCAL register.
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET_VECTOR CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------
INT_VECTOR CODE 0x0004 ; interrupt vector location
MOVWF W_TEMP ; save off current W register contents
MOVF STATUS,w ; move status register into W register
MOVWF STATUS_TEMP ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
BCF INTCON, T0IF ;Rensa TMRO Interruptflaggan
BTFSS GPIO, 5 ;Kolla om knappen är intryckt
GOTO intryckt
BANKSEL TMRO_EXTRA ;Hantera Extraräknaren
DECFSZ TMRO_EXTRA,1
GOTO ISR_SLUT ;Om den inte är noll än, skippa resten av ISRen.
MOVLW TMRO_EXTRA_COUNT;Annars, återställ extraräknaren och fortsätt
MOVWF TMRO_EXTRA
intryckt
NOP
;laggutbit MACRO
BANKSEL STEP_COUNTER
MOVFW STEP_COUNTER ;Kolla vilken "steg" vi är på
CALL rulla_bitar ;Hämta rätt bitar från LookUpTable
BANKSEL GPIO
MOVWF GPIO ;Lägg ut till världen
BANKSEL STEP_COUNTER
INCF STEP_COUNTER ;Öka så vi är redo för nästa "steg"
NOP
MOVLW .8 ;KOlla om vi är vid det sista "steget"
BSF STATUS,C
SUBWF STEP_COUNTER, 0 ;Ta bort antalet steg från Step_Counter
BTFSC STATUS,C ;Blev det noll, alltså sista steget.
CLRF STEP_COUNTER ;Rensa Step_Counter så att vi börjar om från början
; ENDM
NOP
ISR_SLUT
MOVF STATUS_TEMP,w ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF W_TEMP,f
SWAPF W_TEMP,w ; restore pre-isr W register contents
RETFIE ; return from interrupt
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
MAIN_PROG CODE
START
;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------
errorlevel -302
BSF STATUS,RP0 ; set file register bank to 1
CALL 0x3FF ; retrieve factory calibration value
MOVWF OSCCAL ; update register with factory cal value
BCF STATUS,RP0 ; set file register bank to 0
errorlevel +302
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
SETUP
BANKSEL INTCON
MOVLW b'10100000' ;Slå på Global interrupt OCH TMRO Interuppt.
MOVWF INTCON
BANKSEL OPTION_REG
MOVLW b'00000000' ;Här sätter vi prescaler på de sista 3 bitarna
MOVWF OPTION_REG
BANKSEL TRISIO
MOVLW b'00100000'
MOVWF TRISIO ;Sätter alla I/O till utgångar, Utom MCLR
BANKSEL CMCON
MOVLW 07h
MOVWF CMCON
BANKSEL TMRO_EXTRA ;rensa extraräknaren
MOVLW TMRO_EXTRA_COUNT
MOVWF TMRO_EXTRA
BANKSEL STEP_COUNTER
CLRF STEP_COUNTER
BANKSEL GPIO
MOVLW b'00000001'
MOVWF GPIO ;Sätter första pinnen hög
MAIN_LOOP
NOP
GOTO MAIN_LOOP
;---------------------------------------------------------------------------------
rulla_bitar ADDWF PCL,1 ; Hoppa till rätt "Steg" med värdet i w.
RETLW b'00000001' ;Halvsteg
RETLW b'00000011'
RETLW b'00000010'
RETLW b'00000110'
RETLW b'00000100'
RETLW b'00010100'
RETLW b'00010000'
RETLW b'00010001'
;---------------------------------------------------------------------------------
;---------------------------------------------------------------------------------
END ; directive 'end of program'
Alltså, i den del jag kallar "setup" så rensas STEP_COUNTER.
Sedan där jag ropar på tabellen så laddas W med värdet i STEP_CONTER.
Kod: Markera allt
BANKSEL STEP_COUNTER
MOVFW STEP_COUNTER ;Kolla vilken "steg" vi är på
CALL rulla_bitar
Sedan fins det en "if sats" som kollar så att STEP_COUNTER inte blir större än tabellen och om den är det så hoppar den tillbak till noll.
Kod: Markera allt
MOVLW .8 ;KOlla om vi är vid det sista "steget"
BSF STATUS,C
SUBWF STEP_COUNTER, 0 ;Ta bort antalet steg från Step_Counter
BTFSC STATUS,C ;Blev det noll, alltså sista steget.
CLRF STEP_COUNTER ;Rensa Step_Counter så att vi börjar om från början
Sodjan: Jo jag har letat och läst, just den där så hade trådskaparen använt sig av C vilket jag inte begriper ett skvatt av så den hoppade jag över. Trots att problemet kanske är samma känns det för mig svårt att tolka då jag inte förstår det språket. Har läst andra dock men ingen som har hjälp mig.
MVH Peter
EDIT: När jag får error meddelandet så har koden inte enns hunnit ropa på tabellen. Alltså det är innan man kommer dit.