po aktivovaní interuptu arduino zmrzne

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
ITIaster
Stály člen
Stály člen
Príspevky: 177
Dátum registrácie: 01 Jún 2014, 13:00
Vek: 25

po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa ITIaster » 08 Okt 2017, 20:25

zdravím hoši, učím sa používať externé prerušenia a potreboval by som aby ak je pin 2 pripojený k zemi aby mi hodilo krátky program ktorý by na displayi ukazoval prehriatie a pískal bzučiakom... a po odpojení aby bežal daľej hlavný program no jediné čo sa stane je že celé arduino zmrzne a nereaguje až do stlačenia tlačítka RESET ... potrebujem pomoc :crying: :crying: :crying: :crying:
pripájam sem môj výtvor :D

Kód: Vybrať všetko

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>




//LiquidCrystal_I2C lcd(0x38);  // Set the LCD I2C address

//LiquidCrystal_I2C lcd(0x3F, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Creat a set of new characters
const uint8_t charBitmap[][8] = {
   { 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
   { 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
   { 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
   { 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
   { 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
   { 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
   { 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
   { 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }
   
};

void setup()
{
   int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));

  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, OVERHEAT, RISING);
  pinMode (4, OUTPUT);
  lcd.begin(16,2);               // initialize the lcd 

   for ( int i = 0; i < charBitmapSize; i++ )
   {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
   }

 
}

void loop()
{
   lcd.home ();
   // Do a little animation by writing to the same location
   for ( int i = 0; i < 2; i++ )
   {
      for ( int j = 0; j < 16; j++ )
      {
         lcd.print (char(random(7)));
      }
      lcd.setCursor ( 0, 1 );
   }
   delay (200);
}


void OVERHEAT()
{
   lcd.clear();                   // go home
  lcd.print("  OVERHEATING!!  ");
  delay(100);  
  digitalWrite(4, HIGH);
  delay ( 1000 );
  digitalWrite(4, LOW);
  delay(100);
  lcd.clear();
  delay(1000);
   
}

za vaše rady a pomoc vopred Ďakujem :)
0
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa alidedko » 08 Okt 2017, 20:51

Odkial mas tu kniznicu a preco nastavujes adresu displeja 3x? :)

A vlastne, naco tam mas to pole, ktore je pre animaciu na ukazku, ak tam animaciu nepotrebujes?

Skus si ten kod vycistit od nepotrebneho a nechaj si len potrebnu cast, hned budes vidiet, co tam je za zrada.
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa popopepe » 08 Okt 2017, 22:53

Dát do přerušení delay(1000) a další delay... vážně není moc chytrý nápad. To je principiálně blbě úplně celé. Přerušení musí být co nejkratší, na začátku obsluhy přerušení ho zakaž, nastav si nějaký příznak, že přerušení proběhlo, povol přerušení, a mazej z něj ven. Podle toho příznaku si pak udělej, co potřebuješ v normální funkci (to tvoje lcd atd..).

Edit:
Inside the attached function, delay() won't work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. See the section on ISRs below for more information.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa peterple » 09 Okt 2017, 00:18

Popopepe má pravdu. Zavolať delay z obsluhy prerušenia je vražedná kombinácia. Mali by to v dokumentácii označiť veľkým červeným písmom. Je to takzvaný dead lock. delay čaká až uplynú nejaké milisekundy. Lenže tie sa počítajú pomocou prerušení časovača. A ten si teraz nevrzne lebo stojíme v inom prerušení. To zakázalo všetky ostatné prerušenia. Odtiaľ nieť návratu.

Omieľa sa to tu zas a znova. Takto sa obsluha prerušenia nerobí. Nájdi si príklady ako na to s nejakou príznakovou premennou.

A to pole s konštantami v SRAM-ke to je ďalší poteciálny prúser čo sa tu riešil nedávno. Tebe zatiaľ nehrozí ale o taký rok dva áno.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
ITIaster
Stály člen
Stály člen
Príspevky: 177
Dátum registrácie: 01 Jún 2014, 13:00
Vek: 25

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa ITIaster » 09 Okt 2017, 18:12

ďakujem za vaše rady :) skúsim si to vyriešiť v hlavnom programe aj keď reakcia nebude okamžitá...
Adresa môjho displaya s I2C backplatom je 0x3F (I2C scanner mi ju vyhodil), knižnica je z netu.
Tá animácia je náhrada za 400 riadkový program :D (program je môj a nechcem ho zdieľať...)
ďakujem za vysvetlenie s tým delay, teraz už budem vedieť ako to funguje :D (mal som nejaké problémy inde s delay v interrupte v inom programe :D )
a vedel by si mi vysvetliť čo si myslel s tou SRRAM ? vôbec ale vôbec som nerozumel :D a dosť by ma to zaujímalo :D
Diki ešte raz :)
0
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa maskrtnik01 » 09 Okt 2017, 18:48

Bolo to tu nedávno. Keď naalokujete veľa vecí do SRAM(obdoba RAM v počítači), môže sa stať, že sa už do pamäte nevojde tzv. stack, a v praxi vám Arduino tak zblbne, že ho budete musieť vyresetovať. Riešením je dávať do SRAM len to, čo treba. A dáta, ktoré sa nikdy po kompilácii nezmenia, dať do FLASH pamäte cez PROGMEM.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa peterple » 09 Okt 2017, 20:00

A v tom kóde podľa teba by to reagovalo okamžite? Raz by si tam vbehol a potom by si tam trčal prerušenie- neprerušenie.
Ale ak moc chceš existuje funkcia _delay_ms. Až na to že nedá tak dlhé oneskorenia. Lebo je to iba hlúpe odrátavanie jednotky od nejakého veľkého čísla. Takže to ten procesor zmákne pomerne rýchlo. Ale keď si spravíš ďalšiu funkciu čo to zavolá 100 krát máš aj dlhé časy. Kedže nepoužíva prerušenie tak ti ten program nezamrzne ani keď to zavoláš z prerušenia. Ale po celý čas čo budeš s tej ISR funkcii, tak si žiadne iné prerušenie nešktrne.

Takéto veci treba robiť tak aby si tam nemal ani jeden delay/_delay_ms.
Všetko sa to dá pomocou stavových premenných a pomocou milis().

S tou ramkou ti to vysvetlil kolega. Tu máš odkaz na vlákno aby si bol v obraze.
https://svetelektro.com/modules.php?nam ... 3ab6598694
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
ITIaster
Stály člen
Stály člen
Príspevky: 177
Dátum registrácie: 01 Jún 2014, 13:00
Vek: 25

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa ITIaster » 12 Okt 2017, 01:09

ďakujem za to vlákno, zase som o čosi múdrejší :)
a ten interupt, keď je spustený tak kolo neho si nesmie nič škrtnúť :D to ma odpojiť cely systém, vyhuliť ventilátory naplno a hlásiť prehriatie systému :D ventilátory ovláda jedno arduino a zbytok systému druhe (ktoré onedlho nahradím nejakým iným MCU s väčším počtom vstupov/vystupov) no a teraz som sa snažil do toho hlavného programu nasimulovať prehriatie, kedže pri prehriatí jedno arduino druhému iba cez 1 kábel (na spoločnej zemi) pošle 5V do inputpinu a tým to arduino všetko odpojí a začne pískať...
0
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa alidedko » 12 Okt 2017, 07:50

Teraz som ale ja osobne mimo.

Zatuhne to aj s tym zdrojakom, ktory je tu v prvom prispevku?

Lebo vlastne riesime zdrojak, o ktorom zatial nevieme nic. Len ze to je cosi kdesi a ma to 400 riadkov.
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa maskrtnik01 » 12 Okt 2017, 09:04

Deadlock je deadlock. V ISR bude delay čakať, kým prejde sekunda. Lenže "počítadlo času" sa inkrementuje v prerušení od časovača, ktoré je teraz maskované(zakázané). Takže sa to zacyklí uprostred ISR a koniec, reset to istí.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa peterple » 12 Okt 2017, 10:11

Som na tom podobne ako alidedko. Dajme tomu že riešime ten podružný systém ktorý podľa nejakého pinu má spúštať ventilátor, písať na displej chybu a pískať. Potom ten tvoj program mi príde nejaký divný, lebo keď príde signál overheating tak:
  1. napíše chybu na displej (koľko toto trvá)
  2. počká 0,1 sek
  3. niečo zapne (pískanie? ventilátor?)
  4. počká sekundu
  5. niečo čo zapnul vypne
  6. počká sekundu
Počas celej tejto doby je mu ukradnutý signál overheating. Bez ohľadu na to či to je cez prerušenie alebo nie.

Moja predstava by bola asi takáto:
  1. ak sa signál stane aktívny tak sa okamžite púšťa ventilátor a potom sa píše chyba a píska sa
  2. ventilátor sa nechá bežať nejakú minimálnu dobu bez ohľadu na signál či sa vráti do Ok stavu
  3. ak sa signál vráti do OK stavu okamžite sa vypne pískanie a zobrazí sa hláška že už nie je overheating ale iba že beží ventilátor
  4. po uplynutí doby sa vypne ventilátor a displej zobrazí že je normálny stav.
  5. ak v hociktorom okamihu príde signál overheating znova tak sa okamžite robí zase bod 1.
Ten min. čas je tam na to aby to nezačalo oscilovať spôsobom: zapnem vetrák, padne signál, vypnem vetrák, nabehne signál .....

Na toto celé ak to nerobí nič iného nepotrebujem žiadne prerušenia. Ak ich použijem tak sa mi to len skomplikuje, lebo budem musieť robiť o niečo zložitejšiu stavovú mašinu. Ak to robí aj niečo iného (nevieme) tak tú stavovú mašinu urobím. Tipujem že sa celá vlezie do jedného byte (to je 8 jednobitových príznakov).

Mám dojem že toto celé by pri dobrom programátorskom prístupe vedel robiť aj ten nadriadený systém. Časovo sú tieto veci úplne minimálne. Akurát treba jeden pin navyše pre ovládanie pískača. Displej je na I2C takže nezaberá zrejme nič navyše. Signál overheating priamo ovláda ventilátor.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
ITIaster
Stály člen
Stály člen
Príspevky: 177
Dátum registrácie: 01 Jún 2014, 13:00
Vek: 25

Re: po aktivovaní interuptu arduino zmrzne

Príspevok od používateľa ITIaster » 12 Okt 2017, 17:14

sú dve RJ jedno ovláda ventilátory(sú tam 4 módy , permanentne zapnutý, permanentne vypnutý, PWM a AUTO) a v prípade ak by sa prepol mód na permanentne vypnutý a pasívne by to nestíhalo chladiť tak po dosiahnutí určitej teploty t.j. 80°C sa prepne do módu prehriatia a spustí všetky ventilátory na plné gule a dvihne jeden pin na HIGH, ten pin je pripojený ku druhej RJ ktorá riadi celý chod systému (zapnutie/vypnutie hlavného zdroja [obe RJ a všetky ventilátory majú svoj zdroj ktorí beží nepretržite], a ďalej zložité ovládanie rôznych IO pomocou I2C[to je ten 400riadkový program...] plus nejaké tie ledky motorčeky a podobne) no a pokiaľ sa dvihne ten pin na HIGH tak sa musí všetko povypínať pozatvárať atď a na display sa má vypísať "OVERHEATING" a ma to začať pískať... samozrejme prerušovane :D o to aby všetko schladlo sa stará RJ ventilátorov a ako náhle to schladne na 30°C tak stiahne ten pin naspäť na LOW a všetko by sa malo vypnúť resp prejsť do stand-by...

aby som vás tu nekrútil okolo niečoho, je to zosilňovač s automatizovaným chladením... keď to bude hotové tak to pridám do sekcie "môj výrobok" a ak sa to uchytí tak medzi NF články :)

zatiaľ to neprogramujem ďalej, lebo znova riešim iné časti zosilňovača ale potom to skúsim zaradiť do hlavného programu a uvidíme čo to bude robiť a ako bude reagovať, možno tie interrupty ani nebude treba...

no ďakujem za vaše rady a pomoc a čas :)
0
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok