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.

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.