je suis débutant dans la programmation en C et dans les microcontrolleurs. J'ai récupéré un PIC 16F877 et j'essaie de le programmer avec CCS. Voici mon code :
TRISB = 0x00 ; //sorties B
TRISA = 0xFF ; //entrées A
while(1)
{ if (BO ==1 && BF !=1 && BA !=1) // il faut bouton ouverture
{
SO = 1 ; // ouverture
}
else if (BO!=1 && BF==1 && BA!=1) // il faut bouton fermeture
{
SF = 1 ; // fermeture
}
else
{
SO = 0; // arret
SF = 0;
}
}
system("PAUSE");
}
Le problème c'est qu'en lançant la compilation j'ai une erreur à "TRISB = 0x00;" il me marque Undefined identifier -1 is not 0..255 TRISB. Que celà veut-il bien dire ?
J'ai essayé d'inclure la libraire <16F877.h> au début, je l'ai mis d'ailleurs dans le répertoire où j'ai placé mon programme, mais quand je lance la compilation, il m'ouvre le 16f877.h et me dit la même erreur. Je n'ai rien touché à la programmation des boutons dans le pannel lorsque l'on créer un projet, j'ai laissé input AO PIN_AO (je sais pas si vous voyez ce que je veux dire, au cas où dites moi et je vous ferais un copier d'écran )
D'où viens le problème ?
Merci d'être indulgent avec moi, je débute dans cette programmation et c'est pas toujours facile de passer de la théorie à la pratique
Bonjour
LE compilateur a pris la syntaxe "TRISA" comme une variable, je crois bien que c'est un probleme de syntaxe, dans la version de CCS que j'ai utilisé, pour définir les ports la syntaxe est: set_tris_a(0x00), set_tris_c(0xff) ...ect.
Pour le reste, je n'ai pas vu le
Pour ce qui est de tes define porta.0 ...ect...
Je ne crois pas que ce soit la bonne syntaxe aussi, en ouvrant le 16f877.h tu trouveras
#define pin_a0
#define pin_a1
A vérifier bien sur.
PS: Ece que tu es sur que tu compile avec CCS, car cette syntaxe je l'ai deja vu mais c'etait dans un autre compliateur.
Bon courage.
18/01/2008 - 15h30
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Merci pour votre réponse effectivement àa va bien meix comme ça :
set_tris_b(0x00) ; //sorties B
set_tris_a(0xFF) ; //entrées A
while(1)
{ if (BO ==1 && BF !=1 && BA !=1) // il faut bouton ouverture
{
SO == 1 ; // ouverture
}
else if (BO!=1 && BF==1 && BA!=1) // il faut bouton fermeture
{
SF == 1 ; // fermeture
}
else
{
SO == 0; // arret
SF == 0;
}
}
system("PAUSE");
}
En faite je n'avais pas fait attention pour les 0x00, j'avais mis des o au lieu des 0 ... forcément ça coince... erreur de débutant et je n'avais pas mis les doubles égales pour SO ==1 par exemple.
Par contre je n'ai pas mis <16F877.h> dans le programme; quand je le met, quand je compile il m'ouvre le 16F877.h et me marque en bas : "Can not change device type this far into the code -1 is not 0..255".
Donc en gros, je ne sais pas si mon code marche vraiment vu que je n'ai pas mis <16F877.h> dans mon programme, par contre je l'ai mis dans le répertoire où il y a mon programme que je crée.
Et enfin, oui je compile avec CCS
Merci en tout cas pour votre aide
18/01/2008 - 18h34
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Quelqu'un aurait-il une idée ? Ou me confirmer si le programme est bon ?
19/01/2008 - 07h43
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Une petite aide s'il vous plaît ?
Je ne suis vraiment pas sûr que mon programme marche vu que je n'ai pas mis le <16F877.h>
Bonjour
Quece que tu as dans le fichier "#include "D:\Terminale\PPE\programm eC\3 boutons\1er test.h"" ?
- Les doubles égalité sont utilisés dans les test
exemple
Code:
if (input(pin_c1)==1) then ....
Je ne crois pas que ca marche si tu ecrit pin_c1==1 ou SO==1 ...ect
La simple égalité est utilisé lors des affectations
exemple
Code:
X=input_a();
, X est une variable sur un octet
Pour affecter une sortie sur une pin ou sur un port utilise
Code:
output_high(pin_a0)
sur une pin ou bien
Code:
output_a(0xFF);
sur un port
Voila voilou
Bon courage, et essai de lire le help de CCS il t'informera plus que moi. Générallement il y'a des exemples essai de lire pour voir un peu comment ca marche
19/01/2008 - 10h24
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Bonjour, je viens donc de suivre vos recommandations, j'ai donc tapé ce code :
Le code se compile et marche apparemment, mais quand j'inclus la librairie <16F877.h>, il me l'ouvre et me met toujours la même erreur :"Can not change device type this far into the code -1 is not 0..255".
Mais c'est quand même bizarre qu'on ne puisse pas faire de #define pour dire que pin_ao correspond a BO par exemple...
Par contre je n'ai pas compris ce que vous vouliez dire par :
"X=input_a();
, X est une variable sur un octet"
Merci encore
19/01/2008 - 15h17
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Quelqu'un saurait-il si mon code est bon ? C'est quand même bizarre que je ne puisse pas mettre l'include <16F877.h>.
A noté que dans le dossier où il y a mon programme, il y a les fichiers crées par le projet et j'ai rajouté le fichier 16f877.h
EDIT: en faite je pense que c'est bon dans mon fichier test2.h il y a deja l'include 16f877.h
Dernière modification par Panda184 ; 19/01/2008 à 15h22.
19/01/2008 - 15h49
HULK28
Date d'inscription
janvier 2006
Localisation
IDF
Messages
10 256
Re : Programmer 16F877 avec CCS
Salut,
X=input_a();
en principe on écrit pas ça en C, mais bon certain compilateur sont très permissif...
Si X est un entier par exemple et que input_a() est défini telle que:
int input_a(char *chaine);
La fonction input_a() retournera un entier et prendra un pointeur en argument de type char, dans ce cas écrire:
X=input_a(chaine); est correct
Sinon pour <16F877.h> je pense qu'il n'est pas utile de le mettre dans CCS, il faut regarder la doc du compilo comme le conseille SyNeRgY.
"Le temps met tout en lumière." Thalès
19/01/2008 - 16h14
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Merci pour cette petite mise au point, je vais simuler ce programme sous isis dans la semaine, je pense que ce sera bon.
Juste une chose concernant les micronctrolleurs. Comment recevoir et traiter dans un microcontrolleur le pic 16F877 des données reçus par rs232. Je veux dire que j'envoie des données hexadécimal depuis mon pc vers mon microcontrolleur via le rs232, comment faire pour traiter ces données en C.
Je pense qu'il faut mettre certaines données du rs232 au début dans les initialisation, nombre de bit de données, la vitesse ... peut-être une librairie en plus même non ?
Si j'envoie par exemple 6F par mon pc vers mon microcontrolleur, comment faire pour qu'il comprenne que si il reçoit 6F en entrée sur le port A (a moins qu'il y ait un port spécifique au rs232), alors la sortie C1 sera activé. C'est juste un exemple basique mais avec celui-ci je pourrais développer mon programme seul, il faut juste me lancer en quelque sorte
C'est peut être :
if(input(pin_a1)==6F)
alors....
mais je n'y crois pas vraiment, ça serait trop simple à mon gout...
Merci pour votre aide
19/01/2008 - 16h29
HULK28
Date d'inscription
janvier 2006
Localisation
IDF
Messages
10 256
Re : Programmer 16F877 avec CCS
Il faut utiliser l'USART intégré dans le PIC, il faudrait que tu consultes la doc déjà pour voir comment il fonctionne.
La doc est bien faite, ensuite une fois configurer tu dois utiliser des buffers de transmission pour stocker les datas qui arrivent ou qui doivent partir.
Il faut également traiter par interruptions certaines séquences.
Je vais voir ce que je peux te transmettre comme exemple.
@+
"Le temps met tout en lumière." Thalès
19/01/2008 - 16h56
HULK28
Date d'inscription
janvier 2006
Localisation
IDF
Messages
10 256
Re : Programmer 16F877 avec CCS
Je te l'ai envoyé par MP.
@+
"Le temps met tout en lumière." Thalès
23/01/2008 - 16h15
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Bonjour à tous, j'ai simulé mon programme sur ISIS et je deviens fou !! Rien ne marche. Je n'arrive même pas à allumer une DEL lors de la simulation avec un bouton poussoir qui agit sur le PIC.
J'ai tout essayé, des dizaines et des dizaines de programme et là je m'en remet à vous, CCS va me rendre fou !!
Quelqu'un aurait-il un programme tout bête sur CCS qui permet quand une entrée est alimentée alors le microcontrolleur PIC16F877 ouvre une sortie.
J'ai vraiment essayé toutes les syntaxes possibles et imaginables et je comprend pas pourquoi mon entrée lors de la simulation n'est pas alimentée quand je ferme mon bouton poussoir.
J'ai déjà fait plusieurs montages sous ISIS avec d'autres microcontrolleurs et d'autres compilateur mais là CCS me rend fou, j'aurais bien utiliser MPLAB mais CCS est obligatoire...
quelqu'un aurait-il une idée juste pour définir les entrée sorties et la boucle qui quand j'alimente l'entrée B1 par exemple alors la sortie C1 est alimentée.
Merci infiniment.
23/01/2008 - 18h43
Panda184
Date d'inscription
janvier 2008
Messages
50
Re : Programmer 16F877 avec CCS
Quelqu'un aurait-il une idée parceque là je ne comprend plus rien...
J'ai bien essayé de mettre les set_tris... pour parametrer les ports d'entrées et de sorties, j'ai fait des boucles en while et if pour scruter l'etat d'un bouton poussoir, j'ai mis les sorties sous la forme de output_high(...).
Mais rien ne marche...
Merci vraiment pour votre aide.
23/01/2008 - 20h23
SiNeRgY
Date d'inscription
mai 2007
Localisation
Alger
Âge
31
Messages
115
Re : Programmer 16F877 avec CCS
Bonsoir
Voila, j'ai repris ton code initial et je l'ai corigé un peu.
Code:
#include <16f877.h>
#include <stdio.h>
#include <stdlib.h>
#define BO pin_a0
#define BF pin_a1
#define BA pin_a2
#define SO pin_b0
#define SF pin_b1
void main(void)
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1) ;
set_tris_b(0x00) ; //sorties B
set_tris_a(0xFF) ; //entrées A
output_b(0x00);//init du port lors du démarrage.
while(1)
{
if (((input(BO) ==1) && (input(BF) ==0)) && (input(BA)==0 )) // il faut bouton ouverture
output_high(SO) ; // ouverture
else
{
if (((input(BO)==0) && (input(BF)==1)) && (input(BA)==0)) // il faut bouton fermeture
output_high(SF) ; // fermeture
else
{
output_low(SO); // arret
output_low(SF);
}
}
}
}
Je l'ai simulé avec ISIS et ca marche très bien. Je ne connais pas vraiment ta table de vérité ou la justesse de l'algorithme, mais ca devrai t'aider a te familiariser avec la syntaxe de CCS.
Je t'envoie aussi le fichier .hex et essai le.
PS: Enleve l'extension .txt