Stránka 2 z 4

Napsal: 28 pro 2010, 16:57
od mtajovsky
majsi << dík za opravu.

Napsal: 29 pro 2010, 08:45
od AB1

Napsal: 29 pro 2010, 09:22
od ferooo
dakujem za materialy, idem na to pozriet.
Pouzivam AVR-GCC ;)

Napsal: 29 pro 2010, 20:23
od jano80
alebo stačí pozrieť datasheet daného obvodu je tam celkom dobrý príklad použitia EEPROM (zápis , čítanie)

Kód: Vybrat vše

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

Kód: Vybrat vše

unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}

Co třeba ...

Napsal: 04 úno 2011, 20:13
od 67kapa
... takto,pokud chceš čekat na stisk nějakého tlačítka a jinak zařízení nemá dělat nic jiného,nebo jenom to,co vložíš do nekonečné smyčky,viz soubor.?
Nebo můžeš testovat rovnou celou bránu,stav uložíš do příznakového bytu,ten můžeš testovat a pokud bude nulový/nebo naopak nenulový(to si zvolíš),může se zavolat rutina obsluhy kláves.Nebo můžeš cyklicky v obsluze přerušení testovat stav vstupů.Obecně klávesnice nevyžaduje extrémní rychlost čtení,navíc mnohdy musíš ošetřit softwarově zákmity tlačítek,takže bych v přerušení obsluhoval raději displej,no je to na tobě:-)

Napsal: 04 úno 2011, 20:53
od mtajovsky
S těmi tlačítky to není složité, ale ani ne úplně triviální. Po změně úrovně napětí z tlačítka byste měl otestovat, že tato nová úroveň je stabilní po nějakou dobu - například 5 ms. Každé mechanické tlačítko má při přepnutí zákmity, které by se jinak mohly programem v důsledku rychlosti procesoru vyhodnotit chybně jako série sepnutí. Takže po detekci změny počkat třeba 3 ms, otestovat - přečíst podruhé, že úroveň je stejná, počkat další 3 ms a do třetice všeho dobrého i zlého to znovu načíst, jestli úrověň drží. Pak teprve považovat tlačítko za přepnuté.

Pozn. k C# a čekání na tlačítko a podobně: program ve Windowsích se nikde nezastavuje, nota bene nečeká v nějaké smyčce na stisk tlačítka. On po skončení toho, co měl udělat nakonec volá funkci GetMessage() v okenní funkci hlavního okna, a pokud není žádná zpráva ve frontě, tak se řízení odevzdá do systému. Variantně volá čekání na signalizaci objektu jádra WaitForSingle(Multiple)Object(s) (), kde se také předá řízení systému, pokud tento objekt už nebyl signalizován nebo může volat čekání na socket. Ale nikdy se nehaltuje nebo necyklí na místě. Pokud se to udělá v kódu násilně, tak při nejbližším přerušení od časovače stejně systém řízení sebere.

Nakonec, pokud je potřeba snímat stav tlačítek a přitom také současně potřeba obsluhovat ještě jiné události z okolí - kontakt čipové karty, vypršení časovače (softwarového), příjem pro RS232 a tak dále, je nejlépe výše nastíněné paradigma napodobit. Udělat si hlavní smyčku, která je v roli "systému" a detekuje všechny možné události. Jestliže se daná událost vyskytne, předá se řízení příslušnému obslužnému podprogramu.

Napsal: 04 úno 2011, 21:00
od Andrea
Jo, nejlepší bude dát na ten 8bitovej jednočip windousy. :roll:
Stačí tu klávesnici skenovat jednou za x desítek ms v přerušení od časovače a zákmity jsou odstraněné automaticky, pokud se přidá testování 2x stejného stavu po sobě, tak se odstraní i případné rušení.

No...

