Goto page 1, 2 Next
Wojtek
Guest
Wed Sep 28, 2005 6:35 pm
Witam,
mam program który zlicza czas za pomocą timer0 i generowanego przez
niego przerwania (kwarc mam 3.2768MHz). Wygląda to w skrócie tak:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/sfr_defs.h>
int sekunda=0;
SIGNAL(SIG_OVERFLOW0)
{
static int i=0;
i++;
if (i==50)
{
sekunda++;
if (sekunda==60)
{
sekunda=0;
}
i=0;
}
}
int main (void)
{
sei();
DDRB=0xff;
PORTB=0xff;
TCCR0=4;
TIMSK|=(1<<TOIE0);
TCNT0=0;
for (;
{
PORTB=sekunda;
}
return (0);
}
pytanie brzmi: dlaczego to nie działa? Jak w procedurze obsługi
przerwania zamienię sekunda na PORTB to już jest ok.
dziękuję z góry za pomoc
Wojtek
Andy
Guest
Wed Sep 28, 2005 6:51 pm
Użytkownik "Wojtek" napisał w wiadomości
Quote:
Witam,
mam program który zlicza czas za pomocą timer0 i generowanego przez
niego przerwania (kwarc mam 3.2768MHz). Wygląda to w skrócie tak:
#include <inttypes.h
#include <avr/io.h
#include <avr/interrupt.h
#include <avr/signal.h
#include <avr/sfr_defs.h
int sekunda=0;
SIGNAL(SIG_OVERFLOW0)
{
static int i=0;
i++;
if (i==50)
{
sekunda++;
if (sekunda==60)
{
sekunda=0;
}
i=0;
}
}
int main (void)
{
sei();
DDRB=0xff;
PORTB=0xff;
TCCR0=4;
TIMSK|=(1<<TOIE0);
TCNT0=0;
for (;
{
PORTB=sekunda;
}
return (0);
}
pytanie brzmi: dlaczego to nie działa? Jak w procedurze obsługi
przerwania zamienię sekunda na PORTB to już jest ok.
to chyba klasyczny problem
powinno byc:
volatile int sekunda=0;
--
Andrzej
Wojtek
Guest
Wed Sep 28, 2005 7:03 pm
dzięki, przyznam się że pisze w c juz ładnych kilka lat (PC) i nigdy
jeszcze nie musiałem użyć volatile, dlatego taki pomysł nawet nie
przyszedł mi do głowy :)
pozdrawiam
Wojtek
Wojtek
Guest
Wed Sep 28, 2005 7:51 pm
a może jeszcze ktoś wie dlaczego wszystkie diody świecą prawidłowo
oprócz tych podłączonych do pinów portu C: PC2(TCK) PC5(TDI)
pozdrawiam
wojtek
Andy
Guest
Wed Sep 28, 2005 7:52 pm
Użytkownik "Wojtek" napisał w wiadomości
Quote:
dzięki, przyznam się że pisze w c juz ładnych kilka lat (PC) i nigdy
jeszcze nie musiałem użyć volatile, dlatego taki pomysł nawet nie
przyszedł mi do głowy :)
Ja z kolei nie pisze zbyt duzo na PC'ta
ale chyba jesli siega sie do tych samych zasobow (np jakiejs zmiennej)
np z dwoch roznych watkow to zasob musi byc typu volatile.
W przeciwnym wypadku program moze dzialac ale nie musi
i to bedzie zalezalo od kompliatora oraz ustawien optymalizacji.
--
Andrzej
Andy
Guest
Wed Sep 28, 2005 7:53 pm
Użytkownik "Wojtek" napisał w wiadomości
Quote:
a może jeszcze ktoś wie dlaczego wszystkie diody świecą prawidłowo
oprócz tych podłączonych do pinów portu C: PC2(TCK) PC5(TDI)
byc moze masz aktywny fuse od JTAG
a jesli tak to piny te sa zarezerwowane do komunikacji z JTAG'iem
--
Andrzej
Wojtek
Guest
Wed Sep 28, 2005 8:09 pm
Andy wrote:
Quote:
Uytkownik "Wojtek" napisa w wiadomoci
a moe jeszcze kto wie dlaczego wszystkie diody wiec prawidowo
oprócz tych podczonych do pinów portu C: PC2(TCK) PC5(TDI)
byc moze masz aktywny fuse od JTAG
a jesli tak to piny te sa zarezerwowane do komunikacji z JTAG'iem
w rzeczy samej

