RTV forum PL | NewsGroups PL

Dlaczego ATmega88 zawiesza się podczas używania opóźnień w kodzie AVR?

Czemu ATMEGA88 sie wiesza ?

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Dlaczego ATmega88 zawiesza się podczas używania opóźnień w kodzie AVR?

bagno
Guest

Sun Jun 28, 2009 10:47 am   



Witam.

Pod AVR Studio 4.14 testuje takie cos :

#include <avr/io.h>
#include <util/delay.h>

void del()
{
_delay_ms(109);
}

int main(void)
{
DDRB = 0xFF;
while(1)
{
del();
PORTB ^= 1;
PORTB ^= 2;
del();
PORTB ^= 4;
del();
PORTB ^= 8;
}
return 0;
}

No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8; jeszcze
jednego del(); wiesza w tym miejscu procesor. Jest to w sumie tylko 1
przyklad jak go mozna zawiesic. Nie zmienialem w nim nic oprocz dzielenia
zegara przez 8.

Wie ktos co z nim moze byc ? Probowalem w sumie tez zupelnie innego
kompilatora i bylo dokladnie to samo. Testuje to na plytce ZL2AVR.

bagno
Guest

Sun Jun 28, 2009 11:03 am   



bagno wrote:

Quote:
No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8; jeszcze
jednego del(); wiesza w tym miejscu procesor.

to dziala:
while (1)
{
del();
PORTB ^= 1;
PORTB ^= 2;
del();
del();
PORTB ^= 4;
del();
PORTB ^= 8;
}

a to chyba wisi na ostatnim del():
while (1)
{
del();
PORTB ^= 1;
PORTB ^= 2;
del();
PORTB ^= 4;
del();
PORTB ^= 8;
}

to wisi na jedynym del():
while (1)
{
del();
PORTB ^= 8;
}

bagno
Guest

Sun Jun 28, 2009 12:00 pm   



mw158979 wrote:
Quote:
"bagno" <bagno@o2.pl> schrieb
No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8;
jeszcze jednego del(); wiesza w tym miejscu procesor.

A co masz podpiete pod te MOSI/PB3?
Moze przypadkiem programator, bezposrednio?

Probowalem rozne linie roznych portow i zawsze to samo. A programator nie
powinen miec wplywu bo sa bufory
miedzy nim a komputerem (TTL 244). Chyba nie sprawdzilem co bedzie jak go
odepne. Przeszedlem teraz na ATMEGA8
i przez chwile mialem wrazenie, ze sie tak samo miesza. Ale doprowadzilem do
porzadku wszystkie
ustawienia i wyglada na to, ze na ATMEGA8 dziala. Chociaz na 100% pewny nie
jestem czy sie
zaraz nie zacznie znowu wieszac.

Zauwazylem, ze najbardziej sie wieszalo przy krotkich czasach opoznien. Jak
zmienialem tam na delay_ms(100) to
sie raczej nie wieszalo. Pojecia nie mam co z tym jest.

mw158979
Guest

Sun Jun 28, 2009 12:05 pm   



"bagno" <bagno@o2.pl> schrieb
Quote:
No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8; jeszcze
jednego del(); wiesza w tym miejscu procesor.

A co masz podpiete pod te MOSI/PB3?
Moze przypadkiem programator, bezposrednio?

hej

mw158979
Guest

Sun Jun 28, 2009 12:26 pm   



"bagno" <bagno@o2.pl> schrieb
Quote:
mw158979 wrote:
"bagno" <bagno@o2.pl> schrieb
No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8;
jeszcze jednego del(); wiesza w tym miejscu procesor.

A co masz podpiete pod te MOSI/PB3?
Moze przypadkiem programator, bezposrednio?

Probowalem rozne linie roznych portow i zawsze to samo. A programator nie
powinen miec wplywu bo sa bufory

To zalezy czy programator zechce je wylaczyc.
Niby powinien, ale najprostszym sposobem
na sprawdzenie jest odlaczenie.

Po czym poznajesz, ze sie wiesza?

hej

bagno
Guest

Sun Jun 28, 2009 12:35 pm   



mw158979 wrote:
Quote:
"bagno" <bagno@o2.pl> schrieb
mw158979 wrote:
"bagno" <bagno@o2.pl> schrieb
No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8;
jeszcze jednego del(); wiesza w tym miejscu procesor.

A co masz podpiete pod te MOSI/PB3?
Moze przypadkiem programator, bezposrednio?

