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 sur l'Assembleur !

Modérateur : mazertoc

Programmer l'AD9850
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2027
Enregistré en : juillet 2016
Localisation : Terre

#51 Message par Temps-x » mer. 20 oct. 2021 00:51

Bonsoir F6FCO, venom, et tout le forum,

venom a écrit :Source du message oops pourtant je suis doux comme un agneau :oops:

:roll: C'est seulement d'apparence que tu es doux ..... non, excuse moi, j'ai pas voulu te contrarier, pitié...... :cry:



Le problème de l'encodeur :sifflotte: c'est que tu vas être obligé de tourner très longtemps si tu fais de 1Hz à 16000000 Hz
je suis entrain de réfléchir à ce problème, :roll: faut t'il y aller par pas de 1Hz ou plus.

Un interrupteur rotatif à 6 positions ou tu pourrais choisir l'avancement du pas avec ton encodeur soit 1 Hz, 10 Hz, 100 Hz, 1000 Hz, 10000 Hz, 100000 Hz, de plus on peut rajouter des boutons pour mémorisation de la fréquence.

Je crois que c'est cette solution que je vais choisir

Ce pic possède un compteur 24 bits avec un t'elle avantage on ne peut que le sélectionner car 24 bits ça nous donne 16 777 215 Hz pour une seconde, en tant que fréquencemètre il doit être très précis.

De plus avec le NCO tu pourras jouer de la musique 8-)

Ps : Voici pour info les trois type de pic qui sont les mêmes mais avec plus de patte en fonction de la référence ( à voir en fonction de tes besoins)

Pic18F27k42 28 pattes en boitier PDIP
Pic18F47k42 40 pattes en boitier PDIP
PIC18F57K42 48 pattes en boitier TQFP

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Programmer l'AD9850
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1255
Âge : 67
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#52 Message par F6FCO » mer. 20 oct. 2021 10:48

Merci pour les infos,
1hz pas bon, trop petit incrément et il faudrait tourner pendant des heures pour couvrir la petite bande qui nous est allouée. Pour avoir un ordre d'idée il faut pouvoir balayer rapidement la gamme de 7000Khz à 7040Khz (1Khz=1000Hz).

Exemple pratique: Tu es en train de discuter tranquillement avec un pote et une autre station vient se mettre juste à coté de notre fréquence, çà fait du brouillage et on ne se comprends plus, on recherche et trouvons une nouvelle fréquence libre 3Khz plus haut pour continuer notre papotage en morse. Avec un pas de 1Hz il faudrait tourner 3000 crans de l'encodeur (avec encodeurs chinois mécaniques).

Sur celui que j'ai fait avec un Atmel et dont je me sers quotidiennement j'ai un incrément de 500hz, c'est la bonne valeur. Après on peut toujours changer le pas à par ex. 200hz par choix sur appui poussoir si on veut se régler plus fin, c'est juste de l'optimisation.
Il suffit de faire une addition sur 16bits ou 24bits à chaque pas de l'encodeur, à calculer.
Je m'y mettrais dés que j'aurai le bon PIC,
Une porte nand prend 2 bits en entrée... cochonne va !!! :langue:

Programmer l'AD9850
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2026
Âge : 71
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#53 Message par paulfjujo » mer. 20 oct. 2021 15:29

Bonjour à tous ,

Temps-x a écrit :
Ce pic possède un compteur 24 bits avec un t'elle avantage on ne peut que le sélectionner car 24 bits ça nous donne 16 777 215 Hz pour une seconde, en tant que fréquencemètre il doit être très précis.


si tu generes la seconde à parti du PIC
il aura la precision de ton quartz en general +-50ppm à 25°C
ou pire si made in RPC et sans marquage
ou mieux si on paie le prix ( quartz ou oscillateur externe compensé.)
ou FOSC interne reglable à +-3%
sinon la seconde .. depuis la pulse sortie 1Hz RTC DS3231 ?

Le STM1 associé aux portes logiques configurables CLC
devrait permettre de faire FACILEMENT un bon Frequencemetre pour F< 16MHz maxi...
ou voir 32 ou 48MHz si on peut compter les debordements
au dela il faut un diviseur specialisé VHF UHF ( 1/256), car les entrées PIC ne suivent plus.

sur les PICs évloué on a un aussi module DSM
ciruit de modulation de porteuse ...
je n'ai pas regardé les détails . ..pour quel usage ?
enregistrement de data sur cassettes magnetique en format Kansas-city comme sur les vieux TRS80 (Video-Genie) ?

Using this method, the DSM can generate the following
types of Key Modulation schemes:
• Frequency-Shift Keying (FSK)
• Phase-Shift Keying (PSK)
• On-Off Keying (OOK)
Additionally, the following features are provided within
the DSM module:
• Carrier Synchronization
• Carrier Source Polarity Select
• Programmable Modulator Data
• Modulated Output Polarity Select
Aides toi, le ciel ou FantasPic t'aideras

Programmer l'AD9850
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1255
Âge : 67
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#54 Message par F6FCO » jeu. 21 oct. 2021 00:18

Bonsoir,
paulfjujo a écrit :si tu generes la seconde à parti du PIC
il aura la precision de ton quartz en general +-50ppm à 25°C
ou pire si made in RPC et sans marquage
ou mieux si on paie le prix ( quartz ou oscillateur externe compensé.)
ou FOSC interne reglable à +-3%
sinon la seconde .. depuis la pulse sortie 1Hz RTC DS3231 ?

Pour mon utilisation pas besoin de tant de précision, tu te cales sur ton correspondant en adaptant la fréquence. Pour construire un appareil de mesure par contre çà vaut le coup d'investir.

paulfjujo a écrit :devrait permettre de faire FACILEMENT un bon Frequencemetre pour F< 16MHz maxi...
ou voir 32 ou 48MHz si on peut compter les debordements
au dela il faut un diviseur specialisé VHF UHF ( 1/256), car les entrées PIC ne suivent plus.

Là c'est intéressant. Pour le diviseur de mémoire j'avais construit le fréquencemètre TFX1 de F.Thobois (tout en TTL, consommait autant qu'un fer à repasser) et j'avais utilisé un 95hc90, à vérifier si on en trouve encore, c'est vieux.
Il y a surement mieux maintenant.

paulfjujo a écrit :sur les PICs évloué on a un aussi module DSM
ciruit de modulation de porteuse ...
je n'ai pas regardé les détails . ..pour quel usage ?
enregistrement de data sur cassettes magnetique en format Kansas-city comme sur les vieux TRS80 (Video-Genie) ?

FSK et PSK sont des modes de transmission de données. Connais pas OOK mais çà ressemblerait à de la coupure de porteuse, ce qu'on fait depuis les débuts de la radio en somme et qui s'appelle de la CW (continuous wave), exactement ce qu'on fait avec le code morse.
Une porte nand prend 2 bits en entrée... cochonne va !!! :langue:

Programmer l'AD9850
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2027
Enregistré en : juillet 2016
Localisation : Terre

#55 Message par Temps-x » ven. 22 oct. 2021 01:54

Bonsoir paulfjujo, F6FCO, et tout le forum,

F6FCO a écrit :Source du message Après on peut toujours changer le pas à par ex. 200hz par choix sur appui poussoir si on veut se régler plus fin, c'est juste de l'optimisation.


idea ! Ton idée est très bonne, je l’adopte, faire une addition ou soustraction 24 bits, c'est vraiment trop facile en assembleur, d'abord c'est une chose quand doit savoir faire quotidiennement en ASM :langue:

paulfjujo a écrit :Source du message si tu generes la seconde à parti du PIC
il aura la precision de ton quartz en general +-50ppm à 25°C


Je vais le faire à partir du pic, avec un des Timer, je n'ai pas besoin d'une grande précision, pour l'instant.

paulfjujo a écrit :Source du message au dela il faut un diviseur specialisé VHF UHF ( 1/256), car les entrées PIC ne suivent plus

Je pense pas aller aussi loin, car le NCO du Pic18F27K42 ne dépasse pas 16Mhz, par la suite je pense y mettre un diviseur de fréquence, mais j'en suis pas encore là malheureusement, place à l’étude, qui demande beaucoup de temps, surtout quand tous est en anglais :furieux:

Pour l'instant je suis dans l’étude de la datasheet en début de la page 394, j'ai survolé vaguement tout le reste oops incroyable, 4 compteurs de 24 bits pour les MODES DE FONCTIONNEMENT CMS, vraiment passionnent de voir tout ça

SMT.jpg


paulfjujo a écrit :Source du message sur les PIC évolué on a un aussi module DSM
ciruit de modulation de porteuse ...


:furieux: Faut de quoi les programmer ses Pic évolué, oops hors de question d'acheter un Pickit4 à 60 euros, j’attendrais des versions clone de la par des chinois, faudra que Microchip change de stratégie, sinon elle risque de perdre pas mal de client.

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Programmer l'AD9850
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1255
Âge : 67
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#56 Message par F6FCO » ven. 22 oct. 2021 12:09

C'est vrai, parfois je me laisse aller à rêver devant un ICD4, et puis je me réveille.
Une porte nand prend 2 bits en entrée... cochonne va !!! :langue:

Programmer l'AD9850
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1255
Âge : 67
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#57 Message par F6FCO » mar. 2 nov. 2021 15:07

Hello les gens,

J'ai enfin trouvé le temps de travailler sur mon VFO DDS. Après avoir fait un programme avec chargement en // et commencé à dessiner le PCB, j'ai laissé l'affaire en plan pour tester le chargement série. Le PCB n'en sera que plus simple à étudier.

; ----------------------------------------------------------------------------
En premier lieu avec une fréquence fixe.

Code : Tout sélectionner

;************************************************************************************************
;
                         F6FCO - AD9850                        ;
;
                                                                                      ;
;**********************************************************************************************
 ;


        Errorlevel-302 
        list        p
=18f2525                
        
#include    <p18f2525.inc>            
    

 CONFIG OSC 
= INTIO67                     ; Oscillateur interne 8MHz 
 CONFIG IESO 
= OFF                        ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                       ; Reset si chute de tension (ON/OFF)
 CONFIG BORV = 0                          ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                         ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                      ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                     ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= ON                        ; Mclr configuré comme entrée
 CONFIG STVREN 
= ON                       ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                         ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                       ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = OFF                       ; Debugger hors service
 CONFIG CP0 = OFF                         ; Code protection sur block 0 (ON/OFF)
 CONFIG CP1 = OFF                         ; Code protection sur block 1 (ON/OFF)
 CONFIG CP2 = OFF                         ; Code protection sur block 2 (ON/OFF)
 CONFIG CPB = OFF                         ; Code protection sur bootblock  (ON/OFF)
 CONFIG CPD = OFF                         ; Code protection sur eeprom (ON/OFF)
 CONFIG WRT0 = OFF                        ; Protection écriture block 0 (ON/OFF)
 CONFIG WRT1 = OFF                        ; Protection écriture block 1 (ON/OFF)
 CONFIG WRT2 = OFF                        ; Protection écriture block 2 (ON/OFF)
 CONFIG WRTB = OFF                        ; Protection écriture bootblock (ON/OFF)
 CONFIG WRTC = OFF                        ; Protection écriture configurations (ON/OFF)
 CONFIG WRTD = OFF                        ; Protection écriture zone eeprom (ON/OFF)
 CONFIG EBTR0 = OFF                       ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                       ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                       ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                       ; Protection lecture de table bootblock (ON/OFF)

; ------------------------------------ #define
; D0 à D7 AD9850 sur port C
#define fq_ud        LATB,2
#define    w_clk        LATB,3
#define    raz        LATB,4
#define    datas        LATC,0


; ------------------------------------ 
     CBLOCK H'
0
        Reg_1            :1
        Reg_2            :1
        Reg_3            :1
        valeur1            :4
        valeur2            :4
        report16        :1
        EncA_old        :1     ; état de la pin A de l'
encodeur au tour d'avant
        EncB_old        :1     ; état de la pin B de l'
encodeur au tour d'avant
        Sens            :1    ; sens de rotation de l'
encodeur
        tampon            
:1    ; registre à tout faire
        MotBinaire        
:5    ; mot de programmation AD9850 
        ptr            
:1
    ENDC

    ORG H
'0'
    
; ------------------------------------ 
init

mov       movlw     B
'01110011'
        movwf     OSCCON            
    movlw    b
'00000000'
    movwf    TRISB
    movlw    b
'00000000'
    movwf    TRISC
    


Code : Tout sélectionner

#include     <VFO init.asm>
; -----------------------------------
;
initialisations variables encodeur
    movlw    2
    movwf    Sens
    movf    PORTB
,w
    andlw    b
'00000001'
    movwf    EncA_old
    movf    PORTB
,w
    andlw    b
'00000010'
    movwf    EncB_old
    
; Initialisation du mot binaire de programmation AD9850
    movlw    0xb5
    movwf    MotBinaire
+0
    movlw    0x4e
    movwf    MotBinaire
+1
    movlw    0x5c
    movwf    MotBinaire
+2
    movlw    0x0e
    movwf    MotBinaire
+3
    movlw    0x00
    movwf    MotBinaire
+4

    
; incrément 100Hz (0x0d6c)
    ;movlw    0x6c
    
;movwf    valeur1+0
    
;movlw    0x0d
    
;movwf    valeur1+1
    
    
; incrément 250Hz (0x218e)
    ;movlw    0x8e
    
;movwf    valeur1+0
    
;movlw    0x21
    
;movwf    valeur1+1

    
; incrément 500Hz (0x431c)
    ;movlw    0x1c
    
;movwf    valeur1+0
    
;movlw    0x43
    
;movwf    valeur1+1

    
    
main    nop
    bcf    raz
    call    Prog_AD9850
    
    
; ----- Gestion changement de fréquence
encod    nop
    call    Gestion_encodeur
    movlw    2
    subwf    Sens
,w
    btfsc    STATUS
,Z
    bra    encod
    movlw    1
    subwf    Sens
,w
    btfsc     STATUS
,Z
    bra    increment
decrement
    nop
    movlw    0x1c
    movwf    valeur2
+0
    movlw    0x43
    movwf    valeur2
+1
    clrf    valeur2
+2
    clrf    valeur2
+3

    nop
    movff    MotBinaire
+0,valeur1+0
    movff    MotBinaire
+1,valeur1+1
    movff    MotBinaire
+2,valeur1+2
    movff    MotBinaire
+3,valeur1+3
    movff    MotBinaire
+4,valeur1+4
    call    soustraction32
    movff    valeur1
+0,MotBinaire+0
    movff    valeur1
+1,MotBinaire+1
    movff    valeur1
+2,MotBinaire+2
    movff    valeur1
+3,MotBinaire+3
    movff    valeur1
+4,MotBinaire+4
    bra    main    
    
increment
    nop
    
;bra main
    nop
    movlw    0x1c
    movwf    valeur2
+0
    movlw    0x43
    movwf    valeur2
+1
    clrf    valeur2
+2
    clrf    valeur2
+3

    nop
    movff    MotBinaire
+0,valeur1+0
    movff    MotBinaire
+1,valeur1+1
    movff    MotBinaire
+2,valeur1+2
    movff    MotBinaire
+3,valeur1+3
    movff    MotBinaire
+4,valeur1+4
    call    addition32
    movff    valeur2
+0,MotBinaire+0
    movff    valeur2
+1,MotBinaire+1
    movff    valeur2
+2,MotBinaire+2
    movff    valeur2
+3,MotBinaire+3
    movff    valeur2
+4,MotBinaire+4
    
    bra    main
    
    
    
    bra    main
    
    
; ----------------------------------------

#include    <VFO routines.asm>
#include    <VFO tempos.asm>
end


Code : Tout sélectionner

; 3500Khz: 00 07 2B 02 0C
; 3564Khz: 00 07 4C 8F FB
; 5500Khz: 00 0B 43 95 81
; 6981Khz; 00 0E 4C 0D F5
; 7000Khz: 00 0E 56 04 18
; 7011Khz: 00 0E 5C 4E 00
; 7012Khz: 00 0E 5C 4E B5
; 7020Khz: 00 0E 60 80 73
; 7043khz: 00 0E 6C 8F 75

prog_AD9850
    
; 
    movff    MotBinaire
+4,tampon    ; b3      1011 0011
    call    traitement_octet
    nop
    
; 
    movff    MotBinaire
+3,tampon    ; a7    1010 0111
    call    traitement_octet
    nop
    
; 
    movff    MotBinaire
+2,tampon    ; 70    0111 0000
    call    traitement_octet
    nop
    
; 
    movff    MotBinaire
+1,tampon    ; 0d    0000 1101
    call    traitement_octet
    nop
    
; 0000 0000
    movff    MotBinaire
,tampon    ; 00    0000 0000
    call    traitement_octet
    nop
    
    bsf    fq_ud
    bcf    fq_ud    

    return        

traitement_octet
    movff    tampon
,WREG

    rrcf    WREG
,w        ;1
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk
    
    rrcf    WREG
,w        ;2
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk

    rrcf    WREG
,w        ;3
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk
    
    rrcf    WREG
,w        ;4
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk
    
    rrcf    WREG
,w        ;5
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk
    
    rrcf    WREG
,w        ;6
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk
    
    rrcf    WREG
,w        ;7
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk

    rrcf    WREG
,w        ;8
    bcf    LATC
,0
    btfsc    STATUS
,C
    bsf    LATC
,0
    bsf    w_clk
    bcf    w_clk
    
    return
    
    
    
    
    
    
    
    
;********************************************************************
;
                Addition sur entiers 32bits_ F6FCO                    *
;
     Il faut préalablement déclarer des variables sur 32 bits         *
;
             valeur1:4, valeur2:4 et report16                        *
;
                                                                    *
;
 Placer le poids faible de la première valeur dans valeur1            *
;
 et les poids forts dans valeur1+1, valeur1+2, valeur1+3            *
;
                                                                    *
;
 Placer le poids faible de la valeur à additionner dans valeur2    *
;
 et les poids forts dans valeur2+1, +2, +3, +4                      *  
;                                                                    * 
; Appeler la procédure addition32 et le résultat de                     *
;
 valeur1+valeur2 sur 32bits sera dans les 4 octets de valeur2           *
;
 Si carry, il sera stocké dans report16                            *
;********************************************************************
addition32
            movf    valeur1
,w
            addwf    valeur2
,f
            movf    valeur1
+1,w
            addwfc    valeur2
+1,f
            movf    valeur1
+2,w
            addwfc    valeur2
+2,f
            movf    valeur1
+3,w
            addwfc    valeur2
+3,f
            
; s'il y a carry il sera stocké dans report16
            movf    STATUS,w
            andlw    0x1
            movwf    report16
            return    



;********************************************************************
;               Soustraction sur entiers 32bits  _  F6FCO                    *
;     Il faut prélablement déclarer les variables sur 32bits            * 
;             valeur1:4    et valeur2:4 et report16                    *
;                                                                    *
; Placer le poids fort de la première valeur dans valeur1+3            *
; et les poids plus faibles dans valeur1+2, valeur+1, valeur        *
;                                                                    *
; Placer le poids fort de la valeur à soustraire dans valeur2+3        *
; et les poids faibles dans valeur2+2, valeur2+1, valeur2           * 
;                                                                    *  
; Appeler la procédure soustraction32 et le résultat de             *
; valeur1-valeur2 sur 32bits sera dans les 4 octets de valeur1         *
;********************************************************************
soustraction32
            movf    valeur2,w
            subwf    valeur1
            movf    valeur2+1,w
            subwfb    valeur1+1
            movf    valeur2+2,w
            subwfb    valeur1+2
            movf    valeur2+3,w
            subwfb    valeur1+3
            movf    valeur2+4,w
            subwfb    valeur1+4
            return
        
;------------------------------------------------------------------------------
;
;        Gestion encodeur rotatif _ F6FCO
;            Octobre 2021
;
;    pin A de l'
encodeur sur PORTD,0
;    pin B de l'encodeur sur PORTD,1
;
; Déclarer les variables:
;    EncA_old    :1     ; état de la pin A de l'
encodeur au tour d'avant
;    EncB_old    :1     ; état de la pin B de l'
encodeur au tour d'avant
;    Sens        :1    ; sens de rotation de l'
encodeur
;-------------------------------------------------------------------------------

Gestion_encodeur
    movf    PORTB
,w
    andlw    b
'00000001'
    subwf    EncA_old,w
    btfsc    STATUS
,Z
    goto    enc1
        
enc3    movf    PORTB
,w        ; est-ce que A=B_old ?
    andlw    b'00000010'
    rrncf    WREG,w
    subwf    EncA_old
,w
    btfsc    STATUS
,Z
    goto    enc4
    movlw    1
    movwf    Sens        
; Sens=1  horaire
    
enc5    movf    PORTB
,w
    andlw    b
'00000001'
    movwf    EncA_old
    movf    PORTB
,w
    andlw    b
'00000010'
    movwf    EncB_old
    return    

enc1    movf    PORTB
,W
    andlw    b
'00000010'
    subwf    EncB_old,w
    btfss    STATUS
,Z
    goto    enc3
    
enc2    movlw    2
    movwf    Sens        
; sens=2  encodeur figé
    return
    
enc4    clrf    Sens        
; Sens=0 anti-horaire
    goto    enc5
    






; ----------------------------------------------------------------------------
Puis la version avec fréquence variable par encodeur.

Code : Tout sélectionner

;************************************************************************************************
;
                         F6FCO - AD9850                        ;
;
                                                                                      ;
;**********************************************************************************************
 ;


        Errorlevel-302 
        list        p
=18f2525                
        
#include    <p18f2525.inc>            
    

 CONFIG OSC 
= INTIO67                     ; Oscillateur interne 8MHz 
 CONFIG IESO 
= OFF                        ; Délai au démarrage (ON/OFF)
 CONFIG BOREN = OFF                       ; Reset si chute de tension (ON/OFF)
 CONFIG BORV = 0                          ; Tension de reset en 1/10ème Volts 
 CONFIG WDT 
= OFF                         ; Mise hors service du watchdog (ON/OFF)
 CONFIG PBADEN = OFF                      ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
 CONFIG LPT1OSC 
= OFF                     ; Timer1 configuré pour un fonctionnement plus puissant
 CONFIG MCLRE 
= ON                        ; Mclr configuré comme entrée
 CONFIG STVREN 
= ON                       ; Reset sur débordement de pile (ON/OFF)
 CONFIG LVP = OFF                         ; Programmation basse tension autorisée (ON/OFF)
 CONFIG XINST = OFF                       ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
 CONFIG DEBUG = OFF                       ; Debugger hors service
 CONFIG CP0 = OFF                         ; Code protection sur block 0 (ON/OFF)
 CONFIG CP1 = OFF                         ; Code protection sur block 1 (ON/OFF)
 CONFIG CP2 = OFF                         ; Code protection sur block 2 (ON/OFF)
 CONFIG CPB = OFF                         ; Code protection sur bootblock  (ON/OFF)
 CONFIG CPD = OFF                         ; Code protection sur eeprom (ON/OFF)
 CONFIG WRT0 = OFF                        ; Protection écriture block 0 (ON/OFF)
 CONFIG WRT1 = OFF                        ; Protection écriture block 1 (ON/OFF)
 CONFIG WRT2 = OFF                        ; Protection écriture block 2 (ON/OFF)
 CONFIG WRTB = OFF                        ; Protection écriture bootblock (ON/OFF)
 CONFIG WRTC = OFF                        ; Protection écriture configurations (ON/OFF)
 CONFIG WRTD = OFF                        ; Protection écriture zone eeprom (ON/OFF)
 CONFIG EBTR0 = OFF                       ; Protection lecture de table block 0 (ON/OFF)
 CONFIG EBTR1 = OFF                       ; Protection lecture de table block 1 (ON/OFF)
 CONFIG EBTR2 = OFF                       ; Protection lecture de table block 2 (ON/OFF)
 CONFIG EBTRB = OFF                       ; Protection lecture de table bootblock (ON/OFF)

; ------------------------------------ #define
; D0 à D7 AD9850 sur port C
#define fq_ud        LATB,2
#define    w_clk        LATB,3
#define    raz        LATB,4
#define    datas        LATA,3
#define EncA        LATB,0
#define EncB        LATB,1
#define Out1        LATA,5        ; sortie vers AD9850


; ------------------------------------ 
     CBLOCK H'
0
        Reg_1            :1
        Reg_2            :1
        Reg_3            :1
        valeur1            :4
        valeur2            :4
        report16        :1
        EncA_old        :1     ; état de la pin A de l'
encodeur au tour d'avant
        EncB_old        :1     ; état de la pin B de l'
encodeur au tour d'avant
        Sens            :1    ; sens de rotation de l'
encodeur
        tampon            
:1    ; registre à tout faire
        MotBinaire        
:5    ; mot de programmation AD9850 
        ptr            
:1    ; compteur à tout faire
    ENDC

    ORG H
'0'
    
; ------------------------------------ 
init

mov       movlw     B
'01110011'
        movwf     OSCCON            
    movlw    b
'00000000'
    movwf    TRISA
    movlw    b
'00000011'
    movwf    TRISB
    movlw    b
'00000000'
    movwf    TRISC
    


Code : Tout sélectionner

#include     <VFO init.asm>
; -----------------------------------
;
initialisations variables encodeur
    movlw    2
    movwf    Sens
    movf    PORTB
,w
    andlw    b
'00000001'
    movwf    EncA_old
    movf    PORTB
,w
    andlw    b
'00000010'
    movwf    EncB_old
    
; Initialisation du mot binaire de programmation AD9850
    movlw    0xb5
    movwf    MotBinaire
+0
    movlw    0x4e
    movwf    MotBinaire
+1
    movlw    0x5c
    movwf    MotBinaire
+2
    movlw    0x0e
    movwf    MotBinaire
+3
    movlw    0x00
    movwf    MotBinaire
+4

    
; incrément 100Hz (0x0d6c)
    ;movlw    0x6c
    
;movwf    valeur1+0
    
;movlw    0x0d
    
;movwf    valeur1+1
    
    
; incrément 250Hz (0x218e)
    ;movlw    0x8e
    
;movwf    valeur1+0
    
;movlw    0x21
    
;movwf    valeur1+1

    
; incrément 500Hz (0x431c)
    ;movlw    0x1c
    
;movwf    valeur1+0
    
;movlw    0x43
    
;movwf    valeur1+1

    
    
main    nop
    bcf    raz
    call    Prog_AD9850
    
    
; ----- Gestion changement de fréquence
encod    nop
    call    Gestion_encodeur
    movlw    2
    subwf    Sens
,w
    btfsc    STATUS
,Z
    bra    encod
    movlw    1
    subwf    Sens
,w
    btfsc     STATUS
,Z
    bra    increment
decrement
    nop
    movlw    0x1c
    movwf    valeur2
+0
    movlw    0x43
    movwf    valeur2
+1
    clrf    valeur2
+2
    clrf    valeur2
+3

    nop
    movff    MotBinaire
+0,valeur1+0
    movff    MotBinaire
+1,valeur1+1
    movff    MotBinaire
+2,valeur1+2
    movff    MotBinaire
+3,valeur1+3
    movff    MotBinaire
+4,valeur1+4
    call    soustraction32
    movff    valeur1
+0,MotBinaire+0
    movff    valeur1
+1,MotBinaire+1
    movff    valeur1
+2,MotBinaire+2
    movff    valeur1
+3,MotBinaire+3
    movff    valeur1
+4,MotBinaire+4
    bra    main    
    
increment
    nop
    
;bra main
    nop
    movlw    0x1c
    movwf    valeur2
+0
    movlw    0x43
    movwf    valeur2
+1
    clrf    valeur2
+2
    clrf    valeur2
+3

    nop
    movff    MotBinaire
+0,valeur1+0
    movff    MotBinaire
+1,valeur1+1
    movff    MotBinaire
+2,valeur1+2
    movff    MotBinaire
+3,valeur1+3
    movff    MotBinaire
+4,valeur1+4
    call    addition32
    movff    valeur2
+0,MotBinaire+0
    movff    valeur2
+1,MotBinaire+1
    movff    valeur2
+2,MotBinaire+2
    movff    valeur2
+3,MotBinaire+3
    movff    valeur2
+4,MotBinaire+4
    
    bra    main
    
    
    
    bra    main
    
    
; ----------------------------------------

#include    <VFO routines.asm>

end


Code : Tout sélectionner

; 3500Khz: 00 07 2B 02 0C
; 3564Khz: 00 07 4C 8F FB
; 5500Khz: 00 0B 43 95 81
; 6981Khz; 00 0E 4C 0D F5
; 7000Khz: 00 0E 56 04 18
; 7011Khz: 00 0E 5C 4E 00
; 7012Khz: 00 0E 5C 4E B5
; 7020Khz: 00 0E 60 80 73
; 7043khz: 00 0E 6C 8F 75

; -------------------------------------------------------------

prog_AD9850
    
; 
    movff    MotBinaire
+4,tampon    ;      1011 0011
    call    traitement_octet
    
; 
    movff    MotBinaire
+3,tampon    ;     1010 0111
    call    traitement_octet
    
; 
    movff    MotBinaire
+2,tampon    ;     0111 0000
    call    traitement_octet
    
; 
    movff    MotBinaire
+1,tampon    ;     0000 1101
    call    traitement_octet
    
; toujours initialisé à 0x00
    movff    MotBinaire
,tampon    ;     0000 0000
    call    traitement_octet
    
; validation
    bsf    fq_ud
    bcf    fq_ud    
    return        

;
;
 traite chaque bit de l'octet et les valides par un front montant w_clk
traitement_octet
    movlw    8
    movwf    ptr
    movff    tampon,WREG
loop_octet
    rrcf    WREG,w        
    bcf    Out1
    btfsc    STATUS,C
    bsf    Out1
    bsf    w_clk
    bcf    w_clk
    
    decfsz    ptr
    bra    loop_octet
    return



    
    
;********************************************************************
;                Addition sur entiers 32bits_ F6FCO                    *
;     Il faut préalablement déclarer des variables sur 32 bits         *
;             valeur1:4, valeur2:4 et report16                        *
;                                                                    *
; Placer le poids faible de la première valeur dans valeur1            *
; et les poids forts dans valeur1+1, valeur1+2, valeur1+3            *
;                                                                    *
; Placer le poids faible de la valeur à additionner dans valeur2    *
; et les poids forts dans valeur2+1, +2, +3, +4                      *  
;                                                                    * 
; Appeler la procédure addition32 et le résultat de                     *
; valeur1+valeur2 sur 32bits sera dans les 4 octets de valeur2           *
; Si carry, il sera stocké dans report16                            *
;********************************************************************
addition32
            movf    valeur1,w
            addwf    valeur2,f
            movf    valeur1+1,w
            addwfc    valeur2+1,f
            movf    valeur1+2,w
            addwfc    valeur2+2,f
            movf    valeur1+3,w
            addwfc    valeur2+3,f
            ; s'
il y a carry il sera stocké dans report16
            movf    STATUS
,w
            andlw    0x1
            movwf    report16
            return    



;********************************************************************
;
               Soustraction sur entiers 32bits  _  F6FCO                    *
;
     Il faut prélablement déclarer les variables sur 32bits            * 
;             valeur1:4    et valeur2:4 et report16                    *
;
                                                                    *
;
 Placer le poids fort de la première valeur dans valeur1+3            *
;
 et les poids plus faibles dans valeur1+2, valeur+1, valeur        *
;
                                                                    *
;
 Placer le poids fort de la valeur à soustraire dans valeur2+3        *
;
 et les poids faibles dans valeur2+2, valeur2+1, valeur2           * 
;                                                                    *  
; Appeler la procédure soustraction32 et le résultat de             *
;
 valeur1-valeur2 sur 32bits sera dans les 4 octets de valeur1         *
;********************************************************************
soustraction32
            movf    valeur2
,w
            subwf    valeur1
            movf    valeur2
+1,w
            subwfb    valeur1
+1
            movf    valeur2
+2,w
            subwfb    valeur1
+2
            movf    valeur2
+3,w
            subwfb    valeur1
+3
            movf    valeur2
+4,w
            subwfb    valeur1
+4
            return
        
;------------------------------------------------------------------------------
;
;
        Gestion encodeur rotatif _ F6FCO
;            Octobre 2021
;
;
    pin A de l'encodeur sur PORTD,0
;    pin B de l'
encodeur sur PORTD,1
;
;
 Déclarer les variables:
;
    EncA_old    :1     ; état de la pin A de l'encodeur au tour d'avant
;    EncB_old    :1     ; état de la pin B de l'encodeur au tour d'avant
;    Sens        :1    ; sens de rotation de l'encodeur
;-------------------------------------------------------------------------------

Gestion_encodeur
    movf    PORTB,w
    andlw    b'
00000001'
    subwf    EncA_old,w
    btfsc    STATUS,Z
    goto    enc1
        
enc3    movf    PORTB,w        ; est-ce que A=B_old ?
    andlw    b'
00000010'
    rrncf    WREG,w
    subwf    EncA_old,w
    btfsc    STATUS,Z
    goto    enc4
    movlw    1
    movwf    Sens        ; Sens=1  horaire
    
enc5    movf    PORTB,w
    andlw    b'
00000001'
    movwf    EncA_old
    movf    PORTB,w
    andlw    b'
00000010'
    movwf    EncB_old
    return    

enc1    movf    PORTB,W
    andlw    b'
00000010'
    subwf    EncB_old,w
    btfss    STATUS,Z
    goto    enc3
    
enc2    movlw    2
    movwf    Sens        ; sens=2  encodeur figé
    return
    
enc4    clrf    Sens        ; Sens=0 anti-horaire
    goto    enc5
    

    
; ------------------------------------------------------------------

modif_frq
encod    nop
    call    Gestion_encodeur ; retourne sens de rotation ou immobile
    movlw    2
    subwf    Sens,w
    btfsc    STATUS,Z
    bra    encod
    movlw    1
    subwf    Sens,w
    btfsc     STATUS,Z
    bra    increment
decrement
    nop
    movlw    0x8e
    movwf    valeur2+0
    movlw    0x21
    movwf    valeur2+1
    clrf    valeur2+2
    clrf    valeur2+3

    nop
    movff    MotBinaire+4,valeur1+0
    movff    MotBinaire+3,valeur1+1
    movff    MotBinaire+2,valeur1+2
    movff    MotBinaire+1,valeur1+3
    movff    MotBinaire+0,valeur1+4
    call    soustraction32
    movff    valeur1+4,MotBinaire+0
    movff    valeur1+3,MotBinaire+1
    movff    valeur1+2,MotBinaire+2
    movff    valeur1+1,MotBinaire+3
    movff    valeur1+0,MotBinaire+4
    return    
    
increment
    nop
    ;bra main
    nop
    movlw    0x8e
    movwf    valeur2+0
    movlw    0x21
    movwf    valeur2+1
    clrf    valeur2+2
    clrf    valeur2+3

    nop
    movff    MotBinaire+4,valeur1+0
    movff    MotBinaire+3,valeur1+1
    movff    MotBinaire+2,valeur1+2
    movff    MotBinaire+1,valeur1+3
    movff    MotBinaire+0,valeur1+4
    call    addition32
    movff    valeur2+4,MotBinaire+0
    movff    valeur2+3,MotBinaire+1
    movff    valeur2+2,MotBinaire+2
    movff    valeur2+1,MotBinaire+3
    movff    valeur2+0,MotBinaire+4
    return    


https://www.youtube.com/watch?v=ZMSkBGTPazE

Il fonctionne pour l'instant sur un petit fréquencemètre chinois à 8€ mais je vais tenter de lui greffer un affichage LCD sur le même PIC.
Une porte nand prend 2 bits en entrée... cochonne va !!! :langue:

Programmer l'AD9850
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2027
Enregistré en : juillet 2016
Localisation : Terre

#58 Message par Temps-x » dim. 7 nov. 2021 18:37

Bonsoir F6FCO, et tout le forum,

8-) ça avance à ce que je vois, je suis sur plusieurs chose à la fois, mais chaque chose avance, comme j'ai maintenant compris comment mettre en fonction le compteur de fréquence, je vais faire la même chose que toi, mais avec avance réglable( sur écran LCD).

Bon mon bute n'est pas le même que le tiens, mais reste similaire, car je fabrique un fréquencemètre(1 Hz à 2500 Mhz), compteur(1 à 16777215) générateur de signal carré(1 hz à 10Mhz), comptage de temps(1 µs à 16777215 µs), générateur de PWM (20000 Hz (1% a 100%)), lecteur ADC sous 5 volts, donc je suis occupé pour un bout de temps, de plus je vais peut être pas prendre un écran LCD.

Je vais quand même faire le générateur, avec lecture de fréquence pour que tu puisses avancer,

Merci ! pour cette vidéo,

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Programmer l'AD9850
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1255
Âge : 67
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#59 Message par F6FCO » dim. 7 nov. 2021 18:44

Hello,
Beau projet, je l'ai aussi en stock mais il va falloir que je commande du temps chez Aliexpress :wink: Ca va t'occuper un bon bout de temps d'implémenter tout çà.

Je vais quand même faire le générateur, avec lecture de fréquence pour que tu puisses avancer,

Ne t'embête pas, je travaille déjà sur l'affichage mais d'une autre façon, le LCD sera géré par le même PIC que l'AD9850. C'est bien avancé mais pour continuer j'ai besoin de me coder une multiplication 32x16bits.
Une porte nand prend 2 bits en entrée... cochonne va !!! :langue:

