Utilisation des bibliothèques AVR

Bonjour tout le monde ,

Je viens vers vous car je rencontre un soucis à l'utilisation des registres de l'atmega 328.

Je souhaite pour le moment simplement faire clignoter une LED ( Deux ici en l'occurence ) mais j'ai l'impression que la fonction "delay" ne marche pas si on ne fait pas appel aux deux fonctions de base :
Void loop et void setup.

Mon code actuellement ressemble à ceci :

int main(void)
{  
  DDRB = (1 <<DDB0); 
  DDRD = (1<<DDD7);
  while(1)
  {
     PORTB = (1<<PB0);    
     PORTD = (1<<PD7);
     delay(1000);
     PORTB =(0<<PB0);
     PORTD =(0<<PD7); 
     delay(1000);
  }
}

Et j'aimerai avoir le comportement équivalent à ceci en "arduino" :

void setup() {
// initialize digital pin 13 as an output.
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}


void loop() {
digitalWrite(7, HIGH);   
digitalWrite(7, HIGH);   
delay(1000);              
digitalWrite(8, LOW);    
digitalWrite(8, LOW);
delay(1000);   
delay(1000);             
}

Faut-il obligatoirement utiliser les deux fonctions de base pour pouvoir utiliser"delay" ?
Merci d'avance pour vos réponses ! :slight_smile: (Edit : Je usis vraiment aveugle merci ! )

Tu peux mettre tes codes entre les balises, il faut éditer ton message.

hello
j'ai ça en stock
nota: il n'est pas de moi et je ne sais plus ou je l'ai récupéré

const byte Led = 13; // Pour utiliser la LED du module
#define LedToggle digitalWrite (Led, !digitalRead(Led))
   
void setup ()
{
   pinMode (Led, OUTPUT);
   bitClear (TCCR2A, WGM20); // WGM20 = 0
   bitClear (TCCR2A, WGM21); // WGM21 = 0 
   TCCR2B = 0b00000110;      // Clock / 256 soit 16 micro-s et WGM22 = 0
   TIFR2 = 0b00000001;       // TOV2
   TCNT2 = 256 - 250;        // Chargement du timer à 6
}
  
byte varCompteur = 0; // La variable compteur
  
void loop () {
   if (bitRead (TIFR2, 0) == 1) {       // Flag TOV2 mis à 1 ?
     TCNT2 = 256 - 250;         // Rechargement du timer à 6
     bitSet (TIFR2, TOV2);      // Remise à zéro du flag TOV2 (voir texte)
     if (varCompteur++ > 125) { // Incrémentation et a atteint 125 ?
       varCompteur = 0;         // On recommence un nouveau cycle
       LedToggle;             // Inversion de la LED
     }
   }
}

Salut !

Merci de ta réponse mais justement je voudrais ne pas utiliser tout ce qui est void loop/Setup pinmode etc mais travailler directement avec les registres de configurations de port etc mais tout en gardant la possiblité d'utiliser les biblio de delay ou autre si besoin..

Ce n'est pas une question de loop ou de setup, enfin pas directement.

delay() n'est pas un fonction C/C++ , c'est une fonction qui appartient a la bibliothèque arduino.
Pour pouvoir l'utiser tout en restant avec un fichier main classique comme le tien il faut :

  1. ajouter tous les fichiers du "core" arduino dans ton projet ou en faire une bibliothèque statique
  2. lancer la fonction "arduino" init () .
    La fonction init configure un certain nombre de périphériques de la puce comme les timers, UART, etc

Si ton besoin dans les fonctions "arduino" est limité à l'usage de delay () ce n'est pas la peine de compiler toute la bibliothèque arduino, il existe une fonction de l'avr-libc "_delay_ms () " qui est d'origine avec gcc-avr.

PS : Change le titre de ton premier message car ce n'est pas un problème de registre,
Les titres servent à faire des recherches, merci.

Merci de ta réponse ,

Justement je pensais que dans le setup il devait y avoir une implémentation des différentes bibliothèques à ce niveau là.

Comment je peux donc ajouter tout les fichiers "core" d'arduino , ou à défauts en faire des bibliothèques ?
Merci pour la bibliothèque avr j'avais fait une faute dans l'appel de la fonction , j'étais resté sur le double __ de microchip

Merci encore ! :slight_smile:

Justement je pensais que dans le setup il devait y avoir une implémentation des différentes bibliothèques à ce niveau là.

Eh bien non.
Il faut bien comprendre que l'ensemble IDE/fonctions a été développé pour permettre l'accès à la programmation à des volontaires qui partent de zéro et que cela fonctionne.
Il faut distinguer les fonctions Wiring/arduino de l'IDE Wiring/Arduino.
Chacun dans son coin essaye de cacher le plus de choses à l'utilisateur néophyte.
Les fonctions on en a déjà parlé, l'IDE suit la même démarche simplificatrice à l'extrême.

Par exemple dans l'IDE tu ne crée pas de fichiers *.c ou *.cpp mais un *.pde (Wiring) ou un *.ino (arduino).

Il n'est pas nécessaire de déclarer les fonctions avant leur utilisation : c'est l'IDE qui créera le fichier main.cpp et qui fera les déclarations à la place de l'utilisateur.

Le travail de l'utilisateur peut se limiter à compléter deux fonctions :

  • setup qui s'exécute avant la boucle infinie et qui donc ne sera exécuté qu'une seule fois. C'est l'emplacement idéal pour les configurations du matériel
  • loop qui est la boucle infinie.

Il est quand même possible j'ajouter d'autres fonctions.