Externe prerusenie+Mincovník+Atmega16A-PU
Moderátori: psichac, Moderátori
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Externe prerusenie+Mincovník+Atmega16A-PU
Zdravím,mám taký menší problém, do rúk sa mi dostal takýto mincovník http://www.ebay.com/itm/Latest-EU1-PC-M ... SwjVVViES6 http://www.coinsolve.com/english/images ... EU-1,2.pdf a dostal som nápad že ho prepojím s AVR. Principiálne to funguje tak že každých 10 centov čo vhodíte do mincovníka tak uzemní svoj pulzní výstup na 80ms. Preto som sa rozhodol že ich jednoducho budem zaznamenávať cez externé prerušenie a v každom prerušení iba pripočítam k premennej istú čistku.Takže svoj PIN kde mám nastavené externé prerušenie som napojil cez PULL-UP rezistor(10K) na 4,5V(napajacie napetie Atmegy). Problém je ale v tom že Atmega občas akoby odignorovala vhodenú mincu a nespraví nič a pri tom som si istý že k uzemneniu došlo. Preto sa chcem spýtať či niekto náhodou neviete čím by to mohlo byť spôsobené. AVR mám nastavené na 1MHZ a prerušenie zaznamenáva iba dobežnú hranu. skúšal som to aj s nábežnou ale výsledok bol rovnaký. Pridávam aj svoj kód.
0
-
- Ultimate člen
- Príspevky: 3963
- Dátum registrácie: 04 Feb 2013, 22:04
- Bydlisko: U alibabky v Poprade
- Vek: 32
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Kratka otazka, naco ti je zapis na port vnutri while?
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
ouha. to som si ani nevšimol ale nemyslím si že zrovna to by mohol byť problém v mojom prípadne ale ak sa mýlim kľudne ma oprav. moje znalosti AVR nie zase až také ohromujúce.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Externe prerusenie+Mincovník+Atmega16A-PU
V prvom rade - kód sa nevkladá ako obrázok. Ako si ho mám skúsiť preložiť? Mám najprv použiť OCR?
V druhom rade - ten kód prerušenia aj niečo robí? Nevidím nikde že by si v hlavnom programe povolil global interrupt flag
V tretom rade - čím to prekladáš? na to org voľačo mi avr studio nechápavo krúti hlavou.
Edit: treti rad už som zistil mikroC pre AVR.
V druhom rade - ten kód prerušenia aj niečo robí? Nevidím nikde že by si v hlavnom programe povolil global interrupt flag
V tretom rade - čím to prekladáš? na to org voľačo mi avr studio nechápavo krúti hlavou.
Edit: treti rad už som zistil mikroC pre AVR.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
prepáč to ma nenapadlo,globalné prerušenie je povolené v SREG |= 1<<7; a prikladám aj celý kód teda.
volatile int cislo;
void funkcia_int1(void) org IVT_ADDR_INT0
{
cislo = cislo +10;
}
int main(void)
{
SREG |= 1<<7;
DDRA |= 1<<4;
PORTA |= 1<<4;
DDRD &= ~(1<<PORTD2);
GICR |= 1<<INT0;
MCUCR |= 1<<ISC01 | 1<<ISC00;
cislo = 0 ;
while(1)
{
PORTA |= 1<<4;
if(cislo > 100)
{
PORTA &= ~(1<<4);
Delay_ms(5000);
cislo = 0 ;
}
}
}
A áno používam práve MikroC
volatile int cislo;
void funkcia_int1(void) org IVT_ADDR_INT0
{
cislo = cislo +10;
}
int main(void)
{
SREG |= 1<<7;
DDRA |= 1<<4;
PORTA |= 1<<4;
DDRD &= ~(1<<PORTD2);
GICR |= 1<<INT0;
MCUCR |= 1<<ISC01 | 1<<ISC00;
cislo = 0 ;
while(1)
{
PORTA |= 1<<4;
if(cislo > 100)
{
PORTA &= ~(1<<4);
Delay_ms(5000);
cislo = 0 ;
}
}
}
A áno používam práve MikroC
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Externe prerusenie+Mincovník+Atmega16A-PU
To nastavenie cez SREG som prehliadol. Takže nevidím v tom chybu. Kompilovať to nemám čím. Taký pro kompilátor za toľko peňazí nemám. Ako vieš že to niekedy nezapočíta? Nie je tam skôr problém že to započíta viackrát? Je ten pulz z toho mincovníka bez zákmitový? Lebo v takejto konštelácii ti to zachytí zákmit ktorý trvá rádovo mikrosekundy. Ak je to neošetrený mechanický kontakt tak to počíta zákmity jedna radosť.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
mal by byť bez zakmitový zapojené to mám zatial iba na kontaktnom poli. a viem to tak že som si na ten port ktorý mám v podmienke zapojil ledku ktorá blikne na 5 sekund ked hodim viac ako 1euro, a proste ked niekedy hodím viac ako euro tak nezhasne a s toho mi vyplíva že nejký pulz musel stratiť. V najbližších dnoch si to celé chcem ešte napojiť na LCD ale takýto spôsob overenia by mal byť celkom stabilný tiež.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Externe prerusenie+Mincovník+Atmega16A-PU
tak si daj do toho prerusenia negaciu toho bitu s ledkou a po každej vhodenej mince sa musi zmeniť stav led.
Samozrejme v hlavnom programe odstráň oba príkazy čo s ňou manipulujú. Uvidíš či to chodí dobre
Kód: Vybrať všetko
PORTA ~= 1<<4;
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Vďaka skúsim a dám vedieť. dnes to už ale asi nestihnem.takže očakávam že zajtra by som tu mohol dať vedieť či to ide dobre.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Externe prerusenie+Mincovník+Atmega16A-PU
a na hw počítanie tých impulzov si vyrob čítač z nejakého klopného obvodu alebo nejakého čítača aby si vedel či tam tie impulzy naozaj na vstupe sú alebo nie a koľko. Napr z 7474 alebo 7490 a pod. Logickú sondu s počítaním impulzov asi nemáš?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Tak a už som si naozaj istý že je to tým ,že ATmega proste akoby odignoruje niektoré impulzy a chyba nie je nikde inde...................rozmýšlal som si to nemôže byť príliš silním PULL UP rezistorom alebo nízkou frekvenciu ale ani jedna s týchto možností sa mi nezdá byť zrovna pravdepodobná.........a preto som vlastne tam kde som bol a vôbec si s tým neviem rady.
0
-
- Pokročilý člen
- Príspevky: 753
- Dátum registrácie: 24 Jún 2010, 00:00
- Bydlisko: Trnava
- Vek: 68
Re: Externe prerusenie+Mincovník+Atmega16A-PU
V MicroC nerobím ale nie je náhodou chyba v definícii funkcii prerušenia?
Ako vie prekladač že je to interrupt funkcia?
Nemá to byť nejako takto?
void interrupt_ISR () org IVT_ADDR_INT0 { // Interrupt rutine
.......
}
Ako vie prekladač že je to interrupt funkcia?
Nemá to byť nejako takto?
void interrupt_ISR () org IVT_ADDR_INT0 { // Interrupt rutine
.......
}
0
S.K.
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Nevieš vložiť takto pekne ten kód?
V prvom rade logika programu. Milión krát za sekundu nastavíš bit 4 na porte A na 1, ok. Prerušenie inkrementuje po 10 a test je na viac ako sto, takže teoreticky až po desiatom prerušení vynuluješ bit a 5 sekúnd čakáš, ak za ten čas nastane prerušenie proste sa to tam napočíta a nijako netestuje, aj tak sa to vynuluje. Ak bude 100, 110, a viac, furt je to jedno. Ako rýchlo hádžeš mince? Ak niekto hodí rýchlejšie 14 mincí má mu to zobrať ako 10? Vtedy sa ti to stráca?
Kód: Vybrať všetko
volatile int cislo;
void funkcia_int1(void) org IVT_ADDR_INT0
{
cislo = cislo +10;
}
int main(void)
{
SREG |= 1<<7;
DDRA |= 1<<4;
PORTA |= 1<<4;
DDRD &= ~(1<<PORTD2);
GICR |= 1<<INT0;
MCUCR |= 1<<ISC01 | 1<<ISC00;
cislo = 0 ;
while(1)
{
PORTA |= 1<<4;
if(cislo > 100)
{
PORTA &= ~(1<<4);
Delay_ms(5000);
cislo = 0 ;
}
}
}
0
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Nie stráca sa mi to absolutne v nepravidelných intervaloch napríklad ked mám v premennej iba 50 a zrazu hodím mincu a nič sa nestane k premenej sa neprípočíta nič. Práve preto som z toho tak trochu zmetený lebo fyzicky k tomu prerušeniu určite príde.
0
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Ako vieš, či sa nepripočíta? Z toho programu to nijako nezistíš.
Ukáž nejakú schému. Už tu boli spomenuté zákmity na porte. Ako to riešiš? Tiež ti peterple navrhuje aby si dal rozsvietenie LED do prerušenia. Skús to. Delay je čas, kedy funguje z tvojho programu len prerušenie. Na to nezabúdaj.
@stefanSK
Tiež nepoznám MicroC ale z helpu na webe som zistil, že táto kúzelna formulka 'org IVT_ADDR_INT0' to rieši. Je jedno ako sa volá funkcia.
Ukáž nejakú schému. Už tu boli spomenuté zákmity na porte. Ako to riešiš? Tiež ti peterple navrhuje aby si dal rozsvietenie LED do prerušenia. Skús to. Delay je čas, kedy funguje z tvojho programu len prerušenie. Na to nezabúdaj.
@stefanSK
Tiež nepoznám MicroC ale z helpu na webe som zistil, že táto kúzelna formulka 'org IVT_ADDR_INT0' to rieši. Je jedno ako sa volá funkcia.
0
-
- Pokročilý člen
- Príspevky: 753
- Dátum registrácie: 24 Jún 2010, 00:00
- Bydlisko: Trnava
- Vek: 68
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Podľa mňa je tam dôležité toto:
interrupt_ISR ()
interrupt_ISR je kľúčové slovo prekladača - aby prekladač tam vložil kód na odloženie registrov a pred návratom obnovenie registrov, pre povolenie prerušenia splávny kód z prerušovacej rutiny - niečo ako RETI.
Čo popisuje autor tejto témy ako sa chová program, predpokladám, že program blúdi po celej pamäti, náhodne niektoré premenné zmenia svoju hodnotu, ....
interrupt_ISR ()
interrupt_ISR je kľúčové slovo prekladača - aby prekladač tam vložil kód na odloženie registrov a pred návratom obnovenie registrov, pre povolenie prerušenia splávny kód z prerušovacej rutiny - niečo ako RETI.
Čo popisuje autor tejto témy ako sa chová program, predpokladám, že program blúdi po celej pamäti, náhodne niektoré premenné zmenia svoju hodnotu, ....
0
S.K.
-
- Okoloidúci
- Príspevky: 34
- Dátum registrácie: 29 Dec 2015, 12:14
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Myslím že stefanSK má pravdu lebo teraz ked som pozmenil kód zaznamenáva všetky impulzy ale aj 2x čiže tu predpokladám zase narážam na problém s tými zákmitmy na porte,toto som zatiaľ vôbec neriešil lebo som myslel že keď ten výstup z mincovníka iba uzemnuje ked sa vhodí minca stači port pripojiť cez pullup rezistor na 5v a ten výstup z mincovníka pripojiť k portu. Neviete mi náhodou poradiť ako by sa dali tie zákmity odstrániť?
0
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Mozes to urobit na HW urovni:
https://www.google.sk/search?q=hardware ... Bo4QsAQIIQ
alebo softwarovo (napr)
http://www.embedded.com/electronics-blo ... debouncers
https://www.google.sk/search?q=hardware ... Bo4QsAQIIQ
alebo softwarovo (napr)
http://www.embedded.com/electronics-blo ... debouncers
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Externe prerusenie+Mincovník+Atmega16A-PU
Myslím znamená .... vedieť. Často tu opakovaná veta. Hoď sem hexa súbor pre jednu variantu a pre druhú a ja ti hneď poviem či to je naozaj pravda alebo len domienka. Toto je dosť zásadná vec a treba v nej mať jasno. Pri práci s prerušením sa nedá stavať na domienkach. Ani keď ide o jediné prerušenie. 1000x to môže zbehnúť ale 1001 zlyhať ak to nie je urobené poriadne.AjSnahaSaCeni napísal:Myslím že stefanSK má pravdu lebo teraz ked som pozmenil kód zaznamenáva všetky impulzy ale aj 2x čiže tu predpokladám zase narážam na problém s tými zákmitmy na porte,toto som zatiaľ vôbec neriešil lebo som myslel že keď ten výstup z mincovníka iba uzemnuje ked sa vhodí minca stači port pripojiť cez pullup rezistor na 5v a ten výstup z mincovníka pripojiť k portu. Neviete mi náhodou poradiť ako by sa dali tie zákmity odstrániť?
Osobne si myslím (a teda ... viem) že to nie je pravda, lebo ak by sa použila klasická inštrukcia RET miesto IRET tak už sa nepovolí pri návrate global interrupt flag a ďalšie prerušenia by sa ignorovali.
Predpoklad že odpor odstráni zákmity je chybný. Tam je dôležité vedieť aký signál ide z mincovníka. Buď dokumentácia alebo meranie. Predpokladám že ten čítač si si nepostavil. Ja mám logickú sondu s počítaním impulzov pomocou 24 bitového čítača s hradlovaním vstupu a v mojich začiatkoch mi úspešne nahrádzala dvojkanálový osciloskop a logický analyzátor.
Ako vieš že tie impuzy boli dva a nie 12? Efekt v tvojom programe by bol rovnaký? Ak sa ti nechce vyrábať hw počítadlo tak si ho sprav v prerušení. Ak nemáš displej tak si posielaj hodnotu počítadla na nejaký 8 bitový port a tam si pripoj LED alebo dve sedemsegmentovky cez dekodér. Ešte som nezažil aby sa mi tratili hrany na externom prerušení. To by prichádzalo do úvahy iba ak by hlavný program zakazoval prerušenie, alebo by obsluha prerušení trvala dlhú dobu. Ani jedno v tvojom programe by nemalo nastávať.
HW odstraňovanie zákmitov by som nepoužil, ale o tom sa môžeme baviť až sa potvrdí že sú tam a zmeriaš koľko ich je a koľko trvajú.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok