Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

INT0 někdy nezareaguje
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Poradna
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
TommyNET



Založen: Oct 10, 2012
Příspěvky: 13

PříspěvekZaslal: st říjen 10 2012, 15:25    Předmět: INT0 někdy nezareaguje Citovat

Zdravím,
mám problél s ATMEGA88 která běží na 20MHz s napětím 5V. Stavím řízení předstihu zapalování na motorku a na pinu INT0 zachytávám imlulzy od kliky. Vyskytl se mi problém v tom že občas INT0 nezareaguje, nespustí interrupt a to tak jednou za cca 20 pulzů.

Hodil jsem jí tedy na bastlící destičku a zapojil tak že na INT0 mám tlačítko a pullup rezistor 4k7. + mám připojenou na PC3 diodu aby bylo jasně vidět jak se to chová. Interrupt je nastaven tak aby reagoval jak na náběžnou tak sestupnou hranu.

kód:

ISR (INT0_vect)
{
   PORTC=!PORTC;
}
int MAIN (void)
{
   while(1)
   {
      ;
   }
}


Stimhle kódem by to mělo teoreticky při stisku tlačítka rozsvítit a při puštění zhasnout. Problém je v tom, že mačkám a funguje, jenomže jednou za pár stisknutí to na jednu hranu nezareaguje, interupt se nespustí a celé se to otočí. Při zmáčknutí dioda zhasne, při puštění se rozsvítí. A zase furt do kola... Prostě jednou za čas to na nějakou hranu nezareaguje. Setkal už se s tím někdo?

Díky za jakoukoli radu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: st říjen 10 2012, 15:30    Předmět: Citovat

Zákmity kratší než délka běhu přerušení.
_________________
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
TommyNET



Založen: Oct 10, 2012
Příspěvky: 13

PříspěvekZaslal: st říjen 10 2012, 15:56    Předmět: Citovat

včéra jsem to měl na generátoru, pouštěl jsem do toho obedníkovej signál a vstup i výstup snímal na osciloskopu. Ten samý problém.

Ty zákmity by nevyřešilo třeba smazat flagy těsně před opuštěním přerušení?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crifodo



Založen: Oct 11, 2005
Příspěvky: 15005

PříspěvekZaslal: st říjen 10 2012, 16:00    Předmět: Citovat

a zakážeš přerušení hned po jeho vyvolání a povolíš po návratu z obslužného podprogramu?
Informace o poloze kliky snímáš nejspíš opticky, takže problém zákmitů se tím eliminuje dřív než by vznikl?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
TommyNET



Založen: Oct 10, 2012
Příspěvky: 13

PříspěvekZaslal: st říjen 10 2012, 16:14    Předmět: Citovat

to: Crifodo
takle nejak si to myslel?
kód:

ISR (INT0_vect)
{
   EIMSK=0x00;        //maskovani externiho preruseni
   PORTC=!PORTC;   //LED ON/OFF
}
int MAIN (void)
{
   while(1)
   {
      if(EIMSK==0x00)
      {
         EIFR=0x01;      //smaze flag preruseni
         EIMSK=0x01;   //odmaskovani preruseni
      }
   }
}

furt to samé...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: st říjen 10 2012, 17:30    Předmět: Citovat

Dej do toho testu dvě či tři podmínky na stálost stavu na vstupu vzdálený od sebe "vhodnou dobu" - to musíš posoudit sám. Pokud kontrola neprojde, nereaguj a vrať se z přerušení.
_________________
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: st říjen 10 2012, 17:32    Předmět: Citovat

RE: Setkal už se s tím někdo?

Přesně tak, zákmity na tlačítku. Google images: contact bouncing
Při 20MHz je na jednu instrukci 0.05us, takže CPU je strašně rychlé a zachytí i jehlové impulsy.
Řešení
1/ po INT0 přerušení od INT0 zakaž např. na 1ms a pak zase povol. Tím potlačíš "falešné" spínání.
2/ na vstup přidej RC filtr, který špičky "odfiltruje"

edit1: neodzkoušeno
kód:

