RTV forum PL | NewsGroups PL

Tytuł: Błąd w obliczeniach z arytmetyką w programie do pomiaru czasu na ATmega128

[avr-gcc] problem z arytmetyka ...

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Tytuł: Błąd w obliczeniach z arytmetyką w programie do pomiaru czasu na ATmega128

Paweł K
Guest

Thu Oct 14, 2004 11:35 am   



Witam,
napisalem prosty programik to liczenia czasu twania
okresu przebiegu prostokatnego na wejscie IC1.
Wyglada jak ponizej:

volatile u16 Counter;
volatile u16 Capture;
volatile u08 Ready;
volatile u08 Start;
volatile u32 Wynik;

int main ( void ) {

ICR1 = 0;
TCNT1 = 0;
TIMSK |= (1<<TICIE1) | (1<<TOIE1);
TCCR1B |= (1<<ICNC1);

#if defined (__AVR_ATmega128__)
// Config IC1 port ATMEGA128
DDRD &= ~(1<<DDD4);
PORTD &= ~(1<<PD4);
#endif

Ready = 0;
Start = 1;
sei();

//----- Program
glowny --------------------------------------------------------
while (1) {

if (Ready == 1) {
Wynik = (u32)Counter * 0x0000FFFF + (u32)Capture;
Ready = 0;
}

}

return 0;
}



SIGNAL(SIG_OVERFLOW1){
TCNT1 = 0;
Counter++;
Ready = 0;
}

SIGNAL(SIG_INPUT_CAPTURE1){
if (Start == 1) {
TCNT1 = 0;
ICR1 = 0;
TCCR1B |= (1<<CS10); //Start Timer1

Counter = 0;
Ready = 0;
Start = 0;
} else {
Capture = ICR1;
TCCR1B &= ~(1<<CS10); //Stop Timer1

Ready = 1;
Start = 1;
}

}

Wycialem procedury wyswietlania wyniku na LCD zeby nie zasmiecac zbytnio.
Jednak zauwazylem ze Counter nie jest mnozona przez 0x0000FFFF i przyjmuje
warosc ujemna
jak rowniez Capture tez jest raz ujemna a raz dodatnia. Ludzie co jest
grane???? Gdzie tkwi blad. Na AVRStudio 4.0
wszystko sie symuluje poprawnie (wrrr).


--

--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

jerry1111
Guest

Thu Oct 14, 2004 6:45 pm   



On Thu, 14 Oct 2004 14:35:14 +0200, "Paweł K" <kpw@qs.pl> wrote:

Quote:
Wynik = (u32)Counter * 0x0000FFFF + (u32)Capture;

Akurat AVR-studio nie znam, ale moze mnozyc przez 0x0ffffL ?


--
Jerry

jerry1111
Guest

Thu Oct 14, 2004 6:51 pm   



On Thu, 14 Oct 2004 21:45:12 +0200, jerry1111
<stop_this_spam_jerry1111_remove@remove.wp.pl> wrote:

Quote:
On Thu, 14 Oct 2004 14:35:14 +0200, "Paweł K" <kpw@qs.pl> wrote:

Wynik = (u32)Counter * 0x0000FFFF + (u32)Capture;

Akurat AVR-studio nie znam, ale moze mnozyc przez 0x0ffffL ?

No i po cholere taka operacja? Bo siakos nie rozumiem.
Napisz po ludzku:
wynik=(counter<<16)-1+capture


--
Jerry

Mister
Guest

Thu Oct 14, 2004 7:31 pm   



Quote:
volatile u16 Counter;
volatile u16 Capture;
volatile u08 Ready;
volatile u08 Start;
volatile u32 Wynik;

int main ( void ) {

ICR1 = 0;
TCNT1 = 0;
TIMSK |= (1<<TICIE1) | (1<<TOIE1);
TCCR1B |= (1<<ICNC1);

#if defined (__AVR_ATmega128__)
// Config IC1 port ATMEGA128
DDRD &= ~(1<<DDD4);
PORTD &= ~(1<<PD4);
#endif

Ready = 0;
Start = 1;
sei();

file://----- Program
glowny --------------------------------------------------------
while (1) {

if (Ready == 1) {
Wynik = (u32)Counter * 0x0000FFFF + (u32)Capture;

A dlaczego mnożysz przez 65535 a nie 65536?
Myślę zę bardziej poprawnie to powinno wyglądać tak:
Wynik = (u32)(Counter) *(u32) (0x10000) + (u32)Capture;

A co znaczy, ze wynik raz jest ujemny raz dodatni? Przecież wynik masz typu
unsigned.

A tak wogóle to kiedy wyliczasz ten Wynik to powinieneś zablokować
przerwania.
Quote:
Capture = ICR1;

Co to jest ICR1 ? rejestr 8 bitowy czy 16 ?

To tak pobieznie...

Pozdrawiam
Mister

Paweł K
Guest

Thu Oct 14, 2004 8:01 pm   



Quote:
A co znaczy, ze wynik raz jest ujemny raz dodatni? Przecież wynik masz
typu
unsigned.
Wyswietlam Wynik na LCD i raz pokazuje sie ujemny a raz dodatni

i nie jest to blad w wyswietlaniu :(

Quote:
A tak wogóle to kiedy wyliczasz ten Wynik to powinieneś zablokować
przerwania.
na wyliczenie mam caly okres przebiegu przed przeklamaniem

oblicznie zabezpiecza mnie if (Ready == 1) ....

Quote:
Co to jest ICR1 ? rejestr 8 bitowy czy 16 ?
16bit




--

--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

EM
Guest

Fri Oct 15, 2004 6:04 am   



Quote:
Wycialem procedury wyswietlania wyniku na LCD zeby nie zasmiecac zbytnio.
Jednak zauwazylem ze Counter nie jest mnozona przez 0x0000FFFF i przyjmuje
warosc ujemna
jak rowniez Capture tez jest raz ujemna a raz dodatnia. Ludzie co jest
grane???? Gdzie tkwi blad. Na AVRStudio 4.0
wszystko sie symuluje poprawnie (wrrr).

Witaj
A skąd wiesz, że wartości są ujemne? Z procedury LCD, która wyświetla
wartości zarówno dodatnie jak i ujemne? Jeżeli w wyniku pojawia się jedynka
na najstarszej pozycji, to liczba może być traktowana jako ujemna. Ogólnie
przyjrzyj się zapisowi heksadecymalnemu i sprawdź, czy wyniki są poprawne.
Pozdr
EM

Mister
Guest

Fri Oct 15, 2004 6:08 am   



Quote:
Wyswietlam Wynik na LCD i raz pokazuje sie ujemny a raz dodatni
i nie jest to blad w wyswietlaniu Sad
Jak nie? widocznie procedura obsługi LCD spodziewa sie signed.

Nic nie piszesz czy poprawienie rzutowania dało efekt.

Quote:
Co to jest ICR1 ? rejestr 8 bitowy czy 16 ?
16bit

Zaraz, czy w Mega 128 można bezpośrednio zapisać rejestr 16 bitowy ?
przecież to procek 8 bitowy.

Mister

Paweł K
Guest

Fri Oct 15, 2004 9:27 am   



Quote:
A skąd wiesz, że wartości są ujemne? Z procedury LCD, która wyświetla
wartości zarówno dodatnie jak i ujemne? Jeżeli w wyniku pojawia się
jedynka
na najstarszej pozycji, to liczba może być traktowana jako ujemna. Ogólnie
przyjrzyj się zapisowi heksadecymalnemu i sprawdź, czy wyniki są poprawne.
W hexie tez sa anomalia ...


--

--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

EM
Guest

Fri Oct 15, 2004 9:47 am   



Quote:
A skąd wiesz, że wartości są ujemne? Z procedury LCD, która wyświetla
wartości zarówno dodatnie jak i ujemne? Jeżeli w wyniku pojawia się
jedynka
na najstarszej pozycji, to liczba może być traktowana jako ujemna.
Ogólnie
przyjrzyj się zapisowi heksadecymalnemu i sprawdź, czy wyniki są
poprawne.


Quote:
W hexie tez sa anomalia ...

Jeszcze raz zapytam
W AVRstudio wszystko jest OK, tzn. wyniki zgodne z oczekiwanymi?
Jeśli tak:
Gdzie wyskakują wartości ujemne? Na LCD?
Jakie anomalia w hexie?
--
Pozdr
EM

Paweł K
Guest

Fri Oct 15, 2004 9:54 am   



Quote:
W AVRstudio wszystko jest OK, tzn. wyniki zgodne z oczekiwanymi?
Jeśli tak:
Gdzie wyskakują wartości ujemne? Na LCD?
Na LCD.
Jakie anomalia w hexie?
np Capture wyswietla 4fc1, Counter c1, a Wynik 4f00.

Sprawdzalem wszystkie warianty zaproponowane przez kolegow w
poprzednich watkach.

--

--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

EM
Guest

Fri Oct 15, 2004 11:13 am   



Quote:
Wynik = (u32)Counter * 0x0000FFFF + (u32)Capture;

np Capture wyswietla 4fc1, Counter c1, a Wynik 4f00.

Podstawmy i obliczmy:
Wynik powinien być C14F00
-> wniosek - liczba obcięta do typu u16 (a nie np. brak monożenia przez
FFFF)

Procedura LCD nie obsługuje liczb u32 poprawnie?
--
Pozdr
EM

Paweł K
Guest

Fri Oct 15, 2004 12:35 pm   



Quote:
Procedura LCD nie obsługuje liczb u32 poprawnie?
do wyswietlania uzywam stdio.h i printf ();


--

--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

Mister
Guest

Fri Oct 15, 2004 12:51 pm   



Quote:
do wyświetlania uzywam stdio.h i printf ();


A dopisujesz l?

np. printf("%lx", Wynik);


Mister

Paweł K
Guest

Fri Oct 15, 2004 1:46 pm   



Quote:
np. printf("%lx", Wynik);
bylo, ale pogrzebalem w makefile i all dziala !! big tx.


--

--
Best regards
K@pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

elektroda NewsGroups Forum Index - Elektronika Polska - Tytuł: Błąd w obliczeniach z arytmetyką w programie do pomiaru czasu na ATmega128

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map