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 ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

conversion longint en exadecimal
cyril13110
Avatar de l’utilisateur
Expert
Expert
Messages : 1231
Âge : 42
Enregistré en : avril 2016
Localisation : 13

#1 Message par cyril13110 » ven. 4 oct. 2024 19:27

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

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<20then
          inc
(comptpb)
       
end if
      if (
Signal_BP=0)then
          comptpb
=0
         end 
if
       if (
comptpb=3then
          comptpb2 
comptpb2 +1
       end 
if

       if (
comptpb2 )then
          comptpb2 
0
        end 
if

     if (
comptpb2 )then

          
if (Mem_B=0then
             
if (Signal_A then
             Mem_A 
1
                   
if (Signal_Bthen
                   cpt
=cpt+1
                   ecriture_lcd
()
                   
Delay_ms(3)
                   
Mem_A 0
                   end 
if
             
end if
          
end if

           if (
Mem_A=0then
               
if (Signal_B then
               Mem_B
=1
                   
if (Signal_Athen
                      cpt
=cpt-1
                      ecriture_lcd
()
                      
Delay_ms(3)
                      
Mem_B=0
                   end 
if
               
end if
            
end if

        
end if

        if (
comptpb2 )then

          
if (Mem_B=0then
             
if (Signal_A then
             Mem_A 
1
                   
if (Signal_Bthen
                   cpt
=cpt+10
                   ecriture_lcd
()
                   
Delay_ms(3)
                   
Mem_A 0
                   end 
if
             
end if
          
end if

           if (
Mem_A=0then
               
if (Signal_B then
               Mem_B
=1
                   
if (Signal_Athen
                      cpt
=cpt-10
                      ecriture_lcd
()
                      
Delay_ms(3)
                      
Mem_B=0
                   end 
if
               
end if
            
end if

        
end if

         if (
comptpb2 )then

          
if (Mem_B=0then
             
if (Signal_A then
             Mem_A 
1
                   
if (Signal_Bthen
                   cpt
=cpt+100
                   ecriture_lcd
()
                   
Delay_ms(3)
                   
Mem_A 0
                   end 
if
             
end if
          
end if

           if (
Mem_A=0then
               
if (Signal_B then
               Mem_B
=1
                   
if (Signal_Athen
                      cpt
=cpt-100
                      ecriture_lcd
()
                      
Delay_ms(3)
                      
Mem_B=0
                   end 
if
               
end if
            
end if

        
end if

         if (
comptpb2 )then

          
if (Mem_B=0then
             
if (Signal_A then
             Mem_A 
1
                   
if (Signal_Bthen
                   cpt
=cpt+1000
                   ecriture_lcd
()
                   
Delay_ms(3)
                   
Mem_A 0
                   end 
if
             
end if
          
end if

           if (
Mem_A=0then
               
if (Signal_B then
               Mem_B
=1
                   
if (Signal_Athen
                      cpt
=cpt-1000
                      ecriture_lcd
()
                      
Delay_ms(3)
                      
Mem_B=0
                   end 
if
               
end if
            
end if

        
end if

         if (
comptpb2 )then

          
if (Mem_B=0then
             
if (Signal_A then
             Mem_A 
1
                   
if (Signal_Bthen
                   cpt
=cpt+10000
                   ecriture_lcd
()
                   
Delay_ms(3)
                   
Mem_A 0
                   end 
if
             
end if
          
end if

           if (
Mem_A=0then
               
if (Signal_B then
               Mem_B
=1
                   
if (Signal_Athen
                      cpt
=cpt-10000
                      ecriture_lcd
()
                      
Delay_ms(3)
                      
Mem_B=0
                   end 
if
               
end if
            
end if

        
end if

         if (
comptpb2 )then

          
if (Mem_B=0then
             
if (Signal_A then
             Mem_A 
1
                   
if (Signal_Bthen
                   cpt
=cpt+100000
                   ecriture_lcd
()
                   
Delay_ms(3)
                   
Mem_A 0
                   end 
if
             
end if
          
end if

           if (
Mem_A=0then
               
if (Signal_B then
               Mem_B
=1
                   
if (Signal_Athen
                      cpt
=cpt-100000
                      ecriture_lcd
()
                      
Delay_ms(3)
                      
Mem_B=0
                   end 
if
               
end if
            
end if

        
end if

    
conversion cpt 34360
    LongIntToHex
(conversiontxt)
    
ecritureexa_lcd()
Wend
end
j'en appel à l'Energie de l'univers de la nature que ma carte électronique ..... tombe en marche

conversion longint en exadecimal
gwion
Confirmé
Confirmé
Messages : 610
Enregistré en : février 2022

#2 Message par gwion » sam. 5 oct. 2024 19:50

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.

conversion longint en exadecimal
cyril13110
Avatar de l’utilisateur
Expert
Expert
Messages : 1231
Âge : 42
Enregistré en : avril 2016
Localisation : 13

#3 Message par cyril13110 » dim. 6 oct. 2024 09:20

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
j'en appel à l'Energie de l'univers de la nature que ma carte électronique ..... tombe en marche

conversion longint en exadecimal
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2885
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » lun. 7 oct. 2024 09:55

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

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

}
Aide toi, le ciel ou FantasPic t'aidera

conversion longint en exadecimal
cyril13110
Avatar de l’utilisateur
Expert
Expert
Messages : 1231
Âge : 42
Enregistré en : avril 2016
Localisation : 13

#5 Message par cyril13110 » lun. 7 oct. 2024 10:33

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.
j'en appel à l'Energie de l'univers de la nature que ma carte électronique ..... tombe en marche

conversion longint en exadecimal
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2885
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » mar. 8 oct. 2024 09:53

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

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
Aide toi, le ciel ou FantasPic t'aidera

conversion longint en exadecimal
cyril13110
Avatar de l’utilisateur
Expert
Expert
Messages : 1231
Âge : 42
Enregistré en : avril 2016
Localisation : 13

#7 Message par cyril13110 » mar. 8 oct. 2024 10:54

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?
j'en appel à l'Energie de l'univers de la nature que ma carte électronique ..... tombe en marche

conversion longint en exadecimal
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2885
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » mar. 8 oct. 2024 15:31

toute à fée!
Aide toi, le ciel ou FantasPic t'aidera

conversion longint en exadecimal
cyril13110
Avatar de l’utilisateur
Expert
Expert
Messages : 1231
Âge : 42
Enregistré en : avril 2016
Localisation : 13

#9 Message par cyril13110 » mar. 8 oct. 2024 15:44

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?
j'en appel à l'Energie de l'univers de la nature que ma carte électronique ..... tombe en marche

conversion longint en exadecimal
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2885
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » mar. 8 oct. 2024 18:22

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
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités