Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Librerie delay.c e delay.h

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Librerie delay.c e delay.h

Messaggioda Foto Utentejmonty » 7 feb 2015, 18:54

Salve,

Sto iniziando a programmare in MPLAB IDE 8.33 con HI-TEC ANSI C Compiler. Ho iniziato con un semplice programma un lampeggio di un led (trovato su internet) ma una volta che compilo, il compilatore mi dice che non ho le delay.c e le delay.h.
Dove posso trovare queste librerie? Ne ho scaricate alcun da internet ma una volta che le ho incluse al progetto mi da errore dicendo che le funzioni contenute in delay.h sono state ridefinite. Che devo fare?

Grazie per la pazienza.
Avatar utente
Foto Utentejmonty
16 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 232
Iscritto il: 9 ago 2011, 18:58

0
voti

[2] Re: Librerie delay.c e delay.h

Messaggioda Foto Utentesimo85 » 7 feb 2015, 21:18

Mah, è uscito MPLABX con xc8 da un pezzo, con tutte le librerie incluse. Perché non usi quello ?

O_/
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: Librerie delay.c e delay.h

Messaggioda Foto UtenteWALTERmwp » 7 feb 2015, 22:20

Ciao Foto Utentejmonty, non hai indicato da dove hai preso quello che stai utilizzando ma se non è parte della stessa "famiglia" può darsi ci sia ridondanza e o qualche errore di compatibilità.
Prova ad inserire nel prossimo Post il tuo codice e quello delle "delay", così magari gli si può dare un'occhiata.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[4] Re: Librerie delay.c e delay.h

Messaggioda Foto UtenteTardoFreak » 7 feb 2015, 23:02

Questo è, con buona probabilità, un problema che riguarda le impostazioni del progetto: posizione cartella dei file .h
Accetto scommesse.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[5] Re: Librerie delay.c e delay.h

Messaggioda Foto Utentejmonty » 8 feb 2015, 12:21

Questo è lo script del progetto:
Codice: Seleziona tutto
//
//*************************************************

#define  XTAL_FREQ 20MHZ
#include <PIC.h>

__CONFIG (HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT);

#include "delay.h"
#define    LED    RD0

void main(void)
{

TRISA=0b00000000;
TRISB=0b00000000;
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000000;

while(1)
{
LED=LED^1;
DelayMs(250);
}

}
Ultima modifica di Foto UtenteWALTERmwp il 9 feb 2015, 10:02, modificato 1 volta in totale.
Motivazione: Inserito codice nei tag(s) code
Avatar utente
Foto Utentejmonty
16 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 232
Iscritto il: 9 ago 2011, 18:58

0
voti

[6] Re: Librerie delay.c e delay.h

Messaggioda Foto Utentejmonty » 8 feb 2015, 12:22

Codice: Seleziona tutto
delay.c:

/*

high level delay routines - see delay.h for more info.

Designed by Shane Tolmie of http://www.microchipC.com corporation.  Freely distributable.
Questions and comments to webmaster@microchipC.com.
PICuWEB - Program PIC micros with C. Site has FAQ and sample source code.
http://www.microchipC.com.

For Microchip 12C67x, 16C7x, 16F87x and Hi-Tech C

*/

#ifndef __DELAY_C
#define __DELAY_C

#include <PIC.h>
#include   "always.h"

unsigned char delayus_variable;

#include   "delay.h"

void DelayBigUs(unsigned int cnt)
{
   unsigned char   i;

   i = (unsigned char)(cnt>>8);
   while(i>=1)
   {
      i--;
      DelayUs(253);
      CLRWDT();
   }
   DelayUs((unsigned char)(cnt & 0xFF));
}

void DelayMs(unsigned char cnt)
{
   unsigned char   i;
   do {
      i = 4;
      do {
         DelayUs(250);
         CLRWDT();
      } while(--i);
   } while(--cnt);
}

//this copy is for the interrupt function
void DelayMs_interrupt(unsigned char cnt)
{
   unsigned char   i;
   do {
      i = 4;
      do {
         DelayUs(250);
      } while(--i);
   } while(--cnt);
}

void DelayBigMs(unsigned int cnt)
{
   unsigned char   i;
   do {
      i = 4;
      do {
         DelayUs(250);
         CLRWDT();
      } while(--i);
   } while(--cnt);
}

