Czemu ATMEGA88 sie wiesza ?

Jun 28, 2009 13 Replies

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.



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; }

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.

"bagno" snipped-for-privacy@o2.pl schrieb

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

hej

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

Po czym poznajesz, ze sie wiesza?

hej

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

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).

A zagladales w kod ? Moze jakas glupote wygenerowal.

J.

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

U¿ytkownik "T.M.F." snipped-for-privacy@nospam.mp.pl> napisa³ w wiadomo¶ci news:h2838o$472$ snipped-for-privacy@atlantis.news.neostrada.pl...

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>

bagno pisze:

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.

U¿ytkownik "Zbych" snipped-for-privacy@onet.pl napisa³ w wiadomo¶ci news:h287d8$a9d$ snipped-for-privacy@news.mm.pl...

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.

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

W dniu 28.06.2009 20:54, bagno pisze:

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.

Jak rozumiem na tej plytce zamieniles ATMega8 na ATMega88? Tu masz liste roznic pomiedzy tymi procesorami:

formatting link
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.

U¿ytkownik "T.M.F." snipped-for-privacy@nospam.mp.pl> napisa³ w wiadomo¶ci news:h28ftu$441$ snipped-for-privacy@nemesis.news.neostrada.pl...

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required