Vai al contenuto
PLC Forum


Pic16f688 - non riesco a farlo funzionare


Doohan

Messaggi consigliati

Ciao a tutti, ho bisogno del vostro aiuto per far "lavorare" un 16f688....

Ho un po' di esperienza con i pic (usavo i mitici 16f84), ora volevo usare per alcuni circuiti dei 16f688.

Di prove ne ho fatte tante ma non riesco prorpio a far funzionare niente.

Riporto un programmino che ho ridotto all'osso, dovrebbe solo accedere un led (PORTC,5) ma non lo fa...

	PROCESSOR       16F688
	INCLUDE         "P16F688.INC"
	ERRORLEVEL      -203
	ERRORLEVEL      -302
	__CONFIG	30E4h


	ORG     00H

	banksel	OSCCON
	movlw	01110001B
	movwf	OSCCON


;PORTA
	banksel	TRISA
	movlw   00000100B
	movwf   TRISA


;PORTC
	banksel	TRISC
	movlw	00000010B
	movwf	TRISC


	goto	main

main
	bsf	PORTC,5

	END

La programmazione (uso WinPic800) dovrebbe essere ok (scrivo il pic e lo leggo correttamente),

ho provato piu' IC,

lo schemino è troppo semplice per sbagliarlo,

forse sbaglio qualcosa sul settaggio del config word o dei clock interni, non saprei neanch'io; ho provato anche ad usare un quarzo esterno ma il risultato non cambia. sad.gif

Se avete vou qualche suggerimento da darmi...

Ciao e grazie!

Link al commento
Condividi su altri siti


Ciao, avendo nel cassetto un paio di 16F688 acquistati per sbaglio ho fatto per curiosita' un po' di prove.

Premetto che l' assembly per i PIC lo uso pochissimo, preferendo linguaggi piu' "semplici" che aiutano l' utente nell' uso di direttive specifiche o complicate.

Il codice asm e' sicuramente lo strumento piu' potente, ma non e' come per un 8086 o uno Z80: di PIC ce ne sono un sacco e cercare ogni volta le differenze in centinaia di pagine puo' risultare tedioso e scoraggiante.

Tools utilizzati:

- MPLAB IDE 8.36 (MPASMWIN v5.3)

- Programmatore K149 su usb, ma ha funzionato lo stesso bene un PICKIT2 autocostruito, usato per ICSP.

- Documentazione da microchip 41203E.pdf (PIC16F688 Datasheet), vedi sul sito del produttore.

Collegamenti:

PIN1:+5V

PIN14:GND

PIN2/3:quarzo (per la prima prova)

PIN4: pullup con resistenza da 10K, anche se non serve perche' e' abilitato quello interno per il reset (ma non si sa mai...).

PIN5: led con resistenza in serie da 330 ohm.

Secondo me il listato da te postato non funziona perche' c'e' qualche inghippo sulla CONFIG WORD e/o sulla definizione dell' oscillatore, a seconda dei punti di vista puo' essere buona l' una o l' altra.

Per far lampeggiare il led sul PIN 5 (RC5) ho prima provato con un quarzo esterno cambiando la CONFIG WORD da 30E4h a 30E1h (XT), vedi pag. 111 del foglio tecnico.

Ho usato un risuonatore ceramico da 4MHz tra i PIN2 e 3.

Il led lampeggia velocemente.

Poi ho provato con l' oscillatore interno (config word 30E4h) cambiando pero' l' oscillatore in 000 = 31 kHz/LFINTOSC (vedi pag.21/22 del pdf) e impostando il bit1 del registro OSCCON a 0 (LFINTOSC Not Stable).

La porzione di codice diventa quindi:

banksel OSCCON

movlw 00000010B

movwf OSCCON

Il led da un flash circa ogni secondo (stima ad occhio).

Modificato: da mf2hd
Link al commento
Condividi su altri siti

Mi scuso con tutti, ma rileggendo quanto scritto mi sono accorto di aver fatto un bel po' di casino con la descrizione precedente, copiando dai listati delle prove dei pezzi errati.wallbash.gif

Infatti, le righe di codice che ho riportato per l' oscillatore interno non ha senso perche' il bit1 (come il bit2) del registro OSCCON e' di sola lettura e serve a verificare quando l' oscillatore interno si e' stabilizzato (warm-up).

Nel pdf c'e' probabilmente un errore nella pagina della Config Word in quanto il bit5 relativo a /MCLR (0=interno, 1=esterno) ha la nota a pedice errata, e' indicata come (3) ma in realta' e' la (4).

Se viene abilitato il pull-up interno per il Reset, questo disabilita l' oscillatore interno nei modi INTOSC e RC, dato che il pin5 viene utilizzato per altro.

Questo e' il programma di test che sembra ok:

;***** PROG TEST PIC16F688 *****

PROCESSOR 16F688

INCLUDE "P16F688.INC"

ERRORLEVEL -203

ERRORLEVEL -302

;----- CONFIG WORD -----

__CONFIG 0x30E4

; '0011 0000 1110 0100'

; bit15-12=riservati -> non modificare

; bit11=0 -> FCMEM=disable

; bit10=0 -> IESO=disable

; bit9-8=0 -> BOREN=disable

; bit7=1 -> /CPD=disable

; bit6=1 -> /CP=disable

; bit5=1 -> /MCLR= reset esterno

; bit4=0 -> /PWRTE=enable

; bit3=0 -> WDTE=disable

; bit2-0=100 -> INTOSCIO= oscillatore interno e pin RA4,RA5 utilizzabili come I/O

; Nota: Il reset e' esterno => pull-up 10K su pin4

ORG 00H

;----- OSCILLATORE -----

; Selezionare la frequenza dell' oscillatore interno, impostandolo come "System Clock" (bit0=1).

; Nota: Solo con le ultime tre si ha una percezione di lampeggio, con le altre il led sembra solo "mezzo acceso".

;movlw 0x71 ; 8Mhz '01110001'

;movlw 0x61 ; 4Mhz '01100001'

;movlw 0x51 ; 2Mhz '01010001'

;movlw 0x41 ; 1Mhz '01000001'

;movlw 0x31 ; 500khz '00110001'

;movlw 0x21 ; 250khz '00100001'

;movlw 0x11 ; 125khz '00010001'

movlw 0x01 ; 31khz '00000001'

movwf OSCCON ; imposta l' oscillatore interno. Attenzione anche ai bit 2-0 della config word e al bit per /MCLR

;movlw 0x00 ; eventuale valore per calibrazione oscillatore

;movwf OSCTUNE ; calibra oscillatore

;----- I/O -----

;PORTA

banksel TRISA

movlw 0x00 ; tutti out

movwf TRISA

;PORTC

banksel TRISC

movlw 0x00 ;tutti out

movwf TRISC

goto main

;----- LED su pin5

main

bsf PORTC,5

END

;*****

Ecco perche' scrivere in asm e' per me un po' odioso un po' odioso.

Si capisce bene il micro, ma e' un po' lungo arrivare al risultato finale.

Usando ad esempio il picbasic il programma diventa, dopo aver selezionato il micro dal menu':

'***** LAMPEGGIO LED *****

' ----- IMPOSTAZIONI E VARIABILI -----

DEFINE OSC 4 'oscillatore 4Mhz

OSCCON.0=1 ' oscillatore interno = Clock di sistema

'CMCON0 = 7 ' disabilita i comparatori : NON FUNZIONA!!!

CMCON0=%0000111 ' disabilita i comparatori : COSI' FUNZIONA!!!

ANSEL = 0 ' disabilita i convertitori A/D

led var PORTC.5 ' led su pin5

' ----- PROGRAMMA PRINCIPALE -----

loop:

High led ' led ON

Pause 500 ' attesa 0.5 sec

Low led ' led OFF

Pause 500 ' Attesa 0.5 sec

Goto loop ' ripeti il ciclo

End

' *****

La differenza si nota sulla lunghezza del file HEX finale: 121 vs 440 bytes.

Pero' le temporizzazioni del secondo sono precise.

Link al commento
Condividi su altri siti

Ciao, ti ringrazio delle risposte e del tempo che hai dedicato alle prove.

Io invece ho iniziato con l'asm, non ho mai provato altri linguaggi, anche se sono daccordo che semplifichino di molto il lavoro.

Tra sabato e domenica ho fatto qualche prova seguendo i tuoi consigli.... ma continua a non funzionare...

Ho rivisto anche la parte relativa al config word e al registro osccon, a questo punto mi viene il dubbio sulla programmazione del pic (anche perchè a te funziona e a me no). Lo programmo e lo leggo correttamente, l'unica cosa che cambia tra lettura e scrittura sono le voci di "calibrazione" (che si vedono nella parte destra della finestra di winpic800, nella figura sopra).

