Aller au contenu


Photo
- - - - -

help!!! pic18f et led


17 réponses à ce sujet

#1 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 29 décembre 2010 - 10:10



j'ai reçu enfin reçu mon pickit2 pour programmer des pics vu que suis que j'avais fais moi même ne fonctionné pas,

et j'ai un soucis j'ai cherché de droite à gauche sur gogOle des programmes simple clignoté ou allumer simple leds mais le peu que j'ai trouvé ne se ressemble pas les uns des autres et pourtant c'est bien du C !! la j'y comprend plus rien !!! et même les tutos pour mplbab C18 tous sont différents !! :(

j'ai essayé de programmer un petit programme pour allumer une led mais apparement il ne fonctionne pas :(


c'est celui ci :




#define duree LED RB1

void main(void)
{
TRISB = 0x00;
LED=1;
}[/code]


je l'ai trouvé sur un site mais il me semble bizarre, comparer a sa qui est le minimum pour un programme en c, il y a des choses en moins??




#define duree 10000

void tempo(unsigned int count);

void main(void)
{
PORTB = 0x00;
TRISB = 0x00;
while(1) {
PORTB++;
tempo(duree);
}
}

void tempo(unsigned int compte)
{
while(compte--);
}[/code]


enfin voilou je demande votre aide celà fait une journée que je suis dessus que je cherche des tutos, des programmes simple mais pas grand chose, je ramme :heu: et pourtant j'essaye mais là je sais plus par ou chercher.... :heu:


merci d'avance à tous de votre aide ;)

#2 zeqL

zeqL

    Membre passionné

  • Membres
  • PipPipPip
  • 393 messages
  • Gender:Male

Posté 30 décembre 2010 - 02:23

#define duree LED RB1

Si tu sais faire du C, tu comprendras :)

Sinon le include doit correspondre au pic que tu possède. Tu ne pas mettre un include d'un pic16F887A pour un pic18F par exemple. Ni celui d'un PIC18F452 pour un pic 18F4550.

#3 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 30 décembre 2010 - 10:28

Salut !



Pour le premier code qu'on a du faire à l'école, clignotement d'un PORT du microcontrôleur et donc de 8 LED sur un PIC 16F887, ça a donné ça comme code :




{

PORTC = 0xAA; //initialise le PORTC à 1 (allume toutes les LED du PORTC

TRISC = 0; //défini le PORTC comme étant des sorties

ANSELH = 0; //configure les entrées, 0=digitales

ANSEL = 0; //configure les entrées, 0=digitales



for (;;) //boucle infinie

{

delay_ms(500); //délai d'une demi seconde

PORTC = ~PORTC; //inverse le PORTC

}

}[/code]



Si l'anglais ne te rebute pas, il y a pas mal de documents bien faits sur le net.

Par exemple, sur le site de MikroElektronika (on utilise leurs cartes à l'école...) tu as de bonnes explications.



Et tant qu'on est là... Quelle est la différence entre ANSEL et ANSELH ? :D

#4 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 30 décembre 2010 - 06:31

merci à tous de votre aide, du coup je me suis servis de vos petit programmes et avec ce que j'ai trouvé sur le net pour refaire un programme pour allumer une simple led comme je n'aime pas prendre quelque chose de tout fait et ne pas comprendre ce que je fais !!!

donc voici le programme pour une simple led pour un pic18f452



#define LED RB1

void tempo(unsigned int count);

void main(void)
{
PORTB=0x00;
TRISB=1;
}

void tempo(unsigned int compte)
{
while(compte--);
}[/code]


il fonctionne sous mplab celui ci m'a marqué "succesfull" un truc dans le genre loool

par contre petite question:

- j'ai compris que si je me trompe pas qu'il faut définir le port du pic à utliser ici c'est RB1 donc
TRISB=1;[/code]

et non pas TRISRB1=1; [/code]

??? comme ma sortie est RB1 ???


je l'ai bien exporté dans mon pickit et celui l'a mis dans mon pic18f452 là dessus pas de soucis apparement,

par contre j'ai fais le cablage et je n'ai pas de condensateur 100nf à mettre entre vdd et vss, est il indispensable?

malgès sa j'ai quand même fais mon cablage et lorsque je l'ai alimenté ma led s'allume à peine, je crois qu'il ya un soucis !! lool

et j'avais pas vu j'avais oublié de mettre le VVS au - de mon alim 5V et la plus rien ne fonctionne ???? pourquoi???



voilà des questions d'un débutants en programmation sachant que je n'ai programmé avant en C


merci d'avance à tous ;) ;) ;) ;)

#5 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 30 décembre 2010 - 07:49

On met effectivement PORTB = 0x00 et non pas PORTRB1 = 0x00.
Pourquoi il n'y a pas le R ? Très bonne question, je n'ai pas la réponse...

Par contre, on ne met pas le 1 car quand tu fais PORTB = 0x00, tu initialise d'office tout le port à 0.
(0x00, c'est une valeur en hexadécimal. Si tu mets ça en binaire, ça te donne 0b00000000.)
Ça n'a aucun intérêt d'initialiser chaque broche du port une à une... ;)

Tu sais poster une photo de ton montage ? Ou le schéma que tu utilises ? Tes explications ne sont pas très claires...


Et pour le fait de ne pas avoir programmé en C avant, c'est une erreur. :D C'est une étape intéressante pour tout ce qui est logique, utilisation de boucles, de conditions, tableaux, ... Une fois ces concepts bien compris et testé en C "classique", tu peux mieux appréhender le monde des µC.


Bonne continuation

#6 zeqL

zeqL

    Membre passionné

  • Membres
  • PipPipPip
  • 393 messages
  • Gender:Male

Posté 30 décembre 2010 - 08:30

PORTB correspond à un registre de 8 bits et chaque bit correspond à une des sorties du port B
Même chose pour TRISB.

Ensuite PORTB est un define qui se trouve dans le pic18FXXXX.h il correspond à l'adresse physique en mémoire du registre.

normalement tu peux utiliser des defines du style RB1 pour acceder au 2e bit du port B. Tout est dans le PIC18FXXXX.h

J'ai envie de te dire de regarder la datasheet du pic, c'est quand même la première chose à faire avant de se lancer tête baissée dans le code.

#7 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 30 décembre 2010 - 10:53


merci de vos explications,



pour la photos du montage je préfère pas lol c'est tous monté en fil volant sur une plaque de polystirène donc un peu honte loool !!!!





mais voici mon schéma que j'ai fais seul mais je sais pas du tout si il fonctionne ou pas vu que j'ai refais mon montage ce soir et rien du tout ne s'allume,





http://www.servimg.com/image_preview.php?i=142&u=11194312

Image IPB





voilou merci de votre aide ;) ;)

#8 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 31 décembre 2010 - 10:48

Première chose, il te manque un bouton avec une résistance de pull-up pour ton reset. (MCLR)

Je ne suis pas sûr que c'est ce qui l'empêche de fonctionner, mais tout de même, c'est important !



Tiens ? Quelqu'un sait comment mettre un surlignage au dessus de MCLR ?





Pour le reste, c'est dans ton code qu'il y a un problème je pense...







#define LED RB1



void tempo(unsigned int count);



void main(void)

{

PORTB=0x00;

TRISB=1;

}



void tempo(unsigned int compte)

{

while(compte--);

}[/code]



Il n'y a aucun moment où tu changes l'état de la broche RB1...

#9 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 31 décembre 2010 - 12:39

oui c'est ce que je me suis di c'est pour sa j'ai essayé un autre programme celui ci fait clignoté une simple led sur un pic 18F452

le voici :

#include // fonctions de délais
#include // déclarations pour le PIC18F452

void main (void)
{
// on configure le pin 0 du port A en sortie
TRISAbits.TRISA0 = 0;

while(1)
{
// on allume la led en mettant le pin 0 à l'état haut
PORTAbits.RA0 = 1;
// on attends environ 0,25s à 40Mhz
Delay10KTCYx(0);
// on éteint la led en mettant le pin 0 à l'état bas
PORTAbits.RA0 = 0;
// on attends environ 0,25s à 40Mhz
Delay10KTCYx(0);
}

} [/code]

c'est un code prit sur un site internet quelques peu modifié, par contre j'ai mis un quartz à 20mhz au lieu de 40mhz celà à peut être une influence?

