Processzor

Mikrovezérlő: LED villogtatása + 2 nyomógomb kezelése


1. rész

Egy egyszerű hardver + a működtető szoftver első lépésnek. Direkt a legkisebb tokozású ATMEL AT90S2323 mikrokonrollert választottam, ebből is sok mindent ki lehet hozni, igaz drágább mint pl a DIP20 vagy SO20-as tokozású. A program persze egy az egyben használható más procikkal is, Pl AT90S1200 -SO20/DIP20, AT90S2323 -SO8/DIP8 stb, megkötés csak annyi, hogy mindig a PORTB legyen használva és a kiosztás se változzon (LED,SW1,SW2 ugyanaz a bit legyen).
Letöltéskor a nyomógombok ne legyenek lenyomva!!

A működtető program:

; 1. rész
; LED villogtatása mikrovezérlővel + 2 nyomógomb kezelése
;
; Létrehozva: 2005.05.25
; ksasa


.include "2313def.inc"

; változók definiálása
.def temp = r16
.def osztasi_ertek = r17
.def timer_int = r18

; konstansok definiálása
.equ LED = 2 ;LED kimenet portb.2
.equ sw1 = 1 ;nyomógomb 1 portb.1
.equ sw2 = 0 ;nyomógomb 2 portb.0


;program kezdete
.CSEG

;IT vektortábla
.org 0
    rjmp stackinit ; reset it
    reti ; int0 it
    rjmp timer_int ; timer it

;Stack beállitás
stackinit:
    ldi temp,ramend ;Stack inicializálás
    out SPL,temp ;Stack Pointer Low

;PORT B beállitások
    ldi temp,(1< ;portb.2 kimenet, portb.1 és .0 bemenet
    out ddrb,temp
    ldi temp,(1< ;ddb.0 és .1 H-ba állitva,
    out portb,temp ;igy a bemeneteken lesz PULLUP (elvileg)

;timer init
;kvarc = 4MHz

    ldi temp, (1< ;4Mhz/1024 ;előosztás beállitása
    out tccr0,temp

    ldi osztasi_ertek,0 ;osztási alapérték:256, vagyis 4MHz/1024/256=15,258Hz
    out tcnt0,osztasi_ertek

    ldi temp,1< ;timer megszakitás engedélyezése
    out timsk,temp

    sei ;megszakítások engedélyezése

;végtelen ciklus
    ldi timer_int,0 ;timer int számláló inicializálás 

x:
    cpi timer_int,15 ;15 db timer megszakitás bevárása
    breq led_csere ;ha megvan, LED állapot váltása

    sbis portb,sw1 ;elenőrizzük, van e sw1 gombnyomás
    rjmp sw1_lenyomva ;ha van sw1, 1.5Hz-et állitunk be

    sbis portb,sw2 ;elenőrizzük, van e sw2 gombnyomás
    rjmp sw2_lenyomva ;ha van sw2, 2Hz-et állitunk be

    rjmp x ;ha egyik sincs lenyomva, vissza az elejére

sw1_lenyomva: ;sw1 megnyomása esetén a freki legyen 1.5Hz
    ldi osztasi_ertek,82 ;4Mhz/1024/(256-82)/15 = 1.4966Hz
    out tcnt0,osztasi_ertek
    rjmp x ;majd vissza az elejére

    sw2_lenyomva: ;sw2 megnyomása esetén a freki legyen 2Hz
    ldi osztasi_ertek,126 ;4Mhz/1024/(256-126)/15 = 2.003Hz
    out tcnt0,osztasi_ertek
    rjmp x ;majd vissza az elejére


led_csere:
    ldi timer_int,0 ;először is töröljök a timer int szálmálót
    sbic portb,LED 
    rjmp clr_LED ;ha a led világit, akkor kikapcsoljuk 
    sbi portb,LED ;ha nem világit, bekapcsoljuk
    rjmp x

clr_led:
    cbi portb,LED ;itt történik a kikapcsolás
    rjmp x


timer_int:
    out tcnt0,osztasi_ertek ;számláló újratöltése
    inc timer_int
    reti


A program letölthető (uc_part1.asm).