Programmer l'AD9850
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1255
Âge : 67
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#60 Message par F6FCO » dim. 28 nov. 2021 11:14

Hello le monde,

Je viens donner quelques nouvelles de l'avancement du projet. Ca avance, je vois le bout du tunnel mais je rencontre quelques difficultés de parcours.
- L'ad9850 fonctionne bien et la fréquence varie bien sous l'action de l'encodeur, on visualise bien la frq de sortie avec un fréquencemètre.
- L'idée maintenant c'est de ne pas utiliser de fréquencemètre en sortie mais de faire faire la visu par le même PIC, j'ai quelques idées sympa pour l'affichage final.
- Je ne vois pas trop comment partager le temps du PIC entre la prog de l'ad9850 et utiliser les timers pour un vrai fréquencemètre, même avec les interrupt, çà pourrait se faire mais ce serait une vraie usine à gaz, pas envie de me lancer la-dedans pour l'instant, je garde çà pour une option future.

Donc mon idée de partir du mot binaire de programmation pour l'instant déclaré en dur dans l'init et que je fais ensuite varier, et de le "déconstruire" pour arriver à la fréquence, convertir en ascii et afficher dans un premier temps sur LCD.
Ce mot binaire donne par exemple 0x000E5C4EB5 pour 7012Khz.
Pour cela j'utilise à l'envers la formule de calcul donnée pour le DDS: MotBinaire de prog= fq*(2^32/125000) .

