PIC16F627 nefunguje
Moderátor: Moderátoři
-
seeter
PIC16F627 nefunguje
-
seeter
- Přílohy
-
schema.jpg- (14.12 KiB) Staženo 111 x
-
- One.ASM
- (1.13 KiB) Staženo 123 x
Kód: Vybrat vše
list p=16F627 ; list directive to define processor
#include <P16f627.inc> ; processor specific variable definitions
errorlevel -302
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
;--------- CONSTANTS DEFINITIONS---------------------------------------
#define RAM_Start 0x20
#define TIME0 D'30'
#define TIME1 D'30'
#define TIME2 D'30'
;--------- VARIABLE DEFINITIONS ---------------------------------------
CBLOCK RAM_Start
TMP0
TMP1
TMP2
ENDC
;----------------------------------------------------------------------
ORG 0x000 ; Processor reset vector
reset nop
goto init ; Go to beginning of program
ORG 0x004 ; interrupt vector location
nop
init
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0
;------------------------------
MOVLW TIME2
MOVWF TMP2
MOVLW TIME1
MOVWF TMP1
MOVLW TIME0
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
;------------------------------
FIRST MOVLW B'00000100'
MOVWF PORTB
;
MOVLW TIME2
MOVWF TMP2
MOVLW TIME1
MOVWF TMP1
MOVLW TIME0
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
;
MOVLW B'00000000'
MOVWF PORTB
;
MOVLW TIME2
MOVWF TMP2
MOVLW TIME1
MOVWF TMP1
MOVLW TIME0
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
GOTO FIRST
;
END Nebo ještě lépe takto:
Kód: Vybrat vše
list p=16F627 ; list directive to define processor
#include <P16f627.inc> ; processor specific variable definitions
errorlevel -302
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
;--------- CONSTANTS DEFINITIONS---------------------------------------
#define RAM_Start 0x20
#define TIME0 D'30'
#define TIME1 D'30'
#define TIME2 D'30'
;--------- VARIABLE DEFINITIONS ---------------------------------------
CBLOCK RAM_Start
TMP0
TMP1
TMP2
ENDC
;----------------------------------------------------------------------
ORG 0x000 ; Processor reset vector
reset nop
goto init ; Go to beginning of program
ORG 0x004 ; interrupt vector location
nop
init
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0
;------------------------------
call delay
FIRST MOVLW B'00000100'
MOVWF PORTB
call delay
MOVLW B'00000000'
MOVWF PORTB
call delay
GOTO FIRST
;------------------------------
delay
MOVLW TIME2
MOVWF TMP2
del2 MOVLW TIME1
MOVWF TMP1
del1 MOVLW TIME0
MOVWF TMP0
del0 DECFSZ TMP0,F
GOTO del0
DECFSZ TMP1,F
GOTO del1
DECFSZ TMP2,F
GOTO del2
return
;
END -
seeter
Kód: Vybrat vše
_DATA_CP_OFF - není definovaná Kód: Vybrat vše
ale po natažení do procesoru to pořád nefungujeJaký používáš krystal? Do 4MHz je vhodné použít _XT_OSC místo _HS_OSC v direktivě __CONFIG.
Kód: Vybrat vše
proč tam jsou na začátku programu příkazy pro přerušení První NOP na adrese 0x000 je rezervace pro ICD - In Circuit Debugging, tebe se to s emulátorem netýká, můžeš to vypustit. ORG 0x004 rezervuje prostor pro přerušení a na místo budoucího vektoru jsem vložil tu druhou NOP. Žádné přerušení v programu neexistuje ale brzo to budeš potřebovat.
Kód: Vybrat vše
proč tam jsou přidané proměnné jako TIME0,1 a 2To nejsou proměnné, nýbrž konstanty.Chtěl jsem ti prezentovat, že je naprosto zcestné používat přímo v programu číselné konstanty. Pokud bys chtěl v původním programu konstantu D'30' změnit, musel bys to dělat na třech místech. Ve složitějším programu je to jen zdrojem chyb.
Kód: Vybrat vše
errorlevel - 302 Kód: Vybrat vše
CBLOCK RAM_Start Předtím definovaná konstanta RAM_Start ukazuje na počátek použitelné RAM. Příkaz CBLOCK definuje počátek pole uživatelských promněných. Mezi CBLOK a ENDC píšeš svoje proměnné a nemusíš jim přiřazovat absolutní adresy třeba pomocí EQU, jak jsi to udělal ty.
Kód: Vybrat vše
co znamenájí ty definice v řádku Je to nastavení jednotlivých konfiguračních bitů procesoru. Jejich význam najdeš v datasheetu třeba pod pojmem configuration bits.
-
seeter
Kód: Vybrat vše
__CONFIG _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUTa uvidíš.
-
seeter