0% ont trouvé ce document utile (0 vote)
27 vues12 pages

EX1

Transféré par

hanane aissaoui
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
27 vues12 pages

EX1

Transféré par

hanane aissaoui
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

EX1 :

.ORG 0x00 ; Adresse de départ

; Initialisation des valeurs

LDI R0, 14 ; Charger 14 dans R0 (premier nombre)

LDI R1, 4 ; Charger 4 dans R1 (deuxième nombre)

; Début du calcul du PGCD

PGCD:

CP R0, R1 ; Comparer R0 et R1

BRLO Swap ; Si R0 < R1, échanger les deux registres

SUB R0, R1 ; R0 = R0 - R1

BRNE PGCD ; Si R0 ≠ 0, continuer la boucle

RJMP Done ; Sinon, le PGCD est trouvé

Swap:

MOV R4, R0 ; Sauvegarder R0 dans R4

MOV R0, R1 ; R0 = R1

MOV R1, R4 ; R1 = ancienne valeur de R0

RJMP PGCD ; Retour au début de la boucle

Done:

MOV R2, R1 ; Le PGCD est dans R1 (ou R0, car ils sont égaux à ce stade)

RJMP Done ; Boucle infinie pour terminer

EX2 :

.ORG 0x0000 ; Définir l'adresse de départ du programme

.EQU N = 0x30 ; N = 48 (limite du compteur)

; Initialisation des registres et des ports

LDI R16, 0x00 ; Initialiser le compteur à 0


LDI R20, 0xFF ; Configurer toutes les broches de PORTB en sortie (pour les boutons)

OUT DDRD, R20 ; Configurer toutes les pins de PORTB comme sorties

LDI R21, N ; Charger la valeur N (limite du compteur) dans R21

; Configurer PB5 (BP_comp) et PB4 (BP_reset) comme entrées

CBI DDRB, 5 ; Configurer PB5 (BP_comp) comme entrée

CBI DDRB, 4 ; Configurer PB4 (BP_reset) comme entrée

; Boucle principale

BP_comp:

SBIS PINB, 5 ; Vérifier si BP_comp est appuyé (PB5 = 0)

RJMP BP_reset ; Si BP_reset est appuyé, aller à BP_reset

RJMP increm ; Si BP_comp est appuyé, passer à increm

; Incrémenter le compteur

increm:

INC R16 ; Incrémenter le compteur

CPI R16, N ; Comparer le compteur avec N

BREQ LED ; Si égal à N, aller à LED

RJMP BP_comp ; Sinon, revenir à BP_comp

; Affichage du compteur sur les LEDs

LED:

OUT PORTD, R16 ; Afficher la valeur du compteur sur PORTD (8 LEDs)

RJMP mettre_zero ; Passer à la fonction pour remettre le compteur à zéro

; Remettre le compteur à zéro après avoir atteint N

mettre_zero:

LDI R16, 0x00 ; Remettre le compteur à 0

RJMP BP_comp ; Revenir à la vérification du bouton BP_comp


; Fonction de réinitialisation (BP_reset)

BP_reset:

LDI R16, 0x00 ; Remettre le compteur à 0

OUT PORTD, R16 ; Afficher 0 sur les LEDs

RCALL retard ; Appeler la fonction de retard

RJMP BP_comp ; Revenir à BP_comp

; Fonction de retard (simple boucle)

retard:

LDI R18, 0xFF ; Charger un délai dans R18

retard_loop:

NOP ; No Operation (NOP) pour créer un petit délai

DEC R18 ; Décrémenter R18

BRNE retard_loop ; Si R18 != 0, continuer la boucle de retard

RET ; Retour de la fonction de retard

EX3 :

.ORG 0x00

.EQU ADS_RAM=0x0400 ; Adresse de départ de la RAM

.EQU RAM_SIZE=20 ; Nombre de cases mémoire à examiner

CBI DDRB,5 ; Configurer PB5 comme entrée (bouton poussoir)

SBI DDRB,4 ; Configurer PB4 comme sortie (LED)

LDI R30, LOW(ADS_RAM) ; Charger la partie basse de l'adresse RAM

LDI R31, HIGH(ADS_RAM) ; Charger la partie haute de l'adresse RAM

BP_charger:

SBIS PINB, 5 ; Attendre que le bouton soit pressé

RJMP BP_charger

IN R18, PIND ; Lire la donnée depuis le port D

CLR R3 ; Initialiser R3 à 0

CLR R4 ; Initialiser R4 à 0
CLR R17 ; Réinitialiser le compteur

search_loop:

LD R0, Z ; Charger la donnée pointée par Z

CP R0, R18 ; Comparer avec la donnée lue

BREQ found_data ; Si trouvé, sauter à found_data

