Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Tension de Ref interme 1.024V, 2.048V, 4.096V avec Pic18F27K42
Bonsoir,
Je commence bien l'année avec 2 Pic18F27K42 qui ont l'entrée Adc de grillé par ma faute enfin, je crois ou j'ai mal compris.
J'explique un peu : pour configurer une tension de référence de 4.096V intérieur, j'ai configuré les registres comme ci-dessous
Le registre FVRCON se trouve en page 599 du datasheet
Le registre ADREF se trouve en page 624 du datasheet
Malgré cela mon entrée Adc à grillé quand j'ai injecté 3,50V, de plus je ne comprends pas en quoi consiste la configuration du registre FVRCON pour avoir une tension de référence de 4,096V
Quelle qu'un à t'il déjà essayé de se servir de cette tension de référence ?
Et, et t'elle précise ?
Et puis, c'est quoi FVR Buffer 1 Gain sur FVRCON ?
Hum.... je voudrais bien refaire un essai, mais je ne voudrais pas cramer un troisième Pic, d’où l’expression Jamais deux sans trois.
Merci pour vos réponses
A+
Je commence bien l'année avec 2 Pic18F27K42 qui ont l'entrée Adc de grillé par ma faute enfin, je crois ou j'ai mal compris.
J'explique un peu : pour configurer une tension de référence de 4.096V intérieur, j'ai configuré les registres comme ci-dessous
Code : Tout sélectionner
;------------------------- configuration du registre ADREF(bank 62) ----------------------------
movlw B'00000011' ; bit 0 et 1 : 11 = VREF+ est connecté au module interne de référence de tension fixe (FVR)
movwf ADREF ; bit 4 : 0 = VREF- est connecté au VSS
;------------------------- configuration du registre FVRCON(bank 62) ----------------------------
movlw B'10000000'
movwf FVRCON
Le registre FVRCON se trouve en page 599 du datasheet
Le registre ADREF se trouve en page 624 du datasheet
Malgré cela mon entrée Adc à grillé quand j'ai injecté 3,50V, de plus je ne comprends pas en quoi consiste la configuration du registre FVRCON pour avoir une tension de référence de 4,096V
Quelle qu'un à t'il déjà essayé de se servir de cette tension de référence ?
Et, et t'elle précise ?
Et puis, c'est quoi FVR Buffer 1 Gain sur FVRCON ?
Hum.... je voudrais bien refaire un essai, mais je ne voudrais pas cramer un troisième Pic, d’où l’expression Jamais deux sans trois.
Merci pour vos réponses
A+
Modifié en dernier par Temps-x le sam. 12 févr. 2022 01:15, modifié 2 fois.
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir TempsX
As-tu Enable FRVCON ?
Ton PIC est-il alimenté en 5V .. condition pour choisir Vref 4,096V
Je ne vois pas comment on peut cramer une entree ADC .. avec 3..V
ici test ADC avec Vref 4,096V
en C
As-tu Enable FRVCON ?
Ton PIC est-il alimenté en 5V .. condition pour choisir Vref 4,096V
Je ne vois pas comment on peut cramer une entree ADC .. avec 3..V
ici test ADC avec Vref 4,096V
en C
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
Bonsoir paulfjujo,
Ouais il est bien alimenté en 5 volts, j'ai vu en page de la datasheet les conditions pour utiliser la Vréf interne : VDD > 4.75 volts, page 760 du datasheet
Voici la recette pour grillé l’entrée de votre Adc
C'est très simple, il suffit d'activé le bit 7 EN : Fixed Voltage Reference Enable bit et de ne pas activé les bit 0 et 1 ADFVR : FVR Buffer 1 Gain Selection bit
du registre FVRCON
Ça m 'aide pas beaucoup, car je vois pas les registres qui sont configurer, mais bon, tu as fais ce que tu pouvais...
Je viens de refaire un essai, à la volante... et sans grillé le pic... je trouve ceci
Si je mets
FVRCON = 10000001 je trouve pour 1,25 volts 4095
FVRCON = 10000010 je trouve pour 2,25 volts 4095
FVRCON = 10000011 je trouve pour 4,25 volts 4095
Comme mon montage est fait sur fils volant je vais admettre que c'est bon, mais à quoi sert les bits 2 et 3(CDAFVR) de FVRCON, Il n'y à pas 2 Adc non de diou.
Omis la chaleur du pic, est ce que cette tension de référence est stable et fiable ?
Merci
A+
paulfjujo a écrit :Source du message Ton PIC est-il alimenté en 5V
Ouais il est bien alimenté en 5 volts, j'ai vu en page de la datasheet les conditions pour utiliser la Vréf interne : VDD > 4.75 volts, page 760 du datasheet
paulfjujo a écrit :Source du message Je ne vois pas comment on peut cramer une entree ADC .. avec 3..V
Voici la recette pour grillé l’entrée de votre Adc
C'est très simple, il suffit d'activé le bit 7 EN : Fixed Voltage Reference Enable bit et de ne pas activé les bit 0 et 1 ADFVR : FVR Buffer 1 Gain Selection bit
du registre FVRCON
paulfjujo a écrit :Source du message ici test ADC avec Vref 4,096V en C
Ça m 'aide pas beaucoup, car je vois pas les registres qui sont configurer, mais bon, tu as fais ce que tu pouvais...
Je viens de refaire un essai, à la volante... et sans grillé le pic... je trouve ceci
Si je mets
FVRCON = 10000001 je trouve pour 1,25 volts 4095
FVRCON = 10000010 je trouve pour 2,25 volts 4095
FVRCON = 10000011 je trouve pour 4,25 volts 4095
Comme mon montage est fait sur fils volant je vais admettre que c'est bon, mais à quoi sert les bits 2 et 3(CDAFVR) de FVRCON, Il n'y à pas 2 Adc non de diou.
Omis la chaleur du pic, est ce que cette tension de référence est stable et fiable ?
Merci
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous
Oui, mais il y a un DAC .. sortie analogique voir fig 34.1 de la datasheet et CDAFVR
Hypothèse ( non vérifiée,j'y tiens ,à mes 18F27K42 !)
Est-ce qu'une entrée qui semblerait être configurée comme une entrée analogique ADC , mais qui en realité serait une sortie DAC
peut etre mourru si on injecte une tension de 3V ( encore faut-il que le generateur de tension soit à faible impedance de sortie
pour pouvoir delivrer un courant >quelques mA...)
Comme mon montage est fait sur fils volant je vais admettre que c'est bon, mais à quoi sert les bits 2 et 3(CDAFVR) de FVRCON,
Il n'y à pas 2 Adc non de diou.
Oui, mais il y a un DAC .. sortie analogique voir fig 34.1 de la datasheet et CDAFVR
Hypothèse ( non vérifiée,j'y tiens ,à mes 18F27K42 !)
Est-ce qu'une entrée qui semblerait être configurée comme une entrée analogique ADC , mais qui en realité serait une sortie DAC
peut etre mourru si on injecte une tension de 3V ( encore faut-il que le generateur de tension soit à faible impedance de sortie
pour pouvoir delivrer un courant >quelques mA...)
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
Bonjour paulfjujo, et tout le forum,
Ah... enfin je sais à quoi sert les bits CDAFVR du registre FVRCON, avec la figure ci-dessus en comprend tout de suite.
Je ne pense pas que c'est ça car
L'injection sur l'entrée Adc était de 3.5 volts sous 500 µA, de plus, seule le bits EN du registre FVRCON était activé, tout les autres bit du registre FVRCON été à zéro.
Maintenant, J'ai fait une sécurité dans le programme, quand la valeur Adc atteint le maximum(4095) le programme ne lit plus l'adc et une led de couleur rouge s'allume, jusqu’à redémarrage du pic, je pense que tout le monde devrait faire cela pour éviter de détruire l'entrée de l'adc.
C'est quoi ce bit RDY du registre FVRCON
PS : les 2 pic qui ont l'adc détruit son encore utilisable, et se programme très bien, donc ils n'iront pas à déchetterie.
A+
paulfjujo a écrit :Source du message Oui, mais il y a un DAC .. sortie analogique voir fig 34.1 de la datasheet et CDAFVR
Ah... enfin je sais à quoi sert les bits CDAFVR du registre FVRCON, avec la figure ci-dessus en comprend tout de suite.
paulfjujo a écrit :Source du message Est-ce qu'une entrée qui semblerait être configurée comme une entrée analogique ADC , mais qui en realité serait une sortie DAC
peut etre mourru si on injecte une tension de 3V
Je ne pense pas que c'est ça car
L'injection sur l'entrée Adc était de 3.5 volts sous 500 µA, de plus, seule le bits EN du registre FVRCON était activé, tout les autres bit du registre FVRCON été à zéro.
Maintenant, J'ai fait une sécurité dans le programme, quand la valeur Adc atteint le maximum(4095) le programme ne lit plus l'adc et une led de couleur rouge s'allume, jusqu’à redémarrage du pic, je pense que tout le monde devrait faire cela pour éviter de détruire l'entrée de l'adc.
C'est quoi ce bit RDY du registre FVRCON
PS : les 2 pic qui ont l'adc détruit son encore utilisable, et se programme très bien, donc ils n'iront pas à déchetterie.
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous,
je ne vois pas comment l'injection de 500µA puisse detruire une entrée PIC
à part un generateur de tension pouvant debiter > 20mA directement sur l'entree
il y a quand meme des protections sur les dites entrees.. et les diodes de clampage sont prevue pour le depassement tension d'alim .
je pense qu'il y a autre chose ...
Peux-tu poster ton "code Killer" .
. je suis pret à le tester ,quitte à bousiller une entree..
L'injection sur l'entrée Adc était de 3.5 volts sous 500 µA,
je ne vois pas comment l'injection de 500µA puisse detruire une entrée PIC
à part un generateur de tension pouvant debiter > 20mA directement sur l'entree
il y a quand meme des protections sur les dites entrees.. et les diodes de clampage sont prevue pour le depassement tension d'alim .
je pense qu'il y a autre chose ...
Peux-tu poster ton "code Killer" .
. je suis pret à le tester ,quitte à bousiller une entree..
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
Bonjour paulfjujo, et tout le forum,
Code très Dangereux, il faut porter un masque pour y toucher et être vacciné
Voici la version qui à muté le variant Omicron du code Killer Code Killer
Ne faite pas ça chez vous.
J'ai fait une protection dans le programme pour éviter la destruction de l'entrée Adc, dans le programme Code Killer
Bon, de toute façon j'ai trouvé d’où venait le problème, il faut impérativement configurer le registre FVRCON correctement sinon, détruction
de l'entrée Adc
A+
Code très Dangereux, il faut porter un masque pour y toucher et être vacciné
Voici la version qui à muté le variant Omicron du code Killer Code Killer
Ne faite pas ça chez vous.
J'ai fait une protection dans le programme pour éviter la destruction de l'entrée Adc, dans le programme Code Killer
Bon, de toute façon j'ai trouvé d’où venait le problème, il faut impérativement configurer le registre FVRCON correctement sinon, détruction
de l'entrée Adc
paulfjujo a écrit :Source du message . je suis pret à le tester ,quitte à bousiller une entree..
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Temps-X et à tous,
Je suis en train de regarder ton code Killer ADC,
pour verifier si je peux en griller un !
As-tu un schema de connection du PIC ?
pour confirmer la configuration de celui ci
L'entree ADC est -elle bien RC3 ?
car au debut
puis c'est RA7 ?
movlw B'00000111' ; sélection du canal du convertiseur analogique (RA7)
movwf ADPCH ;
L'envoi data au LCD se fait en mode 4bits mais avec les bits inversés et de plus
commentaire sur Port A au lieu de port B ?
se serait donc RB0,RB1,RB2,RB3 ?
ce qui est ci dessous ,pourrait confirmer un ordre de bits inversé sur le quartet de commande,
car à l'endroit donne 0x20
Bizarre et pas tres logique cette fonction d'envoi sur LCD ....ou tout du moins tres inhabituelle..
je vais attendre ton schema, pour me mettre dans les memes conditions de test ..
A+
Je suis en train de regarder ton code Killer ADC,
pour verifier si je peux en griller un !
As-tu un schema de connection du PIC ?
pour confirmer la configuration de celui ci
L'entree ADC est -elle bien RC3 ?
car au debut
Code : Tout sélectionner
movlw B'00001000' ; mode numérique : 14(RC3)
movwf ANSELC
puis c'est RA7 ?
movlw B'00000111' ; sélection du canal du convertiseur analogique (RA7)
movwf ADPCH ;
L'envoi data au LCD se fait en mode 4bits mais avec les bits inversés et de plus
commentaire sur Port A au lieu de port B ?
se serait donc RB0,RB1,RB2,RB3 ?
Code : Tout sélectionner
#DEFINE lcd_port LATB ; D7 ==> RA0
; D6 ==> RA1
; D5 ==> RA2
; D4 ==> RA3
#DEFINE lcd_rs LATA,6 ; RS ==> RA6
#DEFINE lcd_e LATA,7 ; E ==> RA7
ce qui est ci dessous ,pourrait confirmer un ordre de bits inversé sur le quartet de commande,
car à l'endroit donne 0x20
Code : Tout sélectionner
ini_lcd
movlw B'00000100' ; D5 // 0x04 inversé donne 0x20
call envoi ; mode 4 bits
call e_pulse
Bizarre et pas tres logique cette fonction d'envoi sur LCD ....ou tout du moins tres inhabituelle..
je vais attendre ton schema, pour me mettre dans les memes conditions de test ..
A+
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
Bonsoir paulfjujo et à tous,
Bonne appétit...
Je viens de le faire, le voilà
Ben ouais, c'est bien ça, ANSELC est bien sur RC3
Exacte, mais plus bas je le remets sur RC3,
Dans celui que j'ai mi j'ai bien #DEFINE lcd_port LATA ; D7 RA0 tu as du toucher au fichier sans t'en rendre compte.
Les bits d'envois son bien inverser, et c'est fait exprès, pour éviter d'avoir un PCB trop compliquer, pour moi ça change rien car le LCD fonctionne bien, faut penser en 3 dimensions....
Avec l'asm, on peut faire un peu ce qu'on veut, et puis je le sais, je suis un peu tordue, tu as eu la même réflexion que Gérard qui croyait pas que ça pouvait fonctionner comme ça, et pourtant il c'est rendu compte que tout était correcte.
A+
paulfjujo a écrit :Source du message pour verifier si je peux en griller un !
Bonne appétit...
paulfjujo a écrit :Source du message As-tu un schéma de connexion du PIC ?
Je viens de le faire, le voilà
paulfjujo a écrit :Source du message
L'entree ADC est -elle bien RC3 ?
car au debut
movlw B'00001000' ; mode numérique : 14(RC3)
movwf ANSELC
Ben ouais, c'est bien ça, ANSELC est bien sur RC3
paulfjujo a écrit :Source du message puis c'est RA7 ?
movlw B'00000111' ; sélection du canal du convertiseur analogique (RA7)
movwf ADPCH ;
Exacte, mais plus bas je le remets sur RC3,
Code : Tout sélectionner
batterie_scan
rcall _1s ; temps de visionnage
BANKSEL ADPCH ; bank 62
movlw B'00010011' ; sélection du canal du convertiseur analogique (RC3)
movwf ADPCH ; control la batterie
rcall scan_adc ;
;-----------------------------------------------------------------------------------------------
movf adc_high,W ; controler si l'adc n'est pas
xorlw 0x0F ; en overclocking
btfss STATUS,Z
bra batterie_choix
movf adc_low,W
xorlw 0xFF
btfsc STATUS,Z ;
bra batterie_overclocking ; arrêt de l'appareil, car overcloking, reprise au prochain démarrage
paulfjujo a écrit :Source du message L'envoi data au LCD se fait en mode 4bits mais avec les bits inversés et de plus
commentaire sur Port A au lieu de port B ?
se serait donc RB0,RB1,RB2,RB3 ?
Dans celui que j'ai mi j'ai bien #DEFINE lcd_port LATA ; D7 RA0 tu as du toucher au fichier sans t'en rendre compte.
Les bits d'envois son bien inverser, et c'est fait exprès, pour éviter d'avoir un PCB trop compliquer, pour moi ça change rien car le LCD fonctionne bien, faut penser en 3 dimensions....
paulfjujo a écrit :Source du message Bizarre et pas très logique cette fonction d'envoi sur LCD ....ou tout du moins très inhabituelle..
Avec l'asm, on peut faire un peu ce qu'on veut, et puis je le sais, je suis un peu tordue, tu as eu la même réflexion que Gérard qui croyait pas que ça pouvait fonctionner comme ça, et pourtant il c'est rendu compte que tout était correcte.
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Tension de Ref interme 1.024V, 2.0248V, 4.096V avec Pic18F27K42
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir, Temps-X
J'ai testé la version ASM ...
comportement aleatoire du programme ...
un semblant de reponse de l'ADC ..puis plus rien ?
meme la commutation de mode (type de batterie ) avec le choix sur port B RB0..RB3
est aleatoire ..
je pense à un probleme de bank .. ou ???
j'ai refais un morceau de progr. en C
pour revérifier mon entrée ADC RC3
avec +VRef =4,096 et alim MCU = 5,0V
un potar de 2,2K 10 tours entre +Vcc et 0V et le curseur vers entree RC3 via mon miliamperemetre ...
vraiment currieux que
avec Vin = 105mV Ie =1.43mA
intensité qui decroit queand Vin augmente
avec Vin =4.09V ie = 0.24mA !
test Entree RC3 sous mikroC, avec +Vref=4.096
EA= ADC_Read(19) ; ne gere pas le mode avec +Vref
ex: 4.06V en entree -> seulement 3410 points
avec
EA= ADC_Get_Sample(19);
4.09V en entree -> 4095 points en sortie .. OK
Ouf !
L'entree ANA n'est pas MORTE !
peut_etre que le code ci-dessous peut tourner en version de test Mikroc si < 2Ko
en éliminant le superflu..
en points et en volts
J'ai testé la version ASM ...
comportement aleatoire du programme ...
un semblant de reponse de l'ADC ..puis plus rien ?
meme la commutation de mode (type de batterie ) avec le choix sur port B RB0..RB3
est aleatoire ..
je pense à un probleme de bank .. ou ???
j'ai refais un morceau de progr. en C
pour revérifier mon entrée ADC RC3
avec +VRef =4,096 et alim MCU = 5,0V
un potar de 2,2K 10 tours entre +Vcc et 0V et le curseur vers entree RC3 via mon miliamperemetre ...
vraiment currieux que
avec Vin = 105mV Ie =1.43mA
intensité qui decroit queand Vin augmente
avec Vin =4.09V ie = 0.24mA !
test Entree RC3 sous mikroC, avec +Vref=4.096
EA= ADC_Read(19) ; ne gere pas le mode avec +Vref
ex: 4.06V en entree -> seulement 3410 points
avec
EA= ADC_Get_Sample(19);
4.09V en entree -> 4095 points en sortie .. OK
Ouf !
L'entree ANA n'est pas MORTE !
peut_etre que le code ci-dessous peut tourner en version de test Mikroc si < 2Ko
en éliminant le superflu..
Code : Tout sélectionner
// avec Vref interne +4.096V et alim =5V
// OK avec ADC_Get_Sample(19) ; => 4.09V input -> 4095 points
// BAD avec ADC_Read(19): => 4.06V input -> 3410 points => on est sur ref=VDD !
// etonnant Ie =1,43mA pour Ue=0.105V et Ie=0.24mA pour Ue=4.09V
#define Version "2022-02"
#define Directory "C:\\_MikroC\\_MesProjets_MikroC\\_18F27K42_ADC_Test_on_LCD_2022"
#define Project "Test_killed_ADC_18F27K42.mcppi"
#define Source "Test_killed_ADC_18F27K42_2022-02.c"
#define Eeprom " not used ...."
#define Config "P18F27K42_FOSC_64Mhz.cfgsch"
#define PROCESSOR "18F27K42"
#define POWER_SUPPLY " 5V"
#define OSCILLATEUR_INTERNE
#define FOSC "64.0" // MHz
#define LCD1602
#define NbCarPL 16
#define BAUD 115200 // UART1
#define CLS 12
#define CR 13 //0x0D
#define LF 10
#define TAB 9
#define BACK 8
#define Beep 7
#define Separator 0x20 // space
#define ON 0 // because led tirée au +VCC
#define OFF 1
#define SPECIAL 1
#define NORMAL 0
#ifndef Byte
#define Byte unsigned char
#endif
#ifndef Word
#define Word unsigned int
#endif
#define LED_ROUGE LATA4_bit
const code char mesg0[]=" Directory :"Directory"\r\n";
const code char mesg1[]=" MikroC pro 7.30 Beta \n\r";
const code char mesg2[] =" Projet :"Project"\r\n";
const code char mesg3[]=" Test PIC18F27K42\r\n";
const char char mesg4[]=" Config bit : "Config" FOSC:"FOSC" MHz\r\n";
const char char mesg5[]=" Eeprom: "Eeprom"\r\n";
const char char mesg6[]=" Source : "Source"_"Version".c\r\n";
const char char mesg7[]=" 18F27K42 + 1 led + UART1 19200 bds\r\n";
const char char mesg8[]=" avec LCD 1602 en mode // 4 bits \r\n";
const char char mesg9[]=" ";
const char char mesg10[]=" ";
const code char * Messages[]={mesg0,mesg1,mesg2,mesg3,mesg4,mesg5,mesg6,mesg7,mesg8,mesg9,mesg10};
const char Blancs[]=" ";
sbit LCD_RS at LATA6_bit;
sbit LCD_EN at LATA7_bit;
sbit LCD_D7 at LATA0_bit;
sbit LCD_D6 at LATA1_bit;
sbit LCD_D5 at LATA2_bit;
sbit LCD_D4 at LATA3_bit;
// Pin direction
sbit LCD_RS_Direction at TRISA6_bit;
sbit LCD_EN_Direction at TRISA7_bit;
sbit LCD_D7_Direction at TRISA0_bit;
sbit LCD_D6_Direction at TRISA1_bit;
sbit LCD_D5_Direction at TRISA2_bit;
sbit LCD_D4_Direction at TRISA3_bit;
unsigned int i,j,k,l,m,n;
#define MAX_LEN1 128
#define MAX_LEN2 64
#define MAX_LEN3 80
volatile unsigned char Temp=0;
volatile unsigned char Buffer1[MAX_LEN1];
volatile int Flag_Buffer1;
volatile unsigned char c1,cx;
volatile unsigned int i1;
volatile unsigned int Index1;
volatile unsigned int CptErr;
unsigned char CRam1[MAX_LEN2];
unsigned char TEXTE [MAX_LEN3];
unsigned char *txt;
volatile unsigned char TP_Deg,TP_Deci;
volatile unsigned int TAmb;
unsigned int EA0=4095;
float F1=0.00;
unsigned char * p1;
volatile unsigned int Flag_Timer0;
unsigned char Buff_LCD[33]; // LCD 2x16 + zero
int Nb;
volatile unsigned int Count0 = 0;
unsigned char Etat_clock=0;
volatile struct chbits { // 8 flags
unsigned FrameErr:1;
unsigned RAZ:1;
unsigned Elapsed:1;
unsigned Togle:1;
unsigned Second:1;
unsigned Gie:1;
unsigned Full:1;
unsigned Melodie:1;
}Drapeaux ;
void Init_Hardware();
void CRLF1(void) ;
void Raz_Buffer(void) ;
void CPrint(const char *txt);
void strConstRamCpy(unsigned char *dest, const code char *source);
void Interrupts() iv 0x0008 ics ICS_AUTO
{
if (( TMR0IE_bit) && (TMR0IF_bit))
{
//U1TXB=Count0+48;
// pour 100mS
TMR0H = 0x3C; //15536;
TMR0L = 0xB0;
Count0++;
if (Count0 >9)
{
Flag_Timer0=1;
TMR0IE_bit=0;
}
TMR0IF_bit= 0;
}
}
// --- Copie le texte depuis FLASH ROM vers RAM
void strConstRamCpy(unsigned char *dest, const code char *source)
{
while (*(source)>0) *(dest++) = *(source++) ;
*(dest) = 0 ; // terminateur
}
void CRLF1()
{
UART1_Write(CR); UART1_Write(LF);
}
void CPrint(const char *txt)
{
while (*(txt++)>0)
UART1_Write(*(txt));
}
void Float2Ascii (float x, unsigned char *str,char precision)
{
// converts a floating point number to an ascii string
// version limitée à 6 decimales maximum
// x is stored into str, which should be at least 30 chars long
int ie, i, k, ndig;
double y;
ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
ie = 0;
// if x negative, write minus and reverse
if ( x < 0.0000)
{
*str++ = '-';
x = -x;
}
// put x in range 1 <= x < 10
if (x > 0.00000) while (x < 1.00000)
{
x *= 10.000; // a la place de =*
ie--;
}
while (x >= 10.000)
{
x = x/10.000;
ie++;
}
// in f format, number of digits is related to size
ndig += ie; // a la place de =+
//round. x is between 1 and 10 and ndig will be printed to
// right of decimal point so rounding is ...
for (y = i = 1; i < ndig; i++)
y = y/10.000;
x += y/2.000;
if (x >= 10.000) {x = 1.000; ie++;}
if (ie<0)
{
*str++ = '0'; *str++ = '.';
if (ndig < 0) ie = ie-ndig;
for (i = -1; i > ie; i--) *str++ = '0';
}
for (i=0; i < ndig; i++)
{
k = x;
*str++ = k + '0';
if (i == ie ) *str++ = '.';
x -= (y=k);
x *= 10.000;
}
*str = '\0';
}
void Raz_Buffer1()
{
// nettoye le debut de buffer ,car utilisé pour init BT
for(i1=0;i1<MAX_LEN1-1;i1++) Buffer1[i1]=0;
Buffer1[0]=0;
i1=0;
p1=0;
Index1=0;
Flag_Buffer1 =0 ;
//c1=RCREG1;
c1=0;
RC1IE_bit = 1;
}
void Init_Hardware()
{
ANSELA = 0x00; // RA0 analog , OTHER digital
ANSELB = 0x00;
ANSELC = 0x03; // RC3
TRISA = 0x00;
TRISC = 0xFF;
TRISB = 0xFF;
LATA = 0x00;
}
void Init_Timer0()
{
// FOS=64MHz , FOSC/4=16Mhz
// Timer0
// pour 100mS
//FOSC=64MHz Prescaler 1:32; TMR0 Preload = 15536; Actual Interrupt Time : 100 ms
// REGISTER 22-1: T0CON0: TIMER0 CONTROL REGISTER 0
T0CON0=0;
T0CON0.B7=1; // Enable module and operating
T0CON0.B4=1; //MD16=1;
// OUTPS<3:0>: TMR0 Output Postscaler (Divider) Select bits 0111= 1/8 1111=1/16 0000=1/1
T0CON0.B3=0;
T0CON0.B2=0;
T0CON0.B1=0;
T0CON0.B0=0;
// REGISTER 22-2: T0CON1: TIMER0 CONTROL REGISTER 1
// bit 7-5 CS<2:0>:Timer0 Clock Source Select bits = 011 HFINTOSC 010=FOSC/4
T0CON1.B7=0; //T0CON1.CS2 !!!!
T0CON1.B6=1; //T0CON1.CS1
T0CON1.B5=0; //T0CON1.CS0
// bit 4 ASYNC: TMR0 Input Asynchronization Enable bit
// T0CON1.ASYNC=0; //The input to the TMR0 counter is synchronized to FOSC/4
T0CON1.ASYNC=1; //The input to the TMR0 counter is synchronized to FOSC/4
// bit 3-0 CKPS<3:0>: Prescaler Rate Select bit 1/32
T0CON1.B3=0; // CKPS3:0 0011=> 1/8 0101=> 1/32
T0CON1.B2=1 ;
T0CON1.B1=0 ;
T0CON1.B0=1 ;
// pour 100mS
TMR0H = 0x3C; //15536;
TMR0L = 0xB0;
//pour 1000mS
// TMR0H =0x0B ; // 3036
// TMR0L =0xDC ;
// T0CON1.B3=0; // 0110=> 1/64
// T0CON1.B2=1 ;
// T0CON1.B1=1 ;
// T0CON1.B0=0 ;
PIR3.TMR0IF = 0;
PIE3.TMR0IE = 1 ; // TMR0 Enable Interrupt.
T0CON0.B7=1; // Enable module and operating
Count0=0;
Flag_Timer0=0;
}
void LCD_Write_CText_At(char x1,char y1,const char T1)
{
if (strlen(T1<17) )
{
strConstRamCpy(Buff_LCD,T1);
Lcd_Out(x1,y1,Buff_LCD);
}
}
void main()
{
OSCTUNE=0;
OSCCON1 = 0x60;
OSCFRQ = 0x08; // FOSC = 64MHz
Etat_clock=OSCSTAT;
// CLKRCLK=1;
Etat_clock=OSCSTAT;
for (i=0;i<MAX_LEN2;i++) CRam1[i]=0;
Init_Hardware();
LCD_RS_Direction=0;
LCD_EN_Direction=0;
LCD_D7_Direction=0;
LCD_D6_Direction=0;
LCD_D5_Direction=0;
LCD_D4_Direction=0; // at TRISA3_bit;
//LATA.B4=1;
UART1_Init(19200);
UART_Set_Active(&UART1_Read, &UART1_Write, &UART1_Data_Ready, &UART1_Tx_Idle); // set UART1 active
UART1_Write(CLS);
CPrint(" Presentation : \r\n");
for (i=0;i<10;i++) CPrint(Messages[i]);
Delay_ms(1000);
CRLF1();
txt=&TEXTE[0];
CPrint(" LCD 1602 init\r\n");
Lcd_Init();
LATA.B4=0;
LCD_Write_CText_At(1,1,"Special Chars ");
Delay_ms(100);
ADC_Init_Advanced(_ADC_INTERNAL_FVRH4 | _ADC_INTERNAL_VREFL ); //4.096V
//ADC_Init();
CPrint(" Init ADC 4.096V for RC3 Analog input\r\n");
Init_Timer0() ;
CPrint(" Init Timer0 sur 1 sec\r\n");
Lcd_Cmd(_LCD_CLEAR); // 1234567890123456
LCD_Write_CText_At(1,1,"EA0 = Pts");
// Change IVTBASE if required
IVTBASEU = 0x00; // Optional
IVTBASEH = 0x00; // Default is 0x0008
IVTBASEL = 0x08;
GIE_bit=1;
Init_Timer0() ;
while (1)
{
LED_ROUGE = ~LED_ROUGE;
EA0=ADC_Get_Sample(19); // 4.09 pour 4.08Volts reels
// EA0=ADC_Read(19); //1234567890123456 3.41V pour 4.06V reels
strConstRamCpy(CRam1,"EA19= .... pts ");
WordToStr(EA0,CRam1);
k=strlen(CRam1);*(CRam1+k)=' ';
Lcd_Out(1,1,CRam1);
UART1_Write_Text(CRam1);UART1_Write(TAB);
F1=(float)EA0 /1000.0;
Float2Ascii (F1,CRam1,2);
//p1= FloatToStr_FixLen(F1,&TEXTE[0],5); UART1_Write(TAB);
// UART1_Write_Text(p1); CRLF1();
Lcd_Out(2,1,CRam1);
UART1_Write_Text(CRam1); UART1_Write(TAB);
CRLF1();
while( Flag_Timer0==0);
Init_Timer0() ;
}
}
en points et en volts
9 .... pts 0.00
42 .... pts 0.04
485 .... pts 0.48
890 .... pts 0.89
1279 .... pts 1.28
1618 .... pts 1.62
1944 .... pts 1.94
2256 .... pts 2.26
2565 .... pts 2.56
2892 .... pts 2.89
3184 .... pts 3.18
3475 .... pts 3.48
3742 .... pts 3.74
4011 .... pts 4.01
4095 .... pts 4.09
4095 .... pts 4.09
4095 .... pts 4.09
4095 .... pts 4.09
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 101 invités