AVR Studio ve enteresan bir hata

Başlatan fatihvelid, 01 Ağustos 2008, 10:29:00

fatihvelid

AVR Studio(versiyon 4.14) ile ilk defa çalışıyorum. Yaşadığım enteresan problemi sizlerle paylaşmak istedim. Aşağıda verdiğim C kodunda bir problem göremiyorum. Kodun sonuna gelene kadar programın durmasına yada uart portuna yazma işlemini aniden kesmeine sebep hiç bir şey göremiyorum.

Derleyiciden kaynaklanan problem midir acaba? Fuse ayarlarından kaynaklanabilir mi(sanmıyorum ama)?

#include "global.h"

#define UART_BAUD_RATE      19200
int main(void)
{  
    unsigned long a;
	uart_init(UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU)); 
	sei();	
	for(a=0;a<1000000;a++){
		asm("nop");
	}; 	
		#ifdef _DEBUG_MAIN_
			uart_putc(07);
			rprintfInit(uart_putc);
			uart_puts("  DEBUG STARTING 0 \r\n");
			rprintf("UART INSTALLED\r\n");
			uart_putc(07);
		#endif
	init_Tmr1ISR();	
		#ifdef TEST_PERFORMANCE_TOOL
			{
			unsigned int count;
			//start_counter();
			uart_putc(07);
			uart_puts("TEST PERFORMANCE 1 \r\n");
			//count = stop_counter(); // Running Duration sount*100us
			rprintf("TEST PERFORMANCE  2  x100 us\r\n");//,count);
			uart_puts("TEST PERFORMANCE  3 \r\n");
			uart_putc(07);
			}
		#endif//TEST_PERFORMANCE_TOOL
rprintf("DEBUG FINISHED 4 \a\r\n");
uart_putc(07);
uart_puts("FINISHED  5 \a\r\n");
uart_putc(07);
return(0);
}



String Çıktısı





Hex Çıktısı

Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

picusta

init_Tmr1ISR();
'den süpheleniyorum.
satiri kaldir, veya düzgün bir ISR yaz.

fatihvelid

Alıntı yapılan: "picusta"init_Tmr1ISR();
'den süpheleniyorum.
satiri kaldir, veya düzgün bir ISR yaz.

Daha önce satırı kaldırıp denemiştim. Değişen birşey olmadı maalesef.
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

picusta

Emin olmak için sei() yerine cli() yaz. Baska bir interrupt giriyordur belki.
Her zaman ayni yerde mi takiliyor?
Bastaki döngüyü :
a=0;a<1000000;a++
yerine a<2000000 yap ne oluyor ?
peki ya 500000 ?
yine ayni yerde mi takiliyor ?
Watchdog ne durumda?

iyonosfer

rpirntf() fonksiyonunda "\a" kullanımı problem yapıyor olabilir mi?
Blog Sayfam: www.teknobakis.com

fatihvelid

Alıntı yapılan: "picusta"Emin olmak için sei() yerine cli() yaz. Baska bir interrupt giriyordur belki.
Her zaman ayni yerde mi takiliyor?
Bastaki döngüyü :
a=0;a<1000000;a++
yerine a<2000000 yap ne oluyor ?
peki ya 500000 ?
yine ayni yerde mi takiliyor ?
Watchdog ne durumda?

Yukarıda anlattıklarınızın hepsini teker teker denedim. Başlangıçtaki bekleme süresini değiştirdiğim halde yine aynı yerde takılıyor. (5.000.000 bile yaptım)

Uart'in çalışması için interruptin açık olması gerekiyor. Interruptları kapattıktan sonrakileri yazdırmadı, zaten yazdırmaması gerekiyordu.

Proje dosyalarını picroje paylaşım alanımıza, "Picproje Kodlar" klasörü altında "Atmega128 Uart Debug example.rar " adlı bir dosya olarak upload ettim.
http://www.4shared.com/account/file/57358993/1067b6d2/Atmega128_Uart_Debug_example.html
adresinden indirebilirsiniz.

Aşağıdaki programla Fuse ayarlarını yapıp, programlıyorum. Watchdog kapalı.



Alıntı yapılan: "iyonosfer"rpirntf() fonksiyonunda "\a" kullanımı problem yapıyor olabilir mi?

Denedim.Değişen birşey olmadı.
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

leblebitozu

return yerine sonsuz bir döngü koy ya da uart buffer'i flush et.

fatihvelid

Alıntı yapılan: "leblebitozu"return yerine sonsuz bir döngü koy ya da uart buffer'i flush et.

Teşekkürler. Enteresan ama "return 0" dan önce sonsuz döngu koyunca herşey normale döndü. sonsuz döngü olmayınca program sapıtıyor. İlk defa böyle birşeyle karşılaşıyorum.

PIC'de programın sonuna sonsuz döngü koymadığımda, program çalışmasını bitirdiğinde reset atıyordu. AVR ise sapıtıyor.

İlginiz için teşekkürler
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

leblebitozu

Aslında normal hardware uart kullanıyorsun ve uart buffer daki verilerini gönderemeden program sonlanıyor.

fatihvelid

Alıntı yapılan: "leblebitozu"Aslında normal hardware uart kullanıyorsun ve uart buffer daki verilerini gönderemeden program sonlanıyor.

Normalde mikrokontroller için yazdığım her programın sonunda sonsuz döngü koymayı alışkanlık haline getirmiştim. Burda gözümden kaçtığı gibi sebebinide anlayamadım. Bu durum PIC'te olsaydı program bitince sürekli reset atardı.
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...

fatihvelid

Yukarıdaki aynı programa DDRD |= _BV(3); komutunu ekledikten sonra seri porttan herhangi bir data alamıyorum.

PORTD'nin 3.pinini çıkış yaptığımda, programın durmasına yada seri porttan data göndermesine engel ne olabilir ki? Bu pinin özelliği
INT3 ve Usart1 için TX olması.

INT3 kapalı, seri port için Usart0'i kullanıyorum.

Sebebini anlamadım.

AVR konusunda acemiyim :).

Bir fikriniz var mı?
Kainatta her canlı "DNA" diliyle yazılmış bir programdır...