Ancora problemi con pic

Ciao a tutti, sto avendo ancora molti problemi con la programmazione dei pic. Ho provato a mettere sul pic questo programmino in C:

#include

void ritardo(void);

main(void) { TRISB = 0; //portB e portA uscite TRISA = 0;

while (1) { PORTA = 0x00; PORTB = 0xFF; ritardo(); } }

void ritardo(void) { int i; for (i=1; i

Reply to
Brunix
Loading thread data ...

Prova in questo modo:

#include

void ritardo(void);

main(void) { TRISB = 0; //portB e portA uscite TRISA = 0;

while (1) { PORTA = 0x00; PORTB = 0xFF; ritardo(); } }

void ritardo(void) { int i; PORTA = 0xFF; PORTB = 0x00; for (i=1; i

Reply to
Cibri

Brunix ha scritto:

Come sono connessi i 2 led? Se hanno l'anodo a vcc è tutto normale. Con il listato che hai postato vedrai sempre acceso solo 1 dei 2 led. Quale dei 2 dipende da come li hai connessi ai port del PIC (con l'anodo a vcc o con il catodo a gnd).

Ciao

Reply to
Francesco Sacchi

"Francesco Sacchi" ha scritto nel messaggio news:e7lhur$955$ snipped-for-privacy@nnrp.ngi.it...

I led sono connessi con l'anodo alla porta del pic, poi al catodo una resistenza e poi questa a massa. In pratica che la porta del pic è a livello alto, il led si accende, altrimenti no. Ciao Brunix

Reply to
Brunix

"Brunix" ha scritto nel messaggio news:Vv8ng.13963$ snipped-for-privacy@twister1.libero.it...

Ciao, ancora niente da fare. Sto provando in tutti i modi. Prima ho provato a fare un circuitino e un programma in modo che premendo un pulsante che da un positivo su una linea di RA0, mi accendi un led su rb1, mentre lo spegne quando lo rilascio. All'inizio, senza mettere la funzione di ritardo, ha funzionato. Poi ho aggiunto la funzione di ritardo (con i che va fino a 1000) e non ha più funzionato. Ho provato a toglierla nuovamente e non ha più funzionato lo stesso...!!!! Per favore aiutatemi. Mi piace tantissimo l'elettronica, ma se è così allora mollo tutto. Mi sta passando veramente la voglia! E' una settimana che provo a fare questo e non va. Ho cambiato anche pic ed è lo stesso. Uso il propic2clone con Icprog e pic c lite. Aspettando disperatamente un aiuto Ciao Brunix

Reply to
Brunix

"Brunix" ha scritto nel messaggio news:ZSxng.15266$ snipped-for-privacy@twister2.libero.it...

cut

Ciao, il funzionamneto casuale mi fa pensare che tu stia cercando nel posto sbagliato... il programma e' talmente semplice che non ci possono essere errori. Le impostazioni di configurazione, sono a posto? Quali impostazioni usi? Che compilatore c usi? con queste notizie, forse, riesco a darti un aiuto

ciao Angelo

Reply to
angelo

Brunix ha scritto:

un

Facciamo una cosa alla volta. Sei sicuro che l'oscillatore funzioni? Stai usando un oscillatore RC, hai impostato correttamente la configurazione del PIC per usare questa soluzione? Se =E8 per esempio impostata sul quarzo, =E8 normale che non funzioni niente. Seconda osservazione: nella configurazione del PIC hai disattivato il watchdog? In caso contrario, il PIC si resetta periodicamente. Terza considerazione. Premetto che io conosco il C, ma per i microcontrollori preferisco lavorare in assembler. Chi conosce ha programmato in C i PIC potr=E0 correggermi: quando scrivi:

TRISB =3D 0; //portB e portA uscite TRISA =3D 0;

non si deve selezionare nessun banco di memoria? E' il compilatore che lo fa automaticamente?

Tieni duro. La soddisfazione sar=E0 ancora pi=F9 grande quando riuscirai ad ottenere quello che vuoi.

Reply to
Darwin

Guarda la foto a questo indirizzo

formatting link
" che cosi' capisci cosa intende dire Darwin

Si in C la selezione dei banchi di memoria e' automatica

Reply to
Cibri

"Cibri" ha scritto nel messaggio news: snipped-for-privacy@b68g2000cwa.googlegroups.com...

Guarda la foto a questo indirizzo

formatting link
" che cosi' capisci cosa intende dire Darwin

Si in C la selezione dei banchi di memoria e' automatica

Proverò ancora e farò sapere. Intanto io disattivo il wdt e lascio solo il pwrt. Ciao Brunix

Reply to
Brunix

Brunix ha scritto:

Quota come un uomo e non come una bestia.

Poi, fai una foto al circuito.

Scommetto le ascelle che =E8 una faccenda hardware.

E metti da qualche parte sorgente e hexcode.

--
Io.
Reply to
Colossale Pezzo di Idiota

"Colossale Pezzo di Idiota" ha scritto nel messaggio news: snipped-for-privacy@b68g2000cwa.googlegroups.com...

Brunix ha scritto:

Quota come un uomo e non come una bestia.

Poi, fai una foto al circuito.

Scommetto le ascelle che è una faccenda hardware.

E metti da qualche parte sorgente e hexcode.

--
Io.

---------------------

Il sorgente l'ho postato all'inizio. Il circuito l'ho descritto. E' 
facilissimo, sempre quello, resistenza da 10k di pull up su mclr, 
oscillatore rc con 10k e 22 pF e sull'uscita resistenza + led verso massa.
ciao
Reply to
Brunix

"angelo" > il funzionamneto casuale mi fa pensare che tu stia cercando nel posto

Scusa ma evidentemente non ero ben sveglio... Ok per il C lite che credo sia dell Hi Tech

Vedo in una risposta recente che gia' qualcun altro ti ha detto di controllare la configurazione e piu' che altro, che il watch dog non e' disabilitato. Il watch dog, se non viene resettato via soft, attua un reset harware del pic. Prova a escludere il WD e vediamo, vedrai che risolvi. ciao Angelo

Reply to
angelo

Il giorno Mon, 26 Jun 2006 13:42:55 GMT, "Brunix" ha scritto:

Questo simbolo è il delimitatore della firma. Devi scrivere il tuo messaggio prima, non dopo, altrimenti quando ti rispondiamo il testo del tuo messaggio non compare nella risposta. Io ho dovuto usare il copia e incolla per farlo visualizzare.

Ho visto che usi Outlook Express; se vuoi un consiglio usa Free Agent o un altro programma decente per scrivere sui ng.

Reply to
Luigi C.

Le prove le ho fatte escludendo il WDT e al massimo provando con il PWRT ma comunque senza buoni risultati. Devo provare a cambiare oscillatore e passare ad un quarzo. Che dici? ciao Brunix

Reply to
Brunix

"Brunix" ha scritto nel messaggio news: snipped-for-privacy@4ax.com...

mmm..... in effetti, non molto tempo fa', ho usato l'oscillatore interno di un pic

18F2455 per un programma e mi sono trovato in difficolta'. Solo dopo aver cercato in diversi ng, ho trovato la soluzione... il microchip C 18 aveva bisogno di una istruzione particolare per far funzionare l'oscillatore interno, come del resto ha bisogno di un controllo sbagliato di una word per gestire in modo appropriato una device multi interfaccia. E quando capitano queste cose, sono problemi grossi! Comunque, sembra che il primo problema sia il riuscire a capire dove sta' l'errore e se si tratta, come sembra dell'oscillatore che non funziona, dato che hai la possibilita' di usare l'assembler anche con il compilatore C Hi Tech, io proverei a scrivere un paio di righe in assembler per settare i dati giusti e vedere se il risultato cambia. Sai come fare??? Francamente ti offro un aiuto, ma solo se non sai come levarci le gambe, visto che dovrei ravanare un bel po' per riuscire a trovare il modo di fare delle funzioni per il C 16 che ho abbandonato da diverso tempo per il piu' performante C 18 e relativi micro. Mi sembra di ricordare che si tratta di inserire la chiave _asm "comando", ma non sono sicuro che sia per l'hi-tech. Comunque, se non riesci a risolvere, conta su un mio aiuto, per quanto mi e' possibile ciao Angelo
Reply to
angelo

"angelo" ha scritto nel messaggio news:44a02ec4$0$5098$ snipped-for-privacy@reader2.news.tin.it...

Ciao, purtroppo non conosco l'assembler. Ho cominciato direttamente con il C perchè mi trovo meglio, avendolo studiato. Comunque, proverò a comprare un quarzo e metterlo. Vi saprò ridire. ciao Brunix

Reply to
Brunix

Ciao, a che punto sei? Comunque sia, qui sotto ti allego il sorgente di un piccolissimo programma, da me testato con il tuo circuito.

Se vuoi tutto il pacchetto, senza dover ricompilare, dimmi come fare per renderlo disponibile o se posso inviartelo via mail. ciao per ora Angelo

N.B. Ricorda di settare Mp Lab per il pic 16 F 84; nel programma sono gia' presenti i settaggi di configurazione per i fusibili (Oscillatore ecc.). Il led posto su RB 0 lampeggia cambiando stato ogni 500 mSec. circa.

// // INIZIO PROGRAMMA: // // // File template per i microprocessori Pic 16F84 // Contiene le inizializzazioni indispensabili // per la programmazione in C Hi-Tech //

// //////////////////////////////////////////////////////////////////////////////// // // // Programma per Brunix // // // // Rev. 01.00 Rc 0 // // // // J.E.Pi // // 26 Giugno 2006 // // Angelo Raglianti // // // //////////////////////////////////////////////////////////////////////////////// //

// //////////////////////////////////////////////////////////////////////////////// // // // Files da includere // // // //////////////////////////////////////////////////////////////////////////////// //

#include

// //////////////////////////////////////////////////////////////////////////////// // // // Inizializzazione CPU e Release // // // //////////////////////////////////////////////////////////////////////////////// //

// // Compilatore Hi-Tech C // Micro Pic 16 F 84 //

// //////////////////////////////////////////////////////////////////////////////// // // // Configurazione fuses // // // //////////////////////////////////////////////////////////////////////////////// //

__CONFIG (RC & WDTDIS & PWRTEN & UNPROTECT);

// ////////////////////////////////////////////////////////////////////////////// // // // Inizializzazione del numero di revisione del programma // // // ////////////////////////////////////////////////////////////////////////////// //

__IDLOC(0001); //Revisione 00.01

// ////////////////////////////////////////////////////////////////////////////// // // // Dichiarazione delle variabili // // // ////////////////////////////////////////////////////////////////////////////// //

static bit b_ledlamp @ ((unsigned char) &PORTB*8+0); // Led lampeggiante

#define ledon 0 // Led acceso #define ledoff 1 // Led spento #define ledtoggle PORTB ^= 0x01

#define mezzosecondo 10800

static unsigned char uc_MaxFlash = 224; static unsigned char tmpcount;

static unsigned long sec; static unsigned long tmpsec;

unsigned char *ptrbufdat;

// ////////////////////////////////////////////////////////////////////////////// // // // Struttura di un campo di bit // // // ////////////////////////////////////////////////////////////////////////////// //

struct { unsigned char flint : 1; } flag ;

// ////////////////////////////////////////////////////////////////////////////// // // // Funzione di interrupt // // // ////////////////////////////////////////////////////////////////////////////// //

// Funzione per vettore di interrupt legata a Timer0 (RTCC)

static void interrupt isr(void) { asm ("NOP"); asm ("NOP"); asm ("NOP"); asm ("NOP"); asm ("NOP"); asm ("NOP"); TMR0 = 255 - tmpcount; T0IF = 0; flag.flint = 1; //Ogni 100 uSec. flag.flint = 1 }

// ////////////////////////////////////////////////////////////////////////////// // // // Prototipi delle funzioni // // // ////////////////////////////////////////////////////////////////////////////// //

void ritardo(unsigned int uivolte); void initint(void); void initport(void); void initvar(void);

// ////////////////////////////////////////////////////////////////////////////// // // // Funzione main // // // ////////////////////////////////////////////////////////////////////////////// //

main() { initport(); initvar(); initint();

ei(); // Abilita general interrupt

while(1) { ritardo (mezzosecondo); ledtoggle; } }

// ////////////////////////////////////////////////////////////////////////////// // // // Funzioni definite dall'utente // // // ////////////////////////////////////////////////////////////////////////////// //

// ////////////////////////////////////////////////////////////////////////////// // // // Funzione di ritardo software legata a interrupt // // // ////////////////////////////////////////////////////////////////////////////// //

void ritardo(unsigned int uivolte) { while (uivolte) { uivolte--; } }

/* // ritardo x uivolte interrupt da 100 uSec. cadauno

void ritardo(unsigned int uivolte) { while (uivolte) { flag.flint = 0; while (!flag.flint) { ; } uivolte--; } }

*/

// ////////////////////////////////////////////////////////////////////////////// // // // Fine delle funzioni utente // // // ////////////////////////////////////////////////////////////////////////////// //

// //**************************************************************************** // //**************************************************************************** // //**************************************************************************** //

// ////////////////////////////////////////////////////////////////////////////// // // // Funzioni di inizializzazione // // // ////////////////////////////////////////////////////////////////////////////// //

// //**************************************************************************** // //**************************************************************************** // //**************************************************************************** //

// ////////////////////////////////////////////////////////////////////////////// // // // Inizializzazione del Timer0 per interrupt // // // ////////////////////////////////////////////////////////////////////////////// //

void initint(void) { // Option Regiter "OPTION" // bit 7 = RBPU neg. = 0 pullup enabled // bit 6 = INTEDG = 1 rising edge int // bit 5 = TOCS = 0 int clk cycle(clkout) // bit 4 = T0SE = 0 increment on l to h // bit 3 = PSA = 0 prescaler to TMR0 // bit 2-1-0: PS2-PS1-PS0 // 000 = 1 : 2 // 001 = 1 : 4 // 010 = 1 : 8 // 011 = 1 : 16 // 100 = 1 : 32 // 101 = 1 : 64 // 110 = 1 : 128 // 111 = 1 : 256 OPTION = 0b11000011; // 1 : 16

// INTCON REGISTER (ADDRESS 0Bh, 8Bh) // bit 7: GIE: Global Interrupt Enable bit // 1 = Enables all un-masked interrupts // 0 = Disables all interrupts // bit 6: EEIE: EE Write Complete Interrupt Enable bit // 1 = Enables the EE write complete interrupt // 0 = Disables the EE write complete interrupt // bit 5: T0IE: TMR0 Overflow Interrupt Enable bit // 1 = Enables the TMR0 interrupt // 0 = Disables the TMR0 interrupt // bit 4: INTE: RB0/INT Interrupt Enable bit // 1 = Enables the RB0/INT interrupt // 0 = Disables the RB0/INT interrupt // bit 3: RBIE: RB Port Change Interrupt Enable bit // 1 = Enables the RB port change interrupt // 0 = Disables the RB port change interrupt // bit 2: T0IF: TMR0 Overflow Interrupt flag bit // 1 = TMR0 has overflowed (must be cleared in software) // 0 = TMR0 did not overflow // bit 1: INTF: RB0/INT Interrupt flag bit // 1 = The RB0/INT interrupt occurred // 0 = The RB0/INT interrupt did not occur // bit 0: RBIF: RB Port Change Interrupt flag bit // 1 = When at least one of the RB7:RB4 pins changed state (must be cleared in software) // 0 = None of the RB7:RB4 pins have changed state INTCON = 0b10100000; // Abilita GIE e T0IE (T0IF = 0) }

// ////////////////////////////////////////////////////////////////////////////// // // // Inizializzazione delle porte di I/O // // // ////////////////////////////////////////////////////////////////////////////// //

void initport(void) { PORTA = 0x00; PORTB = 0x00; //Port Reset TRISA = 0b00001000; //RA3 = Input TRISB = 0b00000000; //RB tutti Out b_ledlamp = ledon; //Led Lampeggiante acceso di default }

// ////////////////////////////////////////////////////////////////////////////// // // // Inizializzazione delle variabili // // // ////////////////////////////////////////////////////////////////////////////// //

void initvar(void) { tmpcount = 29; //Pre = 1:16 tClk=20MHz/4=5=200nSec. //Per 100uS. TMR0=29*(200ns*16)=92.8uSec. TMR0 = 255 - tmpcount; tmpsec = sec; b_ledlamp = 0; flag.flint = 0; }

// // Fine programma //

Reply to
angelo

Ciao, che programma lunghissimo per far lampeggiare un led!!! Stamattina ho comprato, come ti avevo detto, un quarzo da 4 Mhz ed ho provato con questo tipo di oscillatore. Il risultato è stato lo stesso. Non vorrei che alla fine sia il pic danneggiato, o il programmatore che nn va.... Ho letto che ci sono problemi a programmare il 16F84A... Ecco il programmatore che ho usato fino ad adesso (montato su breadboard - minipropic2clone):

formatting link
Questo, come da test, risulterebbe funzionare, anche se i led di Vpp e Vcc sono sempre accesi... e quando programmo si accende solo quello giallo... Poi, ecco i due programmi che ho fatto io, che avrebbero dovuto funzionare:

#include

main(void) { TRISB = 0; PORTB = 0x01; }

-- #include #include main(void) { TRISB = 0; PORTB = 0x01; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); PORTB = 0x02; }

-- Nel primo caso, con il quarzo, a volte funzionava (con il PWR), a volte no (anche con il PWR). Nel secondo caso, non si accendeva un bel niente!!! E' questo che mi fa venire i dubbi che ti ho detto... Ti ringrazio del programma che mi hai mandato. Va bene anche per il 16F84A o va bene solo per il 16F84??? Grazie ciao P.S. Sarebbe meglio che ci scrivessimo in privato... che dici? Brunix

"angelo" ha scritto nel messaggio news:44a0d9ed$0$16945$ snipped-for-privacy@reader4.news.tin.it...

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

Reply to
Brunix

Ooops... I led che rimangono sempre accesi sono quello dell'alimentazione (verde) e questo penso sia giusto, e quello rosso (Vpp)... ciao Brunix

"Brunix" ha scritto nel messaggio news:6E7og.17532$ snipped-for-privacy@twister2.libero.it...

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

Reply to
Brunix

"Brunix" ha scritto nel messaggio news:6E7og.17532$ snipped-for-privacy@twister2.libero.it...

Ciao, il programma e' lunghissimo, perche' e' il template che uso per la programmazione di tutti i micro. Ti ho inviato questa template per farti avere un punto di partenza affidabile anche per ulteriori prove, tipo passare agli interrupt, che come vedi sono gia' presettati. La funzione di ritardo, in effetti, e' stata aggiunta e la funzione originale e' quella commentata... con un quarzo a 4 MHz. hai un interrupt ogni 100 microsecondi e puoi gestire le temporizzazioni come vuoi, indipendentemente da cosa sta facendo il programma.

Per quanto riguarda il programma che usi per scrivere nel pic, e' Ic Prog??? Che versione??? Comunque, se non lo fosse o non fosse l'ultima versione, scarica dal web l'ultima versione, istalla, installa il dirver se usi Xp e poi vai in: SETTAGGI OPZIONI MISC seleziona Xp (anche per Windows 2K).

Esci da Ic Prog e fai di nuovo ripartire Ic Prog.

Premi F3 e seleziona "PROPIC2 PROGRAMMER" Seleziona LPT 1 (se sei su LPT1 con il programmatore) Metti il segno di spunta a: INVERTI MCLR INVERTI VCC Premi OK.

Vai in: SETTAGGI CONTROLLO HARDWARE ATTIVA MCLR deve eaccenderti il led di VPP ATTIVA VCC deve eaccendere il led di VCC.

A quel che vedo sullo schema, dovrai chiudere l'interruttore che invia il segnale dell'inverter connesso al pin 4 della parallela alla resistenza da

4k7 per far andare il led di VPP. Comunque, eventualmente, gioca un po' con i settaggi finche' non avrai ottenuto di accendere e spegnere i led di VCC e VPP tramite il toggle del controllo hardware. A questo punto prova a programmare un pic... Comunque e' strano, se non risucisse a scrivere dovrebbe darti errore al momento della verifica di programmazione... Hai settato "verifica dopo la programmazione in opzioni... vero!!!!!

Si, sicuramente dovrebbe andare sul'84 A senza bisogno di ricompilare... gia', ma te devi ricompilare per forza, visto che hai il sorgente e non l'eseguibile. Ho provato a compilare, seleziona il Pic 16F 84 A in "COINFIGURA - SELECT DEVICE" e compila, non ci sono difficolta'

Per me non ci sono problemi a scrivere in privato, ma dato che si parla di cose estremamente IT e che credo possano far comodo a qualche principiante, come hanno fatto comodo a me, a suo tempo, altre informazioni lette dal NG, a meno che qualcuno non preferisca che chiudiamo e passiamo in privato, io continuerei senza problemi qui. ciao Angelo

Reply to
angelo

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.