begin process at 2008 09 06 09:21:53
1 237 663 membres
60 nouveaux aujourd'hui
14 313 membres club

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 !

COMMUNICATION SÉRIE RS232 AVEC INTERRUPTIONS


Information sur la source

Description

Ce code permet la communication série entre deux PCs. Lors de la reception d'un nouveau caractère sur la liaison série, l'interruption IRQ4 se déclenche, et une routine prend en charge son traitement. Une interruption est aussi générée dans le cas d'une erreur de réception.

Source

  • .386
  • donnees segment
  • ;;;;;;;;;;;;;;; Port COM ;;;;;;;;;;;;;;;;;;;;
  • commprt equ 03F8h ; adresse de base du com1
  • THR equ commprt ; THR
  • DL_LSB equ commprt ; divisor latch LSB
  • DL_MSB equ commprt+1 ; divisor latch MSB
  • IER equ commprt+1 ; IT enable
  • IIR equ commprt+2 ; IT identification
  • FCR equ commprt+2 ; Fifo ctrl register
  • LCR equ commprt+3 ; ctrl ligne
  • MCR equ commprt+4 ; ctrl modem
  • LSR equ commprt+5 ; status ligne
  • MSR equ commprt+6 ; status modem
  • ;;;;;;;;;;;;;;; Controlleur d'interruption ;;;;;;;;;
  • interr equ 21h
  • donnees ends
  • pile segment stack
  • dw 80 dup(?)
  • pile ends
  • code segment use16
  • assume cs:code,ds:donnees
  • prog proc far
  • ;;;;;;;;;;;;; Sauvegarde des registres ;;;;;;;;;;;;;;;
  • push ds
  • push es
  • push ax
  • push si
  • push dx
  • ;;;;;;;;;;;;; Initialisation des registres de segments ;;;;;;;;;;;;;;;;;;
  • mov ax,donnees
  • mov ds,ax
  • mov es,ax
  • ;;;;;;;;;;;;; détournement de l'IRQ4 ;;;;;;;;;;;;;;;;;
  • cli ; désactive les interruptions
  • xor ax,ax
  • mov fs,ax ; fs = 0
  • mov dx,interr
  • in al,interr ; lecture du masque d'interruption
  • and al,0EFh ; démasque l'IRQ4
  • out dx,al ; écriture du masque
  • mov ax,cs ;
  • shl eax,16 ; eax = cs00h
  • mov ax,offset irq4 ; eax contient segment et offset de la nvlle routine d'interruption
  • mov fs:[0Ch*4],eax ; détourne l'irq4
  • ;;;;;;;;;;;;; Initialisation du port COM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • mov al,80h ; DLAB=1
  • mov dx,LCR
  • out dx,al
  • mov al,0Ch ; 9600 bits/s
  • mov dx,DL_LSB
  • out dx,al
  • xor al,al
  • mov dx,DL_MSB
  • out dx,al
  • mov al,03h ; DLAB=0, 8 bits de données, 1 bit d'arrêt, aucune parité
  • mov dx,LCR
  • out dx,al
  • mov al,5 ; Active l'interruption donnee prete et l'interruption de changement du status de ligne
  • mov dx,IER
  • out dx,al
  • sti ; Autorise les interruptions
  • ;;;;;;;;;;;;; programme principal ;;;;;;;;;;;;;;;;;;;;;;
  • start:
  • xor si,si
  • lea dx,moi
  • mov ah,09h
  • int 21h
  • loop1:
  • xor ax,ax ; lecture d'un caractère
  • int 16h
  • call send_char
  • cmp al,27 ; teste si touche=esc
  • jz fin ; sortir
  • mov dl,al ; afficher le caractère
  • mov ah,02h
  • int 21h
  • jnz loop1
  • send_quit:
  • call send_char
  • fin:
  • pop dx
  • pop si
  • pop ax
  • pop es
  • pop ds
  • mov ax,4C00h
  • int 21h
  • prog endp
  • irq4:
  • push ax
  • push dx
  • push ds
  • ;;;;; Source de l'interruption ;;;;;;
  • mov dx,IIR
  • in al,dx
  • and al,6 ; conserver que bits 1 et 2
  • test al,6
  • jz erreur_ligne ; erreur ligne
  • ; sinon donnée prête
  • mov dx,commprt ; lit un caractère du tampon de réception
  • in al,dx
  • mov dl,al
  • mov ah,02h ; l'affiche à l'écran
  • int 21h
  • jmp fin_irq4
  • erreur_ligne:
  • mov dx,LSR ; lecture de l'état de la ligne
  • in al,dx
  • test al,2 ; si bit 1 est = 1 => erreur overrun
  • jz overrun
  • test al,8
  • jz cadrage ; si bit 3 est = 1 => erreur cadrage (forme)
  • jmp fin_irq4
  • overrun:
  • lea dx,overrun_msg
  • mov ax,cs
  • mov ds,ax
  • mov ah,9
  • int 21h
  • jmp fin_irq4
  • cadrage:
  • lea dx,cadrage_msg
  • mov ax,cs
  • mov ds,ax
  • mov ah,9
  • int 21h
  • fin_irq4:
  • mov al,20h ; EOI
  • out 20h,al
  • pop ds
  • pop dx
  • pop ax
  • iret
  • overrun_msg db "erreur overrun$"
  • cadrage_msg db "erreur cadrage$"
  • ;;;;;;;;;;;;; routine d'envoi d'un caracactère ;;;;;;;;;;;;;;;;
  • send_char proc near
  • push dx
  • push ax
  • mov dx,LSR
  • attend:
  • in al,dx
  • test al,20h
  • jz attend
  • pop ax
  • mov dx,commprt
  • out dx,al
  • pop dx
  • ret
  • send_char endp
  • code ends
  • end prog
.386

donnees segment

;;;;;;;;;;;;;;; Port COM ;;;;;;;;;;;;;;;;;;;;

commprt equ     03F8h           ; adresse de base du com1
THR     equ     commprt         ; THR
DL_LSB  equ     commprt         ; divisor latch LSB
DL_MSB  equ     commprt+1       ; divisor latch MSB
IER     equ     commprt+1       ; IT enable
IIR     equ     commprt+2       ; IT identification
FCR     equ     commprt+2       ; Fifo ctrl register
LCR     equ     commprt+3       ; ctrl ligne
MCR     equ     commprt+4       ; ctrl modem
LSR     equ     commprt+5       ; status ligne
MSR     equ     commprt+6       ; status modem

;;;;;;;;;;;;;;; Controlleur d'interruption ;;;;;;;;;

interr  equ     21h

donnees ends

pile    segment stack
        dw      80      dup(?)
pile    ends

code	segment use16

assume cs:code,ds:donnees
prog    proc    far

        ;;;;;;;;;;;;; Sauvegarde des registres ;;;;;;;;;;;;;;;

        push    ds
        push    es
        push    ax
        push    si
        push    dx

        ;;;;;;;;;;;;; Initialisation des registres de segments ;;;;;;;;;;;;;;;;;;

        mov     ax,donnees
        mov     ds,ax
        mov     es,ax

        ;;;;;;;;;;;;; détournement de l'IRQ4 ;;;;;;;;;;;;;;;;;

        cli                     ; désactive les interruptions
	xor	ax,ax
        mov     fs,ax           ; fs = 0
        mov     dx,interr
        in      al,interr       ; lecture du masque d'interruption
        and     al,0EFh         ; démasque l'IRQ4
        out     dx,al           ; écriture du masque
        mov     ax,cs           ;
	shl	eax,16		; eax = cs00h
        mov     ax,offset irq4  ; eax contient segment et offset de la nvlle routine d'interruption
        mov     fs:[0Ch*4],eax  ; détourne l'irq4

        ;;;;;;;;;;;;; Initialisation du port COM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        mov     al,80h          ; DLAB=1
        mov     dx,LCR
        out     dx,al
	
        mov     al,0Ch          ; 9600 bits/s
        mov     dx,DL_LSB
        out     dx,al
	xor	al,al
        mov     dx,DL_MSB
        out     dx,al
	
        mov     al,03h          ; DLAB=0, 8 bits de données, 1 bit d'arrêt, aucune parité
        mov     dx,LCR
        out     dx,al
	
        mov     al,5           	; Active l'interruption donnee prete et l'interruption de changement du status de ligne
        mov     dx,IER
        out     dx,al

        sti                     ; Autorise les interruptions

        ;;;;;;;;;;;;; programme principal ;;;;;;;;;;;;;;;;;;;;;;
        

