« I2L 2022 Groupe6 » : différence entre les versions
Aucun résumé des modifications |
|||
Ligne 142 : | Ligne 142 : | ||
===== Faire parler le HP ===== | ===== Faire parler le HP ===== | ||
<syntaxhighlight lang="c"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#define LED 0 | |||
#define BUTTON 2 | |||
#define SPEAKER 7 | |||
int main(void){ | |||
CLKSEL0 = 0b00010101; | |||
CLKSEL1 = 0b00001111; | |||
CLKPR = 0b10000000; | |||
CLKPR = 0; | |||
DDRD |= (1 << LED); | |||
PORTD &= ~(1 << LED); | |||
DDRB |= (1 << SPEAKER); | |||
PORTB &= ~(1 << SPEAKER); | |||
while(1) { | |||
for (uint16_t i = 0; i < 1000; i++) { | |||
PORTB |= (1 << SPEAKER); | |||
_delay_ms(1); | |||
PORTB &= ~(1 << SPEAKER); | |||
_delay_ms(1); | |||
} | |||
PORTD |= (1 << LED); | |||
_delay_ms(50); | |||
PORTD &= ~(1 << LED); | |||
_delay_ms(50); | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== Prog USB === | === Prog USB === |
Version du 22 mai 2023 à 13:56
Proposition de système
Nous voudrions équiper la carte d'un port USB, d'une horloge, d'une LED, d'un bouton et d'un haut-parleur. Le but final serait de, lors d'un appui bouton et/ou CapsLock (à définir ensemble), de faire un son et un allumage de la LED.
Contre-proposition
L'idée est bien de refléter l'ensemble de l'état des touches "verrous" du clavier du PC. A chaque changement d'état de ces touches vous associerez un signal lumineux avec les 3 LED multicolores et surtout un signal sonore. Vous êtes tenus de produire des sons et pas seulement des notes. Pour cela vous devrez réussir à stocker (en mémoire flash) des échantillons sonores et à les reproduire sur votre haut-parleur.
Fichiers
Vous utiliserez le même circuit imprimé que le groupe 5.
Installation
Installation des dépendances :
apt install gcc-avr avr-libc dfu-programmer
Passer du fichier source au fichier exécutable :
Compil : avr-gcc -mmcu=atmega16u2 -DF_CPU=16000000UL -c -Wall -I. -Os main.c -o main.o
Edition des liens (exe) : avr-gcc -mmcu=atmega16u2 -g -lm -Wl,--gc-sections -o main.elf main.o
Transformer le code source en fichiers utilisable pour la carte
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
dfu-programmer atmega16u2 erase
dfu-programmer atmega16u2 flash time.hex
dfu-programmer atmega16u2 reset
Programmation
MAKEFILE
AVR = avr-gcc
AVR_HEX = avr-objcopy
TARGET = atmega16u2
DFU = dfu-programmer
CFLAGS = -mmcu=atmega16u2 -DF_CPU=16000000UL -Wall -I. -Os
CLINKS = -mmcu=atmega16u2 -g -lm -Wl,--gc-sections
CHEXS = -j .text -j .data -O
SRC = main.c
OBJ = main.o
ELF = main.elf
HEX = main.hex
push: clean compile link hex erase flash reset
compile:
$(AVR) $(CFLAGS) -c $(SRC) -o $(OBJ)
link:
$(AVR) $(CLINKS) -o $(ELF) $(OBJ)
hex:
$(AVR_HEX) $(CHEXS) ihex $(ELF) $(HEX)
erase:
$(DFU) $(TARGET) erase
flash:
$(DFU) $(TARGET) flash $(HEX)
reset:
$(DFU) $(TARGET) reset
clean:
rm -f $(OBJ) $(EXEC)
Prog SE
LED
Faire clignoter une led
#include <avr/io.h>
#include <util/delay.h>
#define LED 0
#define BUTTON 2
int main(void){
DDRD |= (1 << LED); // Sortie pour la LED
PORTD &= ~(1 << LED); // Configuration de la résistance de tirage
while(1) {
PORTD |= (1 << LED);
_delay_ms(5);
PORTD &= ~(1 << LED);
_delay_ms(5);
}
}
Boutons
Faire clignoter une led en fonction du bouton
#include <avr/io.h>
#include <util/delay.h>
#define LED 0
#define BUTTON 2
int main(void){
CLKSEL0 = 0b00010101;
CLKSEL1 = 0b00001111;
CLKPR = 0b10000000;
CLKPR = 0;
DDRD |= (1 << LED);
PORTD &= ~(1 << LED);
DDRC &= ~(1 << BUTTON);
PORTC |= (1 << BUTTON);
while(1) {
if (!(PINC & (1 << BUTTON)))
{
PORTD |= (1 << LED);
_delay_ms(5);
PORTD &= ~(1 << LED);
_delay_ms(5);
}
}
}
HP
Faire parler le HP
#include <avr/io.h>
#include <util/delay.h>
#define LED 0
#define BUTTON 2
#define SPEAKER 7
int main(void){
CLKSEL0 = 0b00010101;
CLKSEL1 = 0b00001111;
CLKPR = 0b10000000;
CLKPR = 0;
DDRD |= (1 << LED);
PORTD &= ~(1 << LED);
DDRB |= (1 << SPEAKER);
PORTB &= ~(1 << SPEAKER);
while(1) {
for (uint16_t i = 0; i < 1000; i++) {
PORTB |= (1 << SPEAKER);
_delay_ms(1);
PORTB &= ~(1 << SPEAKER);
_delay_ms(1);
}
PORTD |= (1 << LED);
_delay_ms(50);
PORTD &= ~(1 << LED);
_delay_ms(50);
}
}
Prog USB
Le programme qui va sur le microcontrôleur
Prog PC
Le programme qui tourne sur le pc