begin process at 2010 03 18 04:35:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications ms-dos

 > COMMUNICATION SÉRIE RS232 AVEC INTERRUPTIONS

COMMUNICATION SÉRIE RS232 AVEC INTERRUPTIONS


 Information sur la source

Note :
Aucune note
Catégorie :Applications ms-dos Classé sous :rs232, série, interruption Niveau :Débutant Date de création :04/06/2007 Vu / téléchargé :7 612 / 385

Auteur : bouffa

Ecrire un message privé
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 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


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec une capture LECTURE CHAINE ET COMPARAISON[MASM] par w4kfu
Source avec une capture LECTURE TOUCHE CLAVIER[MASM] par w4kfu
Source avec Zip UN RESOLVEUR SUDUKO AVEC ASSEMBLEUR NASM par msavyo1
Source avec Zip TESTEUR DE COMPATIBILITTÉ VESA (SUPER VGA) par bofur
Source avec Zip GÉNÉRATEUR DE MICKEY par BasilYercin

 Sources en rapport avec celle ci

LECTURE ET ECRITURE D'UN CARACTERE ET D'UNE CHAINE DE CARACT... par yasmus
BIBLIOTHEQUE POUR LE 8086 par flory_
Source avec Zip EN UTILISANT LES INTERRUPTIONS DE DOS , CECI EST UN CODE DE... par iltir_master
Source avec une capture PIC16F84 ET DIALOGUE RS232 EN MODE INTERRUPT ET SPOOLING par Fpaul54

Commentaires et avis

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.

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...)

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

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


Discussions en rapport avec ce code source dans le forum

Interruption Bios ou Dos ? [ par Valmont ] Quand choisir d'utiliser une int Dos plutot que Bios et inversement qd il y a + ou - doublon, comme par ex. pour la lecture/ecriture de secteur sur un interruption du bios et du dos sous windows [ par eedy31 ] eedy31Salut a tous est ce que quelqu'un pourait m'aider car je ne sais pascomment faire pour utiliser les interruption du dos et du bios sous windows! Rs232 et pic16f84 [ par bwoufy82 ] Voila je recherche un code source en C (qui sera ensuite mis dans le pic16f84)qui a pour but de recupere un caractere au pic, envoyé par mon soft ecri probleme avec l interruption affichage de chaine [ par M0NTOYA ] bon voila mon probleme ,qd j utilse cette procedure(presentation) pour afficher une chaine de caractere presentation PROC PUSHA MOV AH,09h INT 21h POP probleme avec l interruption affichage de chaine [ par M0NTOYA ] bon voila mon probleme ,qd j utilse cette procedure(presentation) pour afficher une chaine de caractere presentation PROC PUSHA MOV AH,09h INT 21h POP liaison rs232 avec pic16f84a [ par Lastar ] Bonjour à tous, voila je voudrais allumer et éteindre une led à partir du clavier d'un PC. J'ai donc pour cela mis un MAX232CPE avec le pic. Le prob interruption BIOS [ par project0 ] est ce quelqu un connais les interruptions BIOS qui arrete le systeme ( avec mise sous tension ) et celle qui permet un reboot ( redemarrage propre pa communication par liaison rs232 vers LCD graphic [ par lcoumar ] Bonjours!voilà je suis débutant en asembleur, j'envoie d'un pc des chaines de caractère vers un afficheur LCD graphic(type hitachi LMG6912)via la liai Creation commande port série [ par hypotamtam ] Bonjours, je suis novice dans l'electronique et je voudrais savoir si quelqu'un pourrais m'aide ou me donner des liens internet.Je souhaiterai juste s rs232 & assembleur& c++ version microsoft [ par elbair32 ] bonjour;je n'arrive pas à ecrire une fonction sur c++ en utilisant dedant des mnemoniques Tasm pour gérer les ports série je sais comment sa se fait e


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales