Vai al contenuto
PLC Forum


Pic16F Con Programma In C


Alessandro Dj-alex Turco

Messaggi consigliati


  • Risposte 66
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Alessandro Dj-alex Turco

    36

  • simuffa

    13

  • Livio Orsini

    12

  • giacomo56

    2

Scusa ma tu vuoi che qualcuni faccia il programma per conto tuo?

Scordalo!

Dal forum sicuramente riceverai tanto aiuto, ma ci devi mettere del tuo.

Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco

No...non voglio che qualcuno faccia il programma al posto mio...cerco solo aiuto...io ho già progettato la parte hardware

Link al commento
Condividi su altri siti

Che tipo di aiuto ti serve?

Che complilatore usi?

Più informazioni dai più fcilmente sarai aiutato.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Ciao.

Intanto per funzionare ha bisogno di un paio di resistori da 10K tra RA0 e RA1 e VDD perché la porta A non ha pull-up interni, un resistore

sempre da 10K collegato al pin 4 altrimenti hai problemi col reset e in ultimo è sempre consigliabile un condensatore da 100 nF tra il pin VDD e

massa.

Per il software puoi iniziare a definire un array dove memorizzare il codice delle cifre, per esempio:

char const cifra[] = {0xf3, 0xyy, 0xyy, 0xyy, 0xyy, 0xyy, 0xyy, 0xyy, 0xf7, 0xyy};

0xf3 corrisponde allo '0', 0xf7 all'8', gli altri valori yy li puoi trovare tu.

Nel codice scriverari: portb = cifra[0]; per accendere lo zero, portb = cifra[1]; per accendere l'uno e così via.

Per leggere i tasti puoi fare un ciclo che controlla lo stato dei pulsanti ed esegue l'azione conseguente.

Per evitare i rimbalzi meccanici dei tasti devi usare un codice anti rimbalzo, se fai una ricerca su internet trovi come farlo.

Link al commento
Condividi su altri siti

Se lo scopo è imparare a usar PIC a diavolerie simili può andare

altrimenti credo che con un paio di integrati e qualche passivo può risolvere senza utilizzare un PIC.

Modificato: da accacca
Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco

Ok

Devo usare il pic

Il circuito lo devo simulare con multisim

La parte hardware è corretta

Avrei bisogno solo di un esempio di codice programma in C

Link al commento
Condividi su altri siti

Farti un esempio significa farti il programma, vist la banalità del programma.

Il "C" va studiato.

Non lo s'impara per scienza infusa e nemmeno per tentativi. Ti prendi un manuale, magari il classico Richtie, e lo studi.

Se non fai così potrai mettere assieme solo qualche cosina, scimmiottando esempi senza sapere quello che stai facendo.

Per imparare bisogna fare un minimo di fatica e spenderci un poco di tempo.

Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco

Il problema è che io so usare benissimo arduino ma usa un C con comandi proprietari e non so come farlo con un PIC16F84

Se vuoi faccio il programma con C arduino e poi qualcuno mi aiuta a farlo adattare per il PIC

Link al commento
Condividi su altri siti

Il problema è che io so usare benissimo arduino ma usa un C....

Arduino per le librerie usa "C++" mentre per gli sketch è praticamente il "C" stndard.

Poi esistono le "bult in functions" che sono funzioni speciali sviluppate su un determinato compilatore per un determinato processore.

Anche per il PIC i vari complilatori adottano "bult in functions" che variano secondo compilatore usato.

Poi c'è il problema del legame con lo Hw che, anche usando un liguaggio ad alto livello, è imprescindibile.

Tu prova a scrivere il programma per arduino, poi vediamo di aiutarti alla trasposizione.

Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco

// numero dei pin di arduino collegati ai segmenti

const byte seg_A = 2;

const byte seg_B = 3;

const byte seg_C = 4;

const byte seg_D = 5;

const byte seg_E = 6;

const byte seg_F = 7;

const byte seg_G = 8;

// array dei segmenti

const byte segments[7] = {

seg_A, seg_B, seg_C, seg_D, seg_E, seg_F, seg_G,};

// array byte in uscita per ogni valore (l'ultimo valore non è mai utilizzato)

const byte numbers [7] = {

0b10101011, // n

0b11111001, // 1

0b10100100, // 2

0b10110000, // 3

0b10011001, // 4

0b10010010, // 5

0b10000010, // 6

};

// variab

byte gear = 0;

Deve contare da 0 a 9 avanti e indietro con i due pulsanti

Non uso un compilatore lo devo simulare con multisim e usa hi-tech C

Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco

** come faccio ad adattare questo codice arduino per pic

** come faccio ha gestire i pulsanti avanti e indietro (senza farlo avanzare in automatico)

// Conteggio 9 secondi con display 7 segmenti a catodo comune

// definizione delle variabili a cui collegare ogni segmento del display

// la lettera rappresenta il segmento del display il numero il pin

// digitale di Arduino a cui è collegato il corrispondente pin del display

const int a=7;

const int b=6;

const int c=4;

const int d=2;

const int e=1;

const int f=9;

const int g=10;

void LedAcceso(int n)

{

switch(n)

{

case 0:

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

break;

case 1:

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

break;

case 2:

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

break;

case 3:

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

break;

case 4:

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

break;

case 5:

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

break;

case 6:

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

break;

case 7:

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

break;

case 8:

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

break;

case 9:

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

break;

}

};

void setup()

{

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

}

void loop ()

{

for (int i=0;i<10;i++)

{

LedAcceso(i);

delay (1000);

}

}

Link al commento
Condividi su altri siti

qui c'è un primo pezzo da cui puoi prendere spunto...

unsigned char num; // numero da visualizzare

//array con la codifica per i display
unsigned char DISPLAY[10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};

void main(){
TRISA=0;
TRISB=0;
num=0;
for(;; ){
if(num==10)
num=0;
PORTB=DISPLAY[num];
num++;
Delay_ms(1000);
}
}

Modificato: da simuffa
Link al commento
Condividi su altri siti

come faccio ha gestire i pulsanti avanti e indietro (senza farlo avanzare in automatico)

Nel medesimo modo come fai con arduino, con la facilitazione che gli ingressi e le uscite in "C" le puoi anche tratare singolarmente a bits

Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco

CIOE ESEMPIO gli ingressi e le uscite in "C" le puoi anche tratare singolarmente a bits

#define BTN1 RA0 /
#define BTN2 RA1
#define A RB0
#define B RB1
#define C RB2
#define D RB3
#define E RB4
#define F RB5

#define G RB6
Modificato: da Alessandro Dj-alex Turco
Link al commento
Condividi su altri siti

Alessandro Dj-alex Turco
// #include <p16f84.h>
#define BTN1 RA0 // pulsante PIU
#define BTN2 RA1 // pulsante MENO
#define a RB0 // led A_1
#define b RB1 // led B_2
#define c RB2 // led C_3
#define d RB3 // led D_4
#define e RB4 // led E_5
#define f RB5 // led F_6
#define g RB6 // led G_7
void LedAcceso(int n)
{
switch(n)
{
case 0:
PORTAbits.RB0=1;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=1;
PORTAbits.RB4=1;
PORTAbits.RB5=1;
PORTAbits.RB6=0;
break;
case 1:
PORTAbits.RB0=0;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=0;
PORTAbits.RB4=0;
PORTAbits.RB5=0;
PORTAbits.RB6=0;
break;
case 2:
PORTAbits.RB0=1;
PORTAbits.RB1=1;
PORTAbits.RB2=0;
PORTAbits.RB3=1;
PORTAbits.RB4=1;
PORTAbits.RB5=0;
PORTAbits.RB6=1;
break;
case 3:
PORTAbits.RB0=1;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=1;
PORTAbits.RB4=0;
PORTAbits.RB5=0;
PORTAbits.RB6=1;
break;
case 4:
PORTAbits.RB0=0;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=0;
PORTAbits.RB4=0;
PORTAbits.RB5=1;
PORTAbits.RB6=1;
break;
case 5:
PORTAbits.RB0=1;
PORTAbits.RB1=0;
PORTAbits.RB2=1;
PORTAbits.RB3=1;
PORTAbits.RB4=0;
PORTAbits.RB5=1;
PORTAbits.RB6=1;
break;
case 6:
PORTAbits.RB0=1;
PORTAbits.RB1=0;
PORTAbits.RB2=1;
PORTAbits.RB3=1;
PORTAbits.RB4=1;
PORTAbits.RB5=1;
PORTAbits.RB6=1;
break;
case 7:
PORTAbits.RB0=1;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=0;
PORTAbits.RB4=0;
PORTAbits.RB5=0;
PORTAbits.RB6=0;
break;
case 8:
PORTAbits.RB0=1;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=1;
PORTAbits.RB4=1;
PORTAbits.RB5=1;
PORTAbits.RB6=1;
break;
case 9:
PORTAbits.RB0=1;
PORTAbits.RB1=1;
PORTAbits.RB2=1;
PORTAbits.RB3=1;
PORTAbits.RB4=0;
PORTAbits.RB5=1;
PORTAbits.RB6=1;
break;
}
};
void loop ()
{
for (int n=0;n<10;n++)
{
LedAcceso(n);
delay (1000);
}
}
void main()
{
/* Insert your code here. */
}
>>>>> NON VA DOVE HO SBAGLIATO
Link al commento
Condividi su altri siti

il main è la prima funzione che parte.. e nel tuo non c'è nulla

hai riscritto tutto questo per rifare semplicemente quello che ti ho messo nell'esempio? :blink:


hai definito le variabili poi usi PortA? bastava che scrivessi a=1; ad esempio (dovevi usare portB comunque)

Modificato: da simuffa
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...