Skocz do zawartości

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


kermit

Pomocna odpowiedź

.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
Link do komentarza
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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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

 

  • Lubię! 1
Link do komentarza
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 😉

Link do komentarza
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
Link do komentarza
Share on other sites

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. 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.