kurs assemblera AVR / kurs asemblera AVR

Kategoria: assembler



2ml
2009-11-01, 14:55
  witam.

jako że asm to mój ulubiony język programowania tutaj pomogę rozwiązać wasze problemy...
wszystkie zamieszczone tutaj przykłady należy kompilowac w AVR Studio.

zacznę od programu który prawie każdy pisze jako pierwszy, czyli zapalenie diody led

Kod:
; Kurs assemblera mikrokontrolerów AVR
;
; Przykład 0 - zaświeć diodę LED

.include "m162def.inc"
.cseg
.org 0x00


start:    cli            ; blokada przerwań
    ldi    r16,0b00000001    ; linia "portb.0" jako wyjście
    out    ddrb,r16        ; zapis do rejestru

    ldi    r16,0b00000001    ; linia "portb.0" ustaw stan logiczna 1-ka
    out    portb,r16        ; zapis do rejestru

end: jmp end


-w tym przykładzie brakuje (celowo) wielu ważnych rzeczy do prawidłowego działania większych programów.
-kod jest umieszczony w obszarze wektorów przerwań (które zostały zapobiegawczo wyłączone rozkazem CLI)
-nie ma inicjalizacji stosu
-diodę należy podłączyć pomiędzy PB.0 a masę

pierwsza grupa ldi/out ustawia kierunek linii 0 portu b jako wyjście
druga grupa ldi/out ustawia logiczną jedynkę na tym pinie

a dalej jest tylko wieczna pętla...
mad-man
2009-11-01, 22:48
  a jak wygląda z prawidłowa inicjalizacją?
2ml
2009-12-05, 21:20
  prawidłowa inicjalizacja


Kod:
;inicjalizacja

.include "m162def.inc"
.cseg
.org 0x00

;-------------------- wektor przerwań -------------------
   rjmp reset
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   reti
   
;--------------------------------------------------------

reset:
   sei
;----------------------- inicjacja SP -------------------
   ldi   r16, low(ramend)   
   out   SPL, r16         
;--------------------------------------------------------
;----------------------- ustawienia SLEEP ---------------
   in     r16, mcucr     
   sbr    r16,(1<<se)
   cbr    r16,(1<<pud)|(1<<sm1)|(1<<sm0); idlle mode
   out    mcucr, r16
;--------------------------------------------------------   
;----------------------- ustawienia WDT------------------
   in     r16, mcusr
   cbr    r16, (1<<wdrf)
   out    mcusr, r16
   in     r16, wdtcr
   sbr    r16, (1<<wdce)
   out    wdtcr, r16
   cbr     r16, (1<<wde)
   out     wdtcr, r16
   
;---------------------------------------------------------
2ml
2010-02-12, 17:59
  przerzutnik R-S

* S (ang. Set) - wejście ustawiające
* R (ang. Reset) - wejście zerujące

SET ustawia w stan wysoki wyjście Q a w stan niski wyjście /Q
RESET ustawia w stan niski wyjście Q a w stan wysoki wyjście /Q

wyjścia:
PD7 = Q
PD6 = /Q
wejścia:
PD1 = SET
PD0 = RESET


Kod: ; Kurs assemblera mikrokontrolerów AVR
;
; Przykład 1 - przerzutnik RS

.include "m162def.inc"
.def temp = r16 ; r16 bedzię się teraz nazywał temp (lub r16 :D )
.cseg
.org 0x00


;******
ldi temp, 0b11000000
out DDRD, temp ; piny D7 i D6 są ustawione jako wyjścia
; pozostałe jako wejścia
ldi temp, 0b00111111
out PORTD, temp ; wyłączone wyjścia (stan 0), wejścia podciągnięte do zasilania

; !!!UWAGA!!! w przerzutniku RS stan wysoki jednocześnie na obu wejściach jest stanem zabronionym i nie powinien występować
; w tym przykładzie, naprzemiennie wyjścia będa ustawiane i kasowane

sprawdz_przyciski:
sbic PIND, 0 ; jeśli pin D0 = 1, to pomiń następną instrukcję
cbi PORTD, 7
sbic PIND, 0 ; jeśli pin D0 = 1, to pomiń następną instrukcję
sbi PORTD, 6

sbic PIND, 1 ; jeśli pin D1 = 1, to pomiń następną instrukcję
sbi PORTD, 7
sbic PIND, 1 ; jeśli pin D1 = 1, to pomiń następną instrukcję
cbi PORTD, 6
rjmp sprawdz_przyciski ; skocz do początku sprawdzania przycisków


wiecej info o przerzutniku w WIKI


Podobne tematy:
Kurs C++
kurs C++
[polska]szukam osrodka na kurs masazy orientalnych tajskiego
KURS DLA MĘŻCZYZN, 2-dniowy ;)
Krótki kurs obróbki głowicy i kolektorów
Kurs prawa jazdy