ATmega32

آرشیو برنامه های ATmega32 روی برد NSK115

ATmega32

آرشیو برنامه های ATmega32 روی برد NSK115

مانیتورینگ پتانسیومتر

برنامه ای بنویسید که مقدار پتانسیومتر را روی لپ تاپ نمایش دهد: 


.include "m32def.inc"
.ORG 0
;>> General Constants
CLR R20
SER R21

;>> Stack Pointer Localizing
LDI R17,$01
OUT SPL,R20
OUT SPH,R17

;***************************
;>> Potansiometer
;>> ADC Initiating
LDI R16,$E0
OUT ADMUX,R16
LDI R16,$87;XXX
OUT ADCSRA,R16
OUT SFIOR,R20


;>> Read from ADC1
;SBI ADMUX,MUX0

IST:
SBI ADCSRA,ADSC; Start Conversion
SBIS ADCSRA,ADIF
RJMP IST


SBI ADCSRA,ADIF; Clear ADIF flag
IN R30,ADCH

;>> Simple Display
OUT DDRC,R21
OUT PORTC,R30;XXX

;RJMP IST

;****************************
;>> USART
;>> loop vars
LDI R23,0
LDI R24,3

;>> USART Registers
CLI
OUT UCSRA,R20
LDI R16,$08
OUT UCSRB,R16
LDI R17,$86
OUT UCSRC,R17

;>> Baud Rate
OUT UBRRH,R20
LDI R16,$47 ;As in ne-ir
OUT UBRRL,R16
SEI

;>> Wait to empty buffer
Sabr:
SBIS UCSRA,5
RJMP Sabr

;>> Send R30
;LDI R30,82
OUT UDR,R30

;>> Repeat above 3X
INC R23
CPSE R23,R24
RJMP Sabr

;JJJ:
;RJMP JJJ


;RJMP IST

;###############################################


OUT DDRC,R21

;>> Calculate T as:
;>> X=65535-10800*T-1>; 1<X<65535, T: Time
;>> Then write X in TCNT1H and TCNT1L
;>> Here for 0.1 second: X=10799=FBC6


;>> Timer1 Settings
LDI R25,$EF
LDI R24,$C6
OUT TCCR1A,R20
LDI R30,$05
OUT TCCR1B,R30

start1:

OUT PORTC,R21

RCALL FAZ

OUT PORTC,R20

RCALL FAZ

RJMP IST

;************************
FAZ:
OUT TCNT1H,R25
OUT TCNT1L,R24
NIROO:
IN R19,TIFR
SBRS R19,$4
RJMP NIROO
OUT TIFR,R21
RET

چراغهای چشمک زن

برنامه ای بنویسید که لامپ های پورت C را متناوبا روشن و خاموش کند. 

از روش فراخوانی تابع استفاده شود. 

 

.include"m32def.inc"
.ORG 0
;>> CONSTANT REGISTERS
CLR R20
SER R21
OUT DDRC,R21

;>> Stack Pointer Localizing
LDI R17,$01
OUT SPL,R20
OUT SPH,R17


;>> Timer1 Settings
LDI R25,$EF
LDI R24,$C6
OUT TCCR1A,R20
LDI R30,$05
OUT TCCR1B,R30

;>> Calculate T as:
;>> X=65535-10800*T-1>; 1<X<65535, T: Time
;>> Then write X in TCNT1H and TCNT1L
;>> Here for 0.1 second: X=10799=FBC6

start1:

OUT PORTC,R21

RCALL FAZ

OUT PORTC,R20

RCALL FAZ

RJMP start1

;************************
FAZ:
OUT TCNT1H,R25
OUT TCNT1L,R24
NIROO:
IN R19,TIFR
SBRS R19,$4
RJMP NIROO
OUT TIFR,R21
RET

تایمر 16 بیتی

برنامه ای بنویسید که روی 7SEG عدد 2 را برای 1 ثانیه نمایش دهد. 

.include"m32def.inc"
.ORG 0
;>> CONSTANT REGISTERS

CLR R20
SER R21
;>> Display 2 on 7SEG
OUT DDRA,R21
LDI R18,$A4; As 2 in Display
OUT PORTA,R18

LDI R30,$50
OUT TCCR1A,R30
LDI R30,$05
OUT TCCR1B,R30

;>> Calculate T as:
;>> X=65535-10800*T>; 1<X<65535, T: Time
;>> Then write X in TCNT1H and TCNT1L
;>> Here for 1 second: X=10799=D5CF

LDI R25,$D5
LDI R24,$CF
OUT TCNT1H,R25
OUT TCNT1L,R24

;>> TIFR Monitoring
NIROO:
IN R19,TIFR
SBRS R19,4
RJMP NIROO
OUT TIFR,R21

OUT PORTA,R21; 7SEG off

LLL:
RJMP LLL

پتانسیومتر روی لپ تاپ (1)

برنامه ای بنویسید که مقدار پتانسیومتر را خوانده و در برنامه سریال کامپیوتر نمایش دهد. 

( فرض کنید پتانسیومتر دارای مقداری ثابت است و مقدار مقاومت خوانده شده سه بار نمایش داده شود) 

 


.include "m32def.inc"
.ORG 0
;>> General Constants
LDI R20,0
LDI R21,$FF

;***************************
;>> Potentiometer 

;>> ADC Initiating
LDI R16,$E0
OUT ADMUX,R16
LDI R16,$87;XXX
OUT ADCSRA,R16
OUT SFIOR,R20


;>> Read from ADC1
;SBI ADMUX,MUX0

IST:
SBI ADCSRA,ADSC; Start Conversion
SBIS ADCSRA,ADIF
RJMP IST


SBI ADCSRA,ADIF; Clear ADIF flag
IN R30,ADCH

;>> Simple Display
OUT DDRC,R21
OUT PORTC,R30;XXX

;RJMP IST

;****************************
;>> USART
;>> loop vars
LDI R23,0
LDI R24,3

;>> USART Registers
CLI
OUT UCSRA,R20
LDI R16,$08
OUT UCSRB,R16
LDI R17,$86
OUT UCSRC,R17

;>> Baud Rate
OUT UBRRH,R20
LDI R16,$47 ;As in ne-ir
OUT UBRRL,R16
SEI

;>> Wait to empty buffer
Sabr:
SBIS UCSRA,5
RJMP Sabr

;>> Send R30
;LDI R30,82
OUT UDR,R30

;>> Repeat above 3X
INC R23
CPSE R23,R24
RJMP Sabr

JJJ:
RJMP JJJ


RJMP IST

پتانسیومتر

در این برنامه قصد داریم پتانسیومتر روی برد NSK115 را توسط کد اسمبلی راه اندازی کنیم. 

.include "m32def.inc";1
.ORG 0;2
;>> General Constants;3
LDI R20,0;4
LDI R21,$FF;5
OUT DDRC,R21;6

;>> ADC Initiating;7
LDI R16,$E0;8
OUT ADMUX,R16;9
LDI R16,$87;XXX;10
OUT ADCSRA,R16;11
OUT SFIOR,R20;12


;>> Read from ADC1;13
;SBI ADMUX,MUX0;14

IST:;15
SBI ADCSRA,ADSC; Start Conversion;16
SBIS ADCSRA,ADIF;17
RJMP IST;18

SBI ADCSRA,ADIF; Clear ADIF flag;19
IN R16,ADCH;20
OUT PORTC,R16;XXX;21

RJMP IST;22

1-  تنظیمات برای ATmega32 تعریف می شوند.

2- برنامه از فضای صفرم آغاز می شود.

3- به کاربر اعلام می شود که می خواهیم متغییرهای عام را تعریف کنیم. 

4-  R20=0

5- R21=11111111

6- PORTC as output port

7- تنظیمات مبدل آنالوگ به دیجیتال

8 , 9 - ADMUX = E0 H

10 , 11 -  ADCSRA = 87 برای کمترین نرخ نمونه برداری در برابر بیشترین دقت

12- SFIOR = 0

13-  اعلام به کاربر که می خواهیم مبدل را بیاغازانیم

14-  پین صفرم پورت اول به عنوان ورودی آنالوگ تعریف شده است.

15- تعریف نقطه بازگشت

16- آغازاندن تبدیل

17 و 18 - اگر پرچم تبدیل بالا رفت ( یعنی تبدیل انجام شده است) به دو خط بعد برو، وگرنه به نقطه بازگشت IST بازگرد. 

19- پرچم تبدیل را بکش پایین

20- بایت بالای مبدل را به R16 منتقل کن

21- R16 را روی پورت سوم بگذار = روی ال ای دی های هشتگانه مقدار مبدل را نمایش بده

22- به نقطه بازگشت برگرد. ( تکرار تبدیل ( در صورت تغییر متغییر))