Sari la conținut
ELFORUM - Forumul electronistilor

PIC12F675 nu merge


criss

Postări Recomandate

  • Răspunsuri 24
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Abram Burel

    7

  • criss

    5

  • sofian

    2

  • puiu

    1

Top autori în acest subiect

  • 4 luni mai târziu...
Vizitator blueboy35

nu stiu daca e cel mai bun loc pentru postul asta dar poate ajuta pe cineva povestea mea cu rezolvatu unui pic

 

am avut si eu o problema cu un 12f629(asemanator cu 12f675 dar fara convertor A/D)

E primul pic pe care incerc sa-l programez si nu mi'a mers din prima...

 

Mi-am construit singur un programator asemanator cu o schema de COM84 gasita pe net.

Am incercat sa citesc picul...balarii...poate nu'i bun programatoru', poate n'am configurat bine winpic...

verificat diverse configuratii winpic(am crezut ca n'am acces la port pe XP...dar pana la urma, inlocuind o dioda din schema cu un led, am observat ca se aprinde daca testez interfata...deci aveam acces)

am mai facut rost de un zener de 5.1...tot n'a mers da' macar tensiunile semanau mai mult cu alea cerute la data sheet/programming specs

am mai bagat un condensator si....evrika... am reusit sa citesc osccal.

bun...acu sa m'apuc de treaba

Copy/paste de pe net la un program care cica blink'uie un led...

corectat greselile aparute la compilare cu mpasm...

am ars programul pe pic, verificat...ok

facut schema(pic, baterie, rezistanta, led)

conectat bateria si....n'a mers

 

dupa multe incercari, reajustari ale programului, etc, crezand ca am ars picul(pt ca l'am alimentat pe dos la un moment dat si s'a incalzit) am dat de topicul asta si m'am inspirat dintr'un program postat aici sa vad unde gresesc.

am rescris programul meu, sa arinda ledul si atat si am reusit.

Diferentele erau urmatoarele(nu stiu exact care din ele e aia care m'a rezolvat):

- eu foloseam _MCLRE_OFF...incercand sa reduc numarul de componente externe

- aveam brown out detect pe off...nu cred ca era de la asta

- aveam o portiune de cod incepand cu ORG 4 pe care am taiat'o...ceva cu interrupt vectors...am considerat ca n'aveam nevoie

- label'urile n'aveau :(poate de la asta...)

- aveam scrisa o rutina de delay mai ciudata dar oricum n'o apelam...cred

dupa ce am facut toate modificarile astea, a mers. v'am zis ca nu stiu exact care era problema.

cand o sa am timp, o sa testez diverse combinatii poate imi dau seama care din ele era fatala...sau poate stie cineva care a mai trecut prin asta.

Link spre comentariu
Vizitator blueboy35

aaa...daca intereseaza pe cineva schema...e destul de simpla...3 rezistente, un led, un zenner,un stabilizator si un condensator.

Link spre comentariu
Vizitator blueboy35

Mai am niste nelamuriri.Cat de bine se descurca winpic cu bitii de configuratie?Compilez un program in mpasmin, incarc hexul in winpic si daca incerc sa il scriu pe pic, imi da o eroare la bitii de configuratie.Dupa o studiere mai atenta, observ ca la unul din campurile de configuratie(RESERVED) imi zice invalid combination. daca selectez acolo reserved, programeaza fara erori.Fac eu o greseala, sau e un bug undeva?...ma gandesc ca mpasm scrie gresit niste biti in hex si ca picul ii ignora(fiind rezervati) si de aceea, la verificare, da eroare.Si inca o intrebare...cat de importanti sunt bitii de bandgap?multumesc

Link spre comentariu
  • 10 luni mai târziu...
Vizitator zundapp

Poate ma ajuta cineva...

Mai jos este o parte dintr-un programel. Secventa descrisa ar trebui sa aprinda un LED timp de 3 minute.

In realitate LED-ul sta aprins ~2'45".

De programat il programez cu un programator "original" (PicKit...) care cica salveaza valoarea aia de calibrare a oscilatorului si a BandGap-ului...

Are cineva idee unde gresesc?

Multumesc!

 

====================================================================

#include "p12f675.inc"

__CONFIG _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

org 0x00

clrf GPIO

;*******************************BANK 1*******************************

bsf STATUS, RP0

clrf PCON

 

movlw b'10000111'

movwf OPTION_REG

 

clrf WPU

clrf ANSEL

 

movlw b'00001111'

movwf TRISIO

 

cblock 0x20

AA

BB

CC

endc

;*******************************BANK 0*******************************

bcf STATUS,RP0

 

movlw b'00000111'

movwf CMCON

 

clrf ADCON0

 

movlw b'10000000'

movwf INTCON

 

__START

 

clrf AA

clrf BB

clrf CC

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

bsf GPIO, GP4

clrf TMR0

bcf INTCON, T0IF

__k btfss INTCON, T0IF

goto __k

call __INCREMENT

 

;************ 2747*65.536ms=3min // [bB][AA]=[10][187]=180.000ms (3minute)

 

 

__88 movlw d'10';

subwf BB, 0

btfss STATUS, 2

goto __33m1

movlw d'187'

subwf AA, 0

btfsc STATUS, 2

goto _PPP

__33m1 btfsc INTCON, T0IF

call __INCREMENT

__33m2 clrwdt

goto __k

_PPP bcf GPIO, GP4

goto _PPP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

__INCREMENT

bcf INTCON, T0IF

incf AA

clrw

subwf AA, 0

btfss STATUS, 2

goto __H

incf BB

clrw

subwf BB, 0

btfss STATUS, 2

goto __H

incf CC

__H ;clrwdt

return

 

 

 

end

 

 

 

====================================================================

Link spre comentariu

degeaba o salveaza daca tu nu o folosesti

trebuie sa setezi oscilatorul cu valoarea din fabrica ptr 4Mhz

 

call 0x3FFmovwf OSCCAL

definirea de variabile nu se face in mijlocul programului :speriat

Link spre comentariu
  • 3 ani mai târziu...
Vizitator zundapp

Ma mai chinuie un program...

Masor tensiunea pe o intrare analogica la intervale de 500ms si daca diferenta intre 2 masuratori succesive este mai mare decit un prag ->BEEP, daca nu... nu.

 

intrarea analogica e conectata la Vdd (din disperare!)

masor intrarea analogica ADRESH=>M1

astept 500ms

masor intrarea analogica ADRESH=>M2

scad cele 2 valori: M2-M1=DIF

compar diferenta cu un prag DIF-PRAG

daca DIF>PRAG ---> BEEP goto M1

daca DIF M2 devine M1 masor un nou M2

_________________

ignor ADRESL...

 

 

PROGRAMUL:

 

;Pin functions for PIC 12F675

;

; Vdd -|1 8|- Vss

; -|2 7|- GP0/IN_AN

; -|3 6|- GP1/OUT

; -|4 5|-

;***********************************************************************************

;***********************************************************************************

 

#include "p12f675.inc"

 

__CONFIG _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

 

org 0x00

 

cblock 0x24

M1

M2

DIF

PRAG

endc

 

bsf STATUS, RP0

clrf PCON

clrf PIE1

 

call 0x3FF

movwf OSCCAL

 

movlw b'00001111'

movwf OPTION_REG

 

movlw b'00111101'

movwf TRISIO

 

movlw b'11111101'

movwf WPU

 

movlw b'11010001'

movwf ANSEL

 

bcf STATUS, RP0

movlw b'00000111'

movwf CMCON

;================================================================================

_START

movlw d'20'

movwf PRAG

 

;-----------M1--------------

_M1

call __START_ADC ;start conversie

movf ADRESH, 0 ;[ADRESH]>>[W]

movwf M1 ;[W]>>[M1]

;----------------------------

_1

call _dly500ms

 

;-----------M2--------------

_M2

call __START_ADC ;start conversie

movf ADRESH, 0 ;[ADRESH]>>[W]

movwf M2 ;[W]>>[M2]

;----------------------------

;[M2]-[M1]=[DIF] // compar [DIF]cu [PRAG]

 

clrf DIF

 

clrw

addwf M1, 0 ;[M1]+0=[W]

subwf M2, 0 ;[M2]-[M1]=[W]

btfss STATUS, 0

goto _X ;[M2]<[M1]

 

addwf DIF, 1 ;[W]+[DIF]=[DIF] // [M2]-[M1]>>[DIF]

clrw

addwf PRAG, 0 ;[PRAG]+0=[W]

subwf DIF, 0 ;DIF-[PRAG]>>W

btfss STATUS, 0

goto _X ;DIF

 

call _BEEP ;DIF>=PRAG

goto _M1

 

_X movf M2, 0 ;[M2]>>[W]

movwf M1 ;[W]>>[M1]

goto _1

 

;==================================

__START_ADC ;start conversie

bcf PIR1, 6 ;[x1xx.xxxx] The A/D conversion is complete (must be cleared in software)

 

movlw b'00000001' ;[xxxx.xxx1]= A/D converter module is operating

movwf ADCON0 ;[xxxx.xxx0]= A/D converter is OFF

;[xxxx.xx1x]= START A/D conversion. This bit is automatically cleared by hardware when the A/D conversion has completed.

;[xxxx.00xx]= select channel 0/GP0/AN0 pin7

;[0xxx.xxxx]= Left justified; [1xxx.xxxx]= Right justified

;[x0xx.xxxx]= Vref=Vdd

bsf ADCON0, 1 ;[xxxx.xx1x]= START A/D conversion

_cv CLRWDT

btfss PIR1, 6

goto _cv

bcf PIR1, 6

return

;==================================

_BEEP

bcf GPIO, GP1 ;

call _dly500ms

bsf GPIO, GP1

return

;************************************** Delay loops ****************************

_dly500ms

;........

return

;***********************************************************************************

end

 

Cum se comporta:

 

Dupa primele 2 conversii (M1 si M2) diferenta M2-M1

muta M2 in M1

face conversie pentru M2

M2-M1>PRAG ?????????????

face conversii pentru M1 si M2 si M2-M1

muta M2 in M1

face conversie pentru M2

M2-M1

etc.

 

Nu inteleg de ce imi da acea diferenta M2-M1>PRAG atit timp cit intrarea analogica e legata la VDD

Ii pusesem si un delay initial de... 10 secunde (sa se calmeze alimentarea=baterie...) - nu l-am "impresionat"

 

Multumesc!

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări