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í 

AVR GCC: čtení stavu PINu portu v subr. ext. přerušení INT4
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Enkoder



Založen: Mar 29, 2016
Příspěvky: 12

PříspěvekZaslal: út březen 29 2016, 19:39    Předmět: AVR GCC: čtení stavu PINu portu v subr. ext. přerušení INT4 Citovat

ahoj,
mohu chtít v podprogramu ext. přerušení INTn číst stav pinu nějaké brány?
nedaří se mi takový to vstup přečíst.
tohle mi nechodí, ikdyž logický analyzátor ukazuje na PE3 log1, čte se do proměnné stavB pořád jen nula:

#define CHECK_BIT(BYTE,BIT)(BYTE&=(1<<BIT))
unsigned int NastavovanaHodnota=0; // globální proměnné
unsigned char stavB=0, pomocna=0;

ISR(INT4_vect)
{
cli();
stavB= ((PORTE & 0x08)>>3);
//stavB= CHECK_BIT(PORTE,3); // <<< nebo takto taky nechodí
sei();
switch(stavB)
{
case 0: NastavovanaHodnota--; break;
case 1: NastavovanaHodnota++; break;
default: pomocna++; break;
}
}

čtený pin PE3 mám při startu nastavený jako vstup DDRE=0xE7;
Děkuju předem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3330

PříspěvekZaslal: út březen 29 2016, 19:56    Předmět: Citovat

Jestli se tak snažíš číst mechanický enkodér, tak ti tam můžou dělat neplechu zákmity. V obsluze přerušení povoluješ přerušení. Nevím, jak si s možnou reentrancí poradí samotné Cčko, ale ty tam používáš globální proměnné a to není dobré, to přerušení se může vyvolat několikrát po sobě a několikrát se do sebe vnořit.
Hlavní chyba bude ale v tom, že čteš PORTE a ne PINE.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



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

PříspěvekZaslal: út březen 29 2016, 20:21    Předmět: Citovat

kód:

// enkoder demo:

#define CHECK_BIT(BYTE,BIT) ((BYTE)&(1<<(BIT)))

volatile unsigned int NastavovanaHodnota = 0; // globální proměnné

ISR(<TBD>)  // tohle je přerušení spouštěné hranou na pinu<>PE3
{
  unsigned char stavE3;

  stavE3 = CHECK_BIT(PORTE, 3); // PE3?

  if (stavE3)
  {
    NastavovanaHodnota--;
  }
  else
  {
    NastavovanaHodnota++;
  }
}

CHECK_BIT(BYTE,BIT) vrací 0, pokud je vstup v 0, jinak vrací jakoukoliv nenulovou hodnotu
Myslím že v gcc v avr-libc je už toto makro hotové, stačí jej použít:
kód:
sfr_defs.h:#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))

Edit1: To je kouzlo jazyka C, x=0 -> false, x<>0 -> true
Edit2: Jo, má tam být PINE. To je pravda...


Naposledy upravil frpr666 dne út březen 29 2016, 20:30, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3330

PříspěvekZaslal: út březen 29 2016, 20:24    Předmět: Citovat

Máš tam tu samou školáckou chybu jako Encoder, čteš PORTE, ale máš číst PINE.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út březen 29 2016, 20:31    Předmět: Citovat

Rozhodně globální proměnné musí být "volatile". Pak je překladač umístí vždy do datové paměti a ne do registrů. Tohle je (v závislosti na další části programu a kvůli optimalizaci) často zdrojem chyb.

Tj. definici napiš jako:

kód:

volatile unsigned char ...


a ještě mně prosim prozraďte kterej Atmel má PORTE Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Enkoder



Založen: Mar 29, 2016
Příspěvky: 12

PříspěvekZaslal: út březen 29 2016, 20:33    Předmět: Citovat

ahoj, díky za reakce, jste rychlejší, toto je reakce na první odpověď:

díky už se to konečně pohlo, směr je je rozpoznán, čítá to ale většinou po dvou, až to poladím, dám vědět.

globální proměnné používám proto, abych je mohl zobrazit na displeji mimo podprogram přerušení.

v podprogramu přerušení po přečtení vstupu nechám čekat 10ms

na konci podprogramu přerušení shazuji bit příznaku pro čekající přerušení (je to tak?) CLEAR_BIT(EIFR,4);
protože další přerušení bývá obvykle za delší dobu než 200ms

to "několikrát se do sebe vnořit", to je pro mně novinka, je to opravdu tak?

díky moc


Naposledy upravil Enkoder dne út březen 29 2016, 20:37, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3330

PříspěvekZaslal: út březen 29 2016, 20:35    Předmět: Citovat

FHonza napsal(a):
a ještě mně prosim prozraďte kterej Atmel má PORTE Smile

Nevím, kterej je Atmel, ale AVR třeba ATmega64, 128, 640, 1280...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3330

PříspěvekZaslal: út březen 29 2016, 20:44    Předmět: Citovat

Enkoder napsal(a):
na konci podprogramu přerušení shazuji bit příznaku pro čekající přerušení (je to tak?) CLEAR_BIT(EIFR,4);

Když před tím povolíš přerušení, tak je to k ničemu, pokud se EIFR,4 nastaví, přerušení se okamžitě vyvolá znovu (a EIFR se tím následně shodí) a tím se vnoří samo do sebe (přeruší se vykonávaná obsluha INT4 a zavolá se znovu ta samá obsluha INT4).


Naposledy upravil lesana87 dne út březen 29 2016, 20:45, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út březen 29 2016, 20:45    Předmět: Citovat

jasně no. nějak sem na ně zapomněl ... omlouvám se
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út březen 29 2016, 20:53    Předmět: Citovat

Když chceš v přerušení zakázat další přerušení, tak po vstupu do obsluhy přerušení vynuluj příslušný bit v EIMSK. Na konci před opětovným povolením v EIMSK vymaž příslušný bit v EIFR zápisem jedničky. Opravdu se nuluje zápisem jedničky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



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

PříspěvekZaslal: út březen 29 2016, 20:56    Předmět: Citovat

Nastav si na začátku, aby externí přerušení bylo spouštěné hranou.
kód:
The falling edge of INTn generates asynchronously an interrupt request.
The rising edge of INTn generates asynchronously an interrupt request.

Potom nemusíš nic "čistit", všechno se udělá "samo". Nakonec ty globální proměnné nejsou tak špatné. Asi jediný způsob jak předat něco z / do ISR().

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Interruptflags_l.C3.B6schen


Naposledy upravil frpr666 dne út březen 29 2016, 21:05, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3330

PříspěvekZaslal: út březen 29 2016, 20:58    Předmět: Citovat

Zákmity na INT vstupu mu to "samo" neošetří, když má povolené přerušení.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út březen 29 2016, 20:59    Předmět: Citovat

frpr666 napsal(a):
Nakonec ty globální proměnné nejsou tak špatné.


Nejsou, ale musí být volatile když jsou použity v přerušení.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



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

PříspěvekZaslal: út březen 29 2016, 21:03    Předmět: Citovat

@lesana87
s tím vnořováním samo do sebe nesouhlasím. Myslím, že tam bylo něco jako že se z ISR vrátí řízení zpět, provede se alespoň jedna instrukce a pak se zase (případně) zavolá ISR.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Enkoder



Založen: Mar 29, 2016
Příspěvky: 12

PříspěvekZaslal: út březen 29 2016, 21:13    Předmět: Citovat

Very Happy to je fajn parta tady, jsem mezi inteligenty
PORTE má arduino s ATmega2560
k enkoderu jsem dal odpory 10k a kondíky 33nF.
budu sledovat diskuzi, opravím to až zítra

void Inicializace_INT4(void)
{
EICRB |= (1 << ISC41) | (1 << ISC40); // reakce přerušení INT4 na vzestupnou hranu
SET_BIT(EIMSK,4); // povol přerušení od INT4
}

díky moc
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 -> Programování PIC, ATMEL, EEPROM a dalších obvodů Č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.16 sekund