Eeprom pin durumunu nasıl kaydederim ?
  • Merhaba ...

    Bir midi cihaz yapmaya çalışıyorum... Board olarak arduino mega kullanmaktayım.. Önce proteus ile denemeler yaptım ama sanırım program kısmında bir türlü başarılı olamadım. Buraya kod yazmıyacağım çünki yazacağım kodun bir anlamı olmayacak...
    Direk olarak portb yi giriş yapıp sonrada low konumuna çekiyorum ve push button'a bastığımda pinb registerından durumu okuyorum buraya kadar problem yok. 8 adet button portb ye bağlı. Bir değişkene yada bir dizinin herhangi indisine bu port okumasını kaydediyorum. Ama elimi çektiğim anda bastığım button yine 0 olarak kayıtoluyor. Çünki konumu 0 oluyor. Basılı kalan buttonlardan kullanmak istemiyorum.
    Yapmaya çalıştığım şey oluşturduğum byte değişkenindeki 8 bit veriyi buttonlar aracılığı ile değiştirmek ve bunu eeproma kaydetmek... eeproma kayıt konusunda problemim yok. Arduino'nun hazır fonksiyonlarını kullanmadan pure c ile bu algoritmayı nasıl oluşturabilirim ?

    Teşekkürler...
  • basilma durumu diye bir değişken oluşturun butona basıldığında değişken değeri 1 olsun , 8 buton için ayrı ayrı oluşturabilirsiniz.Daha sonra diziye bunu basın , ardından eeproma kaydedin.Ya da direkt olarak butona basıldıysa eeproma kaydedin.
  • EmbeddedSystem Teşekkürler...

    Sanırım bu mantıkla çalışma ihtimali olabilir.. Akşam deneyeceğim... Valla bazen benimde beynim duruyor...

    if (pinb > 0 ) { EEPROM.write(0,PINB) };

  • Merhaba...
    Dediğiniz şekilde B portunun pin durumundan gelen veriyi eeproma kaydettim.. Ve aldığım kaydıda portc ye yönlendirip pinb durumuna göre ledleri yaktım...
    Aşağıdaki satırlar tam olarak bu işi yapmamı sağladı. Ancak şimdi bu durumu toggle haline getirmem gerekiyor... Engin yazılım bilgim buna yetmiyor tabi :) . Esasında bir satır ile eeproma yazdığım veriyi tersleyebiliyorum ama yinede toggle olmuyor..

    EEPROM.read(0) & ~PINB; satırı ile yaktığım aynı ledleri söndürüyorum ben bunu tuşa bas yak sonra tekrar bas sön durumuna getirmek istiyorum.. Acaba nasıl bir mantık ile hareket etmek gerekiyor..

    Araştırdığım kodların geneli tek pin için toggle ama ben portu toggle hale getirmeliyim. Mümkün oldukça kodu basit tutup döngülerden uzak durmaya çalışıyorum.
    Yardımcı olursanız sevinirim....
    Teşekkürler..

    #include < EEPROM.h>
    byte x;
    byte n;

    void setup()
    {

    EEPROM.write(0, 0);

    Serial.begin(9600);
    DDRB = B00000000;
    PORTB = B00000000;
    DDRC = B11111111;
    PORTC = B00000000;

    }

    void loop()
    {

    if (PINB > 0 )
    {
    EEPROM.write(0,PINB);
    PORTC = EEPROM.read(0);

    }


    }
  • Demek istediğiz şu mu butona bastım portun hepsi 1 oldu , butona tekrar bastım portun hepsi 0 oldu ,
    Bunun şunu yapabilirsiniz ,
    if(digitalRead(buton_bağlı_pin) { delay(20); if(buton_durum==0) { butondurum==1;}else{ buton_durum=0;} }

    switch case ile buton durumunu okuyup portu komple tersleyebilirsiniz daha sonrasında.
  • Ayrıca atmel de port hazırlarken , 0-input 1-outputtur , pic gibi değil bilginiz olsun.
  • EmbeddedSystem Merhaba...

    Hayır demek istediğim şöyle..

    PORTB giris olarak ayarladım...
    PORTB LOW olarak ayarladım...
    PORTB de 8 adet push button var...
    8 adet buttondan 1 3 5 diye bastım.
    Ve bastığımı PINB den okudum...
    PINB durumunu eeprom 0 adresine yazdım...
    Şimdi eepromda 0 adresde B00010101 diye bir veri oldu.
    Ben bu veriyi PORTC = EEPROM.read(0); olarak da okuduğum için bastığım tuşların hangi bitleri 1 yaptığını ledler ile görüyorum... Yani portc de de ledlerim var.

    Şimdi elimdeki B00010101 verisini tekrar buttona basıp 0 çekmek istiyorum. Yani hangisini istersem ona basıp ledi söndürmem gerek.

    Tam olarak özetlemem gerekirse bir byte değişkenin içerisindeki bitleri 8 adet button ile 1 ve 0 konumuna çekmek istiyorum. Portun 8 adet biti ile Byte değişkenin 8 adet biti eşit olmalı hangi buttona basıyorsam ona karsılık gelen bit 1 olup 1 isede 0 olmalı...

    Tabi bu birincisi mantığı anlamak adına böyle bunun gibi 8 adet bir pattern yapmam gerekecek :D


  • Ben atmelden baska mcu ile calismadım henüz... Evet biliyorum 0 giris 1 out olduğunu...
    Aslında arduinodan kurtulup avr ye geçmek istiyorumda çok eksiğim... bu konuda...
  • Giriş olarak ayarladığınız bir şeyi nasıl low ayarlıyorsunuz anlamadım , tekrar butona basıp 0 çekme kısmını da anlamadım.Eppromda 8 adet adres belirleyin. Butona bastığınızda o adreslere 1 yapın
  • animasyonmu yapacan kardaş..
    anladığım kadarıyla kayıt silmede istiyosun
    şöyle öneride bulunayım...

    PortB>0 ise eproma yaz yerine

    bitane yaz butonu olsun onunla yaz.. hatta ileri ve geri butonun olsun onlarlada eeprom ardes indexini değiştir.
    hatta hadi_bakalım tuşu oldun oda oynatma yapsın.. yani kayıtlarını ledlere aktarsın..

  • EmbeddedSysteM tekrar merhaba...

    Sanırım ben yanlış anlatıyorum... Giriş olarak ayarladığım porta bağladığım buttonda pulldown direnci var. Button basınca pinb registerından bastığım buttonu okuyabiliyorum. Bunuda eeproma yazıyorum. Eeproma yazdığımıda portc de görüyorum. Yani portc çıkış bu durumda ve ledler bağlı. Zaten eeproma yazıyorum bir byte veriyi burada bir sorun yok.
    Ozaman şöyle diyim portb ye bağladığım 8 adet button pinb registerındaki değişiklik yapıyor... Ve bunu eeproma yazdım. Örnek vermem gerekirse buttonlara basıp 00101001 veri elde ettim. Bu veriyi pinb den okuyup eeproma yazdım ve bu veriyi portc ye gönderdim. Portc nin 1. 4. 6. Pinleri high oldu ve ledler yandı. Şimdi bu ledleri söndürmem için yine portb ye girip yazdığım veriyi tersleyip tekrar eeproma yazıp portc ye göndermem gerekki ledleri söndüreyim. Bu arada 1. 4. 6 bitleri değilde sadece 6 biti tersleyebilirimde. EEPROM.read(0) & ~PINB; Bu satır bu işi yapıyor ama ben bunu toggle olarak yapmalıyım tüm derdim bu.

    Düşünürken aklıma dflipflop kullanmak geldi yazılımla bukadar uğraşmak yerine dflipflop ile toggle button yapıp bukadar dertten kurtulmak daha basit gibi...

    Msg dostum animasyon falan yapmıcam ledleri yakmak için... tam olarak dediğin ama o kayıtları midi mesaja çevirip teensy kontrol edicem.. step sequancer olacak esasında..
    İleri geri durumunu interrupt ile hallettim. Hatta kafa yorup ufak bir lcd de menu falanda yapmak gerekecek yada gui arayüz ile kontrol ama bunlar çok ileride olabilir ben daha başında tebelenmeye başladım :) ama yapana kadar peşini bırakmıcam...
  • Yapmak istediğim tam olarak budur... Muhtemelen burada shift register kullanılmıştır. Ama ben zaten mega kullanacağım gerek yok sanırım. Mantığı anlasam yeter... yoksa adam vermiş kodları şemayı armut piş ağzıma düş diyemiyorum :)

    https://youtu.be/V6P4GdR-m2A
  • Ben ufak bir öneride bulunayım,

    anladığım kadarı ile yazma çizme işlerini yapmışsın takıldığın yer her basışta durum değişme kısmı?
    Eğer doğru ise aşağıdaki kod belki yardımcı olabilir

    8 adet butonun var diyorsun ben 2 tane için örnek vereceğim


    int buton1durum,buton2durum,buton1kontrol,buton2kontrol;

    void loop()
    {
    if(digitalRead(buton1pin))
    {
    if(buton1kontrol)
    {
    buton1kontrol = 0;
    buton1durum != buton1durum;
    }
    }
    else buton1kontrol =1;

    if(digitalRead(buton2pin))
    {
    if(buton2kontrol)
    {
    buton2kontrol = 0;
    buton2durum != buton2durum;
    }
    }
    else buton2kontrol =1;
    }


    böylece her butona bastığında ilgili bit durum değiştirecek. Bu bitleri bir araya getirerek bir byte yapıp bu byte ı eproma yazıp okuyabilirsin.
  • Selamlar Tekrar... ekmekci üstadın dediği mantık ile yaptım toogle olarak button ve eeproma da yazdım ama bana bu sekilde yapmak cok uzun ve kod fazlalıgı gibi geldi.. PINB registerindan okuyabiliyoruz zaten durumu :D Zaten digitalRead denilen fonksiyonda pinb registerından okumuyormu... Herneyse ben kodu yazıyorum baya uzun oldu ki bu sadece 8 pus button için bunu 16 ya cıkaracağım...


    byte outPin0 = 37;
    byte outPin1 = 36;
    byte outPin2 = 35;
    byte outPin3 = 34;
    byte outPin4 = 33;
    byte outPin5 = 32;
    byte outPin6 = 31;
    byte outPin7 = 30;

    byte okunan0, okunan1, okunan2, okunan3, okunan4, okunan5, okunan6, okunan7;
    byte durum0, durum1, durum2, durum3, durum4, durum5, durum6, durum7;
    byte oncekidurum0, oncekidurum1, oncekidurum2, oncekidurum3, oncekidurum4, oncekidurum5, oncekidurum6, oncekidurum7;
    byte toggle_index[8] = {0,1,2,3,4,5,6,7};
    void setup()
    {
    PORTB = B00000000;
    PORTC = B00000000;
    DDRB = B00000000;
    DDRC = B11111111;

    }

    void loop()
    {

    toggle0();
    toggle1();
    toggle2();
    toggle3();
    toggle4();
    toggle5();
    toggle6();
    toggle7();



    }

    void toggle0() {
    okunan0 = digitalRead(53);
    if (okunan0 == 1 && oncekidurum0 == 0) {
    if (durum0 == 1)
    durum0 = 0;
    else
    durum0 = 1;
    }
    oncekidurum0 = okunan0;
    digitalWrite(outPin0, durum0);

    }
    void toggle1() {
    okunan1 = digitalRead(52);
    if (okunan1 == 1 && oncekidurum1 == 0) {
    if (durum1 == 1)
    durum1 = 0;
    else
    durum1 = 1;
    }
    oncekidurum1 = okunan1;
    digitalWrite(outPin1, durum1);
    }
    void toggle2() {
    okunan2 = digitalRead(51);
    if (okunan2 == 1 && oncekidurum2 == 0) {
    if (durum2 == 1)
    durum2 = 0;
    else
    durum2 = 1;
    }
    oncekidurum2 = okunan2;
    digitalWrite(outPin2, durum2);
    }
    void toggle3() {
    okunan3 = digitalRead(50);
    if (okunan3 == 1 && oncekidurum3 == 0) {
    if (durum3 == 1)
    durum3 = 0;
    else
    durum3 = 1;
    }
    oncekidurum3 = okunan3;
    digitalWrite(outPin3, durum3);
    }
    void toggle4() {
    okunan4 = digitalRead(13);
    if (okunan4 == 1 && oncekidurum4 == 0) {
    if (durum4 == 1)
    durum4 = 0;
    else
    durum4 = 1;
    }
    oncekidurum4 = okunan4;
    digitalWrite(outPin4, durum4);
    }
    void toggle5() {
    okunan5 = digitalRead(12);
    if (okunan5 == 1 && oncekidurum5 == 0) {
    if (durum5 == 1)
    durum5 = 0;
    else
    durum5 = 1;
    }
    oncekidurum5 = okunan5;
    digitalWrite(outPin5, durum5);
    }
    void toggle6() {
    okunan6 = digitalRead(11);
    if (okunan6 == 1 && oncekidurum6 == 0) {
    if (durum6 == 1)
    durum6 = 0;
    else
    durum6 = 1;
    }
    oncekidurum6 = okunan6;
    digitalWrite(outPin6, durum6);
    }
    void toggle7() {
    okunan7 = digitalRead(10);
    if (okunan7 == 1 && oncekidurum7 == 0) {
    if (durum7 == 1)
    durum7 = 0;
    else
    durum7 = 1;
    }
    oncekidurum7 = okunan7;
    digitalWrite(outPin7, durum7);
    }
  • Esadında durum soyle oluyor PINB register daki her bit için ve PORTC nin registerindaki her bit için byte boyutunda değişken tanımlayıp hafızada gereksiz yer kaplıyorum... Ama ben register ile push button u toggle hale getiremedim...
  • PORTD |= _BV(PD7);

    PORTD &= ~_BV(PD7);
    gibi olmuyor mu
  • EmbeddedSystem evet oluyor teşekkürler... Ben _Bv makrosundan haberdar değildim :D
    Swithcase i PINB ile karsılaştırma yaparak altınada verdiğin kodu yazıp yaptım...
    Bu arada artık arduino kullanmıcam sanırım paraya kıyıp Atmel Ice aldım... Atmel studio ya terfi ediyorum... Artık daha derinlemesine öğrenmem gerektiğini hisettim... Arduino donanımdan baya soyutluyor insanı... Kütüphaneler ile nereye kadar dimi ? :)
    Teşekkürler hepinize...
  • Rica ederiz , şurada benim hazırladığım bazı eğitim videoları var belki hoşunuza gider
    https://www.youtube.com/playlist?list=PLBTJOzkfYY02EuHiRMr_ivZwTU0AK5l12
  • EmbeddedSystem :D Ben bunları izledim ama tekrar tekrar izliyorum aşina olana kadar...Abone oldum kanalına...
  • Yok ya izlememişim izlediğim başka biriymiş ... Zaten burada bit value den bahsediyorsun... izleseydim bu yapmaya çalıştığım konu bukadar uzamazdı :D
  • Evet sanırım :) Kolay gelsin takıldığınız yerlerde buralarda oluruz elimizden ne gelirse artık :)
  • Teşekürler
  • Bu gibi durumda harici bir eeprom kullamanızı tavsiye ederim hocam

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.