ah et je ne met pas de condensateur 100nf peut être aussi a une influence vu que je n'en n'ai pas

je suis un peu perdu je suis resté la matinée devant mon montage et ma programmation mais rien ne sais passé

ah oui lors ce que je programme mon pic je quitte le programme pickit2 directement par "exit" et je débranche tout, peut être sa déprogramme mon pic ?

voilà encore merci de votre aide

#10 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 01 janvier 2011 - 09:55

donc j'ai à nouveau ressayé de programmé un pic cette fois si un 18F4550 avec un quartz de 20mhz et faire clignoté une simple led

et cette fois la led s'allume !!! mais ne clignote pas ?? loool

voici mon programme sous mikroc

PORTB = 0;
TRISB = 0; // configure les pin du portb en sortie
while (1) { // répète en boucle indéfiniment
PORTB = ~PORTB; // bascule les leds du portb
Delay_ms(1000); // clignote toutes les 1 seconde
}
}[/code]


au moins sa s'allume loool !!!

#11 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 01 janvier 2011 - 10:27

Pas de majuscule au "delay_ms(1000);". ;)
[edit: Je viens de me rendre compte que sur un autre code j'ai un "Delay_ms(...);", avec une majuscule donc. Ça ne doit pas être ça ton problème...]

Et si ça ne marche toujours pas, essaye de faire avec une boucle
{
...
}[/code]

[edit : Peut-être aussi que c'est parce que tu as oublié d'initialiser ANSELH et ANSEL
ANSEL = 0; //configure les entrées, 0=digitales[/code]

J'ai déjà mis le code plus haut, ça serait bien que tu regardes... Et que tu essayes tout d'abord de faire marcher celui-là avant de faire tes propres codes...

#12 zeqL

zeqL

    Membre passionné

  • Membres
  • PipPipPip
  • 393 messages
  • Gender:Male

Posté 02 janvier 2011 - 12:44

Non ANSELH et ANSEL sont facultatifs.

Par défauts ces registres, comme les PORTX sont à 0. Notamment les PORTX qui sont d'office mis à zero, donc en sortie, car une patte mis en entrée sans charge au démarrage du pic = courant infini = boom.

Néanmoins on redéfini quand même les PORTX, pour être sûr.

On peut le faire avec tous les registres aussi, mais bon c'est un peu rébarbatif.

#13 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 02 janvier 2011 - 11:28

Merci pour ce complément d'informations. Effectivement, c'est d'une logique parfaite. Mais il fallait y penser!

Je sens que je vais rajouter cette information dans mon rapport moi...

#14 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 03 janvier 2011 - 11:12

sayé ma led clignote enfin !!!!

je crois que vu que je fais sa sur un montage sur un morceau de carton il y a des petits soucis de connexion, comme je n'ai pas encore de platine d'essai je me débrouille comme je peux

une petite photo même si il y a rien d'exeptionnel à faire clignoter une leds

merci à vous tous de m'avoir aidé !!!


http://i39.servimg.com/u/f39/11/19/43/12/dscf6110.jpg

;) ;) ;)

prochaine étape ..euh je sais pas lol mais je suis content

#15 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 04 janvier 2011 - 10:03

Eh bien c'est du Spartiate chez toi... :D
Mais si ça marche...

Prochaine étape ? Clignoter plusieurs LED avec des tempos ? Chenillard ?

Bonne continuation !


Et juste un conseil : achète une breadboard ! (Sur ebay, ça vaut pas cher du tout !)

#16 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 04 janvier 2011 - 05:29

oui c'est du spartiate lool d'ailleurs je vais commandé une platine d'essai car mon montage ne fonctionne pas toujours...

sayé j'ai trouvé mon prochain petit TP

alors le voici du comment que je vais essayé de faire

un pic 18f4550
un bouton poussoir qui quand j'appuierais dessus allumera une led verte et restera allumé et quand j'appuierais à nouveau s'éteindra
un bouton poussoir qui quand j'appuierais dessus allumera une led jaune et restera allumé et quand j'appuierais à nouveau s'éteindra
un bouton poussoir qui quand j'appuierais dessus allumera une led rouge et restera allumé et quand j'appuierais à nouveau s'éteindra