Napsal: 04 úno 2011, 21:10
od 67kapa
...ono to až tak jednoduché není.Pokud budu skenovat stavy a dva stavy budou po sobě stejný,navíc po 5ms a kabel od klávesnice bude delší(třeba kódový zámek,klávesnice bude oddělená od řídící jednotky),můžou nastat dva stejný stavy vlivem kapacity vodiče a stejně to bude chybný stav a procesor to nepozná.Osobně to testuji tak,že uložím první sken portu do registru a pak po určitou dobu a počtu skenování porovnávám s prvním vstupem.Tak ošetřím i případnou kapacitu kabelu.Osvědčila se mně doba 20ms.Jinou věcí je,zda má zařízení rozpoznat puštění klávesy,či zda má po určité době spustit repetici znaku.

Systém při přerušení...

Napsal: 04 úno 2011, 21:25
od 67kapa
....cyklení neopustí,protože si pamatuje návratovou adresu(následující instrukce) a tam po návratu z přerušení skočí.Pokud nepotřebuji obsluhovat od procesoru nic jiného,bohatě čekání ve smyčce stačí.U kódového zámku naprosto dostačující.Samozřejmě při složitém programu,kdy se obsluhují i jiné periférie,jako I2C,displej....je test kláves v nekonečné smyčce kravina.Ve složitějším systému budou navíc použity jak příznaky,tak i priority přerušení jednotlivých požadavků...

Napsal: 04 úno 2011, 21:46
od Andrea
Akorát že při obsluze přes přerušení může procesor 99,8% času spát.

No pokud bude spát...

Napsal: 04 úno 2011, 22:25
od 67kapa
tak není nic jednoduššího,než ho změnou stavu na portu vzbudit,stačí nastavit příslušné registry(vzbuzení může rovněž iniciovat i AD převodník,watchdog,přetečení timeru...např.)Takhle jsem dělal konstrukci na bateriové napájení,po uplynutí času se vypnulo podsvícení,následovalo vypnutí displeje a skok do SLEEP módu.Stiskem kterékoliv klávesy se procesor vzbudil(klávesnice 4 x 4 ).Při uspání je rovněž uložena návratová adresa programového čítače ve stacku.Dokonce ho můžeš vzbudit a zakázat obsluhu přerušení vyvolanou touto akcí.Možností je několik:-)

Napsal: 04 úno 2011, 22:41
od Andrea
Nevím co to bylo za procesor, ale AVR může vzbudit jen reset nebo přerušení, takže pokud vynecháme ten reset, tak obsluha klávesnice s uspáváním procesoru není bez použití přerušení u AVR možná. ;)

PIC16F876A...

Napsal: 04 úno 2011, 22:48
od 67kapa
...je s tím radost dělat:-)Ano,zapomněl jsem na RESET,ten samozřejmě rovněž procesor vzbudí.Mimochodem,to vzbuzení od portu má téměř každý PIC:-)
Mimochodem,tady je ta "kravinka":-)
http://files.kpelektro.webnode.cz/20000 ... A1tor2.jpg

A ještě,jak se to dělá,když se chci vyhnout tomu přerušení,jednoduše zakážu globální přerušení (bit GIE).Sice to procesor vzbudí,ale neprovede se skok do rutiny přerušení(vektor 0004h)

Napsal: 04 úno 2011, 23:06
od Andrea
Takže (pominu-li ten reset) PIC 16F876 se dokáže vzbudit ze sleepu i se zakázaným přerušením?

Ano,přesně tak...

Napsal: 04 úno 2011, 23:14
od 67kapa
...dokonce i AD převodník ho vzbudí.Jediné,na co je si dávat pozor,je spotřeba ve SLEEP modu,AD převodník trochu žere.A musí se samozřejmě ošetřit porty tak,aby nemohly sloužit jako zdroj proudu...Např. teď mám na stole PIC16F630 a ten má to samé.Oni ty obvody PIC mají totiž ještě další bity,které povolují jednotlivá přerušení od periferií a instrukce sleep je tak trochu vyjímkou.Samozřejmě za běhu programu,pokud bude globální přerušení zakázáno,k přerušení nedojde.Takže mně stačí v programu před isntrukcí SLEEP toto globální přerušení zakázat a jako první instrukci po vzbuzení ho zase povolit:-)