Witam mam następujący problem.
Mam banalny program napisany w C w programie AVR Studio v4.13 dla procesora ATMega64 - moje pierwsze kroki z tym środowiskiem. I mam dosyć spory kłopot a mianowicie w kodzie:
#include <avr/io.h>
#include <util/delay.h>
#define SET_DIODE PORTD|=0x10
#define CLR_DIODE PORTD&=0xEF
#define SET_BIP PORTC|=0x80
#define CLR_BIP PORTC&=~0x80
void bip(void)
{
SET_BIP;
_delay_loop_2(100); <- w tym miejscu program się wysypuje
CLR_BIP;
}
int main (void)
{
DDRD=0x10;
DDRC=0x80;
while(1)
{
_delay_loop_2(2000);
SET_DIODE;
bip(); <- wywołanie sprawiające problem
_delay_loop_2(2000);
CLR_DIODE;
}
return 1;
}
W momencie wywołania procedury bip() wszystko co jest dalej - a dokładnie już procedurze bip() - podczas obsługi funkcji opóźniającej program przerywa działanie i skacze na początek pętli while(1).
Nie wiem co jest grane i dlaczego się tak dzieje - symulator pokazuje poprawne działanie programu.
Próbowałem napisać samemu jakąś funkcję opóźniającą typu:
void delay(int x)
{
do {
asm("nop;");
while (x--)
}
Od razu napiszę, że zauważyłem że jak zamiast wstawienia pętli opóźniającej wstawię pojedyncze asm("nop;"); to program działa poprawnie.
Mam ustawioną optymalizację kodu na -O0 - chyba jest to brak optymalizacji, dlatego nie wiem co jeszcze może być nie tak.
Boję się że jest to efekt przegrzania procka - był przelutowywany, a w poprzedniej konfiguracji odwrotnie zamontowany.
Jeżeli ma ktoś pomysł co może być nie tak - w kodzie lub może trzeba jeszcze odpowiednio skonfigurować AVR Studio to prosiłbym o pomoc.
ps. wie ktoś może jaki jest maksymalny poziom zagłębienia pętli?
Z góry dziękuję za wszelką pomoc
Mam banalny program napisany w C w programie AVR Studio v4.13 dla procesora ATMega64 - moje pierwsze kroki z tym środowiskiem. I mam dosyć spory kłopot a mianowicie w kodzie:
#include <avr/io.h>
#include <util/delay.h>
#define SET_DIODE PORTD|=0x10
#define CLR_DIODE PORTD&=0xEF
#define SET_BIP PORTC|=0x80
#define CLR_BIP PORTC&=~0x80
void bip(void)
{
SET_BIP;
_delay_loop_2(100); <- w tym miejscu program się wysypuje
CLR_BIP;
}
int main (void)
{
DDRD=0x10;
DDRC=0x80;
while(1)
{
_delay_loop_2(2000);
SET_DIODE;
bip(); <- wywołanie sprawiające problem
_delay_loop_2(2000);
CLR_DIODE;
}
return 1;
}
W momencie wywołania procedury bip() wszystko co jest dalej - a dokładnie już procedurze bip() - podczas obsługi funkcji opóźniającej program przerywa działanie i skacze na początek pętli while(1).
Nie wiem co jest grane i dlaczego się tak dzieje - symulator pokazuje poprawne działanie programu.
Próbowałem napisać samemu jakąś funkcję opóźniającą typu:
void delay(int x)
{
do {
asm("nop;");
while (x--)
}
Od razu napiszę, że zauważyłem że jak zamiast wstawienia pętli opóźniającej wstawię pojedyncze asm("nop;"); to program działa poprawnie.
Mam ustawioną optymalizację kodu na -O0 - chyba jest to brak optymalizacji, dlatego nie wiem co jeszcze może być nie tak.
Boję się że jest to efekt przegrzania procka - był przelutowywany, a w poprzedniej konfiguracji odwrotnie zamontowany.
Jeżeli ma ktoś pomysł co może być nie tak - w kodzie lub może trzeba jeszcze odpowiednio skonfigurować AVR Studio to prosiłbym o pomoc.
ps. wie ktoś może jaki jest maksymalny poziom zagłębienia pętli?
Z góry dziękuję za wszelką pomoc