Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: alikilavuz - 25 Mart 2012, 13:47:06

Başlık: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 25 Mart 2012, 13:47:06
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.



Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: arm-beginner - 29 Mart 2012, 19:57:45
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?

Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: parda - 30 Mart 2012, 10:13:50
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.
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 02 Nisan 2012, 14:12:29
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,
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: bocek - 02 Nisan 2012, 15:03:02
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 (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 (http://www.mikrocontroller.net/attachment/22128/AVR053.ZIP)

Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: bocek - 02 Nisan 2012, 15:36:31
şurda da aynı problemle karşılaşmış birisi:
http://www.mikrocontroller.net/topic/233822 (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.
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 02 Nisan 2012, 15:39:44
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,
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 02 Nisan 2012, 15:50:12
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,
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: Kabil ATICI - 02 Nisan 2012, 16:25:50
İş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)
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: bocek - 02 Nisan 2012, 16:34:41
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.
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 02 Nisan 2012, 16:58:08
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,
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: bocek - 02 Nisan 2012, 17:07:19
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 ?:)
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 02 Nisan 2012, 18:33:03
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,
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: mufitsozen - 02 Nisan 2012, 19:01:34
tabiiki var,

http://www.atmel.com/Images/doc2466.pdf (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)
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: bocek - 02 Nisan 2012, 19:08:15
asıl uygulama notları burda:
AVR132: Using the Enhanced Watchdog Timer
http://www.atmel.com/Images/doc2551.pdf (http://www.atmel.com/Images/doc2551.pdf)
kodları da burda:
http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=754&showinfo=1 (http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=754&showinfo=1)
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 02 Nisan 2012, 22:14:48
Merhaba,

Ben şu linki buldum ama daha basit gibi görünüyor. Hem de atmega16 için. Bir deneyeceğim. Bir de zaten avr gcc kütühanesinde avr/wdt.h diye hazır fonksiyonlar varmış.

http://www.engineersgarage.com/embedded/avr-microcontroller-projects/avr-watchdog-timers-circuit (http://www.engineersgarage.com/embedded/avr-microcontroller-projects/avr-watchdog-timers-circuit)

Saygılarla,
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: alikilavuz - 03 Nisan 2012, 12:43:38
Merhaba, 

main.c kodumu şu şekilde değiştirdim. Doğru mudur acaba? Bu şekilde arızalı olan yere götürüp takacağım. Umarım donma,takılma problemi kaybolur.

Saygılarla,


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/stdlib.h>
#include <avr/wdt.h>
#include "uart.h"
#include "display.h"
#include "init.h"
#include "timer.h"
#include "convert.h"
#include "hc165.h"
#include "version.h"
#include "rprintf.h"
#include "serial.h"
#include "delay.h"
static signed char floor;
static unsigned char state;

int main(void)
{
   
   uint8_t old_timer_value = 0;
   delay_us(7);
   wdt_enable(WDTO_2S);
   wdt_reset();
   OSCCAL =0x9C;
   

   init();
   wdt_reset();

   while(1)
   {
      wdt_reset();
      if(uartGetRxBufferLength() > 3)
         serial_main_func();
      wdt_reset();
      if( (counter_tmr2 ^ old_timer_value) & _BV(0))
      {
         wdt_reset();
         old_timer_value = counter_tmr2;
         
         state = convert_databus(hc165_scan(),&floor);
         delay_us(7);
         
         if(state == LIFT_TEST)
            display_test(hc165_scan());
         else
            display(state,floor);
         wdt_reset();
      }
      else
      {
         old_timer_value = counter_tmr2;
         wdt_reset();
      }
   
   }
}
Başlık: Ynt: ATMEGA16A AU UART PROBLEMI
Gönderen: arm-beginner - 04 Nisan 2012, 08:42:33
wdt_reset() bu kadar sık kullanmanın bir anlamı yok.

Ben şahsen çok kritik olmayan uygulamalarda Watchdog-Timer'ı 1 - 2 saniye ayarlıyorum. Ve programın sadece main-loop'un  tek bir yerinde wdt_reset() komutunu kullanıyorum.

Sadece kritik olan uygulamalarda Watchdog-Timer süresini düşürmek zorunda kaldığım için, yoğun hesaplamaların veya uzun süren haberleşmelerin başına bir wdt_reset() koymak zorunda kalıyorum. Ama bunlar istisnalar.

Eklenti: Programı geliştirirken Watchdog'u hiç bir zaman devreye sokman. Herşey bitikden sonra ve herşey normal çalışdığından emin oldukdan sonra Watchdog can-simiti olarak aktif hale getirilir.