void DelayS(unsigned char cnt)
{
   unsigned char i;
   do {
      i = 4;
      do {
         DelayMs(250);
         CLRWDT();
      } while(--i);
   } while(--cnt);
}

#endif
Ultima modifica di Foto UtenteWALTERmwp il 9 feb 2015, 10:03, modificato 1 volta in totale.
Motivazione: Inserito codice nei tag(s) code
Avatar utente
Foto Utentejmonty
16 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 232
Iscritto il: 9 ago 2011, 18:58

0
voti

[7] Re: Librerie delay.c e delay.h

Messaggioda Foto Utentejmonty » 8 feb 2015, 12:23

Codice: Seleziona tutto
delay.h

#define PIC_CLK 16000000 //16Mhz

/*

lowlevel delay routines

Designed by Shane Tolmie for http://www.microchipC.com. Freely distributable.
Questions and comments to webmaster@microchipC.com.

For Microchip 12C67x, 16C7x, 16F87x and Hi-Tech C

Example C:

#define PIC_CLK 4000000

#include "delay.h"

unsigned int timeout_int, timeout_char;

DelayUs(40);  //do NOT do DelayUs(N) of N<5 @ 4Mhz or else it executes DelayUs(255) !!!!
DelayUs(255); //max

dly250n;      //delay 250ns
dly1u;        //delay 1us

timeout_char=timeout_char_us(1147);
while(timeout_char-- && (RA1==0));  //wait up to 1147us for port RA1 to go high
                //  - this is the max timeout

timeout_int=timeout_int_us(491512);
while(timeout_int-- && (RA1==0));   //wait up to 491512us for port RA1 to go high
                //  - this is the max timeout

*/

#ifndef __DELAY_H
#define __DELAY_H

extern unsigned char delayus_variable;

#if (PIC_CLK == 4000000)
   #define dly125n please remove; for 32Mhz+ only
   #define dly250n please remove; for 16Mhz+ only
   #define dly500n please remove; for 8Mhz+ only
   #define dly1u asm("nop")
   #define dly2u dly1u;dly1u
#elif (PIC_CLK == 8000000)
   #define dly125n please remove; for 32Mhz+ only
   #define dly250n please remove; for 16Mhz+ only
   #define dly500n asm("nop")
   #define dly1u dly500n;dly500n
   #define dly2u dly1u;dly1u
#elif ( (PIC_CLK == 16000000) || (PIC_CLK == 16257000) )
   #define dly125n please remove; for 32Mhz+ only
   #define dly250n asm("nop")
   #define dly500n dly250n;dly250n
   #define dly1u dly500n;dly500n
   #define dly2u dly1u;dly1u
#elif (PIC_CLK == 20000000)
   #define dly200n asm("nop")
   #define dly400n dly250n;dly250n
   #define dly2u dly400n;dly400n;dly400n;dly400n;dly400n
#elif (PIC_CLK == 32000000)
   #define dly125n asm("nop")
   #define dly250n dly125n;dly125n
   #define dly500n dly250n;dly250n
   #define dly1u dly500n;dly500n
   #define dly2u dly1u;dly1u
#else
   #error delay.h - please define pic_clk correctly
#endif

//*****
//delay routine

#if PIC_CLK == 4000000
   #define DelayDivisor 4
   #define WaitFor1Us asm("nop")
   #define Jumpback asm("goto $ - 2")
#elif PIC_CLK == 8000000
   #define DelayDivisor 2
   #define WaitFor1Us asm("nop")
   #define Jumpback asm("goto $ - 2")
#elif ( (PIC_CLK == 16000000) || (PIC_CLK==16257000) )
   #define DelayDivisor 1
   #define WaitFor1Us asm("nop")
   #define Jumpback asm("goto $ - 2")
#elif PIC_CLK == 20000000
   #define DelayDivisor 1
   #define WaitFor1Us asm("nop"); asm("nop")
   #define Jumpback asm("goto $ - 3")
#elif PIC_CLK == 32000000
   #define DelayDivisor 1
   #define WaitFor1Us asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop")
   #define Jumpback asm("goto $ - 6")
#else
   #error delay.h - please define pic_clk correctly
#endif

#define DelayUs(x) { \
         delayus_variable=(unsigned char)(x/DelayDivisor); \
         WaitFor1Us; } \
         asm("decfsz _delayus_variable,f"); \
         Jumpback;

/*

timeouts:

C code for testing with ints:

         unsigned int timeout;
         timeout=4000;
         PORT_DIRECTION=OUTPUT;
         while(1)
         {
            PORT=1;
            timeout=8000;
            while(timeout-- >= 1);   //60ms @ 8Mhz, opt on, 72ms @ 8Mhz, opt off
            PORT=0;
         }

Time taken:   optimisations on:      16cyc/number loop, 8us @ 8Mhz
         optimisations off:      18cyc/number loop, 9us @ 8Mhz
         with extra check ie:   && (RB7==1), +3cyc/number loop, +1.5us @ 8Mhz

C code for testing with chars:

         similar to above

Time taken:   optimisations on:      9cyc/number loop, 4.5us @ 8Mhz
         with extra check ie:   && (RB7==1), +3cyc/number loop, +1.5us @ 8Mhz

Formula:   rough timeout value = (<us desired>/<cycles per loop>) * (PIC_CLK/4.0)

To use:      //for max  timeout of 1147us @ 8Mhz
         #define LOOP_CYCLES_CHAR   9               //how many cycles per loop, optimizations on
         #define timeout_char_us(x)   (unsigned char)((x/LOOP_CYCLES_CHAR)*(PIC_CLK/4.0))
         unsigned char timeout;
         timeout=timeout_char_us(1147);                  //max timeout allowed @ 8Mhz, 573us @ 16Mhz
         while((timeout-- >= 1) && (<extra condition>));   //wait

To use:      //for max 491512us, half sec timeout @ 8Mhz
         #define LOOP_CYCLES_INT      16               //how many cycles per loop, optimizations on
         #define timeout_int_us(x)   (unsigned int)((x+/LOOP_CYCLES_INT)*(PIC_CLK/4.0))
         unsigned int timeout;
         timeout=timeout_int_us(491512);                  //max timeout allowed @ 8Mhz
         while((timeout-- >= 1) && (<extra condition>));   //wait
*/
#define LOOP_CYCLES_CHAR   9                     //how many cycles per loop, optimizations on
#define timeout_char_us(x)   (long)(((x)/LOOP_CYCLES_CHAR)*(PIC_CLK/1000000/4))

#define LOOP_CYCLES_INT      16                     //how many cycles per loop, optimizations on
#define timeout_int_us(x)   (long)(((x)/LOOP_CYCLES_INT)*(PIC_CLK/1000000/4))

//if lo byte is zero, faster initialization by 1 instrucion
#define timeout_int_lobyte_zero_us(x)   (long)(((x)/LOOP_CYCLES_INT)*(PIC_CLK/4.0)&0xFF00)

//function prototypes
void DelayBigUs(unsigned int cnt);
void DelayMs(unsigned char cnt);
void DelayMs_interrupt(unsigned char cnt);
void DelayBigMs(unsigned int cnt);
void DelayS(unsigned char cnt);

#endif
Ultima modifica di Foto UtenteWALTERmwp il 9 feb 2015, 10:03, modificato 1 volta in totale.
Motivazione: Inserito codice nei tag(s) code
Avatar utente
Foto Utentejmonty
16 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 232
Iscritto il: 9 ago 2011, 18:58

0
voti

[8] Re: Librerie delay.c e delay.h

Messaggioda Foto Utentejmonty » 9 feb 2015, 20:12

Con Arduino potevo utilizzare una porta in uscita in modo analogico con valori da 0 a 255 che corrispondono da 0v a 5v. E possibile fare ciò con un PIC?
Avatar utente
Foto Utentejmonty
16 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 232
Iscritto il: 9 ago 2011, 18:58

0
voti

[9] Re: Librerie delay.c e delay.h

Messaggioda Foto UtenteWALTERmwp » 9 feb 2015, 20:17

Hai risolto la questione della compilazione ?

Per questo ...
jmonty ha scritto:Con Arduino potevo utilizzare una porta in uscita in modo analogico con valori da 0 a 255 che corrispondono da 0v a 5 V.
... sembra tu stia descrivendo una uscita analogica; quale PIC vorresti impiegare ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[10] Re: Librerie delay.c e delay.h

Messaggioda Foto Utentejmonty » 10 feb 2015, 19:14

Non ci sono riuscito.
Avatar utente
Foto Utentejmonty
16 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 232
Iscritto il: 9 ago 2011, 18:58

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti