.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