diff --git a/TP4/Makefile b/TP4/Makefile new file mode 100644 index 0000000..9c4c972 --- /dev/null +++ b/TP4/Makefile @@ -0,0 +1,39 @@ +.PHONY: default cleantmp clean + +#default: CR.pdf +##default: $(subst md,pdf,$(wildcard *.md)) +# +## COMPTE-RENDU +# +#SOURCES=$(wildcard *.txt) +# +#%.pdf: %.html +# scripts/html2pdf -i "$<" -o "$@" -t "Tutorat de microprocesseurs S6 - TD1 Sujet 8" +# +#%.html: %.tmp template.html +# scripts/md2html -i "$<" -o "$@" -t template.html +# +#%.tmp: %.md $(SOURCES) +# scripts/node_modules/markedpp/bin/markedpp.js "$<" > "$@" + +# PROGRAMME + +%.asm: %.txt + wine ~/S6/uP/tutorat/scripts/Compilateur.exe ~/S6/uP/tutorat/scripts/gram.txt "$<" "$@" + +%.hex: %.asm + wine ~/S6/uP/tutorat/scripts/gavrasm.exe "$<" + +%.upload: %.hex + avrdude -C ~/S6/uP/tutorat/scripts/avrdude.conf -v -p atmega2560 -c wiring -P /dev/ttyACM0 -b 115200 -D -U flash:w:"$<":i + +%.up: %.upload + +serial: + minicom -D /dev/ttyACM0 -b 2400 + +clean: + rm -rf $(subst md,html,$(wildcard *.md)) *.tmp + rm -rf $(subst md,pdf,$(wildcard *.md)) + rm -rf *.hex *.lst *.err + diff --git a/TP4/TP40.asm b/TP4/TP40.asm new file mode 100644 index 0000000..e3da2d7 --- /dev/null +++ b/TP4/TP40.asm @@ -0,0 +1,118 @@ +; lecture de la liaison série + +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +.equ UBRR0H = 0x00C5 +.equ UBRR0L = 0x00C4 +.equ UCSR0A = 0x00C0 +.equ UCSR0B = 0x00C1 +.equ UCSR0C = 0x00C2 +.equ UDR0 = 0x00C6 + +.org 0x0000 + ; Vecteur RESET + jmp debut + +.org 0x0080 +debut: + ; initialisation du pointeur de pile + ldi r28,low(RAMEND) + ldi r29,high(RAMEND) + out SPL, r28 + out SPH, r29 + + ; UBRR0H <- 3 + LDI R16,3 + STS UBRR0H,R16 + + ; UBRR0L <- 64 + LDI R16,64 + STS UBRR0L,R16 + + ; UCSR0A <- 0b00000110 + LDI R16,0b00000110 + STS UCSR0A,R16 + + ; UCSR0B <- 0b00011000 + LDI R16,0b00011000 + STS UCSR0B,R16 + + ; UCSR0C <- 0b00000110 + LDI R16,0b00000110 + STS UCSR0C,R16 + + +boucle: + ; attend qu'un caractère arrive + ; si (UCSR0a & 0x80) == 0 saut boucle + LDS R16,UCSR0a + ANDI R16,0x80 + PUSH R16 + LDI R16,0 + POP R17 + CP R17,R16 + BREQ eti0 + CLR R16 + RJMP eti1 +eti0: + LDI R16,0x01 +eti1: + TST R16 + BREQ eti2 + JMP boucle +eti2: + + + ; R20 <- UDR0 + LDS R16,UDR0 + MOV R20,R16 + + + ; si R20 == 'a' alors R20 <- 'A' + MOV R16,R20 + PUSH R16 + LDI R16,'a' + POP R17 + CP R17,R16 + BREQ eti3 + CLR R16 + RJMP eti4 +eti3: + LDI R16,0x01 +eti4: + TST R16 + BREQ eti5 + LDI R16,'A' + MOV R20,R16 +eti5: + + ; si R20 == 'e' alors R20 <- 'E' + MOV R16,R20 + PUSH R16 + LDI R16,'e' + POP R17 + CP R17,R16 + BREQ eti6 + CLR R16 + RJMP eti7 +eti6: + LDI R16,0x01 +eti7: + TST R16 + BREQ eti8 + LDI R16,'E' + MOV R20,R16 +eti8: + + + ; UDR0 <- R20 + STS UDR0,R20 + + + ; saut boucle + JMP boucle + + + diff --git a/TP4/TP40.txt b/TP4/TP40.txt new file mode 100644 index 0000000..0c042bb --- /dev/null +++ b/TP4/TP40.txt @@ -0,0 +1,44 @@ +; lecture de la liaison série + +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +.equ UBRR0H = 0x00C5 +.equ UBRR0L = 0x00C4 +.equ UCSR0A = 0x00C0 +.equ UCSR0B = 0x00C1 +.equ UCSR0C = 0x00C2 +.equ UDR0 = 0x00C6 + +.org 0x0000 + ; Vecteur RESET + jmp debut + +.org 0x0080 +debut: + ; initialisation du pointeur de pile + ldi r28,low(RAMEND) + ldi r29,high(RAMEND) + out SPL, r28 + out SPH, r29 + + UBRR0H <- 3 + UBRR0L <- 64 + UCSR0A <- 0b00000110 + UCSR0B <- 0b00011000 + UCSR0C <- 0b00000110 + +boucle: + ; attend qu'un caractère arrive + si (UCSR0a & 0x80) == 0 saut boucle + + R20 <- UDR0 + + si R20 == 'a' alors R20 <- 'A' + si R20 == 'e' alors R20 <- 'E' + + UDR0 <- R20 + + saut boucle + diff --git a/TP4/TP41a.txt b/TP4/TP41a.txt new file mode 100644 index 0000000..7c3ef87 --- /dev/null +++ b/TP4/TP41a.txt @@ -0,0 +1,91 @@ +.equ PINA = 0x00 ; définition des adresses des ports +.equ DDRA = 0x01 +.equ PORTA = 0x02 +.equ PINC = 0x06 +.equ DDRC = 0x07 +.equ PORTC = 0x08 + +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +.equ UBRR0H = 0x00C5 +.equ UBRR0L = 0x00C4 +.equ UCSR0A = 0x00C0 +.equ UCSR0B = 0x00C1 +.equ UCSR0C = 0x00C2 +.equ UDR0 = 0x00C6 + +.equ TCCR0A = 0x24 +.equ TCCR0B = 0x25 +.equ TIMSK0 = 0x6E +.equ TIFR0 = 0x35 + +.def d2 = r19 +.def d1 = r20 +.def d0 = r21 +.def select = r22 + +.org 0x0000 + ; Vecteur RESET + jmp debut + +.org 0x002E ; Interruption du timer + jmp tm + +.org 0x0080 +codeAff: ; Représentation des chiffres sur l'afficheur 7-segments + .db 0b1111110, 0b001100, 0b0110111, 0b0011111, 0b1001101, 0b1011011, 0b1111011, 0b0001110, 0b1111111, 0b1011111 + +debut: + ; initialisation du pointeur de pile + ldi r28,low(RAMEND) + ldi r29,high(RAMEND) + out SPL, r28 + out SPH, r29 + + ; Ports pour l'afficheur + DDRA@IO <- 0xFF + DDRC@IO <- 0xFF + + ; Port série 16 MHz 2400 Baud + UBRR0H <- 3 + UBRR0L <- 64 + UCSR0A <- 0b00000110 + UCSR0B <- 0b00011000 + UCSR0C <- 0b00000110 + + ; Timer toutes les 2 ms + TCCR0A@IO <- 0x00 + TCCR0B@IO <- 0x04 + TIMSK0 <- 0x01 + TIFR0 <- 0x01 + + ; Initialisation des valeurs à envoyer sur le port série + d2 <- 0 + d1 <- 0 + d0 <- 0 + + sei + +boucle: + ; attend qu'un caractère arrive + si (UCSR0a & 0x80) == 0 saut boucle + + + R20 <- UDR0 + + d2 <- UDR0 / 100 + d1 <- (UDR0 / 10) % 10 + d0 <- UDR0 % 10 + + saut boucle + +tm: + PortC@IO <- select + si select = 0b10000000 alors PortA@IO <- codeAff@ROM[d2] + si select = 0b01000000 alors PortA@IO <- codeAff@ROM[d1] + si select = 0b00100000 alors PortA@IO <- codeAff@ROM[d0] + lsl select + si select = 0 alors select <- 0b00100000 + reti diff --git a/TP4/TP41b.txt b/TP4/TP41b.txt new file mode 100644 index 0000000..db6eca7 --- /dev/null +++ b/TP4/TP41b.txt @@ -0,0 +1,89 @@ +.equ PINC = 0x06 ; définition des adresses des ports +.equ DDRC = 0x07 +.equ PORTC = 0x08 + +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +.equ UBRR0H = 0x00C5 +.equ UBRR0L = 0x00C4 +.equ UCSR0A = 0x00C0 +.equ UCSR0B = 0x00C1 +.equ UCSR0C = 0x00C2 +.equ UDR0 = 0x00C6 + +.equ TCCR0A = 0x24 +.equ TCCR0B = 0x25 +.equ TIMSK0 = 0x6E +.equ TIFR0 = 0x35 + +.def test = r19 +.def numero = r20 +.def ancienNumero = r21 + +.org 0x0000 + ; Vecteur RESET + jmp debut + +.org 0x002E ; Interruption du timer + jmp tm + +.org 0x0080 +touche: + .DB 0x41, 0x88, 0x48, 0x28, 0x84, 0x44, 0x24, 0x82, 0x42, 0x22, 0x81, 0x21 + ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *, # + +debut: + ; initialisation du pointeur de pile + ldi r28,low(RAMEND) + ldi r29,high(RAMEND) + out SPL, r28 + out SPH, r29 + + ; Ports pour la touche de clavier + DDRC@IO <- 0xFF + + ; Port série 16 MHz 2400 Baud + UBRR0H <- 3 + UBRR0L <- 64 + UCSR0A <- 0b00000110 + UCSR0B <- 0b00011000 + UCSR0C <- 0b00000110 + + ; Timer toutes les 65 ms + TCCR0A@IO <- 0x00 + TCCR0B@IO <- 0b00000101 + TIMSK0 <- 0x01 + TIFR0 <- 0x01 + + sei + + test <- 0 + numero <- 255 + ancienNumero <- 255 + +boucle: + sleep + saut boucle + +reti: + reti + +tm: + ; On teste la touche courante + PORTC@IO <- touche@ROM[test] + si PINC@IO = touche@ROM[test] alors numero <- test + ; On prépare la touche suivante + inc test + ; Si on est arrivé à la fin du test on recommence + si test > 11 alors test <- 0 + ; Si le numéro est différent du précédent (~ a changé) on l'envoie + si numero = test saut reti + + si numero < 10 alors UDR0 <- 48 + numero + si numero = 10 alors UDR0 <- 42 + si numero = 11 alors UDR0 <- 35 + ancienNumero <- numero + + reti diff --git a/TP4/TP42a.txt b/TP4/TP42a.txt new file mode 100644 index 0000000..323924f --- /dev/null +++ b/TP4/TP42a.txt @@ -0,0 +1,91 @@ +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +.equ ADMUX = 0x7C +.equ ADCSRB = 0x7B +.equ ADCSRA = 0x7A +.equ ADCH = 0x79 + +.equ UBRR0H = 0x00C5 +.equ UBRR0L = 0x00C4 +.equ UCSR0A = 0x00C0 +.equ UCSR0B = 0x00C1 +.equ UCSR0C = 0x00C2 +.equ UDR0 = 0x00C6 + +.equ TCCR0A = 0x24 +.equ TCCR0B = 0x25 +.equ TIMSK0 = 0x6E +.equ TIFR0 = 0x35 + +.org 0x0000 + ; Vecteur RESET + jmp debut + +.org 0x002E ; Interruption du timer + jmp tm + +.def timer = r20 + +.org 0x0080 + +debut: + ; initialisation du pointeur de pile + ldi r28,low(RAMEND) + ldi r29,high(RAMEND) + out SPL, r28 + out SPH, r29 + + ; Port série 16 MHz 2400 Baud + UBRR0H <- 3 + UBRR0L <- 64 + UCSR0A <- 0b00000110 + UCSR0B <- 0b00011000 + UCSR0C <- 0b00000110 + + ; Timer toutes les 65 ms + TCCR0A@IO <- 0x00 + TCCR0B@IO <- 0b00000101 + TIMSK0 <- 0x01 + TIFR0 <- 0x01 + + ; ADC en déclenchement manuel + ADMUX <- 0b01100000 + ADCSRB <- 0b00000010 + ADCSRA <- 0b11010110 + + sei + + timer <- 0 + +boucleTemps: + si timer < 122 saut boucleTemps ; 8 secondes ne sont pas encore passées + timer <- 0 +; Lancement d'une conversion ADC + ADCSRA <- 0b11011101 +; Tant que la conversion ADC n'est pas terminée +boucleAdc: + si (ADCSRA & 0x80) == 0 saut boucleAdc + UDR0 <- ADCH / 10 +; Tant que le premier caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar0: + si (UCSR0A & 0x4) == 0 saut boucleCar0 + UDR0 <- ADCH % 10 +; Tant que le deuxième caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar1: + si (UCSR0A & 0x4) == 0 saut boucleCar1 + UDR0 <- 67 +; Tant que le troisième caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar2: + si (UCSR0A & 0x4) == 0 saut boucleCar2 + UDR0 <- 13 +; Tant que le quatrième caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar3: + si (UCSR0A & 0x4) == 0 saut boucleCar3 + saut boucleTemps + +tm: + inc timer + reti + diff --git a/TP4/TP42b.txt b/TP4/TP42b.txt new file mode 100644 index 0000000..ad9e456 --- /dev/null +++ b/TP4/TP42b.txt @@ -0,0 +1,117 @@ +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +.equ ADMUX = 0x7C +.equ ADCSRB = 0x7B +.equ ADCSRA = 0x7A +.equ ADCH = 0x79 + +.equ UBRR0H = 0x00C5 +.equ UBRR0L = 0x00C4 +.equ UCSR0A = 0x00C0 +.equ UCSR0B = 0x00C1 +.equ UCSR0C = 0x00C2 +.equ UDR0 = 0x00C6 + +.org 0x0000 + ; Vecteur RESET + jmp debut + +.org 0x002E ; Interruption du timer + jmp tm + +.def timer = r20 + +.org 0x0080 + +debut: + ; initialisation du pointeur de pile + ldi r28,low(RAMEND) + ldi r29,high(RAMEND) + out SPL, r28 + out SPH, r29 + + ; Port série 16 MHz 2400 Baud + UBRR0H <- 3 + UBRR0L <- 64 + UCSR0A <- 0b00000110 + UCSR0B <- 0b00011000 + UCSR0C <- 0b00000110 + + ; ADC en déclenchement manuel + ADCSRB <- 0b00000010 + ADCSRA <- 0b11010110 + + sei + + timer <- 0 + +attendreConversionADC: + si (ADCSRA & 0b00010000) = 0 saut attendreConversionADC + ret + +boucle: + ; Lecture + ADMUX <- 0b01100000 + call attendreConversionADC + + ; Comparaison avec la valeur correspondant à 10cm + si ADCH > + + + ; Lecture de la consigne + consigne <- ADCH / 8 + 20 + + ; Mode hors-gel + si (PINA@IO & 0b10000000) == 0 alors consigne <- 12 + + ; Déclenchement de la lecture de la température + ADMUX <- 0b01100001 + +attente2: + si (ADCSRA & 0b00010000) = 0 saut attente2 + + temp <- ADCH / 4 + + ; Affichage + PORTA@IO <- codeAff@ROM[temp/20] + PORTB@IO <- codeAff@ROM[temp-(temp/20)*20] + + ; Gestion du radiateur + si consigne - 1 > temp alors PORTB@IO <- PORTB@IO | 0b10000000 + si consigne + 1 < temp alors PORTB@IO <- PORTB@IO & 0b01111111 + + jmp boucle + + +boucleTemps: + si timer < 122 saut boucleTemps ; 8 secondes ne sont pas encore passées + timer <- 0 +; Lancement d'une conversion ADC + ADCSRA <- 0b11011101 +; Tant que la conversion ADC n'est pas terminée +boucleAdc: + si (ADCSRA & 0x80) == 0 saut boucleAdc + UDR0 <- ADCH / 10 +; Tant que le premier caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar0: + si (UCSR0A & 0x4) == 0 saut boucleCar0 + UDR0 <- ADCH % 10 +; Tant que le deuxième caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar1: + si (UCSR0A & 0x4) == 0 saut boucleCar1 + UDR0 <- 67 +; Tant que le troisième caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar2: + si (UCSR0A & 0x4) == 0 saut boucleCar2 + UDR0 <- 13 +; Tant que le quatrième caractère n'est pas envoyé, attendre avant d'envoyer le prochain +boucleCar3: + si (UCSR0A & 0x4) == 0 saut boucleCar3 + saut boucleTemps + +tm: + inc timer + reti +