Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Strano comportamento 16F887

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Strano comportamento 16F887

Messaggioda Foto UtenteLuca90x » 23 apr 2013, 19:55

Ciao a tutti, ho programmato il mio primo PIC finalmente, e quindi arrivano anche i primi problemi :D
il programma è semplice, fa lampeggiare un led a frequenza 2 Hz; ho impostato tutte le porte come Input (non le uso), e la RB2 come out;adesso:
1)il led lampeggia, tutto ok a parte la frequenza che mi sembra decisamente sbagliata (ho usato un quarzo a 20Mhz -> _XTAL_FREQ 20000000) e la funzione delay;
2)testando con un multimetro le varie porte RB, ne trovo qualcuna a valore alto (non dovrebbero essere a 0?), e addirittura in una (RB5), quando testavo, il led in RB2 rimaneva acceso fisso!
Per essere il primo programma, credo funzioni, anche se male; qualcuno ha idea del perché questi "effetti collaterali"? :D
Avatar utente
Foto UtenteLuca90x
15 1 3
 
Messaggi: 20
Iscritto il: 5 mar 2013, 17:38

0
voti

[2] Re: Strano comportamento 16F887

Messaggioda Foto UtenteAjKDAP » 23 apr 2013, 22:55

Visto che non abbiamo sfere magiche :mrgreen: io direi di scrivere:

-compilatore usato
-ambiente di sviluppo
-codice
-schema elettrico in fidocadj
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.250 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[3] Re: Strano comportamento 16F887

Messaggioda Foto UtenteLuca90x » 23 apr 2013, 23:18

E hai ragione anche tu :D
Dunque, uso mplab X, con compilatore xc8, programmatore pickit 3.
questo è il circuito (è proprio il minimo indispensabile ancora)

Questo invece è il codice:
Codice: Seleziona tutto
/*
* Il programma fa lampeggiare un led tramite delle NOP;si usa la funzione
* __delay() che però viene inclusa in un ulteriore ciclo, visti i limiti
* che la stessa pone (max circa 16ms)
*
* Author: Luca
*
* Created on 23 aprile 2013, 15.24
*/

#include <xc.h>                       //Header file generico




// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 3.5V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

#define _XTAL_FREQ 20000000     //Specifico la frequenza del cristallo che sto usando

void __delay_1ms(unsigned int time);    //Prototipo funzione delay

void main(void) {

    TRISA = 0xFF;                     //Imposto tutti i pin di PORTA come input
    TRISB = 0xFF;                     //Imposto tutti i pin di PORTB come input
    TRISC = 0xFF;                     //Imposto tutti i pin di PORTC come input

    TRISBbits.TRISB2 = 0;             //Imposto il pin RB2 come output

    while (1) {                       //Ciclo infinito

    //Imposto il ciclo che farà lampeggiare il led
        PORTBbits.RB2 = 1;          //Led on
            __delay_1ms(1500);       //Delay
        PORTBbits.RB2 = 0;          //Led off
            __delay_1ms(3000);       //Delay

    }

}

void __delay_1ms(unsigned int time){
    while(time-- != 0){
        _delay(5000000);
    }
}


Tra l'altro, ho dovuto usare _delay(), quando il manuale di xc8 mi dava anche __delay_ms(), molto più comoda, ma non veniva riconosciuta, chissà per quale astruso motivo :?
Avatar utente
Foto UtenteLuca90x
15 1 3
 
Messaggi: 20
Iscritto il: 5 mar 2013, 17:38

0
voti

[4] Re: Strano comportamento 16F887

Messaggioda Foto UtenteAjKDAP » 23 apr 2013, 23:30

Luca90x ha scritto:__delay_ms(), molto più comoda, ma non veniva riconosciuta, chissà per quale astruso motivo :?


Leggendoti mi è venuto in mente l'articolo scritto da Foto UtenteTardoFreak :mrgreen:

evidentemente bisogna includere qualche delay.h :-)

Per la questione delle porte, prova a settare TRSIB e PORTB in questo modo:

Codice: Seleziona tutto
TRISB=0x00;
PORTB=0x00;


e magicamente saranno tutte a zero se le controllerai con il multimetro. :ok:

A parte gli scherzi, prima di andare oltre io ti consiglierei di rimandare le sperimentazioni dopo aver studiato un po' di teoria, visto che ho citato l'articolo di tardoFreak, ti rimando ad un suo articolo:
http://www.electroyou.it/tardofreak/wik ... re-parte-i

Ciao
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.250 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[5] Re: Strano comportamento 16F887

Messaggioda Foto UtenteLuca90x » 24 apr 2013, 0:27

