I2L 2022 Groupe4

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Clavier de raccourcis programmables - par Axel Lebas & Wassim Djamaa & Maxime Vitse

Proposition de système

Une carte avec 4 boutons programmables via un fichier de configuration qui est fourni par l'utilisateur. Accompagnée d'une LED.

Contre-proposition

Bonne idée. Votre périphérique USB sera programmé avec une interface comportant un point d'accès OUT pour envoyer les chaînes de caractères à envoyer sur pression des boutons. Il serait intéressant d'écrire ces chaînes dans l'EEPROM de l'ATMega16u2 pour qu'elles persistent une fois le périphérique débranché. Les LED du périphérique doivent permettre d'indiquer quelles touches sont programmées. Le programme de configuration sera écrit avec la bibliothèque libusb-1.0.

Fichiers

Le circuit imprimé à utiliser est le même que celui du groupe 2 avec le clavier optionnel.


// image à insérer

https://cdn.discordapp.com/attachments/497145871180496926/1110119807665311784/image.png

3 parties à faire

  • Prog SE:

- LED

- Bouton

- Haut Parleur (pas dans notre use case)

  • Prog USB:

- LUFA

  • Prog PC:

- Lib usb

Makefile pour automatiser le processus suivant

Par défaut le micro processeur a un bootloader qui permet de faire de la programmation (sans passer par le SPI) , l'utilitaire que nous utilisons est DFU/USB.

"5.2  ATMega328p: Chaîne de compilation (2/2)" de https://rex.plil.fr/Enseignement/Systeme/Systeme.PSE/systeme.html

$ apt install gcc-avr avr-libc dfu-programmer // DFU/USB dfu 6 programmer

$ avr-gcc -mmcu=atmega328p -DF_CPU=8000000UL -c -Wall -I. -Os timer.c -o timer.o // compilation source en un . objet

$ avr-gcc -mmcu=atmega328p -g -lm -Wl,--gc-sections -o timer.elf timer.o // édition des liens (afin d'obtenir un exécutable)

$ avr-objcopy -j .text -j .data -O ihex timer.elf timer.hex // nécessaire pour les utilitaires

$ dfu-programmer atmega16u2 erase

$ dfu-programmer atmega16u2 flash time.hex

$ dfu-programmer atmega16u2 reset

Exemple de makefile

CC = avr-gcc
OBJCOPY = avr-objcopy
DFU_PROGRAMMER = dfu-programmer

CFLAGS = -mmcu=atmega328p -DF_CPU=8000000UL -c -Wall -I. -Os
LDFLAGS = -mmcu=atmega328p -g -lm -Wl,--gc-sections

all: timer.hex

timer.o: timer.c
	$(CC) $(CFLAGS) $< -o $@

timer.elf: timer.o
	$(CC) $(LDFLAGS) $< -o $@

timer.hex: timer.elf
	$(OBJCOPY) -j .text -j .data -O ihex $< $@

erase:
	$(DFU_PROGRAMMER) atmega16u2 erase

flash: timer.hex
	$(DFU_PROGRAMMER) atmega16u2 flash $<

reset:
	$(DFU_PROGRAMMER) atmega16u2 reset

clean:
	rm -f timer.o timer.elf timer.hex

Gestion des entrées-sorties numériques avec avr-gcc

#include <avr/io.h>

#define LED     8
#define BOUTON  9

int main(void){
DDRB |= 0x01;                // Sortie pour la LED
DDRB &= ~0x02;               // Entrée pour le bouton
PORTB |= 0x02;               // Configuration de la résistance de tirage

while(1){
  if(PINB & 0x02) PORTB &= ~0x01;      // LED éteinte
  else PORTB |= 0x01;                  // LED allumée
  }
}


Ports

B: 8 sorties

C: > 8 sorties

D: 8 sorties

En général 8 fois 3 entrées, ici une vingtaine de sorties

Registre DDR (data direction register) : sens de la LED

Pour chaque bit du port si le bit correspond à une entrée ou une sortie


Voir PB0 / PB1 sur le schéma KICAD

- Par défaut, BIT à 0 en entrée

- 1 pour sortie


Il faut toucher au bit avec le poids le plus faible.


Rappels sur les opérandes en C

& | sont des opérandes bit à bit pas comme les opérandes logiques dans les if && ou ||

tilde is NOT

Le OU exclusif s'écrit PORTB ^ = 0X01



le & avec le tilde permet un bit à 0

le | sans le tilde permet un bit à 1


2 types de registres

Port B -> sortie

PINB -> entrée