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 : Gérard
conversion longint en exadecimal
- cyril13110
Expert- Messages : 1231
- Âge : 42
- Enregistré en : avril 2016
- Localisation : 13
Bonsoir à tous,
Je suis en train de préparer un code pour utiliser un AD9850, j'ai reussi à utiliser un encodeur rotatif comme je le souhaite.
Et j'en arrive à la préparation des données hexadecimal pour envoie au générateur de signal.
Dans mikrobasic il y a bien un truc tous fait qui convertie de longint en hexa mais il sort en format texte.
à moins que je face de la detection de caractere pour revenir en veritable hexa je ne vois pas vraiment comment faire.
Auriez vous une petite idée qui pourrait meviter de perdre en temps fou la dessus?
Comme vous le verrez sur le code ci-dessous je me suis arreté à la multiplication par 34360.
Jusque la tous ce passe bien
Je suis en train de préparer un code pour utiliser un AD9850, j'ai reussi à utiliser un encodeur rotatif comme je le souhaite.
Et j'en arrive à la préparation des données hexadecimal pour envoie au générateur de signal.
Dans mikrobasic il y a bien un truc tous fait qui convertie de longint en hexa mais il sort en format texte.
à moins que je face de la detection de caractere pour revenir en veritable hexa je ne vois pas vraiment comment faire.
Auriez vous une petite idée qui pourrait meviter de perdre en temps fou la dessus?
Comme vous le verrez sur le code ci-dessous je me suis arreté à la multiplication par 34360.
Jusque la tous ce passe bien
Code : Tout sélectionner
program test_comutateur_rotatif
' 18h4550 8Mhz
' Declarations section
dim
test_cpt as byte
Mem_A as bit
Mem_B as bit
cpt as longint
conversion as longint
Signal_A as sbit at PortC.0
Signal_B as sbit at PortC.1
Signal_BP as sbit at PortC.6
dim txt as string[10]
dim comptpb as byte
dim comptpb1 as byte
dim comptpb2 as byte
dim manu_on as bit
' Lcd module connections
dim
LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D7 as sbit at RB3_bit
LCD_D6 as sbit at RB2_bit
LCD_D5 as sbit at RB1_bit
LCD_D4 as sbit at RB0_bit
dim
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D7_Direction as sbit at TRISB3_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D4_Direction as sbit at TRISB0_bit
sub procedure ecriture_lcd()
LongIntToStr(cpt, txt)
Lcd_Chr(2,1,txt[0])
Lcd_Chr(2,2,txt[1])
Lcd_Chr(2,3,txt[2])
Lcd_Chr(2,4,txt[3])
Lcd_Chr(2,5,txt[4])
Lcd_Chr(2,6,txt[5])
Lcd_Chr(2,7,txt[6])
Lcd_Chr(2,8,txt[7])
Lcd_Chr(2,9,txt[8])
Lcd_Chr(2,10,txt[9])
end sub
sub procedure ecritureexa_lcd()
LongIntToStr(cpt, txt)
Lcd_Chr(2,1,txt[0])
Lcd_Chr(2,2,txt[1])
Lcd_Chr(2,3,txt[2])
Lcd_Chr(2,4,txt[3])
Lcd_Chr(2,5,txt[4])
Lcd_Chr(2,6,txt[5])
Lcd_Chr(2,7,txt[6])
Lcd_Chr(2,8,txt[7])
Lcd_Chr(2,9,txt[8])
Lcd_Chr(2,10,txt[9])
end sub
main:
ADCON1 = $FF
PORTC = 0 ' set PORTB to 0
TRISC = $FF ' designate PORTB pins as output
LATD = 0 ' set PORTC to 0
TRISD = $00 ' designate PORTC pins as intput
cpt=0
comptpb2 = 0
ecriture_lcd()
' Main program
Mem_B=0
Mem_A=0
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
Lcd_Out(1,1,"Test mesure")
While (TRUE)
'Gestion BP
if (Signal_BP=1) and (comptpb<20) then
inc(comptpb)
end if
if (Signal_BP=0)then
comptpb=0
end if
if (comptpb=3) then
comptpb2 = comptpb2 +1
end if
if (comptpb2 = 6 )then
comptpb2 = 0
end if
if (comptpb2 = 0 )then
if (Mem_B=0) then
if (Signal_A = 1 ) then
Mem_A = 1
if (Signal_B= 1 ) then
cpt=cpt+1
ecriture_lcd()
Delay_ms(3)
Mem_A = 0
end if
end if
end if
if (Mem_A=0) then
if (Signal_B = 1 ) then
Mem_B=1
if (Signal_A= 1 ) then
cpt=cpt-1
ecriture_lcd()
Delay_ms(3)
Mem_B=0
end if
end if
end if
end if
if (comptpb2 = 1 )then
if (Mem_B=0) then
if (Signal_A = 1 ) then
Mem_A = 1
if (Signal_B= 1 ) then
cpt=cpt+10
ecriture_lcd()
Delay_ms(3)
Mem_A = 0
end if
end if
end if
if (Mem_A=0) then
if (Signal_B = 1 ) then
Mem_B=1
if (Signal_A= 1 ) then
cpt=cpt-10
ecriture_lcd()
Delay_ms(3)
Mem_B=0
end if
end if
end if
end if
if (comptpb2 = 2 )then
if (Mem_B=0) then
if (Signal_A = 1 ) then
Mem_A = 1
if (Signal_B= 1 ) then
cpt=cpt+100
ecriture_lcd()
Delay_ms(3)
Mem_A = 0
end if
end if
end if
if (Mem_A=0) then
if (Signal_B = 1 ) then
Mem_B=1
if (Signal_A= 1 ) then
cpt=cpt-100
ecriture_lcd()
Delay_ms(3)
Mem_B=0
end if
end if
end if
end if
if (comptpb2 = 3 )then
if (Mem_B=0) then
if (Signal_A = 1 ) then
Mem_A = 1
if (Signal_B= 1 ) then
cpt=cpt+1000
ecriture_lcd()
Delay_ms(3)
Mem_A = 0
end if
end if
end if
if (Mem_A=0) then
if (Signal_B = 1 ) then
Mem_B=1
if (Signal_A= 1 ) then
cpt=cpt-1000
ecriture_lcd()
Delay_ms(3)
Mem_B=0
end if
end if
end if
end if
if (comptpb2 = 4 )then
if (Mem_B=0) then
if (Signal_A = 1 ) then
Mem_A = 1
if (Signal_B= 1 ) then
cpt=cpt+10000
ecriture_lcd()
Delay_ms(3)
Mem_A = 0
end if
end if
end if
if (Mem_A=0) then
if (Signal_B = 1 ) then
Mem_B=1
if (Signal_A= 1 ) then
cpt=cpt-10000
ecriture_lcd()
Delay_ms(3)
Mem_B=0
end if
end if
end if
end if
if (comptpb2 = 5 )then
if (Mem_B=0) then
if (Signal_A = 1 ) then
Mem_A = 1
if (Signal_B= 1 ) then
cpt=cpt+100000
ecriture_lcd()
Delay_ms(3)
Mem_A = 0
end if
end if
end if
if (Mem_A=0) then
if (Signal_B = 1 ) then
Mem_B=1
if (Signal_A= 1 ) then
cpt=cpt-100000
ecriture_lcd()
Delay_ms(3)
Mem_B=0
end if
end if
end if
end if
conversion = cpt * 34360
LongIntToHex(conversion, txt)
ecritureexa_lcd()
Wend
end.
conversion longint en exadecimal
Bonjour au forum, salut Cyril,
Pour afficher en hexa on peut utiliser :
long int valeur = 1234567890;
printf("Valeur en hexadécimal : %lx\n", valeur); // lettres en minuscules
printf("Valeur en hexadécimal : %lX\n", valeur); // lettres en majuscules
Mais je n'ai pas compris ce que tu veux faire, tu peux donner un exemple avec les 2 valeurs stp ?
Pour ton générateur, tu as intérêt à prévoir un clavier numérique en plus de l'encodeur, ça va nettement plus vite.
Pour afficher en hexa on peut utiliser :
long int valeur = 1234567890;
printf("Valeur en hexadécimal : %lx\n", valeur); // lettres en minuscules
printf("Valeur en hexadécimal : %lX\n", valeur); // lettres en majuscules
Mais je n'ai pas compris ce que tu veux faire, tu peux donner un exemple avec les 2 valeurs stp ?
Pour ton générateur, tu as intérêt à prévoir un clavier numérique en plus de l'encodeur, ça va nettement plus vite.
conversion longint en exadecimal
- cyril13110
Expert- Messages : 1231
- Âge : 42
- Enregistré en : avril 2016
- Localisation : 13
gwion a écrit :Bonjour au forum, salut Cyril,
Pour afficher en hexa on peut utiliser :
long int valeur = 1234567890;
printf("Valeur en hexadécimal : %lx\n", valeur); // lettres en minuscules
printf("Valeur en hexadécimal : %lX\n", valeur); // lettres en majuscules
Mais je n'ai pas compris ce que tu veux faire, tu peux donner un exemple avec les 2 valeurs stp ?
Pour ton générateur, tu as intérêt à prévoir un clavier numérique en plus de l'encodeur, ça va nettement plus vite.
Coucou gwion et touz le monde,
Heu printf c'est en c pas en basic non?
De toute manière ma détection de l'encadreur est des plus hasardeuse à cause de l'écran lcd.
Il faut que je regarde comment faire autrement
conversion longint en exadecimal
- paulfjujo
Expert- Messages : 2885
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
pourquoi vouloir Afficher en HEXA ?
ces 2 procedures sont idem :
sub procedure ecriture_lcd() .. en decimal
sub procedure ecritureexa_lcd() .. en decimal aussi
quel est le probleme ?
conversion = cpt * 34360 ? pour 1000Hz ?
float AD9850_FREQUENCY_FACTOR = 34.35973837; // 2^32 divided by 125MHz
tu veux afficher ton compteur cpt ( la consigne de l'AD9850) ou la frequence ?
en C .. à adapter bien sur ..
pourquoi vouloir Afficher en HEXA ?
ces 2 procedures sont idem :
sub procedure ecriture_lcd() .. en decimal
sub procedure ecritureexa_lcd() .. en decimal aussi
quel est le probleme ?
conversion = cpt * 34360 ? pour 1000Hz ?
float AD9850_FREQUENCY_FACTOR = 34.35973837; // 2^32 divided by 125MHz
tu veux afficher ton compteur cpt ( la consigne de l'AD9850) ou la frequence ?
en C .. à adapter bien sur ..
Code : Tout sélectionner
void AD9850_Charge_Freq(float Freq)
{
AD9850_Serial_Data.TuningWord = (long) (Freq * AD9850_FREQUENCY_FACTOR);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv0);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv1);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv2);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv3);
SendSerialDataByteToAD9850(AD9850_CONTROL_WORD);
Delay_us(100);
FQ_UD = 1;
Delay_us(200);
FQ_UD = 0;
Delay_us(200);
}
void SendSerialDataByteToAD9850(unsigned char Donnee)
{
Byte counter = 0;
do
{
SData = 0;
if(Donnee & 0x01) SData=1; // Check LSB bit
Donnee = Donnee>>1; // RIGHT SHIFT THE Donnee BY ONE BIT
W_CLCK = 1;
Delay_us(100);
W_CLCK = 0;
Delay_us(100);
counter++;
}while(counter<8);
}
conversion longint en exadecimal
- cyril13110
Expert- Messages : 1231
- Âge : 42
- Enregistré en : avril 2016
- Localisation : 13
paulfjujo a écrit :bonjour,
pourquoi vouloir Afficher en HEXA ?
ces 2 procedures sont idem :
sub procedure ecriture_lcd() .. en decimal
sub procedure ecritureexa_lcd() .. en decimal aussi
quel est le probleme ?
conversion = cpt * 34360 ? pour 1000Hz ?
float AD9850_FREQUENCY_FACTOR = 34.35973837; // 2^32 divided by 125MHz
tu veux afficher ton compteur cpt ( la consigne de l'AD9850) ou la frequence ?
Bonjour paul et bonjour à tous,
Je souhaite controler que ce que je vais envoyer a l'AD9850 soit bien de l'exa car je ne vois pas comment decouper le decimal pour l'envoyer.
L'afficheur est là effectivement pour afficher la frequence que je souhaite et comme je n'ai que des 4 lignes du coup je voulais en profiter pour afficher la valeur hexa avant de l'envoyer question d'avancer pas à pas.
Mais je rencontre d'autre probleme , la gestion de l'afficheur utilise trop de ressource et du coup je rate la quasi totalité des creneaux de l'encodeur rotatif.
Il va falloir que je regarde pour faire ca autrement.
Mais deja le probleme ici c'est convertir un decimal au format longint en exa.
conversion longint en exadecimal
- paulfjujo
Expert- Messages : 2885
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Cyril,
si tu envoie du decimal à l'AD9850 .... sous forme d'entier long 32 bits
ce sera forcément sous forme binaire ou hexadecimale !
l'hexadecimal est uniquement une vue de representation par l'esprit..
dans la procedure void
pv0, pv1, pv2,pV3 representent (byte,octet) les registre du AD9850
les visualiser en Hexa n'apportent rien de plus
si tu gere l'evolution de ta consigne , en frequence et non pas avec chaque registre separement
consigne 1000hz
pourquoi vouloir afficher 00008638 ?
d'autant que l'hexadecimal est difficilement interpretable par le cerveau humain.
concernant l'encodeur rotatif, il faut le traiter par interruption ..
visualiser le contenu Hexa d'un byte
modifier sortie UART -> sortie LCD
si tu envoie du decimal à l'AD9850 .... sous forme d'entier long 32 bits
ce sera forcément sous forme binaire ou hexadecimale !
l'hexadecimal est uniquement une vue de representation par l'esprit..
dans la procedure void
Code : Tout sélectionner
struct DataBytes
{
Byte pv0;
Byte pv1;
Byte pv2;
Byte pv3;
};
union
{
unsigned long TuningWord;
struct DataBytes DDS;
}AD9850_Serial_Data;
unsigned char AD9850_CONTROL_WORD;
float AD9850_FREQUENCY =1000.0 ; // 1KHz
float AD9850_FREQUENCY_FACTOR = 34.35973837; // 2^32 divided by 125MHz
void AD9850_Charge_Freq(float Freq)
{
AD9850_Serial_Data.TuningWord = (long) (Freq * AD9850_FREQUENCY_FACTOR);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv0);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv1);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv2);
SendSerialDataByteToAD9850(AD9850_Serial_Data.DDS. pv3);
SendSerialDataByteToAD9850(AD9850_CONTROL_WORD);
Delay_us(100);
FQ_UD = 1;
Delay_us(200);
FQ_UD = 0;
Delay_us(200);
}
pv0, pv1, pv2,pV3 representent (byte,octet) les registre du AD9850
les visualiser en Hexa n'apportent rien de plus
si tu gere l'evolution de ta consigne , en frequence et non pas avec chaque registre separement
consigne 1000hz
pourquoi vouloir afficher 00008638 ?
d'autant que l'hexadecimal est difficilement interpretable par le cerveau humain.
concernant l'encodeur rotatif, il faut le traiter par interruption ..
visualiser le contenu Hexa d'un byte
Code : Tout sélectionner
void Octet2Hex(unsigned char number)
{
char high,low;
// high nibble
high = ((number & 0xF0) >> 4) + 48; // + '0'
if (high > '9')
high =high + 7;
// low nibble
low = (number & 0x0F) + 48; // +'0' low nibble
if (low > '9') // '9'= 57u
low += 7; // > '9'
Put_RS(high);
Put_RS(low);
Put_RS('h');
}
affichage long 32 bits en hexa
Octet2Hex(DataBytes DDS.pv0);
Octet2Hex(DataBytes DDS.pv1);
Octet2Hex(DataBytes DDS.pv2);
Octet2Hex(DataBytes DDS.pv3);
modifier sortie UART -> sortie LCD
conversion longint en exadecimal
- cyril13110
Expert- Messages : 1231
- Âge : 42
- Enregistré en : avril 2016
- Localisation : 13
paulfjujo a écrit :bonjour Cyril,
si tu envoie du decimal à l'AD9850 .... sous forme d'entier long 32 bits
ce sera forcément sous forme binaire ou hexadecimale !
l'hexadecimal est uniquement une vue de representation par l'esprit..
oui c'est vrai,
en gros si je comprends bien tu utilise l'entrée data et non les 8 bits d’entrée en faisant un simple décalage à droite c'est bien ca?
conversion longint en exadecimal
conversion longint en exadecimal
- cyril13110
Expert- Messages : 1231
- Âge : 42
- Enregistré en : avril 2016
- Localisation : 13
derniere question paul, tu commence par envoyer le bit de poids fort ou le pit de poids faible en premier?
Je viens de voir dit moi si je me trompe en gros on mets le premier bit a envoyer on fait 1 pulse sur W_CLK puis le 2nd bit ect jusqu'a la fin et une fois fini il faut un pulse sur FQ_UD pour valider la valeur 32 bits c'est bien ca?
Je viens de voir dit moi si je me trompe en gros on mets le premier bit a envoyer on fait 1 pulse sur W_CLK puis le 2nd bit ect jusqu'a la fin et une fois fini il faut un pulse sur FQ_UD pour valider la valeur 32 bits c'est bien ca?
conversion longint en exadecimal
- paulfjujo
Expert- Messages : 2885
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
oui, c'est cela...
void SendSerialDataByteToAD9850(unsigned char Donnee)
{
Byte counter = 0;
do
{
SData = 0;
if(Donnee & 0x01) SData=1; // Check LSB bit
Donnee = Donnee>>1; // RIGHT SHIFT THE Donnee BY ONE BIT
W_CLCK = 1;
Delay_us(100);
W_CLCK = 0;
Delay_us(100);
counter++;
}while(counter<8);
}
en premier le bit de poids faible (LSB)
ensuite on pousse les autres bits à droite via >>1
..etc ...pour chaque byte composant le mot de 32 bits
void SendSerialDataByteToAD9850(unsigned char Donnee)
{
Byte counter = 0;
do
{
SData = 0;
if(Donnee & 0x01) SData=1; // Check LSB bit
Donnee = Donnee>>1; // RIGHT SHIFT THE Donnee BY ONE BIT
W_CLCK = 1;
Delay_us(100);
W_CLCK = 0;
Delay_us(100);
counter++;
}while(counter<8);
}
en premier le bit de poids faible (LSB)
ensuite on pousse les autres bits à droite via >>1
..etc ...pour chaque byte composant le mot de 32 bits
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités