Externe prerusenie+Mincovník+Atmega16A-PU

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

stefanSK
Pokročilý člen
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

Príspevok od používateľa stefanSK » 01 Feb 2016, 18:58

Tak som chvíľu hladal na internete a nasiel som tento príklad:

/

Kód: Vybrať všetko

*
 * Project name:
     External Interrupt on PortD (Simple 'Hello World' project)
 * Copyright:
     (c) Mikroelektronika, 2010.
 * Revision History:
     20101006:
       - initial release;
       - 20101006 - Ranko Rankovic;
 * Description:
     This is a simple 'Hello World' project. It counts presses on PortD.3 and
     shows result on diodes connected to PORTB.
 * Test configuration:
     MCU:             ATmega16
                      http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf
     Dev.Board:       EasyAVR6
                      http://www.mikroe.com/en/tools/easyavr6/
     Oscillator:      External Clock 08.0000 MHz
     Ext. Modules:    -
     SW:              mikroC PRO for AVR v4.10
                      http://www.mikroe.com/en/compilers/mikroc/avr/
 * NOTES:
     - Make sure you turn ON the PORTB LEDs (SW8.2), set PortD Pull Up Jumper in Vcc position (J4)
       and turn on PortD.3 Switch (SW4.4)
*/


int cnt = 0;                    // Global variable cnt

void interrupt_ISR () org IVT_ADDR_INT1 {               // Interrupt rutine
             SREG_I_bit = 0;    // Disable Interrupts
             cnt++;             // Increment variable cnt
             SREG_I_bit = 1;    // Enable Interrupts
}

void main() {                   // Main program

     DDRD = 0xF7;               // Set PD3 as input
     DDRB = 0xFF;               // Set PortB as output

     PortD = 0x00;
     PortB = 0xFF;              // Starting value for PortD
     GICR = 0b10000000;         // Set the Interrupts
     MCUCR = 0b00001000;        // Configure Interrupt for falling edge on PortD.3

     SREG_I_bit = 1;            // Enable Interrupts

     while(1){                  // Unending loop
              PortB = cnt;      // Write on PortB value of varibale cnt
     }
}
Skús modifikovať na INT0 a daj vedieť čo to robí. Podľa mňa premennú cnt treba zadefinovať ako volatile a zakázanie/povolenie prerušenia nie je potrebné, nakoľko z HW prerušenia vyplýva, že po skoku na vektor prrerušenia je prerušenie zakázané HW CPU a posledná inštrukcia vo funkcii IRET obnoví register SREG a tým sa aj povolí prerušenie (to samozrejme platí v prípade, že programátor nevolá nejaké funkcie, v ktorých sa povolí prerušenie, alebo sa urobí návrat z funkcie s IRET)

Poz.: čo som ja používal mincovníky, tak ani jeden nemal na výstupe žiadne zákmity, výstup bol buď logická úroveň, alebo otvorený kolektor.
0
S.K.

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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 19:58

Tu by som rád upozornil na to, že predpokladať, že RETI obnoví register SREG je omyl. RETI urobí iba to že I flag nastaví do 1 (povolí prerušenie). Ostatných bitov v SREG si nevšíma.
Pre C programátora nepodstatný detail, pre ASM programátora životne dôležitá vedomosť. SREG si totiž musí odložiť sám ak v ňom modifikuje čo len jediný bit rôzny od I.

Inak na čo sem dávať kód nejakého hello word programátora ktorý netuší ako to prerušenie vlastne chodí. A ako sa to v C programuje.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

stefanSK
Pokročilý člen
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

Príspevok od používateľa stefanSK » 01 Feb 2016, 20:40

Ano v poslednom mojom príspevku som sa dopustil nepresnosti, čo peterple opravil.
Pre tých čo nevedia aký je rozdiel v zápise C:
1. void XYZ org IVT_ADDR_INT1
a
2. void interrupt() org IVT_ADDR_INT1

je takýto:
V prvom prípade sa na absolútnu adresu IVT_ADDR_INT1 umiestny kód funkcie XYZ, ktorá je ukončená s RET
V druhom prípade na absolútnu adresu IVT_ADDR_INT1 prekladač umiestny kód, ktorý má na začíatku a na konci minimálne:
(namiesto R16 môže byť aj iný register, záleží na použitom prekladači)

Kód: Vybrať všetko

; Here we start with the Interrupt-Service-Routine
    PUSH R16 ; save a register to stack
    IN R16,SREG ; read status register
    PUSH R16 ; and put on stack
[...] Here the Int-Service-Routine does something and uses R16
    POP R16 ; get previous flag register from stack
    OUT SREG,R16 ; restore old status
    POP R16 ; get previous content of R16 from the stack
    RETI ; and return from int
V kóde čo som minule uviedol mi išlo hlavne o to, ako sa definuje funkcia pre obsluhu prerušenia.
0
S.K.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 20:54

Takže celé som to nahodil na LCD a za pomoci takéhoto kódu som sa snažil zmerať počet impulzov

Kód: Vybrať všetko

sbit LCD_RS at PORTD0_bit;
sbit LCD_EN at PORTD1_bit;
sbit LCD_D7 at PORTD7_bit;
sbit LCD_D6 at PORTD6_bit;
sbit LCD_D5 at PORTD5_bit;
sbit LCD_D4 at PORTD4_bit;
sbit LCD_RS_Direction at DDD0_bit;
sbit LCD_EN_Direction at DDD1_bit;
sbit LCD_D7_Direction at DDD7_bit;
sbit LCD_D6_Direction at DDD6_bit;
sbit LCD_D5_Direction at DDD5_bit;
sbit LCD_D4_Direction at DDD4_bit;


volatile int cislo;
void interrupt_ISR(void) org IVT_ADDR_INT0 {   //globalne prerusenie

cislo = cislo + 10 ;  //Pripocitanie 10  pri vyskite pulzu z mincovnika.

}

void main()
{
char pole[7];

SREG |= 1<<7;
GICR |= 1<<INT0;          //nastavneie preruseniea na INT0
MCUCR |= 1<<ISC01 | 0<<ISC00;  //nastavenie prerusenia na Nabeznu hranu


DDRD &= ~(1<<PORTD2);


Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, "Vhodili Ste :");
cislo = 0 ;
while(1)
{
IntToStr(cislo, pole);
delay_ms(100);
Lcd_Out(2,1,pole);
}
}
a prišiel som ako inač k zarážajúcim výsledkom,zakaždým ked som vhodil mincu sa mi náhodne pripočítalo k premennej od +10 alebo +20,+30,+40 vo veľmi ojedinelých prípadoch sa nestalo vôbec nič. Vždy som vhadzoval 10centovu mincu čo značí 1 uzmnenie na 25ms na výstupe z mincovníka.
0
Naposledy upravil/-a AjSnahaSaCeni v 01 Feb 2016, 20:56, upravené celkom 1 krát.

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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 20:56

Tu je tiež malá nepresnosť. Na tej absolútnej adrese nebude kód samotnej funkcie ale iba skok na kód tej funkcie. Alebo??? Ako inak by sa tam hneď na ďalšiu adresu kde je vektor ďalšieho prerušenia vošla iná funkcia.
Stále varíme z vody a dokiaľ nebudem mať dva preložené hexy raz tak a raz tak tak neviem povedať ako to naozaj je.
Dosť pochybujem že sa takto v tom profi C definuje absolútna adresa pre preklad funkcie.

Edit: reakcia na prispevok Stefana
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 21:02

Tu je hex súbor toho kódu ktorý som používal spolu s LCD
Prílohy
forum1.hex
(4.68 KiB) 24 stiahnutí
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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 21:05

Tak trocha sa to dalo očakávať. Tie zákmity tam sú. To že ich je teraz max 4 nič neznamená. Predpokladám že ich môže byť aj viacero.
Teraz si zmeraj aký je medzi nimi čas. Pusti si nejaký časovač a v prerušení INT0 odchytávaj jeho hodnotu. Pamätaj si predchádzajúci a z rozdielu vypočítaš koľko to trvalo. Ukladaj do poľa a to pole potom vypisuj na displej alebo najlepšie na sériovú linku. Na takéto debugovanie je sériová linka najlepšia.

Potom nato treba nasadiť nejaké páky ako to odstrániť. Ako som už písal ja by som to robil cez sw.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

stefanSK
Pokročilý člen
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

Príspevok od používateľa stefanSK » 01 Feb 2016, 21:10

to peterple: prečítaj si návod. o umiestnení premenných,funkcií na absolútnu adresu v mikroC.

