Skocz do zawartości

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


Pomocna odpowiedź

wziąść
teraz pora na drugą wersje programu który będzie który rówież zapali diodę naszą diodę LED
Ze względu ,że mikrokontrolery nasze mikrokontrolery AVR są 8-bitowe
ldi R20,0x01

out DDRC, R16

out PORTC, R16

Nie bardzo rozumiem ten fragment. Wrzucamy do rejestru R20 jakąś wartość i co z nią? Potem odwołujemy się do R16. Jak to się ma do R20?

-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 ,co w przyszłości może baaardzo nam sie przydać np. Przy programowaniu w innych językach czy nawet przy programowaniu innych mikrokontrolerów.

Od której należałoby zacząć. Bez przedstawienia architektury danego procesora, nauka ASMa mija się z celem. Same rzucenie paroma przykładami i troszką instrukcji to za mało. ASM wbrew pozorom nie jest taż taki prosty, dla tego powstały języki wysokiego poziomu, O ile zapamiętanie samych instrukcji nie jest jakim niesamowitym wyzwaniem, to wykonywanie operacji złożonych już tak, szczególnie obliczeniowo.

No i trzymaj się jakiś zasad pisania. Jak już przyjołeś że stałą do rejestru ładujesz takim sposobem:

LDI R16, 0b00000001

to potem nie rób tak

LDI R16, 0x01 bez wyjaśnienia tych zapisów, bo początkujący się załamią po pierwszych 2 listingach.

Ogólnie wziąłeś sobie na tapetę, bardzo, ale to bardzo trudny do zrobienia dobrze temat.

i tu jeszcze jedna sprawa, użyłem w tym wypadku zapisu binarnego stałej ładowanej do rejestru ,aby było widać dokładnie który bit ustawiamy, ale równie dobrze moglibyśmi użyć zapisu szesnastkowego, wyglądało by to tak:

Więc chyba wszystko wyjaśnione? 😉

kermit, poprawisz w końcu te R20? ; D

  • 3 lat(a) później...

wojakin,

Rejestry ogólnego przeznaczenia(od R16 do R31) są do użytku programisty, można w nich przechowywać, zmienne lub stałe które wykorzystywane będą w programie.
  • 2 tygodnie później...

Dziękuję za informacje 🙂. Pozdrawiam.

Edit: Mam jeszcze pytanie przekazuje do funkcji SPIInt napisanej w asm wartość 8-bitową jako argument z pliku napisanego w c. Z tego co rozumiem adres tej wartości powinien wylądować w rejestrze X ale tak się nie dzieje. Co robię źle?

#include <avr/io.h>
extern void init (void);
extern void SPIInt (uint8_t edata);

int main (void)
{
       init();
       SPIInt(0xAB);
       while(1){

       }
       return 0;
}
#define __SFR_OFFSET 0
#include <avr/io.h>

.global init
.global SPIInt

init:
sbi DDRD, 0

; Set SPI out pin
ldi r16,(1<<PB4)|(1<<PB5)|(1<<PB7)
out DDRB,r16

; Enable SPI, enable SPI Interrupt, set Master Mode and set clock rate fck/16
ldi r16,(1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r16
ret

SPIInt:
ld r17,x
cpi r17,0xAB
breq on
reti

on:
sbi PORTD,0
reti

Edit 2: Znalazłem że kompilator wartość podaną jako argument wkłada do rejestru r24. Dla argumentów zawsze ten rejestr obowiązuje?

  • 3 lat(a) później...

Witam

Jak  wyglądał by ten kod  C w j.ASM 

 kwarc 16 MHz ,Attiny 2313A

--------------------------------------------------------------------------------------

#include <avr/io.h>
#include <util/delay.h>
main()
{
DDRB = (1<<PB3)|(1<<PB4);
PORTB|=(1<<PB3);
while(1)
{
PORTB ^= (1<<PB3)|(1<<PB4);
_delay_us(128000000);
  }   
}  

 

@Anek40 witam na forum 🙂 Na czym dokładnie utknąłeś, próbowałeś zdziałać coś samodzielnie w tej kwestii?

PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku 😉

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