Probowalem rozne linie roznych portow i zawsze to samo. A
programator nie powinen miec wplywu bo sa bufory

To zalezy czy programator zechce je wylaczyc.
Niby powinien, ale najprostszym sposobem
na sprawdzenie jest odlaczenie.

Po czym poznajesz, ze sie wiesza?

Po tym , ze przestaje wykonywac program. Mam podpiete diodki i widze gdzie
sie zatrzymuje.

dziadek Ben
Guest

Sun Jun 28, 2009 1:31 pm   



Quote:
Ale juz na przyklad dodanie po linii PORTB ^= 8; jeszcze jednego del();
wiesza w tym miejscu procesor.

Twojego przypadku to pewnie nie dotyczy, ale może będzie przestrogą dla
innych - dodanie instrukcji wywalało mi programy (wieszały się lub szły w
krzaki) w dwóch przypadkach:
- gdy nie zdążałem na czas odświeżyć Watchdoga,
- gdy w procedurze dałem PUSH bez POP-a (lub na odwrót).

--
dziadek Ben
[z adresu wytnij co trzeba]

J.F.
Guest

Sun Jun 28, 2009 4:18 pm   



On Sun, 28 Jun 2009 11:47:22 +0200, bagno wrote:
Quote:
No i dziala. Ale juz na przyklad dodanie po linii PORTB ^= 8; jeszcze
jednego del(); wiesza w tym miejscu procesor.

A zagladales w kod ? Moze jakas glupote wygenerowal.

J.

T.M.F.
Guest

Sun Jun 28, 2009 4:44 pm   



Quote:
Wie ktos co z nim moze byc ? Probowalem w sumie tez zupelnie innego
kompilatora i bylo dokladnie to samo. Testuje to na plytce ZL2AVR.

Kompilujesz na jakim poziomie optymalizacji? -O0 czy -Os?
Delay nie moze byc kompilowana z -O0.
Pokaz wydenerowany kod w assemblerze.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

bagno
Guest

Sun Jun 28, 2009 5:47 pm   



Użytkownik "T.M.F." <tmf@nospam.mp.pl> napisał w wiadomości
news:h2838o$472$2@atlantis.news.neostrada.pl...
Quote:
Wie ktos co z nim moze byc ? Probowalem w sumie tez zupelnie innego
kompilatora i bylo dokladnie to samo. Testuje to na plytce ZL2AVR.

Kompilujesz na jakim poziomie optymalizacji? -O0 czy -Os?
Delay nie moze byc kompilowana z -O0.
Pokaz wydenerowany kod w assemblerze.

Ustawione jest -Os

Kod:

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000080 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .debug_aranges 00000020 00000000 00000000 000000d4 2**0
CONTENTS, READONLY, DEBUGGING
2 .debug_pubnames 00000023 00000000 00000000 000000f4 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_info 00000136 00000000 00000000 00000117 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_abbrev 000000cb 00000000 00000000 0000024d 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_line 0000014f 00000000 00000000 00000318 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_frame 00000030 00000000 00000000 00000468 2**2
CONTENTS, READONLY, DEBUGGING
7 .debug_str 000000bf 00000000 00000000 00000498 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
0: 12 c0 rjmp .+36 ; 0x26 <__ctors_end>
2: 2c c0 rjmp .+88 ; 0x5c <__bad_interrupt>
4: 2b c0 rjmp .+86 ; 0x5c <__bad_interrupt>
6: 2a c0 rjmp .+84 ; 0x5c <__bad_interrupt>
8: 29 c0 rjmp .+82 ; 0x5c <__bad_interrupt>
a: 28 c0 rjmp .+80 ; 0x5c <__bad_interrupt>
c: 27 c0 rjmp .+78 ; 0x5c <__bad_interrupt>
e: 26 c0 rjmp .+76 ; 0x5c <__bad_interrupt>
10: 25 c0 rjmp .+74 ; 0x5c <__bad_interrupt>
12: 24 c0 rjmp .+72 ; 0x5c <__bad_interrupt>
14: 23 c0 rjmp .+70 ; 0x5c <__bad_interrupt>
16: 22 c0 rjmp .+68 ; 0x5c <__bad_interrupt>
18: 21 c0 rjmp .+66 ; 0x5c <__bad_interrupt>
1a: 20 c0 rjmp .+64 ; 0x5c <__bad_interrupt>
1c: 1f c0 rjmp .+62 ; 0x5c <__bad_interrupt>
1e: 1e c0 rjmp .+60 ; 0x5c <__bad_interrupt>
20: 1d c0 rjmp .+58 ; 0x5c <__bad_interrupt>
22: 1c c0 rjmp .+56 ; 0x5c <__bad_interrupt>
24: 1b c0 rjmp .+54 ; 0x5c <__bad_interrupt>

00000026 <__ctors_end>:
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63
2a: cf e5 ldi r28, 0x5F ; 95
2c: d4 e0 ldi r29, 0x04 ; 4
2e: de bf out 0x3e, r29 ; 62
30: cd bf out 0x3d, r28 ; 61

00000032 <__do_copy_data>:
32: 10 e0 ldi r17, 0x00 ; 0
34: a0 e6 ldi r26, 0x60 ; 96
36: b0 e0 ldi r27, 0x00 ; 0
38: e0 e8 ldi r30, 0x80 ; 128
3a: f0 e0 ldi r31, 0x00 ; 0
3c: 02 c0 rjmp .+4 ; 0x42 <.do_copy_data_start>

0000003e <.do_copy_data_loop>:
3e: 05 90 lpm r0, Z+
40: 0d 92 st X+, r0

00000042 <.do_copy_data_start>:
42: a0 36 cpi r26, 0x60 ; 96
44: b1 07 cpc r27, r17
46: d9 f7 brne .-10 ; 0x3e <.do_copy_data_loop>

00000048 <__do_clear_bss>:
48: 10 e0 ldi r17, 0x00 ; 0
4a: a0 e6 ldi r26, 0x60 ; 96
4c: b0 e0 ldi r27, 0x00 ; 0
4e: 01 c0 rjmp .+2 ; 0x52 <.do_clear_bss_start>

00000050 <.do_clear_bss_loop>:
50: 1d 92 st X+, r1

00000052 <.do_clear_bss_start>:
52: a0 36 cpi r26, 0x60 ; 96
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <.do_clear_bss_loop>
58: 0c d0 rcall .+24 ; 0x72 <main>
5a: 10 c0 rjmp .+32 ; 0x7c <_exit>

0000005c <__bad_interrupt>:
5c: d1 cf rjmp .-94 ; 0x0 <__vectors>

0000005e <del>:
#include <avr/io.h>
#include <util/delay.h>

void del()
{
5e: 88 ee ldi r24, 0xE8 ; 232
60: 93 e0 ldi r25, 0x03 ; 3
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
62: 28 ec ldi r18, 0xC8 ; 200
64: 30 e0 ldi r19, 0x00 ; 0
66: f9 01 movw r30, r18
68: 31 97 sbiw r30, 0x01 ; 1
6a: f1 f7 brne .-4 ; 0x68 <del+0xa>
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
6c: 01 97 sbiw r24, 0x01 ; 1
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
6e: d9 f7 brne .-10 ; 0x66 <del+0x8>
_delay_ms(100);
}
70: 08 95 ret

00000072 <main>:

int main(void)
{
72: 8f ef ldi r24, 0xFF ; 255
74: 84 bb out 0x14, r24 ; 20
DDRC = 0xFF;
while(1)
{
PORTC = 0;
76: 15 ba out 0x15, r1 ; 21

PORTC = 255;
78: 85 bb out 0x15, r24 ; 21
7a: fd cf rjmp .-6 ; 0x76 <main+0x4>

0000007c <_exit>:
7c: f8 94 cli

0000007e <__stop_program>:
7e: ff cf rjmp .-2 ; 0x7e <__stop_program>

Zbych
Guest

Sun Jun 28, 2009 5:56 pm   



bagno pisze:

Quote:
while(1)
{
PORTC = 0;
76: 15 ba out 0x15, r1 ; 21

PORTC = 255;
78: 85 bb out 0x15, r24 ; 21
7a: fd cf rjmp .-6 ; 0x76 <main+0x4

Ten kod nijak się ma do kodu, który pokazałeś w swoim pierwszym poście.
A jeśli nawet tak prosty program ci nie działa, to musisz mieć coś
zwalone w sprzęcie. Pokaż schemat.

--
przeciez moje rozumowanie bylo bez skazy,
no sam bym wskoczyl do tego wulkanu,
ale kto by tak pieknie gwizdal...

bagno
Guest

Sun Jun 28, 2009 7:54 pm   



Użytkownik "Zbych" <abuse@onet.pl> napisał w wiadomości
news:h287d8$a9d$1@news.mm.pl...
Quote:
bagno pisze:

while(1)
{
PORTC = 0;
76: 15 ba out 0x15, r1 ; 21

PORTC = 255;
78: 85 bb out 0x15, r24 ; 21
7a: fd cf rjmp .-6 ; 0x76 <main+0x4

Ten kod nijak się ma do kodu, który pokazałeś w swoim pierwszym poście.

Moze faktycznie to byla jakas wersja po przerobkach. To co tu wczesniej
wklejalem to byl najkrotszy
kod powodujacy zawieszanie a potem robilem rozne inne testy.

Quote:
A jeśli nawet tak prosty program ci nie działa, to musisz mieć coś zwalone
w sprzęcie. Pokaż schemat.

http://www.btc.pl/pdf/zl2avr.pdf

Tam nie ma co byc zepsute. Chyba, ze to w jakis sposob nie wspolpracuje z ta
ATMEGA88. Na ATMEGA8 na razie
chodzi.

T.M.F.
Guest

Sun Jun 28, 2009 8:12 pm   



W dniu 28.06.2009 20:54, bagno pisze:
Quote:
Uytkownik "Zbych"<abuse@onet.pl> napisa w wiadomoci
news:h287d8$a9d$1@news.mm.pl...
bagno pisze:

while(1)
{
PORTC = 0;
76: 15 ba out 0x15, r1 ; 21

PORTC = 255;
78: 85 bb out 0x15, r24 ; 21
7a: fd cf rjmp .-6 ; 0x76<main+0x4
Ten kod nijak si ma do kodu, ktry pokazae w swoim pierwszym pocie.

Moze faktycznie to byla jakas wersja po przerobkach. To co tu wczesniej
wklejalem to byl najkrotszy
kod powodujacy zawieszanie a potem robilem rozne inne testy.

Ale to co tu wkleiles niczego nie zawiesza - z jakiegos powodu petla sie
skasowala i masz naprzemiennie z pelna predkoscia wystawiane na port 0 i
255, a ze tak kilka mln razy na sekunde to migania diody nie widzisz.
Pokaz prawdziwy przyklad robiacy problemy zamiast sciemy.

Quote:

A jeli nawet tak prosty program ci nie dziaa, to musisz mie co zwalone
w sprzcie. Poka schemat.

http://www.btc.pl/pdf/zl2avr.pdf

Tam nie ma co byc zepsute. Chyba, ze to w jakis sposob nie wspolpracuje z ta
ATMEGA88. Na ATMEGA8 na razie
chodzi.

Jak rozumiem na tej plytce zamieniles ATMega8 na ATMega88?
Tu masz liste roznic pomiedzy tymi procesorami:
http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf
Rozumiem, ze w AVR Studio wybrales wlasciwy procesor jako target, znaczy
ATMega88?
Zauwaz, ze roznice sa spore, w tym fuse bitow. Takze nie mozesz po
prostu przelozyc procesora, zaladowac ten sam kod i liczyc, ze zadziala.



--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

bagno
Guest

Wed Jul 01, 2009 9:39 pm   



Użytkownik "T.M.F." <tmf@nospam.mp.pl> napisał w wiadomości
news:h28ftu$441$1@nemesis.news.neostrada.pl...
Quote:
W dniu 28.06.2009 20:54, bagno pisze:
U?ytkownik "Zbych"<abuse@onet.pl> napisa? w wiadomo?ci
news:h287d8$a9d$1@news.mm.pl...
bagno pisze:

while(1)
{
PORTC = 0;
76: 15 ba out 0x15, r1 ; 21

PORTC = 255;
78: 85 bb out 0x15, r24 ; 21
7a: fd cf rjmp .-6 ; 0x76<main+0x4
Ten kod nijak si? ma do kodu, kt?ry pokaza?e? w swoim pierwszym po?cie.

Moze faktycznie to byla jakas wersja po przerobkach. To co tu wczesniej
wklejalem to byl najkrotszy
kod powodujacy zawieszanie a potem robilem rozne inne testy.

Nic z tego nie rozumiem. Zmontowalem to drugi raz i na razie dziala. Nie
wiem co bylo nie tak.

elektroda NewsGroups Forum Index - Elektronika Polska - Dlaczego ATmega88 zawiesza się podczas używania opóźnień w kodzie AVR?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map