Je možné, že na tej adrese bude iba skok na funkciu a možno že tam bude kód (ak nebudú iné prerušenia definované v programe).Najlepšie to vidieť ak by bol hex toho príkladu. Ja nemám mikroC pre AVR tak nemôžem to skontrolovať, či prekladač defaultne na všetky prerušovacie vektory dá RETI a na tie,ktoré sú v programe dá skok na telo funkcie.

V asm tam bude to, čo tam programátor umiestni.
0
S.K.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 21:22

dobre spravím čo mi radíš ale mám predtým ešte 2 otázky. za 1 prečo by som ich nemal odstrániť cez HW? príde mi to jednoduchšie obvzvlášť vzhľadom na to že tam budem chcieť vhadzovať aj inú ako 10centovú mincu a tam keď pôjde v sérii viac impulzov mohlo by byť zložité ich ošetriť cez SW . Druhá otázka je trochu od aktuálnej témi ale suvisí,pri tom ako som vhadzoval mince sa občas stalo že riadok LCD kde som mal vypisanú premennú zaplnili divné znaky a vôbec som nerozumel prečo a musel som reštartovať Atmegu.

A aby som nezabudol tak sa ti chcem poďakovať za doterajšiu pomoc ako aj ostatným i keď sme sa ešte nedopracovali k finálnemu riešeniu v elektro som ešte stále pomerne začiatočník a preto si každú pomoc veľmi cením. :thanks:

-- Spojený príspevok 01 Feb 2016, 22:29 --

a pridávam ešte hex súbor ku kódu ktorý bol pridaní na úplnom začiatku tejto témi.
Prílohy
forum22.hex
(784 Bajtov) 24 stiahnutí
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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 21:30

StefanSk:
takže je jasno. Je tam JMP na nejakú adresu kam vyšla tá funkcia. Čítať si ten kompiler nebudem. Na mňa je moc pro.
Kto by nevedel tak na adrese 2 je vektor pre prerušenie INT0 a tam je inštrukcia JMP ktorá to pošle na kód tej funkcie, ktorá ale nemôže byť na adrese 2 lebo 4 je iný prerušovací vektor a tá funkcia čo to zaberá.

AjSnahaSaCeni:
Ešte keď posleš hex s tou prvou variantou zápisu prerušovacej rutiny, tak ti aj odpoviem či je na konci RETI alebo nie. V tomto prípade je a aj sa všetko korektne uloží obnoví cez zásobník.

Edit: už si poslal, pozriem sa na to.
Prílohy
int0.png
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 21:38

Vďaka. :)
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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 21:42

Aj tu je jasno. Funkciu si môžeš pomenovať ako len chceš. Kľúčové je zaklínadlo org a adresa. Vygeneruje to korektnú ISR funkciu s odložením potrebných vecí na zásobník a s návratom z prerušenia. K tomu názoru ma viedlo to, že tých prerušovacích funkcií býva aj niekoľko, ale asi nemôžu mať rovnaké meno a ďalej to že to naozaj fungovalo. Ako som písal niekde na prvej strane. Ak by tam bol RET ta po prvom INT0 by to zdochlo a už by to na žiadne ďalšie prerušenie nereagovalo.

V červenom rámečku je tá ISR funkcia. Kto vie, tak vie že je OK.
Prílohy
int0first.png
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 21:51

Dobre takže v tomto máme jasno čiže vieme že funkciu môžem pomenovať ako len chcem a nemá to žiadni vplyv. Teraz sa chcem ešte raz spýtať prečo by som sa mal vyhnúť HW ošetreniu tých zákmitov a preferovať SW riešenie? mám to chápať tak že HW ošetrenie je nespoľahlivé?
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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 21:59

AjSnahaSaCeni napísal:za 1 prečo by som ich nemal odstrániť cez HW? príde mi to jednoduchšie obvzvlášť vzhľadom na to že tam budem chcieť vhadzovať aj inú ako 10centovú mincu a tam keď pôjde v sérii viac impulzov mohlo by byť zložité ich ošetriť cez SW . Druhá otázka je trochu od aktuálnej témi ale suvisí,pri tom ako som vhadzoval mince sa občas stalo že riadok LCD kde som mal vypisanú premennú zaplnili divné znaky a vôbec som nerozumel prečo a musel som reštartovať Atmegu.
Odpoveď na 1 otázku:
- nič to nestojí, iba trocha premýšľania. Pracujem vo firme kde pár ušetrených smd vo finále ušetrí 1000€
- bude to spoľahlivejšie, procesor sa dokáže vysporiadať s hocijakou divočinou čo si tam viem prestaviť.
- neber to v zlom ale typujem že tam vrazíš kondenzátor a to tak že bude pomaly, ale isto ničiť ten spínací tranzistor v mincovníku (ak tam nejaký je)
- úplne jednoduché to s tým sw nebude ale možno sa niečo naučíš.

Na otázku č. 2 nepoznám odpoveď. A ani veštecká guľa mi nič nenašepkáva. Bordel v napájaní? Skratovanie napájania? Totálna strelba do luftu.
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
budvar10
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1058
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa budvar10 » 02 Feb 2016, 08:40

Zákmity sa dajú riešiť jednoduchým algoritmom napr. po prvom prerušení ignoruješ prerušenia za určitý časový úsek a potom otestuješ zmenu stavu na porte, alebo HW napr. jednoduchý Schmittov klopný obvod prípadne + invertor. Je na tebe čo si vyberieš, viac pájkovania alebo programovania.
Podľa mňa spoľahlivé bude aj jedno aj druhé, ak sa to dobre navrhne. Program sa ale dá jednoduchšie zmeniť, ale HW bude rýchlejšie reagovať.

Ešte k tej funkcii (viem, že návody čítajú iba zbabelci, no niekedy treba aj to):
http://www.mikroe.com/download/eng/docu ... rrupts.htm
a toto
http://download.mikroe.com/manuals/comp ... l_v100.pdf
str. 104.
Myslím, že to nie je celkom jasne napísané ale ak by funkcia mala mať nejaký špeciálny názov, určite by to tam dali.
0

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 25 Feb 2016, 17:08

zdravím,po dlhej dobe som sa znovu dostal k tomuto problému a podarilo sa mi môj mincovník pomerne zafixovať pri práci som ale prišiel na zaujmavú udalosť ktorú si neviem celkom vysvetliť, ako som už minule písal impulzi(každých 10centov=1pulz) z mincovníka sa snažím zachytávať cez externé prerušenie na ATmege16 pin mám pripojený na externú pull-up rezistor o hodnote 10K. Kód je prakticky rovnaký ako na začiatku tejto témi.atmegu mám momentálne osadenú v tomto programátore http://www.ebay.co.uk/itm/AVR-Minimum-S ... xyBvZTWBcY
a napájam ho cez USB z notebooku a mincovník je napájany externe z 12V zdroju zo siete. Danou anomáliu je že keď mám notebook iba na baterke tak zaznamenávam impulzi veľmi nespoľahlivo(niekedy ho nezaznamenám dokonca vôbec.) a pri tom ked notebook zapojím do siete nabíjačkou tak ich zaznamenávam až príliš veľa(to predpokladám súvisí zo zákmitmi ktoré si už dokážem softeverovo odstániť.) aby som bližšie priblížil výstup z môjho mincovníka prikladám tento link http://www.waferstar.com/en/technical-bulletin.html prepáčte že su to iba také strohé informácie ale nikde som nemohol nájsť presnejšie informácie. všetky informácie o stave spočitaných impulzov som si vypisoval na LCD takže som si pomerne istý tím čo tu tvrdím. Takže moja otázka je či niekto náhodou nevie objasniť čím by mohla byť tá veľká nestabilita pri napájaní iba z baterky.
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: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 25 Feb 2016, 17:47

možno blbá otázka - zeme máš prepojené? Stále by som rád videl schému zapojenia a nie slovné popisy - hento hentam. Ja tu v poslednej dobe vidím len zúfalé vedomosti z elektrotechniky a programovania, tak sa mi nečuduj.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 25 Feb 2016, 18:33

skoro žiadna otázka nie je blbá keď od teba potrebuje pomôcť,ale v tomto pripadne mám zeme skutočne prepojené schému pridám neskôr lebo najskôr musím nejakú vytvoriť aby to bolo aspoň ako tak prehľadné.:D
0

stanleyv
Pokročilý člen
Pokročilý člen
Príspevky: 738
Dátum registrácie: 14 Máj 2007, 00:00
Bydlisko: Trnava
Vek: 51

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa stanleyv » 25 Feb 2016, 19:28

Tak to odfoť a daj tu foto :)
0
Ak nakupuješ často na ebay, Banggood, Aliexpres a pod., tu sa zaregistruj a môžeš ušetriť:
https://www.bonusway.cz?r=6361768

„Jediná druhá šance, kterou máme, je udělat stejnou chybu podruhé.“
David Mamet

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