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