Pagina 1 di 2

aiuto codice in C per PIC

MessaggioInviato: 12 lug 2012, 15:19
da ramboluis
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

Re: aiuto codice in C per PIC

MessaggioInviato: 12 lug 2012, 15:27
da simo85
Codice: Seleziona tutto
__delay_ms(100);

Re: aiuto codice in C per PIC

MessaggioInviato: 12 lug 2012, 15:43
da ramboluis
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! **********

Re: aiuto codice in C per PIC

MessaggioInviato: 12 lug 2012, 15:52
da simo85
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_/

Re: aiuto codice in C per PIC

MessaggioInviato: 12 lug 2012, 15:56
da ramboluis
grazie,ti stimo troppo :ok:

ora funziona tutto

Re: aiuto codice in C per PIC

MessaggioInviato: 18 lug 2012, 8:30
da demos81
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.

Re: aiuto codice in C per PIC

MessaggioInviato: 22 lug 2012, 16:56
da ramboluis
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:

Re: aiuto codice in C per PIC

MessaggioInviato: 22 lug 2012, 18:35
da simo85
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..

Re: aiuto codice in C per PIC

MessaggioInviato: 22 lug 2012, 19:28
da ramboluis
gohan ha scritto: adatta meglio il programma e la sua struttura..

cosa intendi di preciso ?

Re: aiuto codice in C per PIC

MessaggioInviato: 22 lug 2012, 22:16
da simo85
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."