Doohan Inserito: 8 ottobre 2009 Segnala Share Inserito: 8 ottobre 2009 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 ENDLa 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. Se avete vou qualche suggerimento da darmi...Ciao e grazie! Link al commento Condividi su altri siti More sharing options...
Doohan Inserita: 8 ottobre 2009 Autore Segnala Share Inserita: 8 ottobre 2009 Volevo aggiungere un'immagine dei settaggi che applico... (non sono riuscito ad editare il messaggiom sopra)Ciao Link al commento Condividi su altri siti More sharing options...
mf2hd Inserita: 9 ottobre 2009 Segnala Share Inserita: 9 ottobre 2009 (modificato) 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:+5VPIN14:GNDPIN2/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 OSCCONmovlw 00000010Bmovwf OSCCONIl led da un flash circa ogni secondo (stima ad occhio). Modificato: 9 ottobre 2009 da mf2hd Link al commento Condividi su altri siti More sharing options...
mf2hd Inserita: 11 ottobre 2009 Segnala Share Inserita: 11 ottobre 2009 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.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 16F688INCLUDE "P16F688.INC"ERRORLEVEL -203ERRORLEVEL -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 -----;PORTAbanksel TRISAmovlw 0x00 ; tutti outmovwf TRISA;PORTCbanksel TRISCmovlw 0x00 ;tutti outmovwf TRISCgoto main;----- LED su pin5mainbsf PORTC,5END;*****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 4MhzOSCCON.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 More sharing options...
Doohan Inserita: 12 ottobre 2009 Autore Segnala Share Inserita: 12 ottobre 2009 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 More sharing options...
mf2hd Inserita: 12 ottobre 2009 Segnala Share Inserita: 12 ottobre 2009 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 More sharing options...
Doohan Inserita: 13 ottobre 2009 Autore Segnala Share Inserita: 13 ottobre 2009 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 More sharing options...
mf2hd Inserita: 13 ottobre 2009 Segnala Share Inserita: 13 ottobre 2009 E' un po' "povero" come programmatore...ma se funziona, niente di meglio!Quello che ho usato per molti anni e' questo:Link1senza 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:Link2o questa versione dello stesso:Link3vedi 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_pcbNe 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:00000001FFcopia/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 More sharing options...
Doohan Inserita: 14 ottobre 2009 Autore Segnala Share Inserita: 14 ottobre 2009 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 ENDe ottengo il seguente hex::020000040000FA:1000000001308F008316031300308500831603131D:0A001000003087000B2887160B282C:02400E00FC3F75:00000001FFIl led dovrebbe accendersi, ma resta sempre spentoPotresti 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 More sharing options...
mf2hd Inserita: 14 ottobre 2009 Segnala Share Inserita: 14 ottobre 2009 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 16F688INCLUDE "P16F688.INC"ERRORLEVEL -203ERRORLEVEL -302;----- CONFIG WORD -----__CONFIG 0x30E4ORG 00H; Variabili che servono per la temporizzazionecblockd1d2d3endcORG 00H; Ho usato un clock piu' elevato perche' il calcolatore automatico (vedi sotto) non accetta i minori di 1Mhz .movlw 0x41 ; 1Mhzmovwf OSCCON; imposta l' oscillatore interno;----- I/O -----;PORTAbanksel TRISAmovlw 0x00; tutti outmovwf TRISA;PORTCbanksel TRISCmovlw 0x00;tutti outmovwf TRISC;----- CICLO PRINCIPALE , ON/OFF LED su pin5mainbsf PORTC,5 ;ACCENDE IL LEDcall Delay ; CHIAMATA ALLA SUBROUTINE PER LA PAUSA bcf PORTC,5 ; SPEGNE IL LEDcall 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 d2Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_0 ;3 cycles goto $+1 nop ;4 cycles (including call) returnEND;*******************************************************************Il dump HEX per eventuali confronti e' questo::020000040000FA:1000000041308F00831603130030850083160313DD:100010000030870087160F2087120F200A28A6308D:10002000800062308100800B1628810B132818286D:0400300000000800C4:02400E00E4309C:00000001FFMi 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 More sharing options...
Doohan Inserita: 15 ottobre 2009 Autore Segnala Share Inserita: 15 ottobre 2009 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 More sharing options...
giacomo56 Inserita: 15 ottobre 2009 Segnala Share Inserita: 15 ottobre 2009 (modificato) Nei programmi postati sopra mi pare manchi banksel PORTC.Ciao. Modificato: 15 ottobre 2009 da giacomo56 Link al commento Condividi su altri siti More sharing options...
Doohan Inserita: 15 ottobre 2009 Autore Segnala Share Inserita: 15 ottobre 2009 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 CIAO! Link al commento Condividi su altri siti More sharing options...
mf2hd Inserita: 22 ottobre 2009 Segnala Share Inserita: 22 ottobre 2009 Ah ecco che mancava dunque qualcosa. 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora