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.
 
ATTiny'yi ben de kurdum şimdi breadboard'a. Şuradaki prosedürü takip ettim:


IMG_20210815_010646.jpg
 
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
 
ATTiny'yi ben de kurdum şimdi breadboard'a. Şuradaki prosedürü takip ettim:


12979 eklentisine bak
Benim uyguladığım adımların pin bağlantılarına kadar aynısı. Burada tek farklı gördüğüm ben osccal değerini int yazdım, sen hex yazmışsın.

Bir de 30dk lık bir led yakar mısın? Bakalım bendeki gibi 15dk da bırakacak mı saymayı.
 
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.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,957
Mesajlar
118,808
Üyeler
2,825
Son üye
karahanli7

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top