Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : PIC 16F84 & LCD piti probleme :) [ Archives / Les PIC ] (diwee)

jeudi 17 février 2005 à 20:55:28 | PIC 16F84 & LCD piti probleme :)

diwee

bonjour,
j'ai essayé de programmer un pic 16f84 en mode 4-bit pour qu'il affiche un message s sur l'ecran mais en vain. Quand je branche il y a une ligne de carrés noirs. Le code se compile bien mais quand je fais une simulation avec Mplab sim me donne l'erreur suivante :

CORE-E0002: Stack under flow error occurred from instruction at 0x00000b

Voici mon code  :

;**************************************************
;*
;* LCD PIC 2x16 caractères en mode 4-bit
;* HDD 44780 et PIC 16F84a
;*  Par Dan, 17 février 2005
;*
;**************************************************

 LIST p=16F84; Défintition du processeur
 #include <P16F84a.inc>; Variables du processeur

;**************************************************
;*
;* Configuration
;*
;*  CP OFF, lecture du pic autorisée
;* WDT OFF, pas de Watch Dog
;* PWRTE_ON, Timer reset sur power on en service
;* HS_OSC, Oscillateur High Speed à 4 Mhz
;*
;**************************************************

 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

;**************************************************
;*
;* Définitions
;*
;**************************************************

 #DEFINE LCD_RS PORTA,0; On met RS sur A0
 #DEFINE LCD_EN PORTA,1; On met Enable sur A1

;**************************************************
;*
;* Déclaration des variables
;*
;**************************************************

 CBLOCK 0x00C; Début de la zone de variables
 cmpt1 : 1; Variable boucle 1 de temporisation
 cmpt2 : 1; Variable boucle 2 de temporisation
 writetmp : 1; Variable temporaire d'écriture
 ENDC; Fin de la zone de variables


;**************************************************
;*
;* Programme
;*
;**************************************************

 call initpic
 call initlcd
 call ecrire

;**************************************************
;*
;* Initialisation du PIC 16F84a
;*
;**************************************************

initpic

 bsf STATUS, RP0; On passe en bank 1
 movlw 0x00; On met 0
 movwf TRISB; Donc tout le portA est en sortie
 movlw 0x00; On met 0
 movwf TRISA; tout le portB est en sortie
 movlw 0x00;
  movwf OPTION_REG
 bcf STATUS, RP0; On passe en bank 0
 
 RETURN


;**************************************************
;*
;* Initialisation du LCD HD 44780
;*
;**************************************************

initlcd
 movlw D'200'; On mutliplie par 200
 call tempo ;  pour avoir 20mS
 movlw B'00110000'
; Il y a 8 bit ici mais les 4 premiers seront ignorés
; car ils ne sont pas connectés
    movlw PORTB; On écrit sur le port B
 call checklcd; On valide

 movlw D'41'; On mutliplie par 5
 call tempo ;  pour avoir 5mS
 movlw B'00110000'; Donnée d'initialisation
    movlw PORTB; On écrit sur le port B
 call checklcd; On valide

 movlw D'2'; On mutliplie par 2
 call tempo ;  pour avoir 200uS
 movlw B'00110000'; Donnée d'initialisation
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'00100000'; Mode 4-bit
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'00100000'; Mode 4-bit (deuxiéme coup)
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'10000000'; Matrice caractéres 5x8
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'00000000'; Ecran OFF/On
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'00010000'; ClearScreen
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'00000000';
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 movlw B'01000000';
    movlw PORTB; On écrit sur le port B
   call checklcd; On valide

 RETURN

;**************************************************
;*
;* Temporisation de 101uS
;*
;**************************************************

tempo
  ;movwf cmpt2
; Ceci est l'argument. On peut multiplier
; par un entier pour obtenir le temps voulu
boucle2
  ;movlw 0x20; On place 32 ( 0x20 ) dans w
 ;movwf cmpt1; On met w dans cmpt1
boucle1
 ;decfsz cmpt1, f; 31 + 2 cycles (saut 2 cycles)
 ;goto boucle1; 32x2 cycles
 ;decfsz cmpt2, f; On decrémente de 1 cmpt2
 ;goto boucle2; Fin des 101uS on boucle2

 RETURN; 2 cycles

;**************************************************
;*
;* Validation des données sur le LCD HD 44780
;*
;**************************************************