start:
        xor     si,si
        lea     dx,moi
        mov     ah,09h
        int     21h


loop1:
        xor     ax,ax           ; lecture d'un caractère
	int	16h
        call    send_char

        cmp     al,27           ; teste si touche=esc
        jz      fin	        ; sortir

        mov     dl,al           ; afficher le caractère
        mov     ah,02h
        int     21h

        jnz     loop1

send_quit:
        call    send_char
fin:
        pop     dx
        pop     si
        pop     ax
        pop     es
        pop     ds

        mov	ax,4C00h
	int	21h
prog    endp

irq4:                           
	push	ax
	push	dx
        push    ds
        
        ;;;;; Source de l'interruption ;;;;;;

        mov     dx,IIR
        in      al,dx
        and     al,6            ; conserver que bits 1 et 2
        test    al,6
        jz      erreur_ligne    ; erreur ligne

                                ; sinon donnée prête
        mov     dx,commprt      ; lit un caractère du tampon de réception
        in      al,dx

        mov     dl,al
        mov     ah,02h          ; l'affiche à l'écran
        int     21h
        jmp     fin_irq4

erreur_ligne:
        mov     dx,LSR          ; lecture de l'état de la ligne
        in      al,dx
        test    al,2            ; si bit 1 est = 1 => erreur overrun
        jz      overrun
        test    al,8
        jz      cadrage         ; si bit 3 est = 1 => erreur cadrage (forme)
        jmp     fin_irq4

overrun:
        lea     dx,overrun_msg
        mov     ax,cs
        mov     ds,ax
        mov     ah,9
        int     21h
        jmp     fin_irq4

cadrage:
        lea     dx,cadrage_msg
        mov     ax,cs
        mov     ds,ax
        mov     ah,9
        int     21h

fin_irq4:
        mov     al,20h          ; EOI
	out	20h,al
        pop     ds
	pop	dx
	pop	ax
	iret

overrun_msg     db "erreur overrun$"
cadrage_msg     db "erreur cadrage$"

;;;;;;;;;;;;; routine d'envoi d'un caracactère ;;;;;;;;;;;;;;;;

send_char proc near
        push    dx
        push    ax
        mov     dx,LSR
attend:
        in      al,dx
        test    al,20h
        jz      attend
        pop     ax
        mov     dx,commprt
        out     dx,al
        pop     dx
        ret
send_char endp
           

code	ends
        end     prog
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de BruNews le 07/06/2007 00:28:22 administrateur CS

    Me semble important de préciser que tout ceci est complètement obsolète depuis plus de 10 ans.

  • signaler à un administrateur
    Commentaire de nallno le 28/07/2007 09:27:18

    ça on l'avait remarqué, mais l'obsolescence est comme beaucoup de choses toute relative et question de point de vue.

    On me demande bien de fabriquer des claviers à sortie // .
    ("obsolètes" depuis 20 ans...)

  • signaler à un administrateur
    Commentaire de Iwoks le 25/09/2007 12:20:53

    D'ailleur, pour certains GPS's nous avons besoin du RS232. Et même pour le pilotage de certaines machines.
    Donc programme très intéressant. Sur les premières applications RS232

  • signaler à un administrateur
    Commentaire de edfed le 28/02/2008 11:31:04

    pour les choses obsoletes, il y a de quoi faire, je sui squasiment sur que le PC qui à servi a dire que ce code est obsolete, est obsolete lui aussi.
    obsolete, c'est quand ça ne sert plus le systeme de consommation.
    donc, tout est plus ou moins obsolete.

    puis coder en asm, c'est obsolete aussi.
    allez, dire que le code est obsolete montre bien l'etat d'esprit, achete un ecran plasma, ça aussi c'est obsolete.
    alors cours acheter un eee, ça, c'est pas encore obsolete, mais ça ne vat pas tarder... :lol:

Ajouter un commentaire

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS