ATMEGA16A AU UART PROBLEMI

Başlatan alikilavuz, 25 Mart 2012, 13:47:06

alikilavuz

Merhaba,

ATMEGA16A AU kullandığım bir kartım var. Şimdiye kadar problemsiz olarak bilgisayardan uart ile haberleşebiliyordum.

Internal 8Mhz OSC kullanıyorum.  Ve avrdude DOS penceresinden " dump cal " komutu ile aldığım son byte değerini main.c kaynak kodunun içerisine OSCCAL = 0x.. şeklinde yazıyordum. (38400 baud 8N1 no parity) Şimdiye kadar bir problemim yoktu.

Ancak en son dizdiğim 50 karttan 45 tanesinde seri haberleşme hatası alıyorum. Program çalışırken init kısmında seri olarak bazı karakterler gönderiyorum.HyperTerminal programı ile bakıyorum saçma sapan karakterler geliyor ekrana. (Ama dediğim gibi kartlardan sorunsuz olanlar da var. Aynı kod aynı ayarlarla.)

Bu arada işlemci diğer fonksiyonlarını yerine getiriyor.Devre çalışıyor. Sadece uart da bir problem var.

Acaba  nerede hata var. OSCCAL değerini yanlış mı yazıyorum. Entegrede başka ince ayarlar mı var? Kafam çok karışık. (ATMEL den soğumaya başladım iyice :(( )

Şimdiden çok teşekkür eder, saygılar dilerim.




arm-beginner

#1
Merhaba

Usart ile haberleşme yapacaksan, internal RC-oszilatör ile bu biraz kumara benzer. Atmel bu frekansı 5V ve 25 derece için +/- %1 ile garanti ediyor. Isı veya voltaj değiştikce, frekansda değişiyor.
Bu arada: OSCCAL değerini neye göre değiştiriyorsun?


parda

Sistematik bir hatadan dolayı çalışmıyorsa ve siz bunu keşvetseniz bile size nacizane tavsiyem, değil atmel hiç bir işlemcide RC osc ile kritik zamanlama yapmayınız 1000 kart uretirsiniz çalışır 1001. çalışmaz mevsim değişir çalışmaz, İzmir de çalışır Erzurum'a gönderirsin çalışmaz.
Bildiğim tek şey, hiç bir şey bilmediğimdir.

alikilavuz

Merhaba,

Kodlarda Clean yapıp tekar make ettiğimde sorun çözüldü. Derleyicinin kafası karıştı galiba.

Ama bu dediğiniz olay biraz kafama takıldı. Benim grafik lcd kullandığım ve i2c haberleşmesiyle kontrol ettiğim 24C512 ve DS1307 entegresinin takılı olduğu bir devre kartım var. Sorunum şu : Cihaz çalışıyor fakat bazen 2 gün sonra bazen 1 ay sonra (belli olmuyor) ekran donuyor güç sökülüp takılıdığında tekrar çalışmaya başlıyor deniyor. Kod içinde while döngüsü olan yerler vardı o yüzden mi acaba dedim. Bütün while döngülerini kaldırdım. Ama yine aynı problem oldu.

Çok sıkıntıdayım. Bir türlü problemi çözemedim. Orada da Internal OSC kullanıyorum. Acaba bu dediğiniz sebepten mi ?

Çok teşekkürler

Saygılarla,

bocek

#4
siz söyleyince aklıma geldi. benim de kendi yaptığım bir led matris ve lcd göstergeli saat var. dediğiniz gibi bazen (çok nadiren) ekranın donduğunu görüyorum. gücü kesip tekrar takınca düzeliyor. benimki amatör işi olduğundan sıkıntı yapmıyorum tabii. ama şimdi ilgimi çekti bu konu.
benimkinde işlemci atmega8, internal osc kullanıyor, saat entegresi olarak pcf8583 takılı ve bu pcf8583'ü 3V'luk bir saat pili destekliyor.
i2c ile haberleşmede bir sıkıntı olabilir. frekanstaki kaymalar i2c baud ayarını bozuyor olabilir. işlemci, saat entegresinden bir cevap gelmesini bekliyor ve orada takılı kalıyor olabilir. çünkü ekran donduğunda sanıyorsunuz ki saat durdu, ama öyle olmuyor gücü kesip takınca saat doğru değeri göstermeye başlıyor. kullandığınız i2c kütüphanesini paylaşabilirseniz belki bir fikir gelir aklımıza.

ayrıca işinize yararsa OSCCAL ile ilgili atmelin bir uygulama notu var şurda:
http://www.atmel.com/Images/doc2555.pdf
notlarda osilatör kalibrasyonunun nasıl yapılacağı ayrıntılı anlatılıyor. notlarda adı geçen firmware dosyalarını da şurda bulabilirsiniz:
http://www.mikrocontroller.net/attachment/22128/AVR053.ZIP

1 ya da 0. işte 'bit'ün mesele..

bocek

şurda da aynı problemle karşılaşmış birisi:
http://www.mikrocontroller.net/topic/233822
eleman JTAG ile yaptığı testlerde programın şurda:
while(!(TWCR & (1<<TWINT)));

takılı kaldığnı saptamış. sorunu aşmak için de:
// wait until transmission completed or timeout
   i2c_timeout_flag = 0;
   while( !(!(TWCR & (1<<TWINT)) || i2c_timeout_flag>3) );

i2c_timeout_flag diye bir değişken tanımlamış ve onu kullanmış. bu sefer de programın belirsiz yerlere dallandığnı görmüş.
bazen de şurda:
        // wait until stop condition is executed and bus released
        while(TWCR & (1<<TWSTO));

takılı kalıyormuş.

cevaplayanlardan birisi 'i2c sniffer' devresi önermiş.
bir başkası da i2cc baud rate değerinin gereğinden hızlı olabileceğini söylemiş. ds1307 max 100 KHz'e kadar destekler demiş.
senin baud rate ayarında bir sorun olabilir.
dediğim gibi senin kodlardan i2c kısmını paylaşırsan daha rahat yardımcı olabiliriz.
1 ya da 0. işte 'bit'ün mesele..

alikilavuz

Merhaba,

Daha önce de ben bu problemi yazmıştım. 24C512 ve DS1307 paralel olarak i2c portuna bağlıydı. 4K7 pullup dirençler i2c de takılıydı.
Denemelerimde gördüğüm kadarıyla 24C512 den 0xD1 datasını okurken takılma oluyordu. (0xD1 DS1307 'nin slave adresi) External 8 Mhz kristal taktım yine dondu.

Daha sonra 4K7 pullup dirençlerini 1K2 yapınca donma kalktı ya da öyle göründü. Daha sonra kod içerisindeki while döngülerini kaldırdım ama fayda vermedi. İşin kötü tarafı devre 24 saat açık kalan bir devre ve ne zaman donacağı belli olmuyor. Hemen farkedilmemesi çok kötü. Tıpkı gizli bir virüs gibi :((

Ya bir diğer kartımda da sadece 24C512 var. Yani DS1307 yok devrede. Onda da aynı problem var.

Ne yapacağımı şaşırdım. DS1307 takılı olmayan devremin kodlarını yolluyorum. İnşallah siz birşey bulabilirsiniz.

https://hotfile.com/dl/151799434/b2e5112/Devre.rar.html

Saygılarla,

alikilavuz

Merhaba ,

Yalnız bu gönderdiğim kodlara ait devre şemasında i2c uçlarında harici pull-up direnç yok. ATMEL'in dahili pull-up dirençlerini kullanıyorum.

O sıkıntı yapabilir mi ?

Saygılarla,

Kabil ATICI

İşlemcinin iç pull up dirençlerinin değeri yüksek geliyor olabilir. Yinede harici olarak 10K gibi değerler ile pull up kullanmanızda  yarar var.

Ds1307 ile oluşturduğum devrelerde i2c hataları olabileceği öngörüsü ile i2c bağlantısını ilk açıldığında işlemciye saat verisi almak için ve ayar yapıldıktan sonra saat verisini ds1307 göndermek için kullandım.
Saatin referenas sinyali bacağını kullanarak saatin sayma işlemi işlemci üzerinde yaptım. 8-9 ay boyunca denemem sonucunda herhangi bir takılma olmadı.
Sadece ilk 1-2 hafta içinde 32KHz kristalden kaynaklanan hatalar yaşadım. Kristali değiştirdikten sonra sorunsuz çalıştı. (bilgisayar anakartından sökülen kristaller)
ambar7

bocek

kodları inceledim şu husus gözüme çarptı:
i2c.c dosyasında i2Init fonksiyonunda
i2cSetBitrate(I2C_SPEED_KHz);		// set i2c bit rate to 200KHz

şeklinde bir satır var.
açıklamada 200KHz demiş ama I2C_SPEEDD_KHz'nin değeri;
i2cconf.h dosyasında
#define I2C_SPEED_KHz		400

olarak verilmiş. bunun sonucunda i2cSetBitrate fonksiyonunda;
// calculate bitrate division	
	bitrate_div = ((F_CPU/1000)/bitrateKHz);
	if(bitrate_div >= 16)
		bitrate_div = (bitrate_div-16)/2;
		TWBR = bitrate_div;

TWBR=2 olarak hesaplanıyor. atmega16 datasheet 172. sayfada TWBR'nin 10'dan küçük olması sorunlara yol açar demiş.

#define I2C_SPEED_KHz		200

yaparsan TWBR=12 oluyor ki bu da uygun bir değer.

belki senin sorunun bundan kaynaklanmıyordur ama bunu da düzeltmekte fayda var. dene bakalım sonucu paylaşırsın.
1 ya da 0. işte 'bit'ün mesele..

alikilavuz

Dediğiniz ifadeye baktım datasheet te ama bulamadım.

O değeri 200 olarak düzelteyim dediğiniz gibi. Ama netice hemen belli olmayacaktır. Dediğim gibi ne zaman donacağı belli olmuyor zıkkımın.
  Başka göze çarpan birşeyler bulabilirseniz kodlarda çok duacı olurum.

Saygılarla,

bocek

datasheet'te 'Bit Rate Generator Unit' başlığında, altta not olarak yazılmış.
Bir de:
pascal stang ta değerli bir abimiz ama peter fleury'nin i2c kütüphanesini kullansan daha mı iyi olur ne ?:)
1 ya da 0. işte 'bit'ün mesele..

alikilavuz

Ya benim devrede işlemci saçma sapan bir yere dallanıyor, orada da takılıyor diyelim.

Peki bu ATMEGA16 'da PIC de olduğu gibi bir WDT yok mudur? Mesela işlemci böyle saçma sapan bir yere dallanınca kendini resetleyeceği bir çözüm yok mudur acaba?

Saygılarla,

mufitsozen

tabiiki var,

http://www.atmel.com/Images/doc2466.pdf

WDTCR (Watch Dog timer Control Registeri) kullanarak kontrol edebilirsiniz. Usteki dokumanda c ve asm ile orneklerde var (sayfa 44)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

bocek

1 ya da 0. işte 'bit'ün mesele..