ISR (INT0_vect)
{
   EIMSK=0x00;        //maskovani externiho preruseni
   PORTC=!PORTC;   //LED ON/OFF
 
  // start timer, prescaler 1024, clear TOV flag
  TCNT0 = 0;
  TCCR0B = _BV(CS02)|_BV(CS00);
  TIFR0 = _BV(TOV0);
}
int MAIN (void)
{
   while(1)
   {
      if(bit_is_set(TIFR0,TOV0))
      {
         EIFR=0x01;      //smaze flag preruseni
         EIMSK=0x01;   //odmaskovani preruseni

        TCCR0B = 0x00;  // stop timer
        TIFR0 = _BV(TOV0); // clear flag
      }
   }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
TommyNET



Založen: Oct 10, 2012
Příspěvky: 13

PříspěvekZaslal: st říjen 10 2012, 19:57    Předmět: Citovat

Děkuju moc všem za pomoct.
Udělal jsem to nakonec tak že když přijde přerušení tak ho maskou zakážu a povolím až dál v programu. Příští týden to zajdu přeměřit do laboratoře.

Jen se chci informovat jak to je když maskou zakážu a pak povolím přerušení. Smaže se flag nebo ne? Jde o to aby mi nezustal vyset flag a až přerušení povolím tak aby se hned nevyvolalo přerušení. Já totiž pořádně nevím jak ho smazat a to jak sem to dělal asi moc nefunguje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: st říjen 10 2012, 20:32    Předmět: Citovat

Nesmaže, ale nemůžu to říct univerzálně. Najdi si registr s příznaky přerušení. Smaže se jen po vyvolání přerušení.
_________________
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
TommyNET



Založen: Oct 10, 2012
Příspěvky: 13

PříspěvekZaslal: st říjen 10 2012, 21:38    Předmět: Citovat

"Alternatively, the flag can be cleared by writing a logical one to it."

Takže podle tohodle co jsem našel v datasheetu tak flag se smaže pokud na příslušný bit uložím jedničku.
EIFR=0x01
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17858
Bydliště: Nový Bydžov

PříspěvekZaslal: st říjen 10 2012, 23:53    Předmět: Citovat

Nematla se Ti tam do toho naky dalsi preruseni od neceho jinyho a nebo nemas tam nejaky zretezeni preruseni? At Megu skoro neznam, ale u regulaci s 8051 jsem si s tim uzil svy, hlave kdyz se pouzivalo preruseni od vice zarizeni (casovac, seriova lajna, prevodnik...)
Jirka
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: čt říjen 11 2012, 12:09    Předmět: Citovat

TommyNET napsal(a):
Takže podle tohodle co jsem našel v datasheetu tak flag se smaže pokud na příslušný bit uložím jedničku.
EIFR=0x01


Jasně, že to jde smazat "ručně", stejně jako nastavit. Taky to někdy preventivně používám, aby se mě přerušení nezavolalo znovu hned po návratu. Jen si nejsem jistý tou jedničkou, ale je to u megy klidně možný.

_________________
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
TommyNET



Založen: Oct 10, 2012
Příspěvky: 13

PříspěvekZaslal: čt říjen 11 2012, 14:12    Předmět: Citovat

Celeron napsal(a):
Nematla se Ti tam do toho naky dalsi preruseni od neceho jinyho a nebo nemas tam nejaky zretezeni preruseni? At Megu skoro neznam, ale u regulaci s 8051 jsem si s tim uzil svy, hlave kdyz se pouzivalo preruseni od vice zarizeni (casovac, seriova lajna, prevodnik...)
Jirka


Samozřejsmě že v celém programu mám ještě jedno přerušení a to od čítače když přeteče, ale mám nastaveno nepřerušitelné přerušení takže si musí počkat až to běžící se dokončí a pak může začít teprve to další v pořadí. I tak jsou obě přerušení směšně krátká vzhedem k tomu jak často se spouštějí. Takže nehrozí nějaký kolaps.

Problém bude asi opravdu nějaký ten zákmit na INT0. Po odskoku do přerušení ho teda zakážu po chvilce smažu flag a povolím. Teď už to musím jen otestovat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: pá říjen 12 2012, 12:12    Předmět: Citovat

Kdybych to řešil já, tak v obslužné rutině udělám:
1) Smažu příznak přerušení, takže jakákoliv změna na vstupu od tohoto momentu mi po ukončení tohoto přerušení vyvolá hned nové a dozvím se o ní.
2) Načtu hodnotu na sledovaném vstupu. To musím udělat až po smazání příznaku v bodě 1. Kdybych to udělal obráceně, tak mi některé změny mohou utéct.
3) Zpracuji načtenou hodnotu. Typicky ji porovnám s poslední schovanou od minule, a pokud se liší (tj. je změna), něco udělám.
4) Povolím přerušení a ukončím obslužnou rutinu. Typicky jednou instrukcí, aby se mi přerušovací rutiny nevnořovaly do sebe. Bývá na to instrukce "iret", "retfie", "rti", atd. Nevím, co máš ty.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Atlan



Založen: May 10, 2004
Příspěvky: 4507
Bydliště: Košice

PříspěvekZaslal: pá říjen 12 2012, 13:44    Předmět: Citovat

No rad by som videl aj schemu lebo stavba zapalovania nieje len o softe ale aj o schmeme a prevedeni dps.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Poradna Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.17 sekund