Les registres timers

Bonjour,

J'ai avancé un projet domotique :

  • Une carte Arduino + shield ethernet + carte SD ( mini serveur ) + module RF24L01
    avec laquelle je prends la main puis envoi des ordres et reçois des info à partir de l'autre carte.
  • Une seconde carte : arduno UNO ( ma première ! ) équipé d'un module RF24 / d'un capteur temp / une liaison SDi avec afficheur LCD / un mini capteur de mouvement et... ( le bas blesse ! une diode infrarouge )
    j'utilise la biblio iBoardRF24.h combiné à digitalWriteFast.h pour déplacer les pins.

En résumé je pilote ma clim, et prends des infos. Tout marchait bien même l'infra rouge mais pas ensemble : forcément la pin utilisée est obligatoirement la 3 car liée au timer 2 qui lui même est utilisé pour ma liaison...

Donc il faudrait que j'utilise une carte méga afin de disposer des autres timers ( et modifier les biblio... )

Je ne connais pas encore toutes les cartes dispo de chez Arduino, Que me conseillerez-vous pour comme carte ?
je pense qu'il est dommage d'utiliser une méga et ses multiples entrées sorties juste pour une histoire de timer !

Merci d'avance

Sur la Uno, il y a 3 timers. Les 3 sont utilisés? en particulier le code utilise-t-il delay millis ou micros?

Donc il faudrait que j'utilise une carte méga afin de disposer des autres timers ( et modifier les biblio... )

Pas forcément trivial car le timer 2 est un 8 bits, et les timers supplémentaires de la Mega sont des 16 bits. Par exemple le prédiviseurs par 32 existe pour le timer 2, mais pas pour les 16 bits.

Bonsoir Vileroi,

Timer 0 utilisé par la fonction delay de mon programme
Je n’utilise pas le Timer 1,( mais il est en 16 bits :confused: )
Quand au timer 3, étant donné que j’utilise digitalWriteFast.h pour mon module, et que les pins utilisées par le module RF sont :
3 = CE
8 = CS
5 = mosi
6 = miso
7 = SCK
2 = IRQ
j’en déduis qu’il est occupé

Voici l’entête de ma UNO ( avec le conflit pin 3 )

//19 novembre 2020

//pilotage afficheur
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SimpleDHT.h>
//SDA-A4 SCL-A5
LiquidCrystal_I2C lcd(0x27,20,4);// initialize the library with the numbers of lines and columns and pins

//pilotage infrarouge clim
#include <IRremote.h>
#include <MideaIR.h>
#define IR_EMITER           9   // sortie IR sur pin 3 ON PEUX PAS LE CHANGER !
IRsend irsend;
MideaIR remote_control(&irsend);

//capteur température /humidité
#include "DHT.h"
#define DHTPIN 4            //capteur d'humidité sur PIN 4     
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

//init module nrf24
#include <SPI.h>
#include <digitalWriteFast.h>
#include "iBoardRF24.h"
#include "printf.h"
//             (ce,cs,mosi,miso,sck,irq)
iBoardRF24 radio(3,8,5,6,7,2);
const uint64_t pipe[2] = {0xE8E8F0F0E1LL,0xE8E8F0F0D0LL};

cdt,

Quand au timer 3, étant donné....

Je suppose que c'est le timer 2!


Je ne connais pas les bibliothèques utilisées, il est effectivement probable que le module RF utilise un timer mais pas forcément les broches du timer. Surtout que la broche 3 est une CE qui n'a pas de rapport avec le timer 2 (OC2B). Le module RF utilise une liaison SDI mais soft, celle qui est hard n'est pas au même endroit. Il me semblait que SDI.h utilisait le hard?

étant donné que j'utilise digitalWriteFast.h pour mon module, et que les pins utilisées par le module RF sont :
3 = CE
8 = CS
5 = mosi
6 = miso
7 = SCK
2 = IRQ
j'en déduis qu'il est occupé

digitalWriteFast.h ou pas cela ne change strictement rien à l'utilisation ds pins et des timers. c'est un équivalent à "digitalWrite.h" sans les mutiples contrôles.
Le module peut utiliser le timer 2, mais il n'utilise visiblement pas les broches de sortie du timer CE n'a pas besoin d'un signal d’horloge et ne va pas utiliser OC2B. A la rigueur, ce serait SCK...

On peut utiliser un timer pour une interruption sans utiliser les sorties. C'est ce que je fais pour mes pas à pas. les sorties que j’utilise peuvent être n'importe lesquelles.

A priori, on peut choisir librement les broches de ce module:

//             (ce,cs,mosi,miso,sck,irq)
iBoardRF24 radio(3,8,5,6,7,2);

Cela fonctionne toujours en inversant deux chiffres et les broches correspondantes?

Il est peut être possible que le timer 2 ne soit pas utilisé, ce n'est pas le nom des broches qui me le dit. Pour savoir si il est utilisé ou pas, tu peux avec un programme qui fonctionne mettre tous les registres du timer en question à 0 et voir si cela fonctionne toujours.


En tout cas passer sur une Mega ne donnera rien, il y a en plus que des compteurs 16 bits. Une solution ne serait-elle pas d'utiliser le timer 0, si tu n'utilise que delay? A la place de delay(), on peut utiliser sur Uno _delay_ms() qui se comporte presque pareil mais qui au lieu d'utiliser un timer fait des boucles. A condition bien sûr de ne pas utiliser millis() et micros(). Le timer 0 devrait être utilisable si on n'utilise pas TIMER0_OVF

Mais la fonction WIRING/ARDUINO delay() est remplaçable par une fonction qui existe depuis bien plus de temps que l'IDE et fournie par le constructeur du microcontroleur.

Il s'agit de la fonction _delay() qui est livrée avec l'avr-libC qui est obligatoirement livrée avec l'IDE puisque indispensable à l'IDE.
Cette fonction _delay() n'utilise pas de timer. Elle est basée sur la connaissance qu'a Atmel de ses produits.
Attention s'il existe aussi la fonction _delaymicrosecond il n'existe pas d'équivent pour millis().

Voir le site de l'avr-libC

Reste à vérifier si la valeur max du delai est compatible avec l'application.

Merci à tous les deux !
Je vois que j'ai encore beaucoup à apprendre sur les timers....
je vais faire plein d'essais et vous ferai un retour :smiley_cat:

Je viens de déplacer les pins du module RF24, ça fonctionne à la perfection !
Bonne soirée à tous

Il s’agit de la fonction _delay() …

c’est _delay_ms()
voir avr-libc

… il existe aussi la fonction _delaymicrosecond il n’existe pas d’équivalent pour millis().

c’est _delay_us().

Je viens de déplacer les pins du module RF24, ça fonctionne à la perfection !

Bonne suite…