Arduino millis() konusunda yardıma ihtiyacım var.

Sarı olan uno, mavi olan ATtiny.
Değeri 10'ar artırıyorum ama frekans da bir değişiklik olmuyor.

osccal2.PNG
 
Son düzenleme:
Önceki resimdeki mavi olan 50Hz sinyal telefon adaptöründen geliyormuş.
Söktüm koydum kenara sinyal sıfıra düştü.
Ya bu Attiny'in dahili osilatörü kapalı, bizim açmamız lazım bir şekilde, yada entegreler patates. Üçünde de hiç sinyal yok.

osccal3.PNG
 
Şükür bir tanesini ayarlamayı başardım.
Bunun için 61 kullanacağım.
Yalnız bunun kare dalga olması gerekmiyor mu?

osccal4.PNG
 
@Sercan @taydin OSCCAL olayı da olmadı. 3 entegreye de kalibrasyon yaptım, sonra setup void altına osccal değerini girip yükledim entegreye.
Sonuç olarak sanki hiç bir işlem yapmamışım gibi davrandı. 15 dakika da versem 60 dakikada versem maksimum saydığı 14dk 35sn.
Sanırım patates baskı olayıyla karşı karşıyayız. Pinleri aç-kapa olayı güzel çalışıyor ama zamanlama berbat. Zaten osiloskop da görünen pwm'in bir şeye benzememesi de beni işkillendiriyor.
 
@Gokrtl Osiloskopta görülen şey sadece gürültü. 80mV kadar. Diğer pinlerden veya iç osilatörden geliyor.
O zaman bu entegreden hiç sinyal çıkmıyor. Yada sinyal çıkış bacağı yanlış. En iyisi bacakları tek tek ölçerek sinyal arayayım.
Doğru sinyali bulduğumda 5v civarı kare dalga görmem gerekiyor değil mi?
 
Evet, 3.3V veya 5V gibi mantıklı bir voltaj olması lazım. İstersen adım adım git. Bir pin seçip 1 konumuna getir, bakalım çıkış veriyor mu.

Eğer o çalışıyorsa Buradaki kodu deneyebilir misin? Arduino fonksiyonları yerine doğrudan registerları kullanarak hardware PWM yapmış: https://blog.podkalicki.com/attiny13-hardware-pwm/
 
İstersen adım adım git. Bir pin seçip 1 konumuna getir, bakalım çıkış veriyor mu.
Pinlerin HIGH, LOW olması konusunda bir sıkıntı yok. Çünkü denedim, led yakıp sondürüyor pinler. Sadece osilatör ile ilgili bir sıkıntı var. Onu aşmaya çalışıyorum.

Eğer o çalışıyorsa Buradaki kodu deneyebilir misin? Arduino fonksiyonları yerine doğrudan registerları kullanarak hardware PWM yapmış: https://blog.podkalicki.com/attiny13-hardware-pwm/
Bu kodu deneyebilmem için içindeki iki tane kütüphaneyi bulmam gerek. Biraz bakınayım, bulursam denerim.
 
Şimdi bacakları dolandım. Kalibrasyon yapan arkadaş ATtiny entegrenin 7 numaralı pinin den çıkış almış, ben pinleri dolaşırken pwm sinyalini 6 nolu pinde yakaladım.

osc.PNG


osccal5.PNG
 
Şimdi geldik zurnanın zırt dediği yere. Dünkü Frekans eşitlememde 71 sayısını bulmuştum.
Bu günkü bulduğum kare dalga ile tekrar kalibrasyon yaptığımda uno'nun frekansına eşitlemek için yine 71 adım ilerledim.
Ve bu işe yaramıyor. Entegre hep 14:35dk dan ileri gidemiyor.
Resimde görüleceği üzere kare dalga formları birbirine ikiz gibi benzedi.

osccal6.PNG
 
Şimdi geldik zurnanın zırt dediği yere. Dünkü Frekans eşitlememde 71 sayısını bulmuştum.
Bu günkü bulduğum kare dalga ile tekrar kalibrasyon yaptığımda uno'nun frekansına eşitlemek için yine 71 adım ilerledim.
Ve bu işe yaramıyor. Entegre hep 14:35dk dan ileri gidemiyor.
Resimde görüleceği üzere kare dalga formları birbirine ikiz gibi benzedi.
Süre sorunu daha çok overflow durumuna benziyor, saniye sinyali veren bir kesme ayarlayıp saniye saydırabilirsin. kalibrasyonu da timer'ın registerlerinden yapılabilir. Tamamen aylaklıktan, kabaca kronometre tutarak elimdeki bir attiny13'e 9.6MHZ dahili osilatörle saniye değişkenini her saniye artıracak bir kesme hazırladım. PORTB3'e bağlı ledle sınıyor zamanlayıcıyı.
timer deneme:
/*
 * timer_deneme.c
 *
 * Created: 14.08.2021 21:47:18
 * Author : brehk
 */

#include <avr/io.h>
#include <stdlib.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile int saniye,sayac;

ISR(TIM0_COMPA_vect)
{
    sayac++;
    if(sayac>42)
    {
        sayac=0;
        saniye++;   
    }
    
}

int main(void)
{
    DDRB |=1<<3;
    PORTB=0;
    OCR0A=210; //
    TCCR0A |= (1<<WGM01); // CTC timer sayacı OCR0A ile eşitlendiğinde timer sıfırlanır
    TCCR0B |= 0b101;//prescaler 0b101 için 1024
    TIMSK0 |= 1<<OCIE0A;    // OCR0A timer sayacı eşitlenmesinde kesmeyi etkinleştirir.
    sei();
    
    while (1)
    {
        if(saniye>4)
        {
            saniye=0;
            PORTB^=(1<<3);
            
        }
        
            
            
    }
}
 
Süre sorunu daha çok overflow durumuna benziyor, saniye sinyali veren bir kesme ayarlayıp saniye saydırabilirsin. kalibrasyonu da timer'ın registerlerinden yapılabilir. Tamamen aylaklıktan, kabaca kronometre tutarak elimdeki bir attiny13'e 9.6MHZ dahili osilatörle saniye değişkenini her saniye artıracak bir kesme hazırladım. PORTB3'e bağlı ledle sınıyor zamanlayıcıyı.
timer deneme:
/*
 * timer_deneme.c
 *
 * Created: 14.08.2021 21:47:18
 * Author : brehk
 */

#include <avr/io.h>
#include <stdlib.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile int saniye,sayac;

ISR(TIM0_COMPA_vect)
{
    sayac++;
    if(sayac>42)
    {
        sayac=0;
        saniye++;  
    }
   
}

int main(void)
{
    DDRB |=1<<3;
    PORTB=0;
    OCR0A=210; //
    TCCR0A |= (1<<WGM01); // CTC timer sayacı OCR0A ile eşitlendiğinde timer sıfırlanır
    TCCR0B |= 0b101;//prescaler 0b101 için 1024
    TIMSK0 |= 1<<OCIE0A;    // OCR0A timer sayacı eşitlenmesinde kesmeyi etkinleştirir.
    sei();
   
    while (1)
    {
        if(saniye>4)
        {
            saniye=0;
            PORTB^=(1<<3);
           
        }
       
           
           
    }
}
Bunlar arduino kodu değil. Bunu kullanabilmek için başka program yüklemek lazım sanırım.

Çipleri breadboarda tak-çıkar, sürekli jumper tak - sök yapmaktan sıkıldım. Arduino için bir tane shield çizdim. Yarın baskı devresini yapacağım. Sonra özdisandan bulabilirsem entegre siparişi vereceğim ve sonra devam edeceğim bu işe.
 
Sonra da aynı sayfadaki blink kodunu aldım, ama setup fonksiyonunda OSCCAL registerine değer yazdım.

C++:
void setup() {
  OSCCAL = 0x4c;
 // initialize pin 4 (ATtiny leg 3) as an output.
 pinMode(4, OUTPUT);
}
void loop() {
 digitalWrite(4, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);             // wait for a second
 digitalWrite(4, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);             // wait for a second
}
 
Sonra da osiloskop ile LED'yi süren çıkış pininde peryot ölçümü yaptım. OSCCAL'de değişik değerler verdiğimde peryodun da olması gereken 2 saniyeden saptığını gördüm. Benim ATTiny13A da 2 saniyeye en yakın değeri veren OSCCAL ayarı 0x4C oldu. Şu anda peryot hatası %0.3

a.png
 
60 saiyeye kadar delay doğru çalışıyor, ondan daha büyük delay'ler çalışmıyor :)
 
60 saiyeye kadar delay doğru çalışıyor, ondan daha büyük delay'ler çalışmıyor :)
Çalışmıyor derken, bu entegrelerden zamanlama konusunda ümidi keselim mi diyorsun abi?
Sadece pinleri aç kapa olarak mı kullanılır?
 
İlginç, delay fonksiyonunun dokümantasyonu unsigned long alıyor diyor, ama gerçekte unsigned int alıyor gibi. Dolayısıyla 65535 den daha büyük olan delay'ler yanlış çalışıyor.
 
Çalışmıyor derken, bu entegrelerden zamanlama konusunda ümidi keselim mi diyorsun abi?
Sadece pinleri aç kapa olarak mı kullanılır?

Ümidi kesecek bir durum yok, olayın aslını anlamak lazım.
 

Forum istatistikleri

Konular
5,843
Mesajlar
99,667
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top