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
Programmer l'AD9850
Bonsoir F6FCO, venom, et tout le forum,
C'est seulement d'apparence que tu es doux ..... non, excuse moi, j'ai pas voulu te contrarier, pitié......
Le problème de l'encodeur 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, 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
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+
venom a écrit :Source du message pourtant je suis doux comme un agneau
C'est seulement d'apparence que tu es doux ..... non, excuse moi, j'ai pas voulu te contrarier, pitié......
Le problème de l'encodeur 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, 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
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+
Programmer l'AD9850
- F6FCO
Expert- Messages : 1420
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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,
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,
Programmer l'AD9850
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour à tous ,
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) ?
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
Programmer l'AD9850
- F6FCO
Expert- Messages : 1420
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonsoir,
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.
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.
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.
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.
Programmer l'AD9850
Bonsoir paulfjujo, F6FCO, et tout le forum,
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
Je vais le faire à partir du pic, avec un des Timer, je n'ai pas besoin d'une grande précision, pour l'instant.
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
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 incroyable, 4 compteurs de 24 bits pour les MODES DE FONCTIONNEMENT CMS, vraiment passionnent de voir tout ça
Faut de quoi les programmer ses Pic évolué, 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+
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.
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
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
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 incroyable, 4 compteurs de 24 bits pour les MODES DE FONCTIONNEMENT CMS, vraiment passionnent de voir tout ça
paulfjujo a écrit :Source du message sur les PIC évolué on a un aussi module DSM
ciruit de modulation de porteuse ...
Faut de quoi les programmer ses Pic évolué, 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.
Programmer l'AD9850
Programmer l'AD9850
- F6FCO
Expert- Messages : 1420
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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.
; ----------------------------------------------------------------------------
Puis la version avec fréquence variable par encodeur.
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.
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.
Programmer l'AD9850
Bonsoir F6FCO, et tout le forum,
ç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,
pour cette vidéo,
A+
ç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,
pour cette vidéo,
A+
Programmer l'AD9850
- F6FCO
Expert- Messages : 1420
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Hello,
Beau projet, je l'ai aussi en stock mais il va falloir que je commande du temps chez Aliexpress Ca va t'occuper un bon bout de temps d'implémenter tout çà.
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.
Beau projet, je l'ai aussi en stock mais il va falloir que je commande du temps chez Aliexpress 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.
Programmer l'AD9850
- F6FCO
Expert- Messages : 1420
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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.
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.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 139 invités