Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Pic16F Con Programma In C


Messaggi consigliati


  • Risposte 66
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Alessandro Dj-alex Turco

    36

  • simuffa

    13

  • Livio Orsini

    12

  • giacomo56

    2

Inserita:

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.

Alessandro Dj-alex Turco
Inserita:

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

Inserita: (modificato)

Che tipo di aiuto ti serve?

Che complilatore usi?

Più informazioni dai più fcilmente sarai aiutato.

Modificato: da Livio Orsini
Inserita:

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.

Inserita: (modificato)

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
Alessandro Dj-alex Turco
Inserita:

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

Inserita:

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.

Alessandro Dj-alex Turco
Inserita:

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

Inserita:
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.

Alessandro Dj-alex Turco
Inserita:

// 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

Alessandro Dj-alex Turco
Inserita:

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

}

}

Alessandro Dj-alex Turco
Inserita:

Nel messaggio 13 è assebler / assembly

ma devo farlo in C

Inserita: (modificato)

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
Inserita:
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

Alessandro Dj-alex Turco
Inserita: (modificato)

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
Alessandro Dj-alex Turco
Inserita:
// #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
Inserita: (modificato)

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
Alessandro Dj-alex Turco
Inserita:

PERO QUELLO CHE HAI POSTATO NON VA

Inserita:

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:

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

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




×
×
  • Crea nuovo/a...