WinAVR i rejestry ATmegi

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

Reply to
Jacek M.
Loading thread data ...

Spróbuj: extern void A_Init(void);

Pozdrawiam

Reply to
Marcin Stanisz

może spróbuj dodać #include <avr/signal.h>

Reply to
dom on

ale masz tam return 0; , prawda?

Reply to
Krzysiek Kubicki

[...]

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.

Reply to
Jacek R. Radzikowski

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

Reply to
Jacek M.

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

Reply to
Marcin Stanisz
Reply to
Marek Dzwonnik

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.

Reply to
Jacek M.

zaczalbym od sciagniecia najnowszego winavr

Reply to
Greg

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.