Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Programme LCD ATMEL



  1. #1
    JP
    Salut,

    J'ai un programme de gestion d'un afficheur LCD inteligent avec un 8515 et je me pose une question comment se fait la communication avec le LCD sans passé par des IN PORT ou des OUT PORT ?

    [code:1:645ed3144b]; ****************************** ***********************
    ; * Demonstrates the use of the Include routines *
    ; * LCD_INC.ASM for use with the LCD on board of the *
    ; * ATMEL STK200 (C) 1999 Gerhard Schmidt *
    ; * Report bugs to info@avr-asm-tutorial.net *
    ; ****************************** ***********************
    ;
    .NOLIST
    .INCLUDE "C:\avrtools\appnotes \8515def.inc"
    .LIST
    .def mpr=R16 ; My multipurpose register, required
    ; Reset-/Interrupt-Vectors
    rjmp main
    ; Includes the LCD-routines, file must be in the same path
    .INCLUDE "LCD_INC.ASM"
    ; Main program
    main:
    ldi mpr,LOW(RAMEND) ; Set up stack
    out SPL,mpr
    ldi mpr,HIGH(RAMEND)
    out SPH,mpr
    ldi mpr,0xC0 ; Switch on external SRAM and WAIT
    out MCUCR,mpr
    rcall lcd_cl ; Clears display
    rcall lcd_st ; Standard display mode
    ldi mpr,0x05; Cursor position to line 1, col 5
    rcall lcd_sc
    ldi mpr,'H' ; Output Hello World
    rcall lcd_ch
    ldi mpr,'e'
    rcall lcd_ch
    ldi mpr,'l'
    rcall lcd_ch
    rcall lcd_ch
    ldi mpr,'o'
    rcall lcd_ch
    ldi mpr,0x45 ; Cursor position to line 2, col 5
    rcall lcd_sc
    ldi mpr,'W'
    rcall lcd_ch
    ldi mpr,'o'
    rcall lcd_ch
    ldi mpr,'r'
    rcall lcd_ch
    ldi mpr,'d'
    rcall lcd_ch
    ldi mpr,'!'
    rcall lcd_ch
    rcall lcd_on
    loop:
    rjmp loop ; Uff! Next week we learn how to create and read a table[/code:1:645ed3144b]

    [code:1:645ed3144b]; ****************************** **************
    ; * LCD-Interface routines for multi-purpose *
    ; * use with the ATMEL STK200 board, Version *
    ; * 0.1 Beta, (C) 1999 Gerhard Schmidt *
    ; * Report bugs to info@avr-asm-tutorial.net *
    ; ****************************** **************
    ;
    ; Purpose:
    ; Include file for the AVR assembler
    ; Supplies the common routines to drive an
    ; LCD connected to the ATMEL STK200 board
    ; Works best and is compatible to external
    ; SRAM on that board (up to 32 kB)
    ;
    ; Requires:
    ; mpr ... Multipurpose register, anything
    ; between R16 and R31, unchanged
    ; after all routines
    ; Memory-mapped operation of the LCD
    ; Setup of the software stack due to the use
    ; of relative subroutines and PUSH/POP
    ; LCD properly connected to the board, otherwise
    ; processor hangs around and waits for
    ; the busy flag to go down! (no timeout!)
    ; 39 words of program space
    ;
    ; Interfaces:
    ; lcd_wt Waits indefinately until the busy
    ; flag of the LCD is off
    ; lcd_fc Sends the command byte in register
    ; mpr to the LCD after busy is off
    ; lcd_cl Clears the LCD and sets cursor to
    ; the home position, after busy is off
    ; lcd_st Sets the LCD to 8-bit-transfer,
    ; freezes the display window and sets
    ; cursor to increment after busy is off
    ; lcd_sc Sets cursor to the display position
    ; in register mpr (Line 1: 00 .. 0F hex,
    ; Line 2: 40 .. 4F hex)
    ; lcd_ch Outputs the character in register
    ; mpr to the LCD after busy is off
    ; lcd_on Sets display on, cursor on and blink
    ;
    ; Adress definitions:
    .equ lcd_rs = 0x8000 ; Register select = 0 adress
    .equ lcd_ds = 0xC000 ; Register select = 1 adress
    ;
    ; Subroutines
    ;
    ; Wait until LCD is not busy any more
    ;
    lcd_wt:
    push mpr ; save register
    lcd_wt1:
    lds mpr,lcd_rs ; read busy flag
    rol mpr ; Busy = Bit 7 into Carry
    brcs lcd_wt1 ; still busy, repeat
    pop mpr ; restore register
    ret
    ;
    ; Outputs the function command in mpr to the LCD
    ;
    lcd_fc:
    rcall lcd_wt ; Wait until not busy any more
    sts lcd_rs,mpr ; Command byte to LCD
    ret
    ;
    ; Clears LCD and sets cursor to home position
    ;
    lcd_cl:
    push mpr ; save register
    ldi mpr,0x01 ; the clear command
    rcall lcd_fc ; output to LCD command
    pop mpr ; restore register
    ret
    ;
    ; Sets LCD to 8-bit-mode, display window freeze and
    ; cursor incrementation (standard mode)
    ;
    lcd_st:
    push mpr ; save register
    ldi mpr,0b00111000 ; 8-Bit-transfer
    rcall lcd_fc ; to LCD command
    ldi mpr,0b00000110 ; Increment, display freeze
    rcall lcd_fc ; to LCD
    ldi mpr,0b00010000 ; Cursor move, not shift
    rcall lcd_fc ; to LCD
    pop mpr ; restore register
    ret
    ;
    ; Sets cursor on the LCD to a certain display position in mpr
    ;
    lcd_sc:
    push mpr ; save position
    ori mpr,0x80 ; set bit 7 of the position
    rcall lcd_fc ; position to LCD
    pop mpr ; restore register
    ret
    ;
    ; Sends a character in mpr to the display at the current
    ; position, position is incremented after write
    ;
    lcd_ch:
    rcall lcd_wt ; wait for not busy
    sts lcd_ds,mpr ; transfer character to LCD-Display
    ret
    ;
    ; Sets LCD display on, cursor on and blink on
    ;
    lcd_on:
    push mpr ; save register
    ldi mpr,0b00001111 ; command byte
    rcall lcd_fc ; to LCD
    pop mpr ; restore register
    ret[/code:1:645ed3144b]

    Merci d'avance pour vos explications

    -----

  2. Publicité
  3. #2
    Freud
    Salut,

    C'est de l'assembleur (et non du C), et donc il n'y a pas d'instruction comme INP/OUTP. Le caractère ASCII que tu envoies à l'afficheur LCD est stocké dans MPR, et l'interface hardware est probablement définie par les 2 adresses 0x8000 et 0xC000 qui correspondent (je pense) aux adresses de 2 ports I/O du processeur (à vérifier dans le fichier header "8515def.inc").

    @+
    David

  4. #3
    popo
    Bonjour,

    Sur ATMEL, pour utiliser un écran LCD, il existe un port rien que pour ça qui est partagé avec un port E/S. Il suffit quand tu initialise tes ports au début de ton programme. Tu peux regarder sur atmel.com dans la rubrique microcontroleur il y a la doc tech et des exemples d'applications sur les ecrans LCD.
    Si tu programmes en C tu as des fonctions que tu peux utiliser pour programmer plus facilement.


    A+
    popo

  5. #4
    JP
    Bonsoir tous,

    Merci pour vos réponses,

    C'est de l'assembleur (et non du C),
    C'est vrai !!!!

    donc il n'y a pas d'instruction comme INP/OUTP
    Ben si DDRX pour la direction du port X
    IN PORTX pour la lecture sur le port X
    OUT PORTX pour l'envoi des données sur le port X

    l'interface hardware est probablement définie par les 2 adresses 0x8000 et 0xC000
    On peut envoyé directement les données a l'adresse du registre du port
    mais le 0x8000 et 0xC000 d'apres le mapping memoire corresdondent à des adresses de la SRAM externe.

    2 ports I/O du processeur
    Microconcroleur


    Sur ATMEL, pour utiliser un écran LCD, il existe un port rien que pour ça qui est partagé avec un port E/S.
    J'ai pensé a un truc de ce genre la, mais je n'ai rien trouvé sur le site d'Atmel dans les Appnotes. (J'ai peut etres mal cherché)

    J'ai trouvé ca mais c'est en allemand :? et la traduction de google laisse a désiré donc si vous avez des notions d'allemand je fais appel a vous.

    ; Software: Die Ansteuerung erfolgt in diesem Beispiel
    ; wie Memory (memory-mapped). Das hat den Vorteil,
    ; dass die gleichen Befehle wie für Memory benutzt
    ; werden können, das Herumeiern mit den verschiedenen
    ; Ports entfällt und gleichzeitig SRAM am Board be-
    ; trieben werden kann. (Die Beispiel-Programme auf
    ; dem Internet-Server sind alle I/O-mapped und ver-
    ; tragen sich nicht mit gleichzeitigem Memory-Betrieb!).
    ; Die Adresse der LCD-Steuerung ist $8000 für die
    ; Befehle und $C000 für den Zugriff auf den Zeichen-
    ; generator und die Displayzeilen (jeweils Lesen und
    ; Schreiben.
    ; Da bei Memory-Betrieb der Zugriff sehr schnell er-
    ; folgen würde, muss das WAIT-Bit im MCUCR-Register
    ; gesetzt werden. Das macht zwar den RAM-Zugriff auch
    ; langsamer, aber das kann verschmerzt werden. Für
    ; schnelle RAM-Zugriffe kann das Bit zeitweise wieder
    ; Null gesetzt werden, dann ist der Nachteil weg.

  6. #5
    sly535
    Salut jp, voici l'explication :

    apres initialisation du pointeur du pile, tu as :

    Ldi mpr, 0xC0
    out mcucr, mpr

    donc dans un premier temps tu charge la valeur 0xC0 soit tout simplement $C0 ou en encore en binaire 11000000 dans mpr qui est un registre de travail.

    ensuite tu le charge dans MCUCR, et la (faut bien regarder le datasheet, car ce registre change un peu de configuration selon la famille) tu valide les bits SRE et SRW de MCUCR.

    La doc dit : SRE : Quand ce bit est activé, la ram externe est activée et les fonctions de ports configuré comme tel :

    Port A comme entrée/sortie en décodage de donnée et d'adresse LSB(synchro avec ALE)
    Port C uniquement en décodage d'adresse MSB (donc en sortie)

    sans parler de WR et RD qui deviennent actif, le tout synchroniser pour l'accés à la Sram externe

    En fait il s'agit d'une "astuce" très employé dans les systemes à 80C51, ou l'on connecte un afficheur LCD sur le bus du système.
    l'afficheur se voit donc adresser comme une mémoire externe.

    pour plus de renseignement regarder le datasheet page 9,27, 82....

  7. A voir en vidéo sur Futura
  8. #6
    sly535
    Dommage qu'on ne puisse pas éditer ses anciens message, mais je voulait rajouté cela :

    je ne connais pas de configuration "interne" qui déclare un afficheur LCD,

    Je prefere indéniablement l'assembleur au C ou Basic, au moins on controle tout de A à Z, et les applications développées sont très performantes

    Language de "bas niveau" pour fonctionnement de "haut niveau" lol.

    Pour te dire, je connais des personnes dans des sociétés qui sont vraiment embarrassé avec le C dans des applications ou le controle de timing et cruciale, et ou la taille du code générer dans d'autre language ne finissent plus par "rentrer" dans le micro !

    Continue en assembleur...

  9. Publicité
  10. #7
    JP
    Merci sly535,

    Je ne pouvais pas rêver mieux


    ++

  11. #8
    popo
    Bonjour,

    Sur le site d'atmel, il y a un guide d'utilisation de programmation atmel en C ou en assembleur, il y a des exemples d'application et les data sheet.
    Sur les data sheet on vous explique le partage des ports E/S.
    Vous verrez sur les port E/S on peut utiliser beaucoups de fonction comme une sortie PWM ou un CAN.

    http://www.atmel.com/products/avr/
    Vous avez une liste sur le jeu d'instruction en assembleur
    Par exemple
    AVR Instruction Set (148 pages, updated 8/02)


    A+
    popo

  12. #9
    sly535
    merci popo, mais si tu veut en savoir plus, et en francais (enfin j'espere) tu peut toujours passer sur mon site !!!

Sur le même thème :

Discussions similaires

  1. Aide PIC à programmé pour faire marché un affichage LCD
    Par Raphael2 dans le forum Électronique
    Réponses: 48
    Dernier message: 19/01/2008, 19h40
  2. samples Atmel
    Par nounoursvincent dans le forum Électronique
    Réponses: 4
    Dernier message: 04/07/2005, 11h49
  3. LCD HD44780 ---> programme C
    Par Bullrap dans le forum Électronique
    Réponses: 3
    Dernier message: 16/02/2005, 15h24
  4. Programme pour LCD 44780...
    Par Bullrap dans le forum Électronique
    Réponses: 3
    Dernier message: 15/02/2005, 15h08
  5. probleme d'UART sur uC Atmel 8515 programme avec IccAvr
    Par Thorhck dans le forum Électronique
    Réponses: 23
    Dernier message: 06/02/2004, 22h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.