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
Bonjour à toute l'équipe du forum
Bonjour tout le monde
bon désolé, le temps me manque...
JJE, je regarderai cela de plus prés en ouvrant un post sur ce sujet, merci pour l'info
Nondediode, etrange que tu ne puisses pas assembler les udata, nous devons avoir des versions differentes, j'utilise mplabx sous windows10 pour info
Tu as bien fait de supprimé, c'est parce que j'ai fait les essais de JJE sur ton fichier, pas bien
pour la led qui ne clignote pas c'est une erreur de moi
j'ai modifié pour la led, supprimé la variable udata, rajouté des tempos pour te faire patienter.j'essai maintenant de comprendre les données a envoyer a ton afficheur
bon désolé, le temps me manque...
JJE, je regarderai cela de plus prés en ouvrant un post sur ce sujet, merci pour l'info
Nondediode, etrange que tu ne puisses pas assembler les udata, nous devons avoir des versions differentes, j'utilise mplabx sous windows10 pour info
Tu as bien fait de supprimé, c'est parce que j'ai fait les essais de JJE sur ton fichier, pas bien
pour la led qui ne clignote pas c'est une erreur de moi
j'ai modifié pour la led, supprimé la variable udata, rajouté des tempos pour te faire patienter.j'essai maintenant de comprendre les données a envoyer a ton afficheur
Code : Tout sélectionner
;---------------------------------------------------------GESTION AFFICHEUR-----------------------------------------------------------------
; TITRE: Gestion d'un afficheur LCD graphique
; DATE: 10/11/2018
; AUTEUR: nondediode
; PIC UTILISE: PIC16F877
; Gestion PP845 version 2019
; le quartz est de 4MHz
; essai JMarc Version 1,01
;----------------------------------------------------Brochage du PIC sur la carte---------------------------------------------------------
;
; Port | Broche | E/S | Description
; RA0 | 02 | S | Relais "MUTE"
; RA1 | 03 | S | Relais "PHASE"
; RA2 | 04 | S | LED droite
; RA3 | 05 | S | LED gauche
; RA4 | 06 | S | Relais de cde HT gauche et droit
; RA5 | 07 | S | Relais statique gauche et droit
; RB0 | 33 | E | Inter "on / off"
; RB1 | 34 | E | Bouton poussoir "OK"
; RB2 | 35 | S | Data Write afficheur
; RB3 | 36 | S | Data Read afficheur
; RB4 | 37 | S | Chip Enable
; RB5 | 38 | S | C/D
; RB6 | 39 | S | Font Size Select
; RB7 | 40 | S | Reset
; RC0 | 15 | S | Adressage entrée audio bit A
; RC1 | 16 | S | Adressage entrée audio bit B
; RC2 | 17 | S | Adressage entrée audio bit C
; RC3 | 18 | S | Adressage entrée audio bit D
; RC4 | 23 | S | LEDs Rouge droit et gauche
; RC5 | 24 | E | Bouton poussoir "INPUT"
; RC6 | 25 | E | Bouton poussoir "PHASE"
; RC7 | 26 | E | Bouton poussoir "MUTE"
; RD0 | 19 | S | Sortie bit D7 du LCD
; RD1 | 20 | S | Sortie bit D6 du LCD
; RD2 | 21 | S | Sortie bit D5 du LCD
; RD3 | 22 | S | Sortie bit D4 du LCD
; RD4 | 27 | S | Sortie bit D3 du LCD
; RD5 | 28 | S | Sortie bit D2 du LCD
; RD6 | 29 | S | Sortie bit D1 du LCD
; RD7 | 30 | S | Sortie bit D0 du LCD
;--------------------------------------------------DIRECTIVE D'ASSEMBLAGE POUR MPLAB-------------------------------------------------------
list p=16f877a
#include <p16f877.inc>
radix dec ; on travaille en décimal par défaut
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
OPTIONVAL EQU B'00001111'
;-------------------------------------------------Definition de la RAM------------------------------------------------------
cblock 0x20
TEMP ;temp buffer
DATAL ;instruction donnée =0
DATAH ;instruction donnée =1
COMMAND ;instruction
TABLECOUNT ;tablecounter
endc
cblock 0x70
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
Tempj : 1
delai1_LED_TEMOIN : 1
delai2_LED_TEMOIN : 1
temptmr0 : 1
temp1tmr1 : 1
DATA_L : 1
DATA_H : 1
CMD : 1
STATUS_TEMP ;interruptcontextsave for STATUS
PCLATH_TEMP ;interruptcontextsave for PCLATH
COUNT1 ;delaycounter 1
COUNT2 ;delaycounter 2
COUNT3 ;delaycounter 3
DATA_EE_ADDR ;data EEPROM address buffer
DATA_EE_DATA ;data EEPROM data buffer
endc
;-------------------------------------------------Definition des constantes------------------------------------------------------
#DEFINE LED_TEMOIN PORTA,1
#DEFINE LED_TEMOIN2 PORTA,0
#DEFINE LCD_WR PORTB,2 ; RB2 | 35 | S | Data Write afficheur
#DEFINE LCD_RD PORTB,3 ; RB3 | 36 | S | Data Read afficheur
#DEFINE LCD_CE PORTB,4 ; RB4 | 37 | S | Chip Enable
#DEFINE LCD_CD PORTB,5 ; RB5 | 38 | S | C/D
#DEFINE LCD_FS PORTB,6 ; RB6 | 39 | S | Font Size Select
#DEFINE LCD_RESET PORTB,7 ; RB7 | 40 | S | Reset
LCD_DATA EQU PORTD
;--------------------------------------------Definition des registres temporaires------------------------------------------------------
;--------------------------------------------Directives des programmes------------------------------------------------------
;=====================================Macro=====================================
led_cligno_lent macro
movlw 0x28 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x5A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_rapide macro
movlw 0x08 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x0A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_flash macro
movlw 0x29 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x2A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
CtlAff macro ctr
movlw ctr
movwf CMD
call Envoi_cmd
endm
DataAff_8 macro x1,x2
movlw x1
movwf CMD
movlw x2
movwf DATA_L
call Envoi_data_8
call Envoi_cmd
endm
DataAff_16 macro x1,x2
movlw x1
movwf CMD
movlw (x2) / 0x100
movwf DATA_H
movlw (x2) % 0x100
movwf DATA_L
call Envoi_data_16
call Envoi_cmd
endm
;===============================================================================
org 0x000 ; Debut du programme principale
goto START ; Saut à START
;*****************************************************************************
; ROUTINE INTERRUPTION *
;*****************************************************************************
;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR
bsf STATUS,RP0 ; sélectionner banque1
btfss PIE1,TMR1IE ; tester si interrupt autorisée
goto intsw1 ; non sauter
bcf STATUS,RP0 ; oui, sélectionner banque0
btfss PIR1,TMR1IF ; oui, tester si interrupt en cours
goto intsw1 ; non sauter
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
incf temp1tmr1,f
movf delai2_LED_TEMOIN,w ;on test si Xfois
subwf temp1tmr1,W
btfss STATUS,Z
goto suite_led_temoin
bcf LED_TEMOIN
; bsf LED_TEMOIN
clrf temp1tmr1
goto sautintsw9
suite_led_temoin
movf delai1_LED_TEMOIN,w
subwf temp1tmr1,W
btfss STATUS,Z
goto sautintsw9
bsf LED_TEMOIN
; bcf LED_TEMOIN ; inversion des sorties pour la platine essais
sautintsw9
bcf PIR1,TMR1IF ; effacer flag interupt
intsw1
bcf STATUS,RP0 ; oui, sélectionner banque0
;restaurer registres
;-------------------
restorereg
bcf STATUS,RP0
movf FSR_temp , w ; charger FSR sauvé
movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie
;-------------------------------------------------INITIALISATION------------------------------------------------------
START
; Registre d'options (banque 1)
; -----------------------------
BANKSEL OPTION_REG ; sélectionner banque 1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; registres interruptions (banque 1)
; ----------------------------------
bsf INTCON,PEIE ; autoriser interruptions périphériques
bcf STATUS,RP0 ; passer banque 0
; autoriser interruptions (banque 0)
; ----------------------------------
bsf T1CON,0X4
bcf T1CON,0X5
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
BSF T1CON,TMR1ON ;on TMR1 bit a 1
CLRF PORTA ; Remise à 0 du port A
CLRF PORTB ; Remise à 0 du port B
CLRF PORTC ; Remise à 0 du port C
CLRF PORTD ; Remise à 0 du port D
CLRF PORTE ; Remise à 0 du port E
bsf STATUS,RP0 ; Banque 1
clrf TRISA ; PortA en sortie
movlw b'00000110'
movwf ADCON1 ; sortie digital
; PORTA, PORTB, PORTC, and PORTE outputs
CLRF TRISB ; PORTD defaults to input
CLRF TRISC ;
CLRF TRISE ;
BSF PIE1,TMR1IE ;valide le TMR1
bcf STATUS,RP0 ; Banque 0
led_cligno_lent
bsf INTCON,GIE ; valider interruptions
bsf LCD_WR ; RB2 | 35 | S | Data Write afficheur
bsf LCD_RD ; RB3 | 36 | S | Data Read afficheur
bsf LCD_CE ; RB4 | 37 | S | Chip Enable
bsf LCD_CD ; RB5 | 38 | S | C/D
bsf LCD_FS ; font 6x8
bsf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bcf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bsf LCD_RESET
CtlAff 0x80 ; select CG ROM afficheur et mode OR 10000000
call Delay50mS
DataAff_16 0x42,0x0000 ;set grp en 0000h
call Delay50mS
DataAff_16 0x43,0x2800 ;set pavé grp 6x8 (40) ou 8x8 (30)
call Delay50mS
DataAff_16 0x40,0x0017 ;set text en 1700h
call Delay50mS
DataAff_16 0x41,0x2800 ; set pavé grp 6x8 (40) ou 8x8 (30)
call Delay50mS
CtlAff 0xa0 ; épaisseur curseur 1 lignes (1 à 8) 10100000
call Delay50mS
CtlAff 0x9c ; afficher grp/txt et cacher curseur 10011100
call Delay50mS
DataAff_16 0x24,0x1700
call Delay50mS
; DataAff('A'-32); CtlAff10(0xc0); // afficher 'A'
DataAff_8 0xc0,0x24 ; afficher 'D'. Modif effectué
call Delay50mS
led_cligno_rapide
loop
nop
;
GOTO loop ; boucle principale
;-------------------------------------------------Programme tempo------------------------------------------------------
Delay50mS
MOVLW 0x40 ; Charge la valeur dans W
MOVWF COUNT1 ; Transfert de W sur COUNT1
MOVWF COUNT2 ; Transfert de W sur COUNT2
DECFSZ COUNT1,F ; On décrémente COUNT1,F
GOTO $-1 ; Comptage de boucle
DECFSZ COUNT2,F ; On décrémente COUNT2,F
GOTO $-3 ; Comptage de boucle
RETURN
Delay
MOVWF COUNT3 ; Transfert de W sur COUNT3
CALL Delay50mS ; Appel de l'étiquette Delay50mS
DECFSZ COUNT3,F ; On décrémente COUNT3,F
GOTO $-2 ; Comptage de boucle
RETURN
;===============================================================================
Envoi_cmd
bsf LCD_CD ; etat haut pour commande
bcf LCD_CE ; Chip Enable
movf CMD,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
return
Envoi_data_8
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
Envoi_data_16
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
movf DATA_H,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
END
Modifié en dernier par JMarc le mer. 5 déc. 2018 23:54, modifié 1 fois.
Bonjour à toute l'équipe du forum
JMarc, Je vois pas pourquoi tu butes sur ces macros
DataAff_16 envoie une commande suivie d'une valeur 16 bits.
donc pour envoyer la commande 0x40 suivie de l'adresse de la ram texte 0x1700, on fait
DataAff_16 0x40,0x1700
et dans ta macro tu récupères bien les 3 octets et les envoie dans le bon ordre attendu par l'afficheur, 0x00 puis 0x17 puis 0x40
Pour l'affichage d'un caractère, pareil il faut inverser, tu mets x1 dans CMD, c'est bon, et il faut donc mettre la commande 0xc0 en premier
DataAff_8 0xc0, 0x24
Ca paraît compliqué ces macros, mais à l'arrivée le main fait 10 lignes.
Pour la remarque sur la broche FS, on peut voir ça plus tard.
DataAff_16 envoie une commande suivie d'une valeur 16 bits.
donc pour envoyer la commande 0x40 suivie de l'adresse de la ram texte 0x1700, on fait
DataAff_16 0x40,0x1700
et dans ta macro tu récupères bien les 3 octets et les envoie dans le bon ordre attendu par l'afficheur, 0x00 puis 0x17 puis 0x40
Pour l'affichage d'un caractère, pareil il faut inverser, tu mets x1 dans CMD, c'est bon, et il faut donc mettre la commande 0xc0 en premier
DataAff_8 0xc0, 0x24
Ca paraît compliqué ces macros, mais à l'arrivée le main fait 10 lignes.
Pour la remarque sur la broche FS, on peut voir ça plus tard.
Bonjour à toute l'équipe du forum
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Je viens de modifier la macro comme le suggère Satinas. Sauf erreur de ma part, j'ai le même fonctionnement.
Au démarrage l'écran affiche le trait horizontale un court instant et j'obtiens tjrs le clignotement rapide de la led RA1.
Pour comprendre votre programme, je me suis permis d'aller isoler le clignotement rapide de la LED pour voir si le prg ne butait pas sur une cde et qu'il allait bien jusqu'au bout.
Le coup de la LED je le retiens
Au démarrage l'écran affiche le trait horizontale un court instant et j'obtiens tjrs le clignotement rapide de la led RA1.
Pour comprendre votre programme, je me suis permis d'aller isoler le clignotement rapide de la LED pour voir si le prg ne butait pas sur une cde et qu'il allait bien jusqu'au bout.
Le coup de la LED je le retiens
Code : Tout sélectionner
;---------------------------------------------------------GESTION AFFICHEUR-----------------------------------------------------------------
; TITRE: Gestion d'un afficheur LCD graphique
; DATE: 10/11/2018
; AUTEUR: nondediode
; PIC UTILISE: PIC16F877
; Gestion PP845 version 2019
; le quartz est de 4MHz
; essai JMarc Version 1,01
;----------------------------------------------------Brochage du PIC sur la carte---------------------------------------------------------
;
; Port | Broche | E/S | Description
; RA0 | 02 | S | Relais "MUTE"
; RA1 | 03 | S | Relais "PHASE"
; RA2 | 04 | S | LED droite
; RA3 | 05 | S | LED gauche
; RA4 | 06 | S | Relais de cde HT gauche et droit
; RA5 | 07 | S | Relais statique gauche et droit
; RB0 | 33 | E | Inter "on / off"
; RB1 | 34 | E | Bouton poussoir "OK"
; RB2 | 35 | S | Data Write afficheur
; RB3 | 36 | S | Data Read afficheur
; RB4 | 37 | S | Chip Enable
; RB5 | 38 | S | C/D
; RB6 | 39 | S | Font Size Select
; RB7 | 40 | S | Reset
; RC0 | 15 | S | Adressage entrée audio bit A
; RC1 | 16 | S | Adressage entrée audio bit B
; RC2 | 17 | S | Adressage entrée audio bit C
; RC3 | 18 | S | Adressage entrée audio bit D
; RC4 | 23 | S | LEDs Rouge droit et gauche
; RC5 | 24 | E | Bouton poussoir "INPUT"
; RC6 | 25 | E | Bouton poussoir "PHASE"
; RC7 | 26 | E | Bouton poussoir "MUTE"
; RD0 | 19 | S | Sortie bit D7 du LCD
; RD1 | 20 | S | Sortie bit D6 du LCD
; RD2 | 21 | S | Sortie bit D5 du LCD
; RD3 | 22 | S | Sortie bit D4 du LCD
; RD4 | 27 | S | Sortie bit D3 du LCD
; RD5 | 28 | S | Sortie bit D2 du LCD
; RD6 | 29 | S | Sortie bit D1 du LCD
; RD7 | 30 | S | Sortie bit D0 du LCD
;--------------------------------------------------DIRECTIVE D'ASSEMBLAGE POUR MPLAB-------------------------------------------------------
list p=16f877a
#include <p16f877.inc>
radix dec ; on travaille en décimal par défaut
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
OPTIONVAL EQU B'00001111'
;-------------------------------------------------Definition de la RAM------------------------------------------------------
cblock 0x20
TEMP ;temp buffer
DATAL ;instruction donnée =0
DATAH ;instruction donnée =1
COMMAND ;instruction
TABLECOUNT ;tablecounter
endc
cblock 0x70
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
Tempj : 1
delai1_LED_TEMOIN : 1
delai2_LED_TEMOIN : 1
temptmr0 : 1
temp1tmr1 : 1
DATA_L : 1
DATA_H : 1
CMD : 1
STATUS_TEMP ;interruptcontextsave for STATUS
PCLATH_TEMP ;interruptcontextsave for PCLATH
COUNT1 ;delaycounter 1
COUNT2 ;delaycounter 2
COUNT3 ;delaycounter 3
DATA_EE_ADDR ;data EEPROM address buffer
DATA_EE_DATA ;data EEPROM data buffer
endc
;-------------------------------------------------Definition des constantes------------------------------------------------------
#DEFINE LED_TEMOIN PORTA,1
#DEFINE LED_TEMOIN2 PORTA,0
#DEFINE LCD_WR PORTB,2 ; RB2 | 35 | S | Data Write afficheur
#DEFINE LCD_RD PORTB,3 ; RB3 | 36 | S | Data Read afficheur
#DEFINE LCD_CE PORTB,4 ; RB4 | 37 | S | Chip Enable
#DEFINE LCD_CD PORTB,5 ; RB5 | 38 | S | C/D
#DEFINE LCD_FS PORTB,6 ; RB6 | 39 | S | Font Size Select
#DEFINE LCD_RESET PORTB,7 ; RB7 | 40 | S | Reset
LCD_DATA EQU PORTD
;--------------------------------------------Definition des registres temporaires------------------------------------------------------
;--------------------------------------------Directives des programmes------------------------------------------------------
;=====================================Macro=====================================
led_cligno_lent macro
movlw 0x28 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x5A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_rapide macro
movlw 0x08 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x0A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_flash macro
movlw 0x29 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x2A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
CtlAff macro ctr
movlw ctr
movwf CMD
call Envoi_cmd
endm
;DataAff_8 macro x1,x2
DataAff_8 macro 0xc0,0x24
movlw 0xc0 ;x1
movwf CMD
movlw 0x24 ;x2
movwf DATA_L
call Envoi_data_8
call Envoi_cmd
endm
;DataAff_16 macro x1,x2
DataAff_16 macro 0x40,0x1700
movlw 0x40 ;x1
movwf CMD
movlw (0x1700) / 0x100 ;(x2) / 0x100
movwf DATA_H
movlw (0x1700) % 0x100 ;(x2) % 0x100
movwf DATA_L
call Envoi_data_16
call Envoi_cmd
endm
;===============================================================================
org 0x000 ; Debut du programme principale
goto START ; Saut à START
;*****************************************************************************
; ROUTINE INTERRUPTION *
;*****************************************************************************
;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR
bsf STATUS,RP0 ; sélectionner banque1
btfss PIE1,TMR1IE ; tester si interrupt autorisée
goto intsw1 ; non sauter
bcf STATUS,RP0 ; oui, sélectionner banque0
btfss PIR1,TMR1IF ; oui, tester si interrupt en cours
goto intsw1 ; non sauter
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
incf temp1tmr1,f
movf delai2_LED_TEMOIN,w ;on test si Xfois
subwf temp1tmr1,W
btfss STATUS,Z
goto suite_led_temoin
bcf LED_TEMOIN
; bsf LED_TEMOIN
clrf temp1tmr1
goto sautintsw9
suite_led_temoin
movf delai1_LED_TEMOIN,w
subwf temp1tmr1,W
btfss STATUS,Z
goto sautintsw9
bsf LED_TEMOIN
; bcf LED_TEMOIN ; inversion des sorties pour la platine essais
sautintsw9
bcf PIR1,TMR1IF ; effacer flag interupt
intsw1
bcf STATUS,RP0 ; oui, sélectionner banque0
;restaurer registres
;-------------------
restorereg
bcf STATUS,RP0
movf FSR_temp , w ; charger FSR sauvé
movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie
;-------------------------------------------------INITIALISATION------------------------------------------------------
START
; Registre d'options (banque 1)
; -----------------------------
BANKSEL OPTION_REG ; sélectionner banque 1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; registres interruptions (banque 1)
; ----------------------------------
bsf INTCON,PEIE ; autoriser interruptions périphériques
bcf STATUS,RP0 ; passer banque 0
; autoriser interruptions (banque 0)
; ----------------------------------
bsf T1CON,0X4
bcf T1CON,0X5
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
BSF T1CON,TMR1ON ;on TMR1 bit a 1
CLRF PORTA ; Remise à 0 du port A
CLRF PORTB ; Remise à 0 du port B
CLRF PORTC ; Remise à 0 du port C
CLRF PORTD ; Remise à 0 du port D
CLRF PORTE ; Remise à 0 du port E
bsf STATUS,RP0 ; Banque 1
clrf TRISA ; PortA en sortie
movlw b'00000110'
movwf ADCON1 ; sortie digital
; PORTA, PORTB, PORTC, and PORTE outputs
CLRF TRISB ; PORTD defaults to input
CLRF TRISC ;
CLRF TRISE ;
BSF PIE1,TMR1IE ;valide le TMR1
bcf STATUS,RP0 ; Banque 0
led_cligno_lent
bsf INTCON,GIE ; valider interruptions
bsf LCD_WR ; RB2 | 35 | S | Data Write afficheur
bsf LCD_RD ; RB3 | 36 | S | Data Read afficheur
bsf LCD_CE ; RB4 | 37 | S | Chip Enable
bsf LCD_CD ; RB5 | 38 | S | C/D
bsf LCD_FS ; font 6x8
bsf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bcf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bsf LCD_RESET
CtlAff 0x80 ; select CG ROM afficheur et mode OR 10000000
call Delay50mS
DataAff_16 0x42,0x0000 ;set grp en 0000h
call Delay50mS
DataAff_16 0x43,0x2800 ;set pavé grp 6x8 (40) ou 8x8 (30)
call Delay50mS
DataAff_16 0x40,0x0017 ;set text en 1700h
call Delay50mS
DataAff_16 0x41,0x2800 ; set pavé grp 6x8 (40) ou 8x8 (30)
call Delay50mS
CtlAff 0xa0 ; épaisseur curseur 1 lignes (1 à 8) 10100000
call Delay50mS
CtlAff 0x9c ; afficher grp/txt et cacher curseur 10011100
call Delay50mS
DataAff_16 0x24,0x1700
call Delay50mS
; DataAff('A'-32); CtlAff10(0xc0); // afficher 'A'
DataAff_8 0xc0,0x24 ; afficher 'D'. Modif effectué
call Delay50mS
led_cligno_rapide
loop
nop
;
GOTO loop ; boucle principale
;-------------------------------------------------Programme tempo------------------------------------------------------
Delay50mS
MOVLW 0x40 ; Charge la valeur dans W
MOVWF COUNT1 ; Transfert de W sur COUNT1
MOVWF COUNT2 ; Transfert de W sur COUNT2
DECFSZ COUNT1,F ; On décrémente COUNT1,F
GOTO $-1 ; Comptage de boucle
DECFSZ COUNT2,F ; On décrémente COUNT2,F
GOTO $-3 ; Comptage de boucle
RETURN
Delay
MOVWF COUNT3 ; Transfert de W sur COUNT3
CALL Delay50mS ; Appel de l'étiquette Delay50mS
DECFSZ COUNT3,F ; On décrémente COUNT3,F
GOTO $-2 ; Comptage de boucle
RETURN
;===============================================================================
Envoi_cmd
bsf LCD_CD ; etat haut pour commande
bcf LCD_CE ; Chip Enable
movf CMD,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
return
Envoi_data_8
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
Envoi_data_16
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
movf DATA_H,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
END
Bonjour à toute l'équipe du forum
Bonjour à tous,
viewtopic.php?p=11259#p11259
nondediode, as-tu modifié les 6 lignes indiquées ici, et ajouté le "bsf LCD_CE"
donne nous le programme modifié, merci
viewtopic.php?p=11259#p11259
nondediode, as-tu modifié les 6 lignes indiquées ici, et ajouté le "bsf LCD_CE"
donne nous le programme modifié, merci
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour Satinas,
J'ai lancé le prg avec tes modifs mais ça ne change rien
Relis, pour voir si je n'ai pas fait d'erreurs
J'ai lancé le prg avec tes modifs mais ça ne change rien
Relis, pour voir si je n'ai pas fait d'erreurs
Code : Tout sélectionner
;---------------------------------------------------------GESTION AFFICHEUR-----------------------------------------------------------------
; TITRE: Gestion d'un afficheur LCD graphique
; DATE: 10/11/2018
; AUTEUR: nondediode
; PIC UTILISE: PIC16F877
; Gestion PP845 version 2019
; le quartz est de 4MHz
; essai JMarc Version 1,01
;----------------------------------------------------Brochage du PIC sur la carte---------------------------------------------------------
;
; Port | Broche | E/S | Description
; RA0 | 02 | S | Relais "MUTE"
; RA1 | 03 | S | Relais "PHASE"
; RA2 | 04 | S | LED droite
; RA3 | 05 | S | LED gauche
; RA4 | 06 | S | Relais de cde HT gauche et droit
; RA5 | 07 | S | Relais statique gauche et droit
; RB0 | 33 | E | Inter "on / off"
; RB1 | 34 | E | Bouton poussoir "OK"
; RB2 | 35 | S | Data Write afficheur
; RB3 | 36 | S | Data Read afficheur
; RB4 | 37 | S | Chip Enable
; RB5 | 38 | S | C/D
; RB6 | 39 | S | Font Size Select
; RB7 | 40 | S | Reset
; RC0 | 15 | S | Adressage entrée audio bit A
; RC1 | 16 | S | Adressage entrée audio bit B
; RC2 | 17 | S | Adressage entrée audio bit C
; RC3 | 18 | S | Adressage entrée audio bit D
; RC4 | 23 | S | LEDs Rouge droit et gauche
; RC5 | 24 | E | Bouton poussoir "INPUT"
; RC6 | 25 | E | Bouton poussoir "PHASE"
; RC7 | 26 | E | Bouton poussoir "MUTE"
; RD0 | 19 | S | Sortie bit D7 du LCD
; RD1 | 20 | S | Sortie bit D6 du LCD
; RD2 | 21 | S | Sortie bit D5 du LCD
; RD3 | 22 | S | Sortie bit D4 du LCD
; RD4 | 27 | S | Sortie bit D3 du LCD
; RD5 | 28 | S | Sortie bit D2 du LCD
; RD6 | 29 | S | Sortie bit D1 du LCD
; RD7 | 30 | S | Sortie bit D0 du LCD
;--------------------------------------------------DIRECTIVE D'ASSEMBLAGE POUR MPLAB-------------------------------------------------------
list p=16f877a
#include <p16f877.inc>
radix dec ; on travaille en décimal par défaut
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
OPTIONVAL EQU B'00001111'
;-------------------------------------------------Definition de la RAM------------------------------------------------------
cblock 0x20
TEMP ;temp buffer
DATAL ;instruction donnée =0
DATAH ;instruction donnée =1
COMMAND ;instruction
TABLECOUNT ;tablecounter
endc
cblock 0x70
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
Tempj : 1
delai1_LED_TEMOIN : 1
delai2_LED_TEMOIN : 1
temptmr0 : 1
temp1tmr1 : 1
DATA_L : 1
DATA_H : 1
CMD : 1
STATUS_TEMP ;interruptcontextsave for STATUS
PCLATH_TEMP ;interruptcontextsave for PCLATH
COUNT1 ;delaycounter 1
COUNT2 ;delaycounter 2
COUNT3 ;delaycounter 3
DATA_EE_ADDR ;data EEPROM address buffer
DATA_EE_DATA ;data EEPROM data buffer
endc
;-------------------------------------------------Definition des constantes------------------------------------------------------
#DEFINE LED_TEMOIN PORTA,1
#DEFINE LED_TEMOIN2 PORTA,0
#DEFINE LCD_WR PORTB,2 ; RB2 | 35 | S | Data Write afficheur
#DEFINE LCD_RD PORTB,3 ; RB3 | 36 | S | Data Read afficheur
#DEFINE LCD_CE PORTB,4 ; RB4 | 37 | S | Chip Enable
#DEFINE LCD_CD PORTB,5 ; RB5 | 38 | S | C/D
#DEFINE LCD_FS PORTB,6 ; RB6 | 39 | S | Font Size Select
#DEFINE LCD_RESET PORTB,7 ; RB7 | 40 | S | Reset
LCD_DATA EQU PORTD
;--------------------------------------------Definition des registres temporaires------------------------------------------------------
;--------------------------------------------Directives des programmes------------------------------------------------------
;=====================================Macro=====================================
led_cligno_lent macro
movlw 0x28 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x5A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_rapide macro
movlw 0x08 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x0A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_flash macro
movlw 0x29 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x2A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
CtlAff macro ctr
movlw ctr
movwf CMD
call Envoi_cmd
endm
;DataAff_8 macro x1,x2
DataAff_8 macro 0xc0,0x24
movlw 0xc0 ;x1
movwf CMD
movlw 0x24 ;x2
movwf DATA_L
call Envoi_data_8
call Envoi_cmd
endm
;DataAff_16 macro x1,x2
DataAff_16 macro 0x40,0x1700
movlw 0x40 ;x1
movwf CMD
movlw (0x1700) / 0x100 ;(x2) / 0x100
movwf DATA_H
movlw (0x1700) % 0x100 ;(x2) % 0x100
movwf DATA_L
call Envoi_data_16
call Envoi_cmd
endm
;===============================================================================
org 0x000 ; Debut du programme principale
goto START ; Saut à START
;*****************************************************************************
; ROUTINE INTERRUPTION *
;*****************************************************************************
;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR
bsf STATUS,RP0 ; sélectionner banque1
btfss PIE1,TMR1IE ; tester si interrupt autorisée
goto intsw1 ; non sauter
bcf STATUS,RP0 ; oui, sélectionner banque0
btfss PIR1,TMR1IF ; oui, tester si interrupt en cours
goto intsw1 ; non sauter
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
incf temp1tmr1,f
movf delai2_LED_TEMOIN,w ;on test si Xfois
subwf temp1tmr1,W
btfss STATUS,Z
goto suite_led_temoin
bcf LED_TEMOIN
; bsf LED_TEMOIN
clrf temp1tmr1
goto sautintsw9
suite_led_temoin
movf delai1_LED_TEMOIN,w
subwf temp1tmr1,W
btfss STATUS,Z
goto sautintsw9
bsf LED_TEMOIN
; bcf LED_TEMOIN ; inversion des sorties pour la platine essais
sautintsw9
bcf PIR1,TMR1IF ; effacer flag interupt
intsw1
bcf STATUS,RP0 ; oui, sélectionner banque0
;restaurer registres
;-------------------
restorereg
bcf STATUS,RP0
movf FSR_temp , w ; charger FSR sauvé
movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie
;-------------------------------------------------INITIALISATION------------------------------------------------------
START
; Registre d'options (banque 1)
; -----------------------------
BANKSEL OPTION_REG ; sélectionner banque 1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; registres interruptions (banque 1)
; ----------------------------------
bsf INTCON,PEIE ; autoriser interruptions périphériques
bcf STATUS,RP0 ; passer banque 0
; autoriser interruptions (banque 0)
; ----------------------------------
bsf T1CON,0X4
bcf T1CON,0X5
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
BSF T1CON,TMR1ON ;on TMR1 bit a 1
CLRF PORTA ; Remise à 0 du port A
CLRF PORTB ; Remise à 0 du port B
CLRF PORTC ; Remise à 0 du port C
CLRF PORTD ; Remise à 0 du port D
CLRF PORTE ; Remise à 0 du port E
bsf STATUS,RP0 ; Banque 1
clrf TRISA ; PortA en sortie
movlw b'00000110'
movwf ADCON1 ; sortie digital
; PORTA, PORTB, PORTC, and PORTE outputs
CLRF TRISB ; PORTD defaults to input
CLRF TRISC ;
CLRF TRISE ;
BSF PIE1,TMR1IE ;valide le TMR1
bcf STATUS,RP0 ; Banque 0
led_cligno_lent
bsf INTCON,GIE ; valider interruptions
bsf LCD_WR ; RB2 | 35 | S | Data Write afficheur
bsf LCD_RD ; RB3 | 36 | S | Data Read afficheur
bsf LCD_CE ; RB4 | 37 | S | Chip Enable
bsf LCD_CD ; RB5 | 38 | S | C/D
bsf LCD_FS ; font 6x8
bsf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bcf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bsf LCD_RESET
CtlAff 0x80 ; select CG ROM afficheur et mode OR 10000000
call Delay50mS
DataAff_16 0x42,0x0000 ;set grp en 0000h
call Delay50mS
DataAff_16 0x43,30 ;set pavé grp 6x8 (40) ou 8x8 (30)0x2800
call Delay50mS
DataAff_16 0x40,0x1700 ;set text en 1700h
call Delay50mS
DataAff_16 0x41,0x40 ; set pavé grp 6x8 (40) ou 8x8 (30)
call Delay50mS
CtlAff 0xa0 ; épaisseur curseur 1 lignes (1 à 8) 10100000
call Delay50mS
CtlAff 0x9c ; afficher grp/txt et cacher curseur 10011100
call Delay50mS
DataAff_16 0x24,0x1700
call Delay50mS
; DataAff('A'-32); CtlAff10(0xc0); // afficher 'A'
DataAff_8 0xc0,0x1700 ; afficher 'D'. Modif effectué
call Delay50mS
led_cligno_rapide
loop
nop
;
GOTO loop ; boucle principale
;-------------------------------------------------Programme tempo------------------------------------------------------
Delay50mS
MOVLW 0x40 ; Charge la valeur dans W
MOVWF COUNT1 ; Transfert de W sur COUNT1
MOVWF COUNT2 ; Transfert de W sur COUNT2
DECFSZ COUNT1,F ; On décrémente COUNT1,F
GOTO $-1 ; Comptage de boucle
DECFSZ COUNT2,F ; On décrémente COUNT2,F
GOTO $-3 ; Comptage de boucle
RETURN
Delay
MOVWF COUNT3 ; Transfert de W sur COUNT3
CALL Delay50mS ; Appel de l'étiquette Delay50mS
DECFSZ COUNT3,F ; On décrémente COUNT3,F
GOTO $-2 ; Comptage de boucle
RETURN
;===============================================================================
Envoi_cmd
bsf LCD_CD ; etat haut pour commande
bsf LCD_CE ; Chip Enable
movf CMD,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
return
Envoi_data_8
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
Envoi_data_16
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
movf DATA_H,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
END
Bonjour à toute l'équipe du forum
Code : Tout sélectionner
DataAff_16 0x41,40 ;
Envoi_cmd
bsf LCD_CD ; etat haut pour commande
bcf LCD_CE ; Chip Enable
movf CMD,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
Bonjour à toute l'équipe du forum
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 93 invités