Si concordo con te, per la teoria (studio al Polimi, ormai saperla di ogni cosa è legge :D ); ho iniziato a leggere ma preferisco finire l'articolo con calma (e mente lucida :D). Grazie comunque per i link!
Avatar utente
Foto UtenteLuca90x
15 1 3
 
Messaggi: 20
Iscritto il: 5 mar 2013, 17:38

1
voti

[6] Re: Strano comportamento 16F887

Messaggioda Foto UtentePaolino » 26 apr 2013, 15:26

Qualche osservazione.
Nella configurazione delle porte del PIC16F887 stai molto attento alle porte che possono essere condivise anche da ingressi analogici e da comparatori! Misurare col multimetro per verificare la tensione a 0 oppure a 5V è in funzione di come hai/non hai configurato alcuni registri.

Secondo, stai attento: dovresti prevedere anche un condensatore sull'alimentazione:



Infine:

"Luca90x ha scritto:Tra l'altro, ho dovuto usare _delay(), quando il manuale di xc8 mi dava anche __delay_ms(), molto più comoda, ma non veniva riconosciuta, chissà per quale astruso motivo :?

Che tipo di errore ti segnala XC8?

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

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

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,3k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4203
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[7] Re: Strano comportamento 16F887

Messaggioda Foto UtenteLuca90x » 28 apr 2013, 11:47

Scusa il ritardo, non ho potuto controllare in questi giorni...comunque l'errore che da è
"unable to resolve identifier __delay_ms"
come se non lo trovasse;
tra l'altro ho provato anche a includere delays.h ma non cambia niente.

Edit: per pura curiosità ho provato a compilarlo nonostante l'errore, ma crea l'hex e non ritorna alcun errore; a breve provo a caricarlo sul PIC e vedo che succede
Avatar utente
Foto UtenteLuca90x
15 1 3
 
Messaggi: 20
Iscritto il: 5 mar 2013, 17:38

1
voti

[8] Re: Strano comportamento 16F887

Messaggioda Foto Utenterusty » 28 apr 2013, 12:22

Forse questo puo' essere utile:

I think I have solved this problem.

I am using the internal Oscillator. After defining the frequency I pasted the __delay_ms & __delay_us functions from the PIC.h file directly under the XTAL definition.

For whatever reason the delay functions show as undefined even though they compile correctly. At the very top of my code I have this:

#ifndef _XTAL_FREQ#define _XTAL_FREQ 4000000 //4Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

This removed all of the ugly "unable to resolve identifier" errors. Hope this helps.


Da: http://www.microchip.com/forums/m630159.aspx
Avatar utente
Foto Utenterusty
4.077 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

2
voti

[9] Re: Strano comportamento 16F887

Messaggioda Foto UtentematteoDL » 28 apr 2013, 13:31

Ho già lavorato con quel PIC e con quel compilatore ci sto lavorando ora.
Ti riporto quelli che secondo me possono essere considerazioni utili:
-Non vengono chiamati in causa i registri ANSEL e ANSELH per l'impostazione dei pin come analogici o come digitali. Stai usando il pin RB5 che è anche però AN13. Di default questi registri hanno tutti i bit a 1 cioè tutti i pin AN impostati come analogici. Io consiglierei di metterli tutti a digitali, nel tuo caso comunque è d'obbligo mettere almeno ANSELHbits.ANS13=0.
-Vedo che hai configurato FOSC = XT, ma stai usando il quarzo della massima velocità consentita quindi direi che è più appropriato FOSC = HS.
-Dal manuale di xc8 alla voce __delay_ms(): "In order to achieve this, these macros require the prior definition of preprocessor symbol _XTAL_FREQ". Tu lo hai definito ma solo dopo la chiamata a <xc.h>, io solitamente lo faccio prima e funziona.
-Se hai dubbi di ogni sorta leggi approfonditamente il datasheet, anche per cose "banali" come l'uso di pin con funzione di uscita analogica. Non puoi immaginare le migliaia di clausolette da rispettare che si trovano.
Alto documento da tenere sempre sottomano ovviamente è il manuale del compilatore.

Detto questo, buona programmazione!
Avatar utente
Foto UtentematteoDL
704 3 7
Expert
Expert
 
Messaggi: 310
Iscritto il: 26 feb 2012, 20:49

0
voti

[10] Re: Strano comportamento 16F887

Messaggioda Foto UtenteLuca90x » 1 mag 2013, 20:09

Grazie mille a tutti, funziona tutto :D riesco a programmare un PIC e ho capito cosa serve per inziare...e adesso ho il datasheet da studiare :D
Avatar utente
Foto UtenteLuca90x
15 1 3
 
Messaggi: 20
Iscritto il: 5 mar 2013, 17:38


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti