Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

AVR + enkooder

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    AVR + enkooder

    Sai hiljuti AVRISP mkII programmaator soetatud ja peotäis ATmega8-16pu kivisi.
    Ja tänaseks igasugu lihtsamad õpetused läbi käidud, kuidas LED-e vilgutada jne.
    Ja paar asja päris ise oma peaga välja mõeldud.
    Aga nüüd olen päris jännis kohe.
    Nimelt, oleks vaja sellist enkooderit tööle saada kuidagi: http://www.ebay.com/itm/10pcs-New-12...item5d3c2e51d0
    Olen paar päeva googeldanud ja mitmeid õpetusi lugenud aga mõistus peale ei hakka.
    Ükski kood (mis õpetustes töötavad ilusti) minul tööle ei hakka.
    Ilmselt on mul mingi elementaarne asi kahe silma vahele jäänud, mis on nii iseenesest mõistetav et õpetustes eraldi ei mainita.
    Ainuke kood mis vähemalt mingeid elumärke annab on see:

    PHP kood:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #define PIN_A (PIND&1)
    #define PIN_B ((PIND>>1)&1)

    int main (void)
    {
        
    DDRD 0;
        
    DDRB |= _BV(DDB0);
        
    uint8_t del 200;
        
    uint8_t dir 0;
        
    uint8_t counter 0;

        while(
    1)
        {
            if(
    dir == 0) {
                if(
    PIN_A & (!PIN_B)) {
                    
    dir 2;
                } else if(
    PIN_B & (!PIN_A)) {
                    
    dir 4;
                } else {
                    
    dir 0;
                }
            } else if(
    dir == 2) {
                if(
    PIN_A & (!PIN_B)) {
                    
    dir 2;
                } else if((!
    PIN_A) & (!PIN_B)) {
                    
    counter-=10;
                    
    dir 0;
                } else {
                    
    dir 0;
                }
            } else if(
    dir == 4) {
                if(
    PIN_B & (!PIN_A)) {
                    
    dir 4;
                } else if((!
    PIN_A) & (!PIN_B)) {
                    
    counter+=10;
                    
    dir 0;
                } else {
                    
    dir 0;
                }
            } else if(
    PIN_B PIN_A) {
                
    dir 0;
            }
            
    del counter;
            
    PORTB ^= _BV(PB0);
            
    _delay_ms(del);
        }
        return 
    0;

    Aga see ei ole ka päris õige asi sest, vahest töötab ja vahest ei tööta. Mõnikord võin lõputult nuppu kruttida ja mitte midagi ei muuta. Aga samas kohati jälle töötab.

    Kellegil äkki mingit lihtsat koodi pakkuda, mis kindlalt töötab?
    Või mingit head õpetust kus on puust ja punasest ette näidatud, nii et algaja ka tööle saaks asja?
    viimati muutis kasutaja Kkert; 15 m 2014, 16:51. Põhjus: Kustutasin koodist kõrvalised asjad ära.

    #2
    Vs: AVR + enkooder

    Alustuseks kas sul elektriliselt on kõik ikka korrektne ja sisendid ei ripu õhus, juhtmed müra ei korja?
    Toidan trolle!

    Comment


      #3
      Vs: AVR + enkooder

      Tõstsin selle C teksti natuke harjunumasse keskkonda ja
      panin selle PIND muutuma ++ (00, 01, 10,11) ja -- ja tabelist.
      Midagi mõistlikku nagu ei tulnud dir vilkus 0 ja 2 või 0 ja 4 vahel.
      Kuidas need PIN_A ja PIN_B peavad muutuma?

      Kas nii nagu siin mudelid>> servomootor all?

      ----------
      Maadlen ühe 1kW mootori sisseehitatud enkooderiga. Kakleb.
      Vast tuleb ka mikro peale minna

      Comment


        #4
        Vs: AVR + enkooder

        No ühendused peaksid (vist) olema õieti.
        Müra kohta ei oska õelda... "leivalaua" peale laotud.

        Proovisin enkooderi väljunditele 100nF kondekad veel järgi panna aga siis kadusid need vähesed elumärgid üldse ära ja nupu kruttimine ei mõjuta enam midagi.
        Sellest enkooderist ma muud rohkem ei tea kui seal Ebay lingil infot on: " Output: 2-bit gray code".

        Nagu ma aru saan siis praegu see kood peaks led-i vilkumise kiirust muutma vastavalt enkooderi asendile.
        Algselt on kood pärit sealt, kolmandast postitusest: http://stackoverflow.com/questions/3...cro-controller
        Nii palju muutsin seda et, selle led-i vilkumise lisasin sinna juurde, et oleks kuidagi aru saada et asi üldse töötab.
        Muidu see ledi vilkumine pole üldse oluline. Eesmärk on saada see enkooder lihtsalt mingit arvu muutma. Et saaks seda siis hiljem teistes projektides kasutada.
        Aga siiamaani pole ükski kood tööle hakanud mis leidnud olen.

        Ühendused siis nii: Click image for larger version

Name:	DSC03573.JPG
Views:	1
Size:	435,3 KB
ID:	867732

        Click image for larger version

Name:	io_ports_intro_02_lrg.jpg
Views:	1
Size:	86,6 KB
ID:	867733
        viimati muutis kasutaja Kkert; 15 m 2014, 15:42.

        Comment


          #5
          Vs: AVR + enkooder

          Kui loetav kood muutub nii
          int P[5]={0,2,3,1}; //-- 00, 10, 11, 01
          int P[5]={1,3,2,0}; //++ 01, 11, 10, 00
          siis loendajale kas liidetakse või lahutatakse.
          See töötab.

          Vast võiks need kaks bitti viia välja nt LEDidele ja enkooderit aeglaselt keerata.

          Kui sinna panna vahele konded siis saame ainult ümberlülitus hetkest pulsi ja
          alalisnivoo on püsivalt null. Programm aga jälgib ju nivoosid.

          Kui oleks kaks testrit siis võiks neid PINGESID AVR sisendis korraga jälgida.
          Ühest testrist aitab ka virgale poisile.

          Meeldivat kruttimist.
          ________________
          See sealne nn Gray kood on selline kood kus
          koodi iga muutus kitsub esile ainult mingi ühe biti muutuse.


          C U tüüpi katikud või kontaktid on sobivad. Kaks poolkaart, 90 kraadi nihkes
          viimati muutis kasutaja A.R.; 15 m 2014, 16:30.

          Comment


            #6
            Vs: AVR + enkooder

            Kas ma saan õieti aru et, see _delay_ jama on mul üldse valesti üles ehitatud?
            Kas praegu on nii et ta ennem teist korda neid if/else värke läbi ei käi, kuni delay aeg läbi ei ole?
            Siis ju ta ei saagi töötada, kui kood seda delay-d ootab enamuse ajast.
            Või mõtlen ma valesti praegu?

            Kas seda annab kuidagi paremini teha, et mul oleks midagi silmaga nähtavat, kui enkooderit keerates mingi muutus toimub?

            PS: Kustutasin koodist kõrvalised (sinna mitte kuuluvad) asjad ära.

            Comment


              #7
              Vs: AVR + enkooder

              Käsi südamel - ma ei tea kuidas Su enkooder töötab.
              Aga sel peab olema kolm-neli klemmi.
              ja keerates peab mõned neis olema pool aega koos ja pool aega lahus.
              Ja sellised paare peaks olema kaks tk.

              Seega pool ringi ajast on kontakt ja pool ei ole.
              Need kontakti ajad on omavahel veerand pööret nihkes.
              Arvuti jookseb ringi ja tunneb ära ühe alguse mille ajal teine on lahti ja siis järgmise ja jne.

              Arvan et ta VÕIKS nii töötada.
              Mul programm hakkas sellise algoritmi järgi tööle.

              Kuskil 30 aastat tagasi oli mingi õiendamine selle grey koodiga, täpselt ei meenu.
              Aga ta töötab.

              Comment


                #8
                Vs: AVR + enkooder

                Panin enkooderile LEDid otse sappa ja väljund paistis selline aeglaselt keeratesClick image for larger version

Name:	rotary-encoder.gif
Views:	1
Size:	3,1 KB
ID:	867734

                Comment


                  #9
                  Vs: AVR + enkooder

                  Kui nüüd panna need väärtused 1-0 kujul kirja siis saamegi sellise koodi.
                  Selle koodipinge saab saata otse AVR sisendisse. Vist võib?
                  Kui tahad PC peal samm-sammult katsetada võin saata C teksti ja
                  translaator on vabavara.

                  Comment


                    #10
                    Vs: AVR + enkooder

                    1. Siis järgmiseks kirjuta kood mis emuleerib neid LED-e prose peal, enne kui keerulisema ülesande juurde lähed. Saad teada, kas sisend käitub adekvaatselt. Kui ei käitu, siis proovid läbi takisti sisendit käsitsi pull uppida ja pull downida. Ma olen sellist aeganõudvat, aga õpetlikku meetodit kasutanud, et kui mingist allalaetud progest aru ei saa, siis kirjutad ise nullist sama funktsiooniga. Pärast seda saad tavaliselt teise koodist ka aru
                    2. Ma atmega mikroga pole midagi teinud, kas seal on sisenditel sisemine pullup üldse ja kas seda on vaja aktiveerida ka. Kindel on ka sisemine alati takistiga väljast üle sillata, kui sellised ebamäärased kalad ujuvad.
                    3. Boardilt ei paista otse kivi toitesisendis väikest toitesilumise kondekat. Mõnikord on sellst kasu, lüüt ei saa igat sorti häirega hakkama.
                    Toidan trolle!

                    Comment


                      #11
                      Vs: AVR + enkooder

                      Esmalt postitatud redart poolt Vaata postitust
                      Boardilt ei paista otse kivi toitesisendis väikest toitesilumise kondekat. Mõnikord on sellst kasu, lüüt ei saa igat sorti häirega hakkama.
                      Kivil on kõhu all veel üks kondekas.
                      Selline adapter on kasutuses: http://www.ebay.com/itm/ATTiny48-88-...item41624eac9f

                      Comment


                        #12
                        Vs: AVR + enkooder

                        Seal pildipeal ei paista takkisteid.
                        Et siis annad läbi ca kümne kilooomiste protsessori sisendisse pinge peal ja läbi enkoodri lased pinge nulli.
                        Pildi järgi lased praegu ainult pinget nulli, aga kust see pinge sul tuleb.
                        MINULE EI MEELDI KUI MÕNINGAD ISIKUD MINU POSTITUSI MUUDAVAD,
                        KUI POSTITUS EI SOBI SIIS PALUKS SEE KUSTUTADA !

                        Comment


                          #13
                          Vs: AVR + enkooder

                          Esmalt postitatud klm poolt Vaata postitust
                          Pildi järgi lased praegu ainult pinget nulli, aga kust see pinge sul tuleb.
                          #define PIN_A (PIND&1)
                          #define PIN_B ((PIND>>1)&1)
                          See peaks sisemised pullupid aktiveerima vist. Aga proovin homme veel välistega ka.
                          viimati muutis kasutaja Kkert; 15 m 2014, 21:10.

                          Comment


                            #14
                            Vs: AVR + enkooder

                            Esmalt postitatud Kkert poolt Vaata postitust
                            See peaks sisemised pullupid aktiveerima vist.
                            Aga proovin homme veel välistega ka.
                            Kas sealt jala pealt mõõta ei anna?
                            Kui ei kiigu siis ei ole.

                            Kunagi 85. olime hädas. Soojas toas printer ei töötanud.
                            Mantlid selga, aknad pärani ja siis trükkis.
                            LPT-l polnud sisendil takisteid peal.

                            Comment


                              #15
                              Vs: AVR + enkooder

                              Esmalt postitatud Kkert poolt Vaata postitust
                              Kas ma saan õieti aru et, see _delay_ jama on mul üldse valesti üles ehitatud?

                              ....

                              Kas seda annab kuidagi paremini teha, et mul oleks midagi silmaga nähtavat, kui enkooderit keerates mingi muutus toimub?
                              Jah, selle parema asja nimi on katkestus. See näeb välja nii:
                              1. Otsid üles väljaviigud, millele saab määrata "pin change" katkestust.
                              2. Ühendad enkoodri ümber nende viikude külge.
                              3. Sead juhtregistris üles teatud biti, mis lubab Sulle vajaliku "pin change" katkestuse.
                              4. Defineerid globaalse muutuja "volatile int position = 0;".
                              5. Kirjutad spetsiaalse päisega funktsiooni selle katkestuse teenindamiseks.

                              Mis tähendab katkestuse teenindamine:
                              a) Katkestuse tekkimisel (antud juhul toimub see siis, kui mingi sisend muutub) viskab prose muud asjad nurka ja hakkab seda spetsiaalse päisega funktsiooni täitma.
                              b) Funktsiooni alguses võrreldakse sisendite olekut eelnevaga ja vastavalt krutib muutujat "position" kas üles- või allapoole.
                              c) Funktsiooni lõpus märgitakse spetsiaalses registris, et katkestus on teenindatud.

                              AVR-il on ka globaalne katkestuste lubamise/keelamise nupp (sei()/cli()), see peab ka olema muidugi lubatud asendis.
                              If you think education is expensive, try ignorance.

                              Comment

                              Working...
                              X