Stránka 1 z 3
PIC16F627 nefunguje
Napsal: 18 bře 2008, 16:58
od seeter
Dobrý den, udìlal jsem takovou hloupou aplikaci, kde mi bliká jedna LED dioda. Odzkoušel jsem to na emulátoru od Asixu a vše fungovalo. Poté jsem program nátáhl do procesoru a když jsem jej spustil nic se nestalo. Netušim ani ,kde bych mìl hledat chybu. Tišák se zdá být v poøádku a program taky. Ovšem v manuálu od Microchipu sem nalezl rùzné promìnné, které se definují, ale u nikoho jsem je nenašel v programu. Prosím o pomoc...díky...
Napsal: 18 bře 2008, 17:11
od jankop
Dej sem svůj program a schéma zapojení. Pak budem mít o čem diskutovat.
Napsal: 18 bře 2008, 19:23
od Sunmay
Zkusil bych změnit oscilátor z RC na XT
![Wink ;)](./images/smilies/icon_wink.gif)
Napsal: 18 bře 2008, 21:13
od seeter
Tady sou ty soubory...
Napsal: 18 bře 2008, 22:14
od Sunmay
A nastavil si správně ty konfigureční bity (jako že chces používat krystal, že nechces používat watchdog atd.) ?
Napsal: 18 bře 2008, 22:44
od seeter
tak to sem teda nenastavil...a ani nevim, jak se to dìlá...
![Sad :-(](./images/smilies/icon_sad.gif)
Napsal: 19 bře 2008, 08:59
od jankop
Zkus třeba následující. Direktiva __CONFIG nastavuje mimo jiné i typ oscilátoru.
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
Napsal: 19 bře 2008, 12:27
od seeter
tak jsem to celé zkopíroval a prohnal emulátorem, ten to vše pøijal až na _DATA_CP_OFF - není definovaná a tak jsem jí smazal... když sem to pustil na emul. tak to fungovalo...ale po natažení do procesoru to poøád nefunguje...chtìl jsem se zeptat na pár vìcí: proè tam jsou na zaèátku programu pøíkazy pro pøerušení a proè tam jsou pøidané promìnné jako TIME0,1 a 2? co znamená errorlevel - 302 a co znamenájí ty definice v øádku a co znamená CBLOCK RAM_Start ?
![Embarassed :oops:](./images/smilies/icon_redface.gif)
Napsal: 19 bře 2008, 13:24
od jankop
zřejmě je v tvém kompileru starší verze souboru P16f627.inc, to lze snadno napravit. V prostředí MPLAB 8.0 je to legální konstrukce.
Kód: Vybrat vše
ale po natažení do procesoru to pořád nefunguje
Jaký 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 2
To 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.
Je příkaz, který potlačí chybová hlášení o přepínání bank. U složitějších programů budeš moc rád, že ho znáš, protože tohle hlášení nic neřeší, ale hodně překáží.
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.
Je to nastavení jednotlivých konfiguračních bitů procesoru. Jejich význam najdeš v datasheetu třeba pod pojmem configuration bits.
Napsal: 19 bře 2008, 13:34
od jankop
Pokud v direktivě __CONFIG dáš na místo parametru _HS_OSC parametr _INTRC_OSC_NOCLKOUT, tak by měl být použit interní oscilátor. Připojený krystal nebude ničemu vadit.
Napsal: 19 bře 2008, 13:48
od seeter
tak to teda klobouk dolù, to jste teda dobrej...
![Smile :-)](./images/smilies/icon_smile.gif)
díky moc za vysvìtlení...ještì se na to kouknu...
Napsal: 19 bře 2008, 13:49
od seeter
ten krystal mám 5 MHz...
Napsal: 19 bře 2008, 14:05
od jankop
Krystal může spolehlivě kmitat s emulátorem, ale s reálnou PIC nemusí. Chce to zkusit nejprve asi s tím interním oscilátorem. Bez inicializace pracuje na 4MHz. Použij
Kód: Vybrat vše
__CONFIG _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
a uvidíš.
Napsal: 19 bře 2008, 14:08
od seeter
tak _INTRC_OSC_NOCLKOUT to jako pøíkaz nebere, ale to by nebyl problém, když tam ten krystal je pøipojenej, ale poøád to nefunguje,...jako b to vùbec nežilo a pøitom je napìtí jak na plusu tak na MCLR a když tam program vypálím, tak ho i zpìtnì kontroluji, zda tam je... a vždy tam je...
![Sad :-(](./images/smilies/icon_sad.gif)
Napsal: 19 bře 2008, 14:25
od jankop
Najdi soubor P16f627.inc a zkontroluj parametr _INTRC_OSC_NOCLKOUT. Bude tam nejspíš, jen v trochu jiné podobě.
S tímto parametrem krystal nepotřebuješ. Čím vlastně programuješ? Programuješ i s konfiguračním slovem? Přečti kompletně obsah procesoru a pošli mi ho emailem.