Treker (Damian Szymański) Listopad 4, 2019 Udostępnij Listopad 4, 2019 @Anek40 pokaż to co masz, tak będzie łatwiej 🙂 Początek z DDRB i PORTB gotowy? 2 Cytuj Link do komentarza Share on other sites More sharing options...
Anek40 Listopad 4, 2019 Udostępnij Listopad 4, 2019 (edytowany) .nolist .include "tn2313adef.inc"; kwarc16 MHz ,64/64 sekund .list .cseg .org 0 ;wyłączenie przerwań cli ;załadowanie adresu końca pamięci ldi R16, LOW(RAMEND) out SPL, R16 ;ustawienie kierunków transmisji, PB3 i PB4 jako wyjście sbi DDRB, 3 sbi DDRB, 4 main: nop nop ;ustawienie PB3 w wysoki stan logiczny sbi PORTB, 3 ;ustawienie PB4 w niski stan logiczny cbi PORTB, 4 ;wywołanie opóźnienia rcall delay ;ustawienie PB3w niski stan logiczny cbi PORTB, 3 ;ustawienie PB4 w wysoki stan logiczny sbi PORTB, 4 ;wywołanie opóźnienia rcall delay ;powrót do etykiety main rjmp main Edytowano Listopad 4, 2019 przez Anek40 Cytuj Link do komentarza Share on other sites More sharing options...
Anonim Listopad 4, 2019 Udostępnij Listopad 4, 2019 Taka podpowiedź: skompiluj sobie ten kod i zobacz plik *.lss w edytorze. najlepiej bez optymalizacji wtedy wszystko ładnie widać. dbg - stabs. _delay_us() jest w w avrlibc, do generowania odpowiedniego (+/-) opóźnienia użyty tam jest specjalny algorytm. Cytuj Link do komentarza Share on other sites More sharing options...
Anek40 Listopad 4, 2019 Udostępnij Listopad 4, 2019 (edytowany) Takie mi wyszło dissasembly kodu w j.C skompilowałem na AVR 5.1 , drugi kod w ASM działa na uC. Jak w drugim kodzie zmieniać wartość delay. chodzi mi o zmniejszenie kodu w ASM ,napisanie go inaczej jak wyszło z dissasembly kodu w j.C. ------------------------------------------------------------------------------------------- plik lss A tu plik lss DELAY 1 C.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000064 00000000 00000000 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .stab 000006b4 00000000 00000000 000000b8 2**2 CONTENTS, READONLY, DEBUGGING 2 .stabstr 00000090 00000000 00000000 0000076c 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_aranges 00000020 00000000 00000000 000007fc 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_pubnames 0000001b 00000000 00000000 0000081c 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_info 0000014a 00000000 00000000 00000837 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_abbrev 000000f3 00000000 00000000 00000981 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_line 000001bd 00000000 00000000 00000a74 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_frame 00000020 00000000 00000000 00000c34 2**2 CONTENTS, READONLY, DEBUGGING 9 .debug_str 00000110 00000000 00000000 00000c54 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_pubtypes 0000002b 00000000 00000000 00000d64 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 14 c0 rjmp .+40 ; 0x2a <__ctors_end> 2: 19 c0 rjmp .+50 ; 0x36 <__bad_interrupt> 4: 18 c0 rjmp .+48 ; 0x36 <__bad_interrupt> 6: 17 c0 rjmp .+46 ; 0x36 <__bad_interrupt> 8: 16 c0 rjmp .+44 ; 0x36 <__bad_interrupt> a: 15 c0 rjmp .+42 ; 0x36 <__bad_interrupt> c: 14 c0 rjmp .+40 ; 0x36 <__bad_interrupt> e: 13 c0 rjmp .+38 ; 0x36 <__bad_interrupt> 10: 12 c0 rjmp .+36 ; 0x36 <__bad_interrupt> 12: 11 c0 rjmp .+34 ; 0x36 <__bad_interrupt> 14: 10 c0 rjmp .+32 ; 0x36 <__bad_interrupt> 16: 0f c0 rjmp .+30 ; 0x36 <__bad_interrupt> 18: 0e c0 rjmp .+28 ; 0x36 <__bad_interrupt> 1a: 0d c0 rjmp .+26 ; 0x36 <__bad_interrupt> 1c: 0c c0 rjmp .+24 ; 0x36 <__bad_interrupt> 1e: 0b c0 rjmp .+22 ; 0x36 <__bad_interrupt> 20: 0a c0 rjmp .+20 ; 0x36 <__bad_interrupt> 22: 09 c0 rjmp .+18 ; 0x36 <__bad_interrupt> 24: 08 c0 rjmp .+16 ; 0x36 <__bad_interrupt> 26: 07 c0 rjmp .+14 ; 0x36 <__bad_interrupt> 28: 06 c0 rjmp .+12 ; 0x36 <__bad_interrupt> 0000002a <__ctors_end>: 2a: 11 24 eor r1, r1 2c: 1f be out 0x3f, r1 ; 63 2e: cf ed ldi r28, 0xDF ; 223 30: cd bf out 0x3d, r28 ; 61 32: 02 d0 rcall .+4 ; 0x38 <main> 34: 15 c0 rjmp .+42 ; 0x60 <_exit> 00000036 <__bad_interrupt>: 36: e4 cf rjmp .-56 ; 0x0 <__vectors> 00000038 <main>: #include <avr/io.h> #include <util/delay.h> main() { DDRB = (1<<PB3)|(1<<PB4); 38: 88 e1 ldi r24, 0x18 ; 24 3a: 87 bb out 0x17, r24 ; 23 PORTB|=(1<<PB3); 3c: c3 9a sbi 0x18, 3 ; 24 while(1) { PORTB ^= (1<<PB3)|(1<<PB4); 3e: 98 e1 ldi r25, 0x18 ; 24 40: 88 b3 in r24, 0x18 ; 24 42: 89 27 eor r24, r25 44: 88 bb out 0x18, r24 ; 24 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); 46: 24 e5 ldi r18, 0x54 ; 84 48: 35 e8 ldi r19, 0x85 ; 133 4a: 45 e4 ldi r20, 0x45 ; 69 4c: 51 e0 ldi r21, 0x01 ; 1 4e: 21 50 subi r18, 0x01 ; 1 50: 30 40 sbci r19, 0x00 ; 0 52: 40 40 sbci r20, 0x00 ; 0 54: 50 40 sbci r21, 0x00 ; 0 56: d9 f7 brne .-10 ; 0x4e <__SREG__+0xf> 58: 00 c0 rjmp .+0 ; 0x5a <__SREG__+0x1b> 5a: 00 c0 rjmp .+0 ; 0x5c <__SREG__+0x1d> 5c: 00 00 nop 5e: f0 cf rjmp .-32 ; 0x40 <__SREG__+0x1> 00000060 <_exit>: 60: f8 94 cli 00000062 <__stop_program>: 62: ff cf rjmp .-2 ; 0x62 <__stop_program> .NOLIST .INCLUDE "TN2313ADEF.INC" ; kwarc16 MHz ,64/64 sejkund RJMP PC+0x0015 RJMP PC+0x001A RJMP PC+0x0019 RJMP PC+0x0018 RJMP PC+0x0017 RJMP PC+0x0016 RJMP PC+0x0015 RJMP PC+0x0014 RJMP PC+0x0013 RJMP PC+0x0012 RJMP PC+0x0011 RJMP PC+0x0010 RJMP PC+0x000F RJMP PC+0x000E RJMP PC+0x000D RJMP PC+0x000C RJMP PC+0x000B RJMP PC+0x000A RJMP PC+0x0009 RJMP PC+0x0008 RJMP PC+0x0007 CLR R1 OUT 0x3F,R1 LDI R28,0xDF OUT 0x3D,R28 RCALL PC+0x0003 RJMP PC+0x0016 RJMP PC-0x001B LDI R24,0x18 OUT 0x17,R24 SBI 0x18,3 LDI R25,0x18 IN R24,0x18 EOR R24,R25 OUT 0x18,R24 LDI R18,0x54 LDI R19,0x85 LDI R20,0x45 LDI R21,0x01 SUBI R18,0x01 SBCI R19,0x00 SBCI R20,0x00 SBCI R21,0x00 BRNE PC-0x04 RJMP PC+0x0001 RJMP PC+0x0001 NOP;No operation RJMP PC-0x000F CLI RJMP PC-0x0000 Edytowano Listopad 4, 2019 przez Anek40 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
RFM Listopad 9, 2019 Udostępnij Listopad 9, 2019 Dnia 15.09.2012 o 20:54, kermit napisał: Teraz UWAGA ,bardzo ważna zaleta asemblera – ucząc się tego języka, tak naprawdę uczymy się nie tylko języka, ale też architektury samego mikrokotnrolera A ucząc się C, C++ nie poznajemy architektury? Jest magiczna funkcja uruchamiająca timer? Masz sporo błędów i widać nie za bardzo znasz Assembler i arhitektórę AVR. Zanim zabrałeś się za napisanie tego niby kursu powinieneś zapoznać się z https://wydawnictwo.btc.pl/elektronika/197738-sztuka-programowania-mikrokontrolerow-avr-podstawy-e-book.html W swoim kursie wyskakujesz od opisu komend zamiast najpierw pokazać organizacje pamięci itp np według spisu treści http://dl.btc.pl/btc_dl/p197738-spavr1_spis_tresci.pdf 1 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Listopad 12, 2019 Udostępnij Listopad 12, 2019 @RFM to temat, który był założony ponad 7 lat temu - zgłaszanie uwag w tej chwili chyba już wiele nie zmieni. Artykuł nie był doskonały, ale wiele osób z niego skorzystało. Jeśli masz ochotę na stworzenie nowej wersji takiego kursu to zachęcam do pisania 😉 Cytuj Link do komentarza Share on other sites More sharing options...
RFM Listopad 12, 2019 Udostępnij Listopad 12, 2019 10 minut temu, Treker napisał: o temat, który był założony ponad 7 lat temu Nie zwróciłem uwagi na datę był na pierwszym miejscu. 11 minut temu, Treker napisał: Jeśli masz ochotę na stworzenie nowej wersji takiego kursu to zachęcam do pisania Po co? To jakby robić kurs Bascom albo lepiej, ASM Z-80. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Ilor287 Kwiecień 28, 2023 Udostępnij Kwiecień 28, 2023 Szybkie pytanie odnośnie jak zaprogramować avr ogólnie mikrokontrolery. Robię projekt zapewne dobrze znany useless box, tylko właśnie jest zamiennik zamiast Arduino jest mikrokontroler (dokładnie atmega16). Problem jest z wysterowaniem serwomechanizmu, daje sygnał o częstotliwości 50Hz(20ms) i wypełnieniu odpowiednio 1ms(90°), 1.5(ms0°) i 2ms(-90°). Dokładnie takie mam sygnały na wyjściu atmeg-i ale nic się nie dzieje, natomiast jak analizowałem przebieg sygnału z Arduino to sygnał wyjściowy był nie zmienny nawet jak zmieniałem wypełnienie potencjometrem i wynosiło ok.15ms,i przy takim sygnale servo normalnie działało. Działam na Microchip studio, próbowałem też dodać bibliotekę z Arduino ale nie działało, prawdopodobnie mogłem coś źle zrobić, bo nie znalazłem dobrej strony opisującej tą operację, a samemu to już nie mam siły. Cytuj Link do komentarza Share on other sites More sharing options...
spider4 5 lutego Udostępnij 5 lutego Jak dla mnie bardzo obiecujący artykuł. Z niecierpliwością czekam na kolejne częsci. Cytuj Link do komentarza Share on other sites More sharing options...
Santiago 5 lutego Udostępnij 5 lutego Proszę spojrzeć na datę tego 'kursu' Cytuj Link do komentarza Share on other sites More sharing options...
spider4 5 lutego Udostępnij 5 lutego Taaak, spojrzałem już po napisaniu komentarza... Bardzo szkoda, bo już miałem nadzieję... Cytuj Link do komentarza Share on other sites More sharing options...
Krysom 19 lutego Udostępnij 19 lutego Oto książka, z której korzystałem "AVR Programming: Nauka pisania oprogramowania dla sprzętu" Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!