Cours:ArduinoSansLoopSetup : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(can/adc)
 
(6 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
Il est tout à fait possible de se passer complètement des librairies Arduino, tout en utilisant le logiciel Arduino !
 
Il est tout à fait possible de se passer complètement des librairies Arduino, tout en utilisant le logiciel Arduino !
 +
Ou d'utiliser une partie de la librairie Arduino pour simplifier l'usage de certains périphériques.
  
={{Rouge|exemple :}}=
+
=liaison série=
 +
 
 +
On peut utiliser la classe {{Rouge|Serial}} arduino, à condition d'{{Rouge|autoriser les interruptions}} :
  
 
<source lang=c>
 
<source lang=c>
#define F_CPU 16000000UL
 
#include <util/delay.h>
 
 
 
int main()
 
int main()
 
{
 
{
  DDRB=0x0F;
+
  sei();
 
+
  Serial.begin(9600);
  for(;;)
+
  while(1)
  {
+
  {
    PORTB^=0x0F;
+
      Serial.println("top");
    _delay_ms(500);
+
      _delay_ms(500);
  }
+
  }
 
}
 
}
 
</source>
 
</source>
 
  
 
=Gestion du temps=
 
=Gestion du temps=
Ligne 26 : Ligne 25 :
 
*utiliser {{Rouge|_delay_us}} à la place de delayMicroseconds
 
*utiliser {{Rouge|_delay_us}} à la place de delayMicroseconds
  
S'il est indispensable d'utiliser les fonctions arduino [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c delay/delayMicroseconds/millis/micros], il faut configurer le Timer1 de la façon suivante :
+
S'il est {{Rouge|indispensable}} d'utiliser les fonctions arduino [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c delay/delayMicroseconds/millis/micros], il faut configurer le Timer1 de la façon suivante :
  
 
<source lang=cpp>
 
<source lang=cpp>
Ligne 48 : Ligne 47 :
 
     delay(100);
 
     delay(100);
 
     Serial.println(millis());
 
     Serial.println(millis());
 +
  }
 +
}
 +
</source>
 +
 +
=i2c=
 +
 +
Il est possible d'utiliser la librairie Arduino Wire, il convient juste d'autoriser les interruptions :
 +
 +
<source lang=cpp>
 +
#include <Wire.h>
 +
int main()
 +
{
 +
sei();
 +
Wire.begin();
 +
while(1)
 +
{
 +
}
 +
}
 +
</source>
 +
 +
 +
=can/adc=
 +
 +
Il est possible d'utiliser la fonction analogRead à condition d'initialiser le convertisseur :
 +
 +
<source lang=cpp>
 +
void initAdcArduino()
 +
{
 +
  sei();
 +
  // marche pour 328p et 2560 et autres ... pour Fcpu = 16MHz
 +
  // à adapter suivant le µc et la fréquence
 +
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
 +
  ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
 +
}
 +
 +
int main()
 +
{
 +
  initAdcArduino();
 +
  Serial.begin(115200);
 +
  while(1)
 +
  {
 +
    Serial.println(analogRead(A0));
 +
    _delay_ms(250);
 
   }
 
   }
 
}
 
}
 
</source>
 
</source>

Version actuelle datée du 3 juin 2024 à 17:54

Il est tout à fait possible de se passer complètement des librairies Arduino, tout en utilisant le logiciel Arduino ! Ou d'utiliser une partie de la librairie Arduino pour simplifier l'usage de certains périphériques.

liaison série

On peut utiliser la classe Serial arduino, à condition d'autoriser les interruptions :

int main()
{
   sei();
   Serial.begin(9600);
   while(1)
   {
      Serial.println("top");
      _delay_ms(500);
   }
}

Gestion du temps

Remplacement :

  • utiliser _delay_ms à la place de delay
  • utiliser _delay_us à la place de delayMicroseconds

S'il est indispensable d'utiliser les fonctions arduino delay/delayMicroseconds/millis/micros, il faut configurer le Timer1 de la façon suivante :

void initFonctionsTempsArduino()
{
  sei();
  // marche pour 328p et 2560 et autres ...
  // à adapter suivant le µc
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
  TCCR0A=(1<<WGM01)|(1<<WGM00);
  TCCR0B=(1<<CS01)|(1<<CS00);
  TIMSK0=(1<<TOIE0);
}

int main()
{
  initFonctionsTempsArduino();
  Serial.begin(115200);
  while(1)
  {
    delay(100);
    Serial.println(millis());
  }
}

i2c

Il est possible d'utiliser la librairie Arduino Wire, il convient juste d'autoriser les interruptions :

#include <Wire.h>
int main()
{
	sei();
	Wire.begin();
	while(1)
	{
	}
}


can/adc

Il est possible d'utiliser la fonction analogRead à condition d'initialiser le convertisseur :

void initAdcArduino()
{
  sei();
  // marche pour 328p et 2560 et autres ... pour Fcpu = 16MHz
  // à adapter suivant le µc et la fréquence
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
  ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

int main()
{
  initAdcArduino();
  Serial.begin(115200);
  while(1)
  {
     Serial.println(analogRead(A0));
     _delay_ms(250);
  }
}