Per i 16f84 usavo IC-Prog, ma non ha nel database i 16f688, e comunque ultimamente mi pianta il pc), ora ho provato winpic800...

Sapete indicarmi qualche altro software per la programmazione? (uso un jdm su seriale).

Link al commento
Condividi su altri siti

Che tipo di JDM usi?

Ho rispolverato il mio JDM (modello "2001" ???) e provato ad usarlo con WinPic800 v3.63c .

Il micro viene riconosciuto e il programma (vedi altro post) viene caricato nel micro senza problemi.

Funziona e ho ripetuto l' operazione piu' volte cambiando la frequenze fra quelle elencate (tolto/aggiunto il segno di commento).

La pagina della configurazione non l' ho toccata, ma rispetto alla tua dei primi post c'e' di differente solo il POR2 che da te e' spuntato mentre da me no.

Forse e' questo che non gli fa fare il poweron-reset all' accensione.

Hai messo la resistenza di pull-up sul pin4 per il reset ?

Al limite prova a forzare un reset manuale mettendo il pin a GND e vedi cosi' se parte.

Il resto, se usi l' ICSP, sono 6 fili : VCC (pin1),GND (pin4), resistenza+led (pin5), ICSPDATA (pin13), ICSPCLOCK (pin12) e la VPP (pin4).

Solitamente sulla bread-board ci aggiungo qualche diodo 1N4148 (VPP e VCC) onde evitare ritorni strani verso il programmatore o l' alimentatore esterno.

In questo caso il JDM ce la fa tranquillamente ad alimentare il tutto.

Mi sto ricredendo su questi piccoli PIC che avevo acquistato per sbaglio (volevo dei 16F88).

Rispetto al 16F84 o al 16F628 si perde un pin I/O pero', oltre a piu' memoria, hanno un sacco di funzionalita' in piu': comparatori, 8 ADC a 10bit (!!!), USART avanzato con possibilita' di indirizzare il micro se in rete con altri su RS485... oltre ad assorbire una miseria (220 microA) in low-power.

Da non sottovalutare il prezzo: li ho pagati attorno a 2 Euro l' uno su ebay, ma non mi pare che costino tanto di piu'.

P.S. Anch' io ero affezionato al JDM per la sua semplicita', poi scopiazzando da vari progetti in rete ho realizzato un clone personale del PICKIT2, sia in versione "grande" con zoccolo zif e "tascabile", da inserire in una scatoletta Teko da 7x3cm.

Oramai uso solo questo perche' con l' USB e piu' comodo della seriale, funziona bene sui PC portatili e generalmente in tutti i PC moderni.

Anche perche' oramai le seriali "vere" stanno scomparendo e gli adattatori USB/RS232 non sempre hanno i livelli di tensione richiesti dal JDM o simili.

Link al commento
Condividi su altri siti

Ciao, adesso sono al lavoro, il programmatore l'ho fatto seguendo questo schema (ovviamente porto i segnali ai pin giusti), a memoria anche i valori delle resistenze sono uguali, e comunque il programmatore sembra funzionare. L'unica differenza tra quello che scrivo sul pic e quello che leggo, sono le voci sulla "calibrazione" sembra che ogni pic abbia la sua: scrivo lo stesso hex sul picA e sul picB, leggo picA e picB trovando 2 "calibrazioni" diverse.

Stasera faro' altre prove, andando a vedere con maggior precisione cosa sono questi bit di calibrazione.

L'hex lo genero anch'io con MPASMWIN 5.3, ho provato anche i codici che hai postato ma non mi va...

Dovro mettermi con calma.

Per quanto riguarda i 16f688, anceh secondo me hanno buone qualità, li ho scelti perchè mi serve un pic piccolo e con l'ADC, poi mi fa comodo l'oscillatore interno...

Ciao e grazie

Link al commento
Condividi su altri siti

E' un po' "povero" come programmatore...ma se funziona, niente di meglio!

Quello che ho usato per molti anni e' questo:

Link1

senza lo zif, solo icsp.

Non considerare i software che ci sono nella pagina, sono in dos e non funzionano bene con i windows recenti.

Ma se devi realizzarne uno nuovo ti consiglio questo:

Link2

o questa versione dello stesso:

Link3

vedi le modifiche e il link "download" verso la fine della pagina, per gli schemi e altro.

Con questi ultimi c'e' la possibilita' di selezionare l' applicazione della VPP prima della VDD, necessaria con alcuni dei PIC recenti.

Avevo ridisegnato il pcb in modo da averlo solo ICSP (piu' comodo e compatto):

mio_pcb

Ne ho realizzati diversi per gli amici e funzionano piuttosto bene, unica attenzione e' quella di utilizzare un cavetto per ICSP non molto lungo (max 20cm) specie utilizzando il comune flat.

Il costo per le varie versioni e' di qualche euro (escluso lo zif) e i transistor non sono critici, puoi usare anche equivalenti rispettandone la piedinatura.

Per escludere un problema al programmatore o al software che lo gestisce puoi, se vuoi, usare il seguente dump in hex del codice compilato dal programma in picbasic citato in altro post:

:020000040000FA

:100000002828A301A200FF30A207031CA307031C9A

:1000100023280330A100DF300F200328A101E83E90

:10002000A000A109FC30031C1828A00703181528FC

:10003000A0076400A10F152820181E28A01C222844

:1000400000002228080083130313831264000800B1

:1000500083160F14831207309900831691018312BF

:1000600087168316871283120130A300F4308A01A9

:10007000022087128316871283120130A300F43006

:0E0080008A0102208A01302863008A01442888

:02400E00FC3F75

:00000001FF

copia/incolla nel notepad o altro editor ascii (no word) solo le righe che iniziano per ":".

Salvalo come "Tutti i file" (no .TXT), codifica ANSI e mettendoci l' estensione .HEX.

Controlla che l' opzione "A capo automatico" sia disabilitata.

Programmato il micro, il led su RC5 dovrebbe lampeggiare ogni secondo.

Cosi' almeno hai un' idea se il problema e' nel codice o nel JDM/WinPic.

Link al commento
Condividi su altri siti

Ciao e ancora grazie per il supporto!

Il tuo codice funziona anche qui da me!! il led lampeggia con intervalli di 1 secondo...

Ora se puoi facciamo la prova contraria.

Io ho compilato questo codice (che poi è il tuo del post sopra, ho solo cambiato il config e tolto i commenti)

;***** PROG TEST PIC16F688 *****

PROCESSOR 16F688
INCLUDE "P16F688.INC"
ERRORLEVEL -203
ERRORLEVEL -302

;----- CONFIG WORD -----

__CONFIG 0x3FFC


ORG 00H


movlw 0x01; 31khz '00000001'

movwf OSCCON; imposta l' oscillatore interno. Attenzione anche ai bit 2-0 della config word e al bit per /MCLR

;----- I/O -----
;PORTA
banksel TRISA
movlw 0x00; tutti out
movwf TRISA

;PORTC
banksel TRISC
movlw 0x00;tutti out
movwf TRISC


goto main

;----- LED su pin5

main
bsf PORTC,5
goto main

END

e ottengo il seguente hex:

:020000040000FA

:1000000001308F008316031300308500831603131D

:0A001000003087000B2887160B282C

:02400E00FC3F75

:00000001FF

Il led dovrebbe accendersi, ma resta sempre spento

Potresti provare a compilare il codice che c'è scritto qua sopra e vedere se ti si accende il led sulla "solita" C5 (pin 5)? e vedere se l'hex generato e diverso?

MPASM non mi aveva dato mai problemi, forse mi manca qualche settaggio..(?)

C'è anche da dire che sono troppo preso dal lavoro in questo periodo e che non riesco mai a mettermi con un po' di calma con questi 688...

Link al commento
Condividi su altri siti

Gia' nel programma iniziale c'era qualcosa che mi suonava strano su come il led potesse lampeggiare dato che i ritardi in assembler non sono proprio facili da ottenere e c'erano cosi' poche istruzioni.

Pero', come detto non sono molto attirato dall' asm e non conoscendo tanto le istruzioni ho pensato che quel "bsf" finale fosse una qualche funzione molto potente (dopotutto e' un chip RISC).

Nel tuo ultimo listato quel "goto main" finale mi ha messo un dubbio e cosi' mi sono messo a vedere cosa fanno le varie istruzioni.

Dopo il minicorso intensivo di assembly, penso che il programma originale, cosi' com' era, non poteva funzionare, ma anche quelli asm che hoi postato io dopo.

Il led doveva solo accendersi e basta.

Resta da capire perche' il led lampeggiava comunque dopo l' "END", forse che' il micro si resettava in continuazione. (???)

Comunque, le operazioni che il programma deve svolgere sono : accendere il led, eseguire una pausa di un certo tempo, spegnere il led, rieffettuare la pausa e continuare cosi' ciclicamente.

Il listato che ho provato e' questo:

;***** PROG TEST PIC16F688 v2.0 - CON PAUSE *****

PROCESSOR 16F688

INCLUDE "P16F688.INC"

ERRORLEVEL -203

ERRORLEVEL -302

;----- CONFIG WORD -----

__CONFIG 0x30E4

ORG 00H

; Variabili che servono per la temporizzazione

cblock

d1

d2

d3

endc

ORG 00H

; Ho usato un clock piu' elevato perche' il calcolatore automatico (vedi sotto) non accetta i minori di 1Mhz .

movlw 0x41 ; 1Mhz

movwf OSCCON; imposta l' oscillatore interno

;----- I/O -----

;PORTA

banksel TRISA

movlw 0x00; tutti out

movwf TRISA

;PORTC

banksel TRISC

movlw 0x00;tutti out

movwf TRISC

;----- CICLO PRINCIPALE , ON/OFF LED su pin5

main

bsf PORTC,5 ;ACCENDE IL LED

call Delay ; CHIAMATA ALLA SUBROUTINE PER LA PAUSA

bcf PORTC,5 ; SPEGNE IL LED

call Delay ; CHIAMATA ALLA SUBROUTINE PER LA PAUSA

goto main ; RIPETE IL CICLO

;***** ROUTINE PER LA PAUSA *****

; Il codice e' ottenibile in automatico, sia come sequenziale che come sub, con il calcolatore al seguente link

; _http://www.piclist.com/techref/piclist/codegen/delay.htm

;

; NOTA: e' il risultato ottenuto con 0.5 sec e 1Mhz, pero' il lampeggio e' piu' veloce.

; Forse il calcolatore e' ottimizzato per qualche altro PIC.

Delay

;124993 cycles

movlw 0xA6

movwf d1

movlw 0x62

movwf d2

Delay_0

decfsz d1, f

goto $+2

decfsz d2, f

goto Delay_0

;3 cycles

goto $+1

nop

;4 cycles (including call)

return

END

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

Il dump HEX per eventuali confronti e' questo:

:020000040000FA

:1000000041308F00831603130030850083160313DD

:100010000030870087160F2087120F200A28A6308D

:10002000800062308100800B1628810B132818286D

:0400300000000800C4

:02400E00E4309C

:00000001FF

Mi rimane qualche dubbio sul registro per la configuarazione del clock, vista la temporizzazione veloce ottenuta.

Appena rimetto in posizione l' oscilloscopio provo a vedere cosa esce dal pin clockout.

Link al commento
Condividi su altri siti

anche a me faceva strano il lampeggio del led... doveva solo accendersi e restare acceso, a me bastava per capire se funzionava la compilazione il programmatore ma sopratutto per capire i setti della config word. Perchè anche se si resetasse, dovrebbe comunque riaccenderlo subito (il programma non ha delay software), e noi non dovremmo neanche accorgerci dello spegnimento.

Stasera quando torno a casa, provero' a compilare il tuo ultimo codice, e vedo se gli hex corrispondono.

Ciao e grazie!

PS Grazie anche dei link dei programmatori, sempre utili!

Link al commento
Condividi su altri siti

giacomo56+15/10/2009, 12:58--> (giacomo56 @ 15/10/2009, 12:58)

Esatto!!

è proprio quello che manca, non era sul banco giusto.. con i 16f84 non avevo mai usato quel comando, ora mi sa che non lo scordero' piu'...

Ho anche provato a compilare il listato di mf2hd ottenendo lo stesso dump hex.

Grazie mille per il vostro aiuto e per la disponibilità, probabilmente tra un po' troverete altre domande riguardanti il codice che andro' a scrivere rolleyes.gif

CIAO! wink.gif

Link al commento
Condividi su altri siti

Ah ecco che mancava dunque qualcosa. thumb_yello.gif

L' ultimo listato che ho postato pero' sembra funziona anche senza selezionare il banco, misteri del compilatore.

Una cosa a parte, non inerente al topic.

Sperimentando con questo PIC mi sono accorto di una cosa:

Se si usano gli ADC impostando il registro bit a bit quello che attiva il campionamento e che ne indica la fine (GO/DONE) non e' bit3 di ADCON0 come per altri (16F876) ma il bit2.

Bisogna quindi fare attenzione se si usano parti di codice basate su altri modelli di micro.

Usando invece l' istruzione apposita con un linguaggio ad alto livello (es. ADIN) il compilatore sistema automaticamente il tutto in base al PIC dichiarato.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...