====== GPIOTE et PPI pour le comptage et le suivi ====== Sur le schéma de kit monté pendant la Fête de la Science, le circuit de la LED qui clignote à chaque impulsion a été identifiée comme étant la cause d'erreurs de comptage. Pour réintroduire une LED (ou //a foritiori// un buzzer), il faudrait insérer un ampli-op en suiveur pour éviter de déformer l'impulsion qui arrive sur la GPIO utilisée pour compter les coups. Cependant, des mécanismes internes du RFduino peuvent-être mise en oeuvre. Ils auront en outre l'avantage d'être contrôlables logiciellement, ce qui permettra de les désactiver, sans mobiliser de GPIO supplémentaire. ===== introduction au PPI ===== Le RFduino est basé sur le Nordic Semiconductor nRF51822. La documentation du SDK Nordic Semiconductors est accessible uniquement aux acheteurs du SDK. Toutefois, elle reste succinte. D'autres éléments d'information sont accessibles à partir du forum RFduino, et tout simplement dans les codes sources RFduino/cores/arduino. Le PPI est le //Peripheral-Peripheral-Interface//. Il permet de connecter les GPIOTE, GPIO-Tasks-Events qui sont eux-même connectés aux GPIO. Comptage : void setup() { Serial.begin(9600); pinMode(6, INPUT); // Config GPIO Event (gpiote_channel, pin, polaritée) nrf_gpiote_event_config(0, 6, NRF_GPIOTE_POLARITY_LOTOHI); // Config counter NRF_TIMER1->MODE = TIMER_MODE_MODE_Counter; NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_16Bit; NRF_TIMER1->TASKS_START = 1; // Config PPI int ppi = find_free_PPI_channel(255); NRF_PPI->CH[ppi].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[0]; // Input NRF_PPI->CH[ppi].TEP = (uint32_t)&NRF_TIMER1->TASKS_COUNT; // Output NRF_PPI->CHEN |= (1 << ppi); // Active le canal PPI } void loop() { delay(2000); NRF_TIMER1->TASKS_CAPTURE[0] = 1; // capture le comptage dans CC[0] Serial.println((uint8_t)NRF_TIMER1->CC[0], DEC); NRF_TIMER1->TASKS_CLEAR = 1; // count = 0; } Suiveur : void setup() { pinMode(6, INPUT); pinMode(5, OUTPUT); // GPIO Event (gpiote_channel, pin, polaritée) nrf_gpiote_event_config(0, 6, NRF_GPIOTE_POLARITY_TOGGLE); // GPIO Task (gpiote_channel, pin, polaritée, etat_initial) nrf_gpiote_task_config(1, 5, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_LOW); // Valeures possibles pour la polaritée : // NRF_GPIOTE_POLARITY_LOTOHI // NRF_GPIOTE_POLARITY_HITOLO // NRF_GPIOTE_POLARITY_TOGGLE // Config PPI int ppi = find_free_PPI_channel(255); NRF_PPI->CH[ppi].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[0]; // Input NRF_PPI->CH[ppi].TEP = (uint32_t)&NRF_GPIOTE->TASKS_OUT[1]; // Output NRF_PPI->CHEN |= (1 << ppi); // Active le canal PPI } void loop() { delay(1000); } Le nouveau code est placé sur Git. * [[wiki:projets:smartphone-geiger:lipo_cms|Article suivant : chargeur de batterie LiPo au format CMS]] * [[wiki:projets:smartphone-geiger:accueil|Retour à l'accueil]] * [[wiki:projets:smartphone-geiger:chronologie|Retour à la chronologie du projet]] * [[wiki:projets:smartphone-geiger:cms|Article précédent : circuit CMS]]