Stránka 1 z 2
PIC 12F675
Napsal: 04 bře 2007, 15:24
od Tlouk
Zdravím,začínám s tímto procesorem a zajímalo by mě,jestli je možné PIC zničit programově (když napíšu špatně program) ?
Na co si dát případně pozor ?
V datashetu píšou že je max.zatížitelnost GP 25mA,je možné aby se zničil po připojení LEDky (5mA) s odporem ?
Díky.
Napsal: 04 bře 2007, 17:52
od tatous
Na obě otázky zní odpověď ne. Zničit procesor můžeš mimo jiné špatným programováním ve špatném programátoru, přepětím, ale ne programem.
Program se může "zakousnout", ale neničí. LED při proudu 5mA také port neodpálí.
Napsal: 04 bře 2007, 21:47
od Tlouk
Programoval jsem to programátorem PRESTO.Program jsem několikrát mazal a znovu programoval,na pohled to fungovalo dobře.Program měl blikat (po 1s) s LED.LEDka (5mA) s odporem byla zapojena mezi GP0 a GND.Programově jsem nastavil všechny registry TRISIO=0. Po zapnutí napájení se LEDka rozsvítila na jednu sekundu a zhasla a už se nerozsvítila.Vynadal jsem procesor a chtěl program smazat,nebo znovu naprogramovat a program hlásil nějakou chybu (prostě to nešlo).
V čem by mohl být problém,nebo kde jsem udělal chybu ?
Napsal: 04 bře 2007, 22:07
od nop
je to jen tip,ale máš vypnutý nebo ošetřený watchdog?
Napsal: 04 bře 2007, 22:12
od Tlouk
watchdog mám vypnutý
Napsal: 04 bře 2007, 22:15
od nevim
zkus sem poslat program..
Napsal: 04 bře 2007, 22:26
od Tlouk
Je to psaný v mikropascalu a je to example k PIC 12F675.
V projectu jsou zaškrtnuta tato nastavení WDT_OFF,INTRC_OSC_NOCLKOUT
Program:
Kód: Vybrat vše
program led_blinking;
begin
TRISIO := 0; // configure pins of gpio as output
while true do
begin
GPIO := $FF; // turn ON diodes on gpio
delay_ms(1000); // wait for 1 second
GPIO := $00; // turn OFF diodes on gpio
delay_ms(1000); // wait for 1 second
end;
end.
Napsal: 04 bře 2007, 22:41
od Tlouk
Takhle vypadá kód assembleru při disaaemblerování
Kód: Vybrat vše
; ADDRESS OPCODE ASM
; ----------------------------------------------
$0000 $2804 GOTO _main
$0004 $ _main:
;led_blinking.ppas,21 :: program led_blinking;
;led_blinking.ppas,25 :: TRISIO := 0; // configure pins of gpio as output
$0004 $1303 BCF STATUS, RP1
$0005 $1683 BSF STATUS, RP0
$0006 $0185 CLRF TRISIO, 1
;led_blinking.ppas,27 :: while true do
$0007 $ led_blinking_L_2:
;led_blinking.ppas,29 :: GPIO := $FF; // turn ON diodes on gpio
$0007 $30FF MOVLW 255
$0008 $1283 BCF STATUS, RP0
$0009 $0085 MOVWF GPIO
;led_blinking.ppas,30 :: delay_ms(1000); // wait for 1 second
$000A $3006 MOVLW 6
$000B $00DC MOVWF STACK_12
$000C $30FF MOVLW 255
$000D $00DB MOVWF STACK_11
$000E $30FF MOVLW 255
$000F $00DA MOVWF STACK_10
$0010 $0BDC DECFSZ STACK_12, F
$0011 $2813 GOTO $+2
$0012 $281A GOTO $+8
$0013 $0BDB DECFSZ STACK_11, F
$0014 $2816 GOTO $+2
$0015 $2819 GOTO $+4
$0016 $0BDA DECFSZ STACK_10, F
$0017 $2816 GOTO $-1
$0018 $2813 GOTO $-5
$0019 $2810 GOTO $-9
$001A $301A MOVLW 26
$001B $00DB MOVWF STACK_11
$001C $30FF MOVLW 255
$001D $00DA MOVWF STACK_10
$001E $0BDB DECFSZ STACK_11, F
$001F $2821 GOTO $+2
$0020 $2824 GOTO $+4
$0021 $0BDA DECFSZ STACK_10, F
$0022 $2821 GOTO $-1
$0023 $281E GOTO $-5
$0024 $3042 MOVLW 66
$0025 $00DA MOVWF STACK_10
$0026 $0BDA DECFSZ STACK_10, F
$0027 $2826 GOTO $-1
;led_blinking.ppas,31 :: GPIO := $00; // turn OFF diodes on gpio
$0028 $0185 CLRF GPIO, 1
;led_blinking.ppas,32 :: delay_ms(1000); // wait for 1 second
$0029 $3006 MOVLW 6
$002A $00DC MOVWF STACK_12
$002B $30FF MOVLW 255
$002C $00DB MOVWF STACK_11
$002D $30FF MOVLW 255
$002E $00DA MOVWF STACK_10
$002F $0BDC DECFSZ STACK_12, F
$0030 $2832 GOTO $+2
$0031 $2839 GOTO $+8
$0032 $0BDB DECFSZ STACK_11, F
$0033 $2835 GOTO $+2
$0034 $2838 GOTO $+4
$0035 $0BDA DECFSZ STACK_10, F
$0036 $2835 GOTO $-1
$0037 $2832 GOTO $-5
$0038 $282F GOTO $-9
$0039 $301A MOVLW 26
$003A $00DB MOVWF STACK_11
$003B $30FF MOVLW 255
$003C $00DA MOVWF STACK_10
$003D $0BDB DECFSZ STACK_11, F
$003E $2840 GOTO $+2
$003F $2843 GOTO $+4
$0040 $0BDA DECFSZ STACK_10, F
$0041 $2840 GOTO $-1
$0042 $283D GOTO $-5
$0043 $3042 MOVLW 66
$0044 $00DA MOVWF STACK_10
$0045 $0BDA DECFSZ STACK_10, F
$0046 $2845 GOTO $-1
;led_blinking.ppas,33 :: end;
$0047 $2807 GOTO led_blinking_L_2
;led_blinking.ppas,34 :: end.
$0048 $2848 GOTO $
HEX soubor vypadá takhle:
Kód: Vybrat vše
:100000000428FF3FFF3FFF3F031383168501FF30A6
:10001000831285000630DC00FF30DB00FF30DA00A1
:10002000DC0B13281A28DB0B16281928DA0B1628E4
:10003000132810281A30DB00FF30DA00DB0B2128F0
:100040002428DA0B21281E284230DA00DA0B262871
:1000500085010630DC00FF30DB00FF30DA00DC0B0E
:1000600032283928DB0B35283828DA0B3528322896
:100070002F281A30DB00FF30DA00DB0B4028432842
:10008000DA0B40283D284230DA00DA0B45280728F1
:100090004828FF3FFF3FFF3FFF3FFF3FFF3FFF3F3E
:02400E00F43F7D
:00000001FF
Napsal: 05 bře 2007, 05:59
od tatous
Máš vypnuté komparátory a nastaveny porty na digit I/O? Nikde jsem to neobjevil, jak v .asm , tak v disasembl. hexu.
Napsal: 05 bře 2007, 09:24
od ViPali
Dve veci:
1/ Keď som prvý krát programoval 675, tak sa správala nie celkom korektne, musel som programovo prednastaviť registre. Tabuľka stavov po zapnutí nemusí celkom platiť. Ale dal sa viackrát programovať.
2/ Keď si ho ťahal zo zapojenia, bolo vypnuté napätie, neodpálil si ho nejakým skratom?
Napsal: 05 bře 2007, 10:30
od nop
taky by se měl někde nastavovat registr ANSEL kterým nastavuješ jetli port bude jako analogový nebo digitální IO
Napsal: 05 bře 2007, 12:40
od tatous
Přepiš v "led_blinking.c"
>Oscillator: Internal, 04.000 MHz< původně 8MHz
void main() {
> CMCON = 0x07< vložit
> TRISIO = 0; <
Pokud nemáš MCLR spojeno přes rezistor na +, nastav konfig.bit MCLR=0. Po kompilaci a naprogramování LED bliká v 1sec intervalech.
Vyzkoušeno na kontakt. poli. Pokud napíšeš e-mail, pošlu Ti všechny soubory, včetně kompilace.
Napsal: 05 bře 2007, 17:22
od Tlouk
tatous píše:Máš vypnuté komparátory a nastaveny porty na digit I/O? Nikde jsem to neobjevil, jak v .asm , tak v disasembl. hexu.
Asi ne. Program jsem vzal tak jak je v examples programu Mikropascal.
ViPali píše:Dve veci:
1/ Keď som prvý krát programoval 675, tak sa správala nie celkom korektne, musel som programovo prednastaviť registre. Tabuľka stavov po zapnutí nemusí celkom platiť. Ale dal sa viackrát programovať.
2/ Keď si ho ťahal zo zapojenia, bolo vypnuté napätie, neodpálil si ho nejakým skratom?
1) zajímavé ...,v manuálu píšou :
Mikropočítač je vybaven šesti univerzálními vývody. Jejich nastavení záleží na periferiích, které jsou pro zařízení povoleny.
Obecně platí, že jakmile je povoleno periferní zařízení, přiřazený vývod již nefunguje jako univerzálně použitelný vývod.
Chápal jsem to tak,že pokud se nastaví TRISIO := 0; není potřeba dál nic nastavovat.
2)Na sto procent ne.Napětí zdroje mám 5,1V ,snad to není moc.
nop píše:taky by se měl někde nastavovat registr ANSEL kterým nastavuješ jetli port bude jako analogový nebo digitální IO
Netuším ...,nikde jsem ho nenastavoval.
tatous píše:Přepiš v "led_blinking.c"
>Oscillator: Internal, 04.000 MHz< původně 8MHz
void main() {
> CMCON = 0x07< vložit
> TRISIO = 0; <
Pokud nemáš MCLR spojeno přes rezistor na +, nastav konfig.bit MCLR=0. Po kompilaci a naprogramování LED bliká v 1sec intervalech.
Vyzkoušeno na kontakt. poli. Pokud napíšeš e-mail, pošlu Ti všechny soubory, včetně kompilace.
Rezistor tam nemám,proč je tam třeba a jakej ?
Jestli můžeš ,pošli mi hlavně ty soubory na
904436430439324@tiscali.cz
Díky.
Napsal: 05 bře 2007, 17:29
od Tlouk
Jakou hodnotu má mít ANSEL (pro oba stavy)?
Díky
Napsal: 05 bře 2007, 18:48
od tatous
V mikroC je u 675 nutné vypnout komparátory. Pokud nastavíš všechny porty v TRISGPIO jako výstupní, kompilátor ví, že analogový výstup je blbost a nastaví vše jako digitální. Potom není nutno nastavovat ANSEL. Pokud je to ale potřeba, tak vstup se nastavuje na nejnižších čtyřech bitech ANSEL (Banka1), ANS0 až ANS3 a to, 0-digit, 1-analog, pro AN0 až AN3. I/O se nastavuje v TRISGPIO. Nakonec vše je v Data Sheetu.
Pin MCLR slouží k resetování procesoru. Rezistor na MCLR může být v rozmezí 0 až 10k, já preferuji 4k7 - 10k. Pokud chceš použít někde MCLR jako vstup, připne se vnitřní rezistor tohoto pinu. Viz Data Sheet.
Zkompilované soubory jsem už odeslal na e-mail