Skocz do zawartości
kermit

[Kurs] Programowanie mikrokontrolerów AVR w języku assembler - część 1

Pomocna odpowiedź

@Anek40 pokaż to co masz, tak będzie łatwiej 🙂 Początek z DDRB i PORTB gotowy?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(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 przez Anek40

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites
(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 przez Anek40

Udostępnij ten post


Link to post
Share on other sites
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

 

Udostępnij ten post


Link to post
Share on other sites

@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 😉

Udostępnij ten post


Link to post
Share on other sites
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.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

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!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...