dzięki!
wojtek
Piotr Pitucha
Guest
Thu Sep 29, 2005 4:12 am
Użytkownik "Wojtek" napisał w wiadomości
Quote:
Witam,
mam program który zlicza czas za pomocą timer0 i generowanego przez
niego przerwania (kwarc mam 3.2768MHz). Wygląda to w skrócie tak:
#include <inttypes.h
#include <avr/io.h
#include <avr/interrupt.h
#include <avr/signal.h
#include <avr/sfr_defs.h
int sekunda=0;
for (;
{
PORTB=sekunda;
}
pytanie brzmi: dlaczego to nie działa? Jak w procedurze obsługi
przerwania zamienię sekunda na PORTB to już jest ok.
Według mnie dlatego że przypisujesz wartość int do PORTB a to jest byte
......
Zmień deklarację sekundy i powinno iść.
Pozdrawiam Piotr
Miłosz K.
Guest
Thu Sep 29, 2005 7:23 am
Piotr Pitucha napisał(a):
Quote:
Według mnie dlatego że przypisujesz wartość int do PORTB a to jest byte
.....
Zmień deklarację sekundy i powinno iść.
Pozdrawiam Piotr
To akurat nie ma zadnego znaczenia, bo w przerwaniu sekunda zmienia się
od 0 do 59 ( czyli w zakresie byte ), a w przypisaniu PORTB=sekunda
kompilator sam zadba o konwersję typu.
--
Miłosz Kłosowicz
------------------------------------------------
AVR : ISP,JTAG,moduły prototypowe (USB,CAN)
TYPO3: projekty, webhosting, sklepy internetowe
->
http://www.miklobit.com
------------------------------------------------
A.Grodecki
Guest
Thu Sep 29, 2005 10:01 am
Użytkownik Piotr Pitucha napisał:
.....
Quote:
pytanie brzmi: dlaczego to nie działa? Jak w procedurze obsługi
przerwania zamienię sekunda na PORTB to już jest ok.
.....
Według mnie dlatego że przypisujesz wartość int do PORTB a to jest byte
.....
Zmień deklarację sekundy i powinno iść.
......
Tak się zastanawiam, czytając liczne wątki na temat C z zastosowaniach
dla mikokontrolerów, na ile pisanie programu ma za cel wykonanie
urządzenia o konkretnych funkcjach a na ile pokonywanie schodów
leksykalnych języka i widzimisię mniej lub bardziej NIEDOROBIONEGO
cross-kompilatora:

))))))))))
--
Pozdrawiam,
A. Grodecki
Piotr Pitucha
Guest
Thu Sep 29, 2005 10:39 am
Użytkownik "A.Grodecki" napisał w wiadomości
Quote:
Tak się zastanawiam, czytając liczne wątki na temat C z zastosowaniach
dla mikokontrolerów, na ile pisanie programu ma za cel wykonanie
urządzenia o konkretnych funkcjach a na ile pokonywanie schodów
leksykalnych języka i widzimisię mniej lub bardziej NIEDOROBIONEGO
cross-kompilatora:

))))))))))
Może i masz rację, ale zmiany w procesorach są większe niż w kompilatorach,
daję sobie jako tako radę a nie znam kompletnie asemblera żadnego z
procesorów którym się bawię
Pozdrawiam
Adam Dybkowski
Guest
Thu Sep 29, 2005 6:04 pm
Wojtek wrote:
Quote:
byc moze masz aktywny fuse od JTAG
a jesli tak to piny te sa zarezerwowane do komunikacji z JTAG'iem
w rzeczy samej
Szczesliwie w wielu ATmegach interfejs JTAG mozna wylaczyc programowo
aby te piny wykorzystac do innych celow (tak jest m.in. z portem F w
procesorze ATmega128).
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
Jaroslaw Berezowski
Guest
Sat Oct 01, 2005 6:40 pm
Dnia Wed, 28 Sep 2005 21:51:57 +0200, Andy napisał:
Quote:
sekunda++;
if (sekunda==60)
{
sekunda=0;
}
i=0;
}
to chyba klasyczny problem
powinno byc:
volatile int sekunda=0;
Do tego jeszcze mozna tak:
++sekunda %= 60;
:)
--
Jaroslaw "Jaros" Berezowski
Adam Dybkowski
Guest
Sat Oct 01, 2005 7:32 pm
Jaroslaw Berezowski wrote:
Quote:
Do tego jeszcze mozna tak:
++sekunda %= 60;
Ja wole to samo dajacy a IMHO bardziej zrozumialy zapis:
sekunda = (sekunda + 1) % 60;
Inna sprawa, ze wiekszosc malo rozgarnietych kompilatorow (w tym pewnie
i gcc) zastosuje w tym miejscu czasochlonna operacje obliczania reszty z
dzielenia. Rozwiazanie poczatkowe (z if'em) zadziala szybciej.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
J.F.
Guest
Sat Oct 01, 2005 10:57 pm
On Sat, 01 Oct 2005 21:40:10 +0200, Jaroslaw Berezowski wrote:
Quote:
Do tego jeszcze mozna tak:
++sekunda %= 60;
Eee - mozna tak ?
J.
Goto page 1, 2 Next