Ca implique une grosse division 32/16 qui tourne en permanence pour faire la conversion motBinaire en frq, qui me bouffe un temps machine incroyable et qui ralentit tout le système, la prog du DDS se fait bien (il lui suffit d'un coup pour qu'il tourne) mais l'action sur l'encodeur est mal reconnue étant donné que le plus gros du temps machine se passe dans la (les) division(s). Cette routine de division est de mon cru, programmée rapidement pour le besoin et certainement pas ce qui se fait de mieux, il va falloir que je retravaille dessus.
Il faut que cette division 32/16 me donne un reste, je n'ai pas trouvé mon bonheur sur le net donc je m'y colle.

J'ai voulu augmenter la frq de travail du PIC mais j'avais un souci d'oscillateur qui ne fonctionnait pas correctement, Satinas m'a donné la solution. Depuis je tourne avec un xtal 64Mhz, çà tourne mais ne résoud pas le pbm d'overbookage du PIC.

Et pour faire bon poids j'ai des soucis avec MPLab 8.92 qui me fait des misères, parfois (c'est aléatoire) le build ou la programmation (aussi bien en Débug qu'en Program) se met à mouliner et çà prends plusieurs minutes avant de se faire, j'ai changé le Pickit et il ne semble pas en cause. Ca ne m'aide pas à avancer.
Une porte nand prend 2 bits en entrée... cochonne va !!! :langue:


Retourner vers « Langage ASM »

Qui est en ligne

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