Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

aiuto codice in C per PIC

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] aiuto codice in C per PIC

Messaggioda Foto Utenteramboluis » 12 lug 2012, 15:19

ciao a tutti, sto seguendo una guida sul web per imparare a programmare i PIC con c con l'uso dei programmi MPLAB IDE e HI-TECH 9.83
alla terza lezione c'era un esempio di sorgente che faceva lampeggiare un led ,allora ho fatto copia e incolla e in un compilatore per C e l'ho caricata su MPLAB seguendo la guida ,quando lo compilo mi da errore e mi esce questo:

Codice: Seleziona tutto
Build C:\Users\PCPC\Desktop\rtf-01\lala for device 16F877A
Using driver C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe

Make: The target "C:\Users\PCPC\Desktop\rtf-01\main.p1" is out of date.
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 C:\Users\PCPC\Desktop\rtf-01\main.c -q --chip=16F877A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" -olala.cof -mlala.map --summary=default --output=default main.p1 --chip=16F877A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.83
Copyright (C) 2011 Microchip Technology Inc.
(1273) Omniscient Code Generation not available in Lite mode (warning)
Error   [499] ; 0. undefined symbol:
   _DelayMs(lala.obj)

********** Build failed! **********
se invece cancello i due delay allora funziona
qui tutta la sorgente:
Codice: Seleziona tutto
// CORSO PROGRAMMAZIONE PICMICRO
// http://www.settorezero.com
//
// modulo: main.c
// autore: Bernardo Giovanni
// data: 18/08/09
// descrizione: lampeggia un led su RA1
// picmicro: PIC16F877A
// clock: 4MHz
//
//*************************************************

#define  PIC_CLK 4000000 // questo è utilizzato dalle routine di ritardo contenute in Delay.C
#include <PIC.h> // contiene i nomi mnemonici di registri e porte

// Fuses di configurazione
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF & CP_OFF);

#include "delay.c" // routine per ritardi

// funzione principale, eseguita all'avvio del picmicro
void main(void)
{

// imposto i registri tristato in maniera tale che tutte le porte siano configurate come pin di uscita
TRISA=0b00000000;
TRISB=0b00000000;


while(1) // eseguo un ciclo finito
{
RA1 = 1;
DelayMs(100);
RA1 = 0;
DelayMs(100);


}// Fine ciclo continuo

} // Fine main






sapete cosa puo essere? ho provato a scrivere il delay in tutti i modi ,con l' underscore ecc.. , ma niente mi da sempre errore
Avatar utente
Foto Utenteramboluis
80 1 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 28 giu 2012, 18:39

1
voti

[2] Re: aiuto codice in C per PIC

Messaggioda Foto Utentesimo85 » 12 lug 2012, 15:27

Codice: Seleziona tutto
__delay_ms(100);
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: aiuto codice in C per PIC

Messaggioda Foto Utenteramboluis » 12 lug 2012, 15:43

grazie,il delay ora funziona ma mi da un nuovo errore:
Codice: Seleziona tutto
Build C:\Users\PCPC\Desktop\rtf-01\allarme for device 16F877A
Using driver C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe

Make: The target "C:\Users\PCPC\Desktop\rtf-01\main2.p1" is out of date.
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 C:\Users\PCPC\Desktop\rtf-01\main2.c -q --chip=16F877A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Error   [192] C:\Users\PCPC\Desktop\rtf-01\main2.c; 37.31 undefined identifier "_XTAL_FREQ"

********** Build failed! **********
Avatar utente
Foto Utenteramboluis
80 1 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 28 giu 2012, 18:39

0
voti

[4] Re: aiuto codice in C per PIC

Messaggioda Foto Utentesimo85 » 12 lug 2012, 15:52

Devi dichiarare la costante _XTAL_FREQ se usi la funzione __delay_ms, così per esempio, se il PIC lavora con un oscillatore esterno a 20MHz.
Codice: Seleziona tutto
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 20000000
#endif


Questo perché la funzione __delay_ms calcola il ritardo a seconda della frequenza di system clock, solo che tu devi dirgli il valore della frequenza di oscillazione, appunto dichiarando ed assegnando un valore per _XTAL_FREQ.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

2
voti

[5] Re: aiuto codice in C per PIC

Messaggioda Foto Utenteramboluis » 12 lug 2012, 15:56

grazie,ti stimo troppo :ok:

ora funziona tutto
Avatar utente
Foto Utenteramboluis
80 1 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 28 giu 2012, 18:39

0
voti

[6] Re: aiuto codice in C per PIC

Messaggioda Foto Utentedemos81 » 18 lug 2012, 8:30

ciao, anch'io ho iniziato da poco con il C per PIC.
ti consiglio di leggerti sempre dal PDF della guida all'HI TECH C le funzioni di libreria che vai usando.
trovi sempre indicato che tipo di variabili definire o particolari note sulle dimensioni delle variabili da usare.
Avatar utente
Foto Utentedemos81
1.479 1 6 8
Expert EY
Expert EY
 
Messaggi: 601
Iscritto il: 16 mar 2009, 20:56

0
voti

[7] Re: aiuto codice in C per PIC

Messaggioda Foto Utenteramboluis » 22 lug 2012, 16:56

ho montato tutto il mio circuito ,a livello di hardware e tutto ok , ho scritto alcuni programmi per testare i singoli componenti ed e tutto funzionante
allora mi sono messo e ho scritto un programma per far funzionare questo allarme ma non funziona. ho fatto varie modifiche ma niente :( il programma non segue nessuna istruzione sembra quasi che si impalla ,a volte la sirena parte non appena alimento il PIC
a questo punto l' unica cosa che mi viene in mente è che il mio programma sia una vera ciofeca
eccolo :
Codice: Seleziona tutto
//*************************************************
// SOFTWARE ALLARME 1.2
//*************************************************
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 40000
#endif

#include <PIC.h>

// Fuses di configurazione
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF & CP_OFF);

#include "delay.c" // routine per ritardi

// funzione principale, eseguita all'avvio del picmicro
void main(void)
{

// imposto i registri tristato in maniera tale che tutte le porte siano configurate come pin di uscita
TRISA=0b00000000;
TRISB=0b00000000;
TRISC=0b01110000;
TRISD=0b00000100;
//INIZIO PROGRAMMA
restart:
if (RD2 == 1)  // interruttore a chiave ( ho dovuto utilizzare questo sistema perche una volta girata la chiave per chiudere il circuito non si puo piu estrarre)
   {
      RD3 = 1;           // il led fa 3 lampeggi per certificare l'accensione
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 0;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 1;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 0;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 1;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 0;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
        }
else
    {goto restart;}



while(1) // eseguo un ciclo finito
{
if (RC6 == 1)  // sensore normalmente aperto
   {RD1 = 1;//  RD1 e la sirena
     
   
    __delay_ms (250); // rimane accesa per 30 secondi
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
      RD1 = 0;     // si spegne la sirena
     } 
if (RC5 == 1) // altro sensore normalmente aperto
     {
   
    RD1 = 1;// accende sirena
    __delay_ms (250);// tiene acceso per 30 secondi
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    RD1 = 0;         // spegne la sirena
      }

if (RC4 == 1) // sensore normalmente aperto 
   {
    RD1 = 1;         // accende sirena
   
    __delay_ms (250);//tiene accesa per 30 secondi
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    __delay_ms (250);
    RD1 = 0;              //spegne sirena 
     }
if (RD2 == 1)   // se si gira nuovamente la chiave il led lampeggia 2 volte e il circuito torna da capo attendendo un altro giro di chiave
    {RD3 = 1;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 0;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 1;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
      RD3 = 0;
      __delay_ms (250);
      __delay_ms (250);
      __delay_ms (250);
   
       goto restart;}

}// Fine ciclo continuo

} // Fine main

sono disperato :cry:
Avatar utente
Foto Utenteramboluis
80 1 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 28 giu 2012, 18:39

1
voti

[8] Re: aiuto codice in C per PIC

Messaggioda Foto Utentesimo85 » 22 lug 2012, 18:35

Dire se un codice funziona o no solo col osservarlo non è cosa per tutti i sorgenti.

Oltre a questo, toglierei tutte quelle funzioni di ritardo. A cosa servono per esempio 3 funzioni per un ritardo di 750ms? Una non basta? Oltre a questo, esistono i timer e le interrupt. Sono molto più efficenti.
Ultima cosa, togli quel goto e adatta meglio il programma e la sua struttura..
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[9] Re: aiuto codice in C per PIC

Messaggioda Foto Utenteramboluis » 22 lug 2012, 19:28

gohan ha scritto: adatta meglio il programma e la sua struttura..

cosa intendi di preciso ?
Avatar utente
Foto Utenteramboluis
80 1 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 28 giu 2012, 18:39

0
voti

[10] Re: aiuto codice in C per PIC

Messaggioda Foto Utentesimo85 » 22 lug 2012, 22:16

ramboluis ha scritto:cosa intendi di preciso ?

Cambierei un po' tutto..

A parte usare i timer e non la __delay_ms, all'inzio del codice fai un test continuo su RD2.
Perché non usi l'IOC del PORTB, visto che a quanto sembra ce l'hai libero? Tra l'altro, come c'è scritto sul datasheet a pagina 46
"This interrupt can wake the device from Sleep."
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti