Jump to content
PLC Forum


Sign in to follow this  
Alessandro Dj-alex Turco

Pic16F Con Programma In C

Recommended Posts

Alessandro Dj-alex Turco

vedi foto allegata

post-209878-0-70601700-1422193033_thumb.

Share this post


Link to post
Share on other sites

Livio Orsini

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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Livio Orsini

Che tipo di aiuto ti serve?

Che complilatore usi?

Più informazioni dai più fcilmente sarai aiutato.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
giacomo56

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.

Share this post


Link to post
Share on other sites
accacca

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.

Edited by accacca

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Livio Orsini

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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Livio Orsini
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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);

}

}

Share this post


Link to post
Share on other sites
Alessandro Dj-alex Turco

Nel messaggio 13 è assebler / assembly

ma devo farlo in C

Share this post


Link to post
Share on other sites
simuffa

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);
}
}

Edited by simuffa

Share this post


Link to post
Share on other sites
Livio Orsini
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

Share this post


Link to post
Share on other sites
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
Edited by Alessandro Dj-alex Turco

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
simuffa

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)

Edited by simuffa

Share this post


Link to post
Share on other sites
Alessandro Dj-alex Turco

PERO QUELLO CHE HAI POSTATO NON VA

Share this post


Link to post
Share on other sites
simuffa

il programma non l'ho fatto io.. l'ho preso da internet e funziona.. nel messaggio 5 di giacomo56 alla 3 riga probabilmente c'è la soluzione :smile:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...