WinAVR i rejestry ATmegi

May 24, 2005 13 Replies

Mam w swoim projekcie w WinAVR dwa pliki: main.c i a.c. W funkcji main wywoluje funkcje void A_Init(void). plik main.c: #include <avr/io.h>



#include "a.h"



void main (void){ A_Init(); // inicjalizacja; ... // dalsza czesc programu }



plik a.c: #include <avr/io.h>



void A_Init(void){ UCSR1C = (3<<UCSZ0)|(2<<UPM0); UCSR1B = 1<<TXEN;



... // dalsze linie funkcji }



plik a.h void A_Init(void);



Funkcja A_Init zawiera kilka linii ustawiajacych stany w rejestrach mikrokontrolera Atmega128. Problem polega na tym, ze jesli nie zaremuje wszystkich takich linii w tej funkcji (odwolujacych sie do rejestrow mikrokontrolera) program nie opuszcza funkcji i nie wraca do main(). Po zaremowaniu ich, wpisalem w tej funkcji linie inkrementacji wewnetrznej zmiennej ... program dzialal prawidlowo. Oczywiscie oba pliki *.c sa zadeklarowane w pliku makefile, tam tez ustawiony jest typ mikrokontrolera... . Moze wiecie co sie dzieje? Mikrokontrolery w jezyku C programuje od wielu lat ale to jest moj pierwszy program w WinAVR i nie wiem juz co robic. Z gory dziekuje za pomoc Jacek



Spróbuj: extern void A_Init(void);

Pozdrawiam

Niestety to nie to. Zrobiolem eksperyment i przenioslem te funkcje i umiescilem ja w jednym pliku z funkcja main(). Poniewaz teraz jest ona powyzej main() nie potrzebuje dekalracji. Sytuacja jest bez zmian tzn. w funkcji wywolywanej z main() gdy A_Init nie odwoluje sie do rejestrow mikrokontrolera wszystko jest w porzadku a jesli to robi; program nie wraca do main() i idzie w maliny. Na poczatku plikow gdzie odwoluje sie do zasobow mikrokontrolera umieszczona jest linia: #include <avr/io.h> . Przeciez to definiuje jego zasoby. Juz zglupialem. Moze pomoze mi ktos bardziej doswiadczony ode mnie... Jacek M.

U¿ytkownik "dom on" snipped-for-privacy@gazeta.KROPKA.pl> napisa³ w wiadomo¶ci news:d7045h$rnj$ snipped-for-privacy@nemesis.news.tpi.pl...

Niestety to nie to. Wiem, ze problem jest z powrotem programu do miejsca z ktorego funkcja A_Init() byla wywolana. Nadal gdy A_Init() nie odwoluje sie do rejestrow wszystko jest w porzadku. Co ciekawsze, program dochodzi do konca funkcji A_Init(), wiem bo ustawilem tam znacznik. Nawet jesli wczesnej przechodzi przez punkt w ktorym zmienia ustawienia tych rejestrow wszystko jest OK. Jacek M.

ale masz tam return 0; , prawda?

[...]

Przesledz kod asemblerowy generowany przez kompilator. Objawy wskazuja na jezdzenie po stosie i nadpisanie adresu powrotu. Upewnij sie ze masz zadeklarowane poprawnie wszystkie typy, jesli kompilujesz avr-gcc dodaj do opcji -Wall i -pedantic. No i oczywiscie dokladnie przeanalizuj wszystkie warningi i skad sie one biora

pzdr. j.

Nie, poniewaz funkcja jest typu void. Co ciekawsze te znaczniki o ktorych wspominalem sa podobne co do typu i parametrow wejsciowych do A_Init(). Sa to funkcje ktore po prostu migaja ledami. Ustawione w interesujacych mnie miejscach informuja mnie czy program tam doszedl... One rowniez w swoim wnetrzu operuja na rejestrach wewnetrznych, z tym ze na portach wyjsciowych... Juz nic nie rozumiem z tego. Poniewaz jestem na poczatku programu brak mi narzedzi by podejrzec to co dzieje sie na chociazby stosie i licze na Wasze doswiadczenie. Jacek

No, dobra - szukamy dalej:

  1. Jaka to ATmega?
  2. Czy jest prawidłowa deklaracja procesora w makefile?
  3. Czy podczas kompilacji wyrzuca jakieś ostrzeżenia?

Pozdrawiam

W makefile mam linie deklaracji: MCU = atmega128

Nie. Kompilacja konczy sie: > Process Exit Code: 0

W listingach nie ma zadnych ostrzezen ani bledow. Projekt zredukowalem juz do jednego pliku ktory posiada dwie funkcje: int main (void) i void USART1_Init( void )

U¿ytkownik "Jacek M." snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:d707sr$j4p$ snipped-for-privacy@news.onet.pl

formatting link

Po wielu probach okazalo sie, ze problem lezy w zupelnie innym miejscu. Okazalo sie, ze program (chociaz na razie trudno go tak nazwac) zachowuje sie poprawnie jesli zaprogramuje fusa M103C. Jenak nie o emulacje ATmega103 na 128-ce mi chodzi. Chcialbym aby mikrokontroler pracowal poprawnie w trybie 128-ki ale nie wiem co sie dzieje. Programuje w WinAVR i w pliku makefile mam linie definicji mikrokontrolera: MCU = atmega128 Reszta definicji w tym pliku chyba jest poprawna poniewaz w ubozszym trybie program dziala. Pakiet WinAVR jest instalowany dwa miesiace temu. Kompilacja nie sygnalizuje ani bledow, ani ostrzezen. Nie wiem co robic. Moze macie jakies pomysly?

Pomozcie prosze. Pozdrawiam Jacek M.

No i sprawa sie wyjasnila. Uzywalem do programowania mikrokontrolera ATmega128 programatora ISP programmer udostepnionego na liscie przez Adama Dybkowskiego. Tam zaprogramowany fusebit M103C oznaczony jest jako niezaznaczony. Zwrocilem sie do autora z prosba o pomoc i dostalem odpowiedz, ze zaprogramowany fusebit oznaczony jest jako nie zazanczony.Wydawalo mi sie, ze jest dokladnie na odwrotnie, dlatego moje poszukiwania byly bezowocne. Po zaprogramowaniu tego bitu (znacznik w programatorze zaznaczony) wszystko wrocilo do normy. Dziekuje Wam wszystkim za pomoc. Jacek M.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required