voilou j'ai cherché des schémas et des programme mais pas trouvé grand chose j'ai trouvé celui ci dans le compilateur mikroc mais je n'y comprend pas grand chose ? si quelq'un pouvait m'éclaircir un peu sur olsdate, adcon ,cmcon et le reste c'est à peut près compris

si je me trompe pas normalement il faut que je mette 3 entrée input sur 3 pins différent pour les boutons poussoirs et 3 sortie outpout sur 3 pins différent pour les leds et si j'ai compris il faut que je définisse les bouton poussoir à 0 et que la led soit éteinte et que si le bouton poussoir passe à 1 que la led s'allume et tous sa en boucle "while" il me semble

le voici :


void main() {

ADCON1 |= 0x0F; // Configure AN pins as digital
CMCON |= 7; // Disable comparators

TRISB0_bit = 1; // Set pin as input

TRISC = 0x00; // Configure PORTC as output
PORTC = 0xAA; // Initial PORTC value
oldstate = 0;

do {
if (Button(&PORTB, 0, 1, 1)) { // Detect logical one
oldstate = 1; // Update flag
}
if (oldstate && Button(&PORTB, 0, 1, 0)) { // Detect one-to-zero transition
PORTC = ~PORTC; // Invert PORTC
oldstate = 0; // Update flag
}
} while(1); // Endless loop
}[/code]


merci d'avance ;) ;) ;) ;) ;) ;) ;)

#17 pickitbot

pickitbot

    Membre

  • Membres
  • 28 messages

Posté 04 janvier 2011 - 11:46

sayé j'ai commencé le code de mon programme 3 boutons poussoirs et 3 leds le voici



sortie = 0; // initialise les pins du microcontroleur.
TRISB = 0b00000111; // défini les 3 boutons poussoirs en entré "1" RB0,RB1,RB2; défini les 3 leds en sortie "0" RB3,RB4,RB5;
for (;;){ // la suite du programme s'effectue en boucle.

if (PORTB-0==0) // si je lis 0 sur le bit 0 du portb.
(PORTB-1==0) // si je lis 0 sur le bit 1 du portb.
(PORTB-2==0) // si je lis 0 sur le bit 2 du portb.

{
PORTB-3==1; // alors j'envoie 0 sur le bit 3 du portb. (led éteinte)
PORTB-4==1; // alors j'envoie 0 sur le bit 4 du portb. (led éteinte)
PORTB-5==1; // alors j'envoie 0 sur le bit 5 du portb. (led éteinte)
}
else // sinon si je lis 1 sur le le bit 3,4,5 du portb.

{
PORTB-3=1; // alors j'envoie 1 sur le bit 3. (led allumé)
PORTB-4=1; // alors j'envoie 1 sur le bit 4. (led allumé)
PORTB-5=1; // alors j'envoie 1 sur le bit 5. (led allumé)
}


}

}[/code]




donc déjà je voudrais votre avis sur ce que j'ai écris si c'est juste et logique ou pas du tout sachant que j'ai fais le programme seul en lisant les tuto sur robotix et quelques autres exemple sur d'autre sites


j'ai lu le tuto sur les interruption et j'ai cherché
ENABLE pour autoriser l'interrutpion sur le PORTB pour les boutons poussoirs RB0,1,2 et il faut le mettra à l'état "1" si j'ai bien compris
et
FLAG pour savoir si il y a un changement quelconque sur le port b des leds RB3,4,5 si il faut ou pas les allumer

sachant que j'ai cherché dans le datasheet qui suit de mon pic http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf
page 101 je trouve que deux bits pour le flag c'est à dire le 0 et le 2 pour le portb , sachant que j'ai besoin de 3 flag puisque j'ai 3 boutons poussoirs !! j'ai bien lu ou me suis je trompé ??

merci de m'éclaircir un peu ;) ;) ;) ;) ;) ;) ;) ;)

a oui je n'ai pas mis initializ encore dans mon programme mais je le mettrais plus tard

#18 fantaspic

fantaspic

    Nouveau membre

  • Membres
  • 4 messages

Posté 27 décembre 2015 - 10:27

Des réponses ici :

http://www.fantaspic.fr/index.php





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users