ADIW ZL, 1 ; Incrémenter Z (passer à l'adresse suivante)

INC R17 ; Incrémenter le compteur

CPI R17, RAM_SIZE ; Vérifier si toutes les cases ont été parcourues

BRLO search_loop ; Continuer si la fin n'est pas atteinte

RJMP mettre_zero ; Si la donnée n'est pas trouvée après tout le parcours

found_data:

MOV R3, R30 ; Stocker l'adresse basse dans R3

MOV R4, R31 ; Stocker l'adresse haute dans R4

SBI PORTB, 4 ; Allumer la LED

RJMP BP_charger ; Retourner à l'attente du bouton poussoir

mettre_zero:

CLR R3 ; Mettre R3 à 0

CLR R4 ; Mettre R4 à 0

CBI PORTB, 4 ; Éteindre la LED

RJMP BP_charger ; Retourner à l'attente du bouton poussoir

EX4 :

.EQU LED = 5

SBI DDRB,LED

comparaison:

CP R0,R1

BRGE allume_led
RJMP attient_led

allume_led:

SBI PORTB,LED

RJMP comparaison

attient_led

CBI PORTB,LED

RJMP comparaison

EX4 :

; Définir le symbole pour la LED

.EQU LED = 5 ; LED connectée à PB5

.ORG 0x00 ; Adresse de départ

start:

; Initialisation du Port B

LDI R16, (1 << LED) ; Charger la valeur pour définir PB5 comme sortie

OUT DDRB, R16 ; Configurer PB5 en sortie

; Charger les données signées dans R0 et R1

LDI R0, -5 ; Exemple : Charger -5 dans R0

LDI R1, 3 ; Exemple : Charger 3 dans R1

; Comparaison des deux valeurs

CP R0, R1 ; Comparer R0 et R1 (signé)

BRGE led_on ; Si R0 ≥ R1, aller à l'allumage de la LED

led_off:

CBI PORTB, LED ; Éteindre la LED (PB5 = 0)

RJMP end ; Fin du programme


led_on:

SBI PORTB, LED ; Allumer la LED (PB5 = 1)

end:

RJMP end ; Boucle infinie pour terminer

EX5 :

.ORG 0x00

.EQU data1=0x0967

.EQU data2=0x1200

CBI DDRB,5

CBI DDRB,4

MOVW R1,data1

MOVW R3,data2

ADIW R5:R4,R1

ADIW R5:R4,R3

BRLO retenu

BRVS over_flow

RJMP end

retenu:

SBI PORTB,5

RET

overflow:

SBI PORTB,4

RET

end:

RJMP end

EX6 :

.ORG 0x00

.EQU tem=0x5A
.EQU led=5

SBI PORTB,led

LDI R16, 0x00

OUT DDRD, R16

LDI R1,tem

IN R0,PORTD

CP R0,R1

BRSH allume_led

RJMP eteint_led

allume led:

SBI PORTB,5

RJMP end

eteint_led:

CBI PORTB,led

RJMP end

end:

RJMP end

EX7 :

.ORG 0x00 ; Début du programme

; Entrée : Nombre binaire 8 bits dans R0

; Sortie :

; - Chiffre fort (centaines) dans R7

; - Chiffre milieu (dizaines) dans R6

; - Chiffre faible (unités) dans R5

LDI R16, 100 ; Charger 100 dans R16 pour calculer les centaines

CLR R7 ; Initialiser R7 (chiffres des centaines)


centaines_loop:

CP R0, R16 ; Comparer R0 avec 100

BRLO dizaines ; Si R0 < 100, passer au calcul des dizaines

SUB R0, R16 ; R0 = R0 - 100

INC R7 ; Incrémenter le compteur des centaines

RJMP centaines_loop ; Répéter jusqu'à ce que R0 < 100

dizaines:

LDI R16, 10 ; Charger 10 dans R16 pour calculer les dizaines

CLR R6 ; Initialiser R6 (chiffres des dizaines)

dizaines_loop:

CP R0, R16 ; Comparer R0 avec 10

BRLO unites ; Si R0 < 10, passer au calcul des unités

SUB R0, R16 ; R0 = R0 - 10

INC R6 ; Incrémenter le compteur des dizaines

RJMP dizaines_loop ; Répéter jusqu'à ce que R0 < 10

unites:

MOV R5, R0 ; Copier le reste (R0) dans R5 (chiffres des unités)

fin:

RJMP fin ; Boucle infinie pour terminer le programme

EX8 :

.ORG 0x00 ; Début du programme

.EQU char_recherche = 'o' ; Caractère à rechercher ('o' dans cet exemple)

.DEF temp = R16 ; Registre temporaire

; Chaîne de caractères en ROM


chaine: .DB "Bonjour tous le monde", 0

; Initialisation

LDI ZL, LOW(chaine << 1) ; Charger l'adresse basse de la chaîne dans ZL

LDI ZH, HIGH(chaine << 1) ; Charger l'adresse haute de la chaîne dans ZH

CLR R0 ; Initialiser le compteur d'occurrences à 0

boucle:

LPM temp, Z+ ; Charger le prochain caractère de la chaîne (Z pointe vers la chaîne en ROM)

CPI temp, 0 ; Comparer le caractère avec 0 (fin de chaîne)

BREQ fin ; Si c'est la fin de chaîne, sauter à la fin

CPI temp, char_recherche; Comparer le caractère avec le caractère recherché

BRNE boucle ; Si ce n'est pas une correspondance, continuer la boucle

INC R0 ; Incrémenter le compteur d'occurrences

RJMP boucle ; Recommencer la boucle

fin:

RJMP fin ; Boucle infinie à la fin du programme

EX9 :

.ORG 0x00 ; Début du programme

; Le registre R0 contient le chiffre (0-9)

; Le registre R1 contiendra le code ASCII correspondant

LDI R16, '0' ; Charger le code ASCII du caractère '0' dans R16

ADD R1, R0, R16 ; Ajouter le code ASCII de '0' au chiffre dans R0

; Le résultat est le code ASCII correspondant au chiffre

; Fin du programme (peut être utilisé dans une boucle ou étendu pour d'autres traitements)

RJMP $
EX10 :

; Définition des broches pour les LEDs

.EQU R1 = 0 ; Feu rouge voie 1 -> PD0

.EQU O1 = 1 ; Feu orange voie 1 -> PD1

.EQU V1 = 2 ; Feu vert voie 1 -> PD2

.EQU R2 = 3 ; Feu rouge voie 2 -> PD3

.EQU O2 = 4 ; Feu orange voie 2 -> PD4

.EQU V2 = 5 ; Feu vert voie 2 -> PD5

.DEF delay_counter = R16 ; Registre pour compter les cycles de délai

.DEF i = R17 ; Registre pour des boucles internes

; Début du programme

.ORG 0x00

RESET:

LDI R16, 0xFF ; Configurer PORTD en sortie

OUT DDRD, R16

MAIN_LOOP:

; État 1 : V1 allumé, R2 allumé (voie 1 passe)

SBI PORTD, V1 ; Allumer V1 (vert voie 1)

SBI PORTD, R2 ; Allumer R2 (rouge voie 2)

CALL DELAY_30S ; Attendre 30 secondes

CBI PORTD, V1 ; Éteindre V1

; État 2 : O1 allumé, R2 toujours allumé

SBI PORTD, O1 ; Allumer O1 (orange voie 1)

CALL DELAY_2S ; Attendre 2 secondes

CBI PORTD, O1 ; Éteindre O1


; État 3 : R1 allumé, R2 allumé (sécurité)

SBI PORTD, R1 ; Allumer R1 (rouge voie 1)

CALL DELAY_10S ; Attendre 10 secondes

CBI PORTD, R2 ; Éteindre R2

; État 4 : R1 allumé, V2 allumé (voie 2 passe)

SBI PORTD, V2 ; Allumer V2 (vert voie 2)

CALL DELAY_30S ; Attendre 30 secondes

CBI PORTD, V2 ; Éteindre V2

; État 5 : R1 allumé, O2 allumé

SBI PORTD, O2 ; Allumer O2 (orange voie 2)

CALL DELAY_2S ; Attendre 2 secondes

CBI PORTD, O2 ; Éteindre O2

; État 6 : R1 et R2 allumés (sécurité)

SBI PORTD, R2 ; Allumer R2 (rouge voie 2)

CALL DELAY_10S ; Attendre 10 secondes

CBI PORTD, R1 ; Éteindre R1

RJMP MAIN_LOOP ; Répéter le cycle

; ================== Sous-programmes de délai ==================

; Délai approximatif basé sur une fréquence de 16 MHz et un prescaler.

; Boucle interne pour générer des délais de quelques secondes.

DELAY_30S:

LDI delay_counter, 30

DELAY_LOOP_30S:

CALL DELAY_1S

DEC delay_counter
BRNE DELAY_LOOP_30S

RET

DELAY_10S:

LDI delay_counter, 10

DELAY_LOOP_10S:

CALL DELAY_1S

DEC delay_counter

BRNE DELAY_LOOP_10S

RET

DELAY_2S:

LDI delay_counter, 2

DELAY_LOOP_2S:

CALL DELAY_1S

DEC delay_counter

BRNE DELAY_LOOP_2S

RET

DELAY_1S:

LDI i, 250 ; Nombre d'itérations (approximatif)

DELAY_LOOP_1S:

NOP

NOP

DEC i

BRNE DELAY_LOOP_1S

RET

.END

Vous aimerez peut-être aussi