[ATTiny85] problème avec le watchdog


bonsoir/bonmatin,

bon je retape tout après un magnifique bsod  =(
je travaille sur mon projet de fin d'année, j'utilise actuellement deux avr : un mega328p et un tiny85. la programmation du tiny85 me donne du fil à retordre. je lui demande pourtant peu de choses :p : il doit boucler indefiniment sur du ["i]led-fadign[/i]" sur son pin 4 , un interruption est définie sur le pin 2  ainsi qu'une autre sortie sur le pin 3 , cette dernière doit rester allumée pendant 4-5s secondes, elle doit s'activé suite à l'interruption, voici le dernier code utilisé :

code: [select]

#include <pinchangeinterruptsimple.h>
#include <avr/wdt.h>

int ledfade = 4;
int locker = 3;

void setup() 
{
  wdt_disable();
  pinmode(locker, output);
  attachpcinterrupt(2, blnk, change);
}

void loop() 

  for(int fadevalue = 0 ; fadevalue <= 255; fadevalue +=5)
  { 
     analogwrite(ledfade, fadevalue);             
     delay(30);                           
  }
  for(int fadevalue = 255 ; fadevalue >= 0; fadevalue -=5)
  {
     analogwrite(ledfade, fadevalue);           
     delay(30);                           
  }
}

void blnk()
{
   digitalwrite(locker, 1);
   wdt_enable(wdto_4s);
   while(1);
}


le problème est dans la fonction blnk() qui est appellé par l'interruption :
le problème est que bien sur un "delay()" (qui aurait servie pour laisser 4 secondes le pin 3 en high) n'est pas possible pendant l'interruption, alors vous allez me dire que j'aurais pu utiliser un asm volatile ("  jmp 0"); (avantage de cette instruction c'est qu'elle ne restore pas l'état initial des pins) mais le tiny85 (confirmation de la datasheet) ne supporte pas l'instruction "jmp 0" donc impossibilité de revenir au début du programme de cette manière, c'est pourquoi j'utilise un overflow du watchdog
lorsqu'une interruption se produit le pin3 est "mis en high" , le watchdog "compte 4 secondes" puis force le tiny85 à faire un software reset , le watchdog doit par contre est désactivé dès le début du setup() pour ne pas resetter au bout de 4 secondes après le reset : d' où le code : wdt_disable();

nous voici au problème principale (le tiny85 est bien programmé avec ce code) , je le mets sous tension la led "fade" normallement , lorsqu'une déclanche une interruption en reliant le pin 2 au 5v (qui est "pulled-down" avec une resistance 10k) et bien la deuxième led s'allume effectivement pendant 4 secondes mais ( le hic ) la première led ne recommence pas à "fader" par contre on peut toujours déclancher des interruption qui allume la deuxième led pendant 5 secondes .
mais tant qu'on n'a pas mis hors tension et remis en tension le tiny85 impossible de faire "fader" la première après la première interruption.

j'attends avec impatience vos remarques et vos eventuelles propositions , merci d'avance   :)

salut,

essaye en ajoutant mcusr = 0; avant wdt_disable();


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > [ATTiny85] problème avec le watchdog


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support