Şimdi Ara

Atmega8 serisi için lütfen yardım edin.Öğrenciyim büyük hocalarıma soru.

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
10
Cevap
0
Favori
737
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Öğrenciyim ve atmel atmega8 serisini C ile programlamaya merak sardım.Program ve derleyici olarak avr stuio 4 ve winavr'yi kullanıyorum.Yapmak istediğim program PB0'nın 18 dk boyunca lojik 1 olmasını sağlamak daha sonrada yine PB0'ın 8 saniye boyunca lojik 0 olarak kalmasını sağlamak işlem sonsuz döngü halinde devam edecektir. yazdığım program şu geciktirme'de takıldım.

    #include <avr/io.h>

    #define F_CPU 4000000UL

    #include <util/delay.h>

    void main()

    {

    DDRB = 0xFF;

    PORTB = 0x00;

    do{

    PORTB = 0x01;

    _delay_ms(1080000);

    PORTB = 0x00;

    _delay_ms(480000);

    }while(1);

    return 0;

    }

    gecikme komutunu düzgün yapamıyorum.Lütfen yardım edin acemiyim yeni öğreniyorum şimdiden çok teşekkür ederim.







  • _delay_ms fonksiyonu ile direkt olarak istediğin kadar bekleme süresi elede edemezsin.
    "The maximal possible delay is 262.14ms /F_CPU in MHz. "
    yani en fazla 262.14/F_CPU (MHz) kadar bekleme verebilirsin. senin F_CPU 4 MHz olduğundan;
    _delay_ms ile verebileceğin en fazla bekleme süren: 262.14/4 = 65.535 ms'dir.

    Bunu aşmak için genelde 1 ms bekleme yapan ayrı bir fonksiyon kullanılır.
     
    void delay_1ms(uint16_t ms) {
    uint16_t i;
    for(i=0;i<ms;i++) _delay_ms(1);
    }

    Fakat senin projende 1080000 ms gibi bir rakam sözkonusu olduğundan, bu da 16 bitlik uint16_t ile verebileceğin maksimum değeri (65535) aştığından
    şöyle yapmak daha uygun olur:
     
    void delay_50ms(uint16_t ms) {
    uint16_t i;
    for(i=0;i<ms;i++) _delay_ms(50);
    }

    böylece senin kod şöyle olur:
     
    #include <avr/io.h>

    #define F_CPU 4000000UL
    #include <util/delay.h>
    void main()
    {
    DDRB = 0xFF;
    PORTB = 0x00;
    do{
    PORTB = 0x01;
    delay_50ms(21600);
    PORTB = 0x00;
    delay_50ms(9600);
    }while(1);
    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi donanimbocek -- 12 Ağustos 2013; 20:03:00 >




  • donanimbocek hocam öncelikle yardımın için teşekkürler.progamının

    delay_50ms(21600); ve

    delay_50ms(9600);

    satırları avr studio ve winavr derleyicisinde hata veriyor.Bi kontrol edermisin
  • delay_50ms fonksiyonunun tanımını main fonksiyonundan öncesine koy.
    ya da main fonksiyonundan önce
    void delay_50ms(uint16_t ms);
    satırını ekle.
  • dediğin satırları ekledim derleyici yine hata verdi.
  • ne hata verdiğini de yazsan iyi olmaz mı?

    aşağıdaki satırlar sorunsuz derleniyor bende.

     
    #include <avr/io.h>
    #include <util/delay.h>

    #define F_CPU 4000000UL

    void delay_50ms(uint16_t ms) {
    uint16_t i;
    for(i=0;i<ms;i++) _delay_ms(50);
    }

    int main(void)
    {
    DDRB = 0xFF;
    PORTB = 0x00;
    do{
    PORTB = 0x01;
    delay_50ms(21600);
    PORTB = 0x00;
    delay_50ms(9600);
    }while(1);
    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi donanimbocek -- 14 Ağustos 2013; 9:10:55 >
  • Hocam zamanlamada yine hata var 4 dk boyunca lojik 1 oluyor.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • simulasyonda değil de gerçek devre üzerinde denedin mi?
  • gerçek devre üzerinde denemedim.Birçok kişi isis'in hata yapmayacağını söylüyor.Benim for döngüsüyle yaptığım yazılımda sadece 1 dk şaşırma oluyo senin program ise 4 dk sonra bitiyor hocam.Zamanlayıcı çok uzun sürede şaşırıyor sanırım.
  • donanım böcek hocam yazılımını board üzerindede denedim zamanlamada hata var. Programı timers ile yazabilirmisin
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.