checklcd; On cherche à se faire valider auprés du LCD
 movlw D'1'; On mutliplie par 1
 call tempo ;  pour avoir 100uS
 bsf LCD_EN; On valide en mettant 1 sur E (Pin Enable)
 nop 
 nop
 nop; 450ns délai à respecter
 bcf LCD_EN; On valide en mettant 0 sur E (Pin Enable)
  movlw D'1'; On mutliplie par 1
 call tempo ;  pour avoir 100uS

 RETURN

;**************************************************
;*
;* Ecrire sur le LCD HD 44780
;*
;**************************************************
write
 movwf writetmp; On copie le caractère dans writetmp
 andlw 0xF0
 andlw D'1'
 movwf PORTB
 
 swapf writetmp, w
 andlw 0xF0
 andlw D'1'
 movwf PORTB

 RETURN


;**************************************************
;*
;* Ecrire
;*
;**************************************************

ecrire
 movlw  0x54
 bsf LCD_RS
 call write

 RETURN
 END
 


jeudi 17 février 2005 à 21:02:36 | Re : PIC 16F84 & LCD piti probleme :)

diwee

Réponse acceptée !
dans Temporisation de 101uS
les ';' étaient juste là pour faire un test.

lundi 7 mars 2005 à 08:52:49 | Re : PIC 16F84 & LCD piti probleme :)

CoreBreaker

pour ton message d'erreur, ça veut dire qu'il y a plus de RETURN exécutés que de CALL. Lorsqu'un RETURN de trop a été exécuté, la pile est en underflow, c'est à dire que la pile est épuisée, et qu'il n'y a pas d'adresse de retour, le microcontroleur ne saura pa où aller pour exécuter l'instruction suivante.

tu dois faire:
;**************************************************
;*
;* Programme
;*
;**************************************************

 call initpic
 call initlcd
 call ecrire

fin
   goto fin

car sinon au retour de la procédure "ecrire", la prochaine instruction exécutée est celle est celle de la procédure "initpic", donc ensuite le RETURN de la procédure "initpic" est exécuté, il y a alors un "stack underflow".

Core Breaker




Cette discussion est classé dans : valide, lcd, call, movlw, portb


Répondre à ce message

Sujets en rapport avec ce message

texte en memoire dans pic [ par yalein ] Bonjour a tous, je suis débutant dans la programmation en assembleur et la je coince sur un probleme. J'utilise un pic 16f877 avec un afficheur et je 16F84 asm aide pour modifier une routine de RB7 à RB3 [ par pasrico ] bonjour     pic 16F84A + 24C16    voila j'ai cette routine qui marche tres bien mais je veux la modifier pour passer sur le portb,03  (RB3) mais comme Problème avec un code [ par showbiz_hurricanes ] Bonjour Pour un projet universitaire, je dois concevoir un programme de tri en assembleur mais celui ci ne fonctionne pas comme je le voudrai. Le PIC: long call et table [ par flagyg ] Bonjour,J'appelle une table qui se trouve à l'adresse 0x700 depuis ~0x20. J'ai remarqué que ça ne jouait plus car la table me renvoie nimporte ou dans Probleme avec la pile et call [ par Mick7 ] Salut,Voila j'ai un probleme d'adresse de pile quand je fais appele a call affichage:  Main:     mov ax, 324     mov bx, 10  Boucle:     xor dx, dx    lcd [ par shalala ] bonjour tout le monde,je suis nouveau dans le domaine de l'assemleur; je programme un lcd,mais ca ne fonctionne pas,pourtant j'ai receuilli un maximum Invoke et Call [ par Micro_and_Macro ] Bonjour Voilà je débute en asm(masm32) et j'expérimente, mais là je flanche :-)Pourquoi ces 2 codes ne donnent -il pas la mêm chose?1er code.code assembleur et afficheur LCD ?!!? [ par bugeur ] Bonjour,j'ai un programme a faire en assembleur pour l'affichageur d'un LCD ressemblant à :txtlcd           fcc       "__________"           fcb       TSR & Détournement d'interrupt(ion) [ par ghuysmans99 ] bonjour à tous.j'ai fait un petit prog en asm 32bits pour dos mais il ne fonctionne pas ... reste à savoir pourquoi !!pourriez-vous m'aider ??;Change [Assemblage] - Calcul d'Offsets [ par Nowid50 ] Bonjour à tous !J'aimerais une "petite" information... (pas moyen de trouver sur Google...) Voila la situation :Je suis actuellement en train de progr


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.