Uživatel:Vozakdom

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] Předmět A2M99MAM - Mikroprocesory a mikropočítače

Dominik Vozák





Veškerou práci vytvářím s kolegou: Josef Zitko

Odevzdání domácího úkolu (DU1): viz záložka 10.cvičení







[editovat] 1. Organizace cvičení, bezpečnost práce, MAM wiki, vybavení laboratoře 362, program AVR Studio, Programování v jazyku C.

14.2.2013

[editovat] 2. Programování v jazyku C kód.

21.2.2013


poznámky v sešitě

[editovat] 3. Programátor AVR Dragon, mikroprocesory ATtiny2313 a ATmega88, instrukční soubor AVR, assembler, první pokus v assembleru v simulátoru AVR a spuštění programu přímo na procesoru.

28.2.2013


zapojení programátorů:


                      


Popis vývodů ATtiny2313 a ATmega168 :

Soubor:ATtiny2313.png


[editovat] Propojení klávesnice s procesorem

Na černém konektoru do kontaktního pole, od kterého vede barevný plochý kabel dolů, jsou sloupce a řádky klávesnice připojeny takto:

COL1 COL3 ROW1 ROW3
COL2 COL4 ROW2 ROW4



Pozdější zapojení s větrákem:

Soubor:VZ-zapojeni.jpg


První program na blikání ledky.


; 
; example LED-show program for ATtiny 2313
;
; 2-color LED with 300 Ohm resistor in series is supposed to be
; connected between pins 12 (PB0, LED_X) and 13 (PB1, LED_Y).
;
; Color1 shines when LED_X is high and LED_Y is low
; Color2 shines when LED_Y is high and LED_X is low
; LED is off when LED_Y and LED_X are both low or both high


	.EQU DDRB = $17		; DDRB address
	.EQU PORTB = $18	; PORTB address
	

	.EQU LED_X = 0		; LED_X is on PB0, pin 12 of ATtiny2313
	.EQU LED_Y = 1		; LED_Y is on PB1, pin 13 of ATtiny2313

; Pins connected to LED are outputs, DDRx=1 (set):

	SBI	DDRB, LED_X	; SBI - Set Bit in I/O Register
	SBI	DDRB, LED_Y

SHOW:	
	RCALL	COLOR1	; RCALL - Relative Call to Subroutine
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR1
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT

	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT

	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT
	
	RJMP SHOW		; RJMP - Relative Jump 

;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
SMALLWAIT:
	INC	    R1				; INC - Increment
	BRNE	SMALLWAIT	; BRNE - Branch if Not Equal (Z flag) 
	RET					; RET - Return from Subroutine

WAIT:
	LDI	    R16, 4			; LDI - Load Immediate
WAIT1:	
    INC  	R1
	BRNE	WAIT1
	INC 	R2
	BRNE	WAIT1
	DEC	    R16
	BRNE	WAIT1
	RET
	
COLOR1:
    SBI	PORTB, LED_X
	CBI	PORTB, LED_Y	; CBI - Clear Bit in I/O Register
	RET

COLOR2:
    SBI	PORTB, LED_Y
	CBI	PORTB, LED_X
	RET

COL3W:
	LDI	R16, 2
COL3X: 	
    RCALL	COLOR1
	RCALL	SMALLWAIT
	RCALL	COLOR2
	RCALL	SMALLWAIT
	INC	    R2
	BRNE	COL3X
	DEC	    R16
	BRNE	COL3X

DARK:
    CBI	PORTB, LED_X
	CBI	PORTB, LED_Y
	RET


[editovat] 4. Vstupní a výstupní porty, připojování periferií, maticová klávesnice, řízení LED, 1. domácí úkol

7.3.2013

jak zjistit stav tlačítka:

1.pulling - neustálé zkoumání


2.pomocí instrukce načíst stav bitu - neukládat - načíst instrukcí podmíněného skoku - podle stavu - skákat


instrukce SBIS (skip if bit is set)

SBIS PINC,2 = PC2

pokud je tam jednička skočí jinam, pokud není tak se provede něco dalšího.

SBIS -- jestli je rovno 1

SBIC -- jestli je rovno 0

Připojena externí klávesnice. (pozor na více tlačítek zmáčknutých naráz)


; 
; example LED-show program for ATtiny 2313
;
; 2-color LED with 300 Ohm resistor in series is supposed to be
; connected between pins 12 (PB0, LED_X) and 13 (PB1, LED_Y).
;
; Color1 shines when LED_X is high and LED_Y is low
; Color2 shines when LED_Y is high and LED_X is low
; LED is off when LED_Y and LED_X are both low or both high


	

	.EQU LED_X = 0		; LED_X is on PB0, pin 12 of ATtiny2313
	.EQU LED_Y = 1		; LED_Y is on PB1, pin 13 of ATtiny2313


	.EQU DDRB = $17
	.EQU PORTB = $18
	.EQU PINB = $16

	.EQU DDRD = $11
	.EQU PORTD = $12
	.EQU PIND = $10


; Pins connected to LED are outputs, DDRx=1 (set):

	SBI	DDRB, LED_X	; SBI - Set Bit in I/O Register
	SBI	DDRB, LED_Y
	CBI DDRB, 2
	SBI DDRD, 2        ;PD2 is output - ROW
                       ;CBI PORTD, 2  ; PD2=0
                       ;CBI DDRC, 2   ; PC2 is input - COLUMN	

	SBI PORTB,2       ;enables pull-up resistor on this pin
	CBI PORTD,2
	
	
  GO:
	RCALL   COLOR1
	RCALL	WAIT
	SBIS	PINB, 2
	RCALL	COLOR2
	RCALL	WAIT
	RJMP	GO

;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
SMALLWAIT:
	INC	R1				; INC - Increment
	BRNE	SMALLWAIT	; BRNE - Branch if Not Equal (Z flag) 
	RET					; RET - Return from Subroutine

WAIT:
	LDI	R16, 4			; LDI - Load Immediate
WAIT1:	INC	R1
	BRNE	WAIT1
	INC	R2
	BRNE	WAIT1
	DEC	R16
	BRNE	WAIT1
	RET
	
COLOR1:
    SBI	PORTB, LED_X
	CBI	PORTB, LED_Y	; CBI - Clear Bit in I/O Register
	RET

COLOR2:
    SBI	PORTB, LED_Y
	CBI	PORTB, LED_X
	RET

COL3W:
	LDI	R16, 2
COL3X: 	RCALL	COLOR1
	RCALL	SMALLWAIT
	RCALL	COLOR2
	RCALL	SMALLWAIT
	INC	R2
	BRNE	COL3X
	DEC	R16
	BRNE	COL3X

DARK:
    CBI	PORTB, LED_X
	CBI	PORTB, LED_Y
	RET

[editovat] 5. Výkonové spínací prvky, úloha na regulaci ventilátoru, přerušení, uspání procesoru

14.3.2013


[[Sleep:]] (pouze se nahraje do registru SMCR hodnota uvádějící stav spánku a následně smyčka pro spánek -> ze spánku se probudí při přerušení a navrátí při RETI )

ldi r16,0b00000101 ; Power down mode
	out SMCR,r16 ; Sleep mode set

loop:
	sleep 
	nop 
	rjmp loop

[[Interrupt:]] (nastaveni zásobníku na konec --> nastaví se kam skákat při konkrétním přerušení, povolí se přerušení globálně "sei" a nastaví se povolení přerušení pro konkrétní periferii a její konkrétní vstupy)

.ORG 0x0000 
	jmp Main ; Reset Handler

.ORG 0x0008 
	jmp isr1 ; PCINT1 Handler

main:

ldi R16,high(RAMEND)
out SPH,R16
ldi R16,low(RAMEND)
out SPL,R16


; Keyboard interrupt  
;
; Activation of pin change interrupt - PROBLEM!!! PCICR and PCIMSK are 
; extended I/O registers (0x68 and 0x6C), and must be handled as 
; a memory location

;	ldi r16,0x02 ; activate PCINT1
;	out PCICR,r16

	ldi r26, PCICR ; load address of PCICR in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00000010 ; activate PCINT1
	st X, r16 ; store new PCINT1


;	ldi r16,0b00011100 ; Mask active inputs
;	out PCMSK1,r16

	ldi r26, PCMSK1 ; load address of PCMSK1 in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00011100 ; allow pin change interrupt on portC bits 2,3,4
	st X, r16 ; store new PCMSK1


	sei ; Enable interrupts




PWM vytvořená softwarově

; 
; example fan program for ATmega88
;
; P4 CPU fan Ucc pin is supposed to be connected 
; to +12 V, GND pin is supposed to be connected 
; to FET Drain, Source on GND, Gate on 
; pin 16 (PB2, FAN). Fan runs when FAN output is log. H.
;
; FAN is switched ON with switch between PC2 and PD2


	.EQU DDRB = $04
	.EQU PORTB = $05

	.EQU DDRC = $07
	.EQU PORTC = $08
	.EQU PINC = $06

	.EQU DDRD = $0A
	.EQU PORTD = $0B
	.EQU PIND = $09

;	.INCLUDE "m88def.inc"  ; replaces previous lines of the program

	.EQU FAN = 2


; Pin driving FAN is set as output:

	SBI	DDRB, FAN

; Basic keyboard init:

; One switch of matrix keyboard is connected between PINC 2 a PIND 2
; Zero values of DDRC, 2 and PORTB, 2 are implicit

	SBI DDRD, 2
	SBI PORTC, 2


; Init:
	RCALL   FAN_OFF


;klavesnice 7 a 3
   cbi DDRC,3  ;vstup
   sbi DDRD,1  ;vystup

   cbi PORTD,2  ;vystup nula
   sbi PORTC,3  ;nastavenej pul up


GO:	SBIS	PINC, 2
	RCALL	KEY7   ; Simple PWM control of the FAN, if the key is pressed
	SBIS    PINC, 3
	RCALL   KEY3
	RJMP	GO


;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
VERYSMALLWAIT:
	LDI R20, 0xFC
	MOV R1, R20
SMALLWAIT:
	INC	R1
	BRNE	SMALLWAIT
	RET

	
FAN_ON:
	SBI	PORTB, FAN
	RET

FAN_OFF:
	CBI	PORTB, FAN
	RET


PWM:
	MOV 	R17, R16
	INC		R17
	LDI		R18, 0xF8
	OR		R18, R16
PWM_ON:
	DEC		R17
	BREQ	PWM_OFF
	SBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_ON
PWM_OFF:
	INC		R18
	BREQ	PWM_RET
	CBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_OFF
PWM_RET:
	RET


KEY7:
ldi R16,8
rcall PWM
ret

KEY3:
ldi R16,1
rcall PWM	
ret

[editovat] 6. Čítače, časovače a PWM výstupy, zdroje hodinového signálu, přesný reálný čas.

21.3.2013


PROGRAM: Klávesnicí řízení PWM výstup pro větrák(skupina Josef Zitko, Dominik Vozák)



.INCLUDE "m88def.inc"
;*********
;Zapojeni:
;*********
;radky:		col1(PD1);	col2(PD2);	col3(PD3);	col4(PD4)
;sloupce:	row1(Pb1);	row2(Pb2);	row3(Pb3);	row4(Pb4)
;PWM out:	Pd5

;**********
;definovani
;**********
	.EQU IN1 = 1		;col1
	.EQU IN2 = 2		;col2
	.EQU IN3 = 3		;col3
	.EQU IN4 = 4		;col4
 
	.EQU OUT1 = 1		;row1
	.EQU OUT2 = 2		;row2
	.EQU OUT3 = 3		;row3
	.EQU OUT4 = 4	 	;row4

    .def citac		= r19
	.equ PWM_PULSES = 0
	.equ PWM_OUT    = 5 ; Pd5 PWM out

;-------------
;nastaveni PWM
;-------------
PWM_INIT:
	ldi R17, 0b00100011	; Fast PWM Mode, out on OC0B, non Inverting
	out TCCR0A, R17			; 
	ldi R17, 0b00001001	; WGM2:1 (Fast PWM), CS2..0:001 (internal clock, prescale=1)
	out TCCR0B, R17
	ldi R17, PWM_PULSES	; load number of clock pulses for 1 PWM period
	out OCR0A, R17   

	sbi DDRD, PWM_OUT	; set pin 11 as PWM output OC0B (PD5 pin)

;vypnuti PWM
	ldi R17, 0b00000011	; Fast PWM Mode, out on OC0B, non Inverting
	out TCCR0A, R17	


;---------------
;nastaveni portu
;---------------
cbi DDRD, IN1			;Pd1 in
sbi PORTD,IN1			;Pd1 pull-up on

cbi DDRD, IN2			;Pd2 in
sbi PORTD,IN2			;Pd2 pull-up on

cbi DDRD, IN3			;Pd3 in
sbi PORTD,IN3			;Pd3 pull-up on

cbi DDRD, IN4			;Pd4 in
sbi PORTD,IN4			;Pd4 pull-up on

;nastaveni (take jako vystupni - tu jednu budu vzdy prepinat do vstupu)
cbi DDRB,OUT1			;Pb1 in
cbi DDRB,OUT2			;Pb2 in
cbi DDRB,OUT3			;Pb3 in
cbi DDRB,OUT4			;Pb4 in



;*************
;Hlavni smycka
;*************	
MAIN:
	ldi R17, 0b00000011	;vypnuti PWM
	out TCCR0A, R17	
	RCALL STISK
RJMP MAIN




;***********
;podprogramy
;***********

STISK:
;Nic nedela pokud neni seple jen jedno tlacitko
;---------------------------------------------------------------------------
	clr 	citac		;vynulovani pom registru
	in      R16,sreg
	cbr     R16,0b00000010	
	out     sreg,R16	;vynulovani sreg po clr(pro sychr)

	;************(zakomentovanim se multiple touch ochrana vypne)
	sbi DDRB,OUT1		;out
	cbi PORTB,OUT1		;Pb1 out Low
	sbi DDRB,OUT2		;out
	cbi PORTB,OUT2		;Pb1 out Low
	sbi DDRB,OUT3		;out
	cbi PORTB,OUT3		;Pb1 out Low
	sbi DDRB,OUT4		;out
	cbi PORTB,OUT4		;Pb1 out Low
	;*************

	SBIS 	PIND,IN1
	RCALL 	VICETLAC
	SBIS 	PIND,IN2
	RCALL 	VICETLAC
	SBIS 	PIND,IN3
	RCALL 	VICETLAC
	SBIS 	PIND,IN4
	RCALL 	VICETLAC
   
	ldi 	R16,0b00000001
	eor 	R16,citac
	brne    SKOK		;skoci jen kdyz v citaci bude 0b00000001(pouze jedno zmackle)
;----------------------------------------------------------------------------


;1.radek je low
    sbi DDRB,OUT1		;out
	cbi PORTB,OUT1		;Pb0 out Low
cbi PORTB,OUT2	    	;Pb1 in 
cbi PORTB,OUT3			;Pb2 in 
cbi PORTB,OUT4			;Pb3 in 

;kontrola jestli je na vstupu nula(mozna tlacitka 1,2,3,A)
SBIS 	PIND,IN1
RCALL 	PROG1
SBIS 	PIND,IN2
RCALL 	PROG2
SBIS 	PIND,IN3
RCALL 	PROG3
SBIS 	PIND,IN4
RCALL 	PROGA

;2.radek je low
cbi PORTB,OUT1			;Pb0 in 
	sbi DDRB,OUT2		;out
	cbi PORTB,OUT2		;Pb1 out Low
cbi PORTB,OUT3			;Pb2 in 
cbi PORTB,OUT4			;Pb3 in 

;kontrola jestli je na vstupu nula(mozna tlacitka 4,5,6,B)
SBIS 	PIND,IN1
RCALL 	PROG4
SBIS 	PIND,IN2
RCALL	PROG5
SBIS 	PIND,IN3
RCALL 	PROG6
SBIS 	PIND,IN4
RCALL 	PROGB

;3.radek je low
cbi PORTB,OUT1			;Pb0 in 
cbi PORTB,OUT2			;Pb1 in 
	sbi DDRB,OUT3		;out
	cbi PORTB,OUT3		;Pb2 out Low
cbi PORTB,OUT4			;Pb3 in 

;kontrola jestli je na vstupu nula(mozna tlacitka 7,8,9,C)
SBIS 	PIND,IN1
RCALL 	PROG7
SBIS 	PIND,IN2
RCALL 	PROG8
SBIS 	PIND,IN3
RCALL 	PROG9
SBIS 	PIND,IN4
RCALL 	PROGC

;4.radek je low
cbi PORTB,OUT1			;Pb0 in 
cbi PORTB,OUT2			;Pb1 in 
cbi PORTB,OUT3			;Pb2 in 
	sbi DDRB,OUT4		;out
	cbi PORTB,OUT4		;Pb3 out Low

;kontrola jestli je na vstupu nula(mozna tlacitka *,0,#,D)
SBIS 	PIND,IN1
RCALL 	PROGHVEZD
SBIS 	PIND,IN2
RCALL 	PROG0
SBIS 	PIND,IN3
RCALL 	PROGMRIZ
SBIS 	PIND,IN4
RCALL 	PROGD

SKOK:
RET

;-----------------------
;pri zmacnuti klavesnice
;-----------------------

PROGA:					;stisk A
ret

PROGB:					;stisk B
ret

PROGC:					;stisk C
ret

PROGD:					;stisk D
ret

PROGHVEZD:				;stisk *
ret

PROGMRIZ:				;stisk #
ret

PROG1:					;stisk 1
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,2
out OCR0A, R17 
ret

PROG2:					;stisk 2
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,4
out OCR0A, R17 
ret

PROG3:					;stisk 3
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,6
out OCR0A, R17 
ret

PROG4:					;stisk 4
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,8
out OCR0A, R17 
ret

PROG5:					;stisk 5
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,10
out OCR0A, R17 
ret

PROG6:					;stisk 6
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,14
out OCR0A, R17 
ret

PROG7:					;stisk 7
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,18
out OCR0A, R17 
ret

PROG8:					;stisk 8
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,22
out OCR0A, R17 
ret

PROG9:					;stisk 9
ldi R17, 0b00100011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
clr R17
ldi R17,32
out OCR0A, R17 
ret

PROG0:					;stisk 0
ldi R17,0
out TCCR0A, R17
ldi R17, 0b00000011		; Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, R17	
ret


;-------
;ostatni
;-------
VICETLAC:   			;stisk vice tlacitek
inc citac
ret




Soubor:VZ-zapojeni.jpg

[editovat] 7. Složitější periferie, A/D převodníky a analogový komparátor. Ukázka zesilovače v třídě D s ATtiny45.

28.3.2013

připravit domácí úkol č.1, TEST !


[editovat] 8. Posuvný registr jako výstupní periferie, připojení sedmisegmentového displeje se spol. anodou přes 74HCT595 (připravit doma schéma a program v assembleru pro zobrazení dvou zadaných znaků, přepínaných jedním vstupem). Rozdělení samostatných prací.

.include "m88def.inc"
;********************
;Popis, zapojeni a deklarace
;********************
;-----
;popis
;-----
;maximum clock frequency SH_CP and ST_CP 74HC(100MHz) 74HCT(57MHz)
;Pomoci zmacknuteho/nezmacknuteho tlacitka ovladam, kterej ze dvou cisel
;bude zobrazeno(sepnuto = num1; nesepnuto = num2)
;s přerušením od tlačítka!!!!

;--------
;zapojeni
;--------
;spinac:	PB0
;SH_CP:		PC5
;ST_CP		PC4
;DS		PC3

;-------
;numbers
;-------
;0b11000000;//0
;0b11111001;//1
;0b10100100;//2
;0b10110000;//3
;0b10011001;//4
;0b10010010;//5
;0b10000010;//6
;0b11111000;//7
;0b10000000;//8
;0b10010000;//9

;-------------------------
;tabulka vektoru preruseni
;-------------------------
.org 0x000
rjmp reset					;reset

.org 0x003					;PCINT0
rjmp PCINT0interupt



reset:
sei						;global inter. enable
;--------
;zasobnik
;--------
ldi r16,high(ramend)
out sph,r16
ldi r16,low(ramend)
out spl,r16

;---------
;deklarace
;---------
;obecne
.def pom     = r16
.def counter = r17
.def number  = r18

.equ SH_CP   = 5			;PC5(SH_CP)
.equ ST_CP   = 4  			;PC4(ST_CP)
.equ DS	     = 3  			;PC3(DS)
.equ button  = 0

ldi pom,8				;8 x SH_CP
;portC
sbi DDRC,SH_CP
sbi DDRC,ST_CP
sbi DDRC,DS

;portB
sbi PORTB,button			;PD0 in(pull up)

;-------------------
;nastaveni preruseni
;-------------------

ldi pom,0b00000001			;activate PCIE0 -> PCINT7...0
sts PCICR,pom

ldi r16,0b00000001 			;Mask active inputs(allow PCINT0 only)
sts PCMSK0,pom			

;----------------
;nastaveni spanku
;----------------
ldi pom,0b00000101	 		;Power down mode
out SMCR,pom 				;Sleep mode set

;*************
;hlavni smycka
;*************
main:
	sleep
	nop
rjmp main



;*****************
;obsluha preruseni
;*****************
PCINT0interupt:
	sbis  PINB,button
	rcall push_button	;pushed button
	sbic  PINB,button
	rcall not_push_button	;no pushed button
reti

;**********
;procedures
;**********
;----------------------
;push or not_pus button
;----------------------
push_button:		    	        ;number one
	ldi   number,0b11001011         ;number one = 1
	ldi   counter,8			;8x SHCP
	lds   r1,0b00000001		;mask for bit0	
jump0:    	
	mov   pom,number
	cbr   pom,0b11111110
    eor   pom,r1
	brne  set_DS0	  		;if 0.bit set go to: set_DS
	breq  noset_DS0			;if 0.bit non-set go to: noset_DS
set_DS0:
	sbi PORTC,DS			;DS = High
    rjmp outof0
noset_DS0:
	cbi PORTC,DS			;DS = Low	
outof0:
	;rcall wait				;maybe?
	sbi PORTC,SH_CP			;Write(one bit)
	;rcall wait
	cbi PORTC,SH_CP			;not write(one bit)?????
		
	lsr   number			;one bit shift to right
	dec   counter	
	brne  jump0
		sbi PORTC,ST_CP		;write whole register
		;rcall wait			;maybe
		cbi PORTC,ST_CP		;not write all register?????
ret




not_push_button:			;number two
	ldi   number,0b01010101         ;number one = 1
	ldi   counter,8			;8x SHCP
	lds   r1,0b00000001		;mask for bit0	
jump1:    	
	mov   pom,number
	cbr   pom,0b11111110
    eor   pom,r1
	brne  set_DS1	  		;if 0.bit set go to: set_DS
	breq  noset_DS1			;if 0.bit non-set go to: noset_DS
set_DS1:
	sbi PORTC,DS			;DS = High
    rjmp outof1
noset_DS1:
	cbi PORTC,DS			;DS = Low
outof1:
	;rcall wait				;maybe?
	sbi PORTC,SH_CP			;Write (one bit)
	;rcall wait
	cbi PORTC,SH_CP			;not write (one bit)?????

	lsr   number			;one bit shift to right
	dec   counter	
	brne  jump1
		sbi PORTC,ST_CP		;write whole register
		;rcall wait			;maybe
		cbi PORTC,ST_CP		;not write whole register?????
ret

[editovat] 9. Jazyk C a jeho překlad pomocí GCC a programu make, ISP pomocí avrdude. Optimalizace rychlosti, optimalizace využití RAM, kombinace C a assembleru, C intrinsics

[editovat] 10. Teoreticky vnější RAM, externě připojené vstupy a výstupy, odevzdání 1. domácího úkolu na osobní stránce zde na Wiki, zadání 2. domácího úkolu.

DOMÁCÍ ÚKOL1

.include "m88def.inc"
;******
;zadani
;******
;Zvolte vhodné zapojení a procesor a v assembleru naprogramujte 2 na sobě nezávislé PWM regulace
;osvětlení do auta. Jedna je pro vnitřní osvětlení, po sepnutí dveřního kontaktu nastaví okamžitě
;plný svit, po rozpojení ještě asi 5 s plný svit a následuje asi 2 sekundy dosvit s poklesem od
;maxima do nuly, druhá PWM je pro regulované osvětlení palubní desky, vstup potenciometr, výstup
;výkonová PWM regulace asi 10 % až 100 %. Napájecí napětí auta je 12 V, špičky rušení mohou dosáhnout
;až 20 V.

;špičky v Vcc pomocí stabilizatoru napětí(např.MC7805CTG)


;********
;zapojeni
;********
;tlacitko: 	na PB0 a GND
;potenciometr: 	na PC0 - ADC0
;LED1 a LED2: 	na LED1(PD5(OC0B)-zelena), LED2(PD3(OC2A)-cervena)
;kondenzator:   na AREF

;***************
;preddefinovani
;***************
.def pom 	    = r16
.def citac 	    = r17
.def PWM2_poc_pulsu = r20	;value for 1MHz/10 PWM (plný svit) - palubka
.def PWM1_poc_pulsu = r21	;value for 1MHz/ PWM (plný svit) - interier

.equ tlacitko       = 0	

;-------------------------
;tabulka vektoru preruseni
;-------------------------
.org 0x000
rjmp reset

.org 0x015
rjmp ADCconv_compl


reset:
sei   				;globalni povoleni preruseni
;--------
;zasobnik
;--------
ldi pom,high(ramend)
out sph,pom
ldi pom,low(ramend)
out spl,pom

;---
;def
;---
ldi citac,0xf0			;pomocna pro citac
ldi PWM2_poc_pulsu,2
ldi PWM1_poc_pulsu,2

;----------------
;inicializace ADC
;----------------
ldi pom, 0b11100000		;interní 1.1V reference s kapacitorem na pinu AREF, zarovnání výsledku vlevo, vstup na ADC0
sts ADMUX, pom				
ldi pom, 0b11101101		;ADC "zapnut", int. off, autotriger off, dělící faktor 32 (31,250kHz),ADATE(1): povoleni ciziho zapnuti adc
sts ADCSRA,pom			;ADC control and status register A; ADIE=1(AD interrupt enable)
ldi pom, 0b00000000		;autotriger on: adts2:0 = 000 (free running)
sts ADCSRB, pom		
ldi pom, 0b00000001		
sts DIDR0,pom			;reduce power consumption in the digital input buffer(on ADC0pin)			

;---------------
;deklarace portu
;---------------
;portB
ldi pom,0b00000000
out DDRB,pom
ldi pom,0b00000001
out PORTB,pom

;portD
ldi pom,0b00101000
out DDRD,pom
ldi pom,0b00000000
out PORTD,pom

;portC
ldi pom, 0b000000	    	;PC0 je vstup ADC 
out DDRC, pom			
ldi pom, 0b000000		;vstupy


;----------------------
;deklarace PWM interier
;----------------------
ldi pom, 0b00100011		;Fast PWM Mode, out on OC0B, non Inverting
out TCCR0A, pom			 
ldi pom, 0b00001001		;WGM2:1 (Fast PWM), CS2..0:001 (internal clock, prescale=1)
out TCCR0B, pom
mov pom, PWM1_poc_pulsu		;load number of clock pulses for 1 PWM period
out OCR0A, pom
ldi pom, 0b00000011		;com0b1, com0b0 = 0,0 0CO disconnected	"zakmitani"
out	TCCR0A, pom

;-------------------------------------------------------
;deklarace PWM palubka - nemusim odpojovat --> 10 - 100%
;-------------------------------------------------------
				;nastaveni shodne jako TMR0, jen jiny zpusob, protoze registry nejsou dostupne pomoci "out"
ldi pom, 0b00100011		;rychlá PWM, výstup na OC2B (PD3), neinvertující
sts TCCR2A, pom			;TCCR - time counter control register
ldi pom, 0b00001001		;rychlá PWM, vnitřní hodiny, prescale=1
sts TCCR2B, pom			
mov pom, PWM2_poc_pulsu		;load number of clock pulses for 1 PWM period
sts OCR2A, pom	
			
;*************
;hlavni smycka
;*************
main:
	sbic  PINB,tlacitko
	rcall interierNESTISK
	sbis  PINB,tlacitko   	;hlida zda je sepnut dverni kontakt
	rcall interierSTISK	
rjmp  main

;*********
;procedury
;*********
;--------
;interier:
;--------
interierSTISK:	  		     ;zelena ledka//deklarace PWM1
	ldi    pom,0xf0
	eor    pom,citac
	brne   skok
	rcall  svit 		
skok:
	ldi    citac,0xff
ret


interierNESTISK:		     ;sviti plny jas
	ldi    citac,0xf0
	mov    pom,PWM1_poc_pulsu    ;opetovne nastaveni plneho svitu
	out    OCR0A,pom
	ldi    pom, 0b00100011	     ;Fast PWM Mode, out on OC0B, non Inverting
	out    TCCR0A, pom	
ret



svit:			  	     ;5sec (256x256x25 x 3us = 4,92s)
	ldi   pom, 0b00100011	     ;Fast PWM Mode, out on OC0B, non Inverting
	out   TCCR0A, pom	
	mov   pom,PWM1_poc_pulsu
	out   OCR0A,pom 	

;5sec plny svit	
	clr r1					
	clr r2					
	ldi r18,25
wait:
	inc r1					;256x
	brne wait
	inc r2					;256x256
	brne wait
	dec r18					;256x256x25
	brne wait 

;2sec dosvit
    ldi pom,50
	mov r1,pom
	clr r2
hop: 
;dekrementace
;------------  
    mov pom, PWM1_poc_pulsu
	inc r2
	add pom,r2
	out OCR0A,pom	
;------------
	rcall smallwait
 	dec r1
brne hop

	ldi  pom,0b00000011	  	;odpojeni od PWM
	out  TCCR0A, pom		;odpojeni od PWM		
ret

smallwait:					;255x32
	lds r3,32
	clr r18
back:
	inc r18
brne back
	dec r3
brne back
nop
ret
;---------------------------------------------------------------- 
;prevedeni hodnoty z ADC do intervalu 10 - 100% pro pouziti v PWM
;----------------------------------------------------------------
;Pro zjednoduseni pocitani je max hodnota PWM 36. Kdyz max hodnota z AD je 255, pak po
;vydeleni 8 (odstranena des. cast) je to rovno 31. Kdyz pricteme 4, tak 35, tzn. maximalni
;strida je 97%, coz jde. Naopak minimalni, tedy v intervalu ADCH od 0 do 7, kdy vysledek 
;je 4, je 11%. Intervaly tedy nejsou presne podle zadani, ale v praxi to je zanedbatelne,
;a usetrilo se hodne pocitani pro dosazeni presne hodnoty ;-) Protoze min hodnota neni 0,
;ale 10% (resp 11%) neni potreba odpojovat vystupni pin od PWM generatoru.

;-------
;palubka:
;-------
ADCconv_compl:
	clr pom				;odstran vysledek posledniho prevodu
;dekodovani hodnoty
	lds pom, ADCH			;hodnotu H bytu z AD prevodu do Temp
	lsr pom				;Hodnota deleno 2x
	lsr pom				;Hodnota deleno 2x
	lsr pom				;Hodnota deleno 2x
					;celkove deleno 8x

	mov PWM2_poc_pulsu, pom	        ;hodnota ADCH/8
	ldi pom, 0x04
	add PWM2_poc_pulsu, pom	        ;pricte 4
	mov pom,PWM2_poc_pulsu
	sts OCR2A, pom			;nastavi PWM pro palubku
reti

Dekódování hodnoty převzato od uživatele: Vafektom

[editovat] 11. Teoreticky připojení SD karty, sériový port, softwarové USB, bootloader. Programování přístupu k vnější RAM a k externě připojeným vstupům a výstupům v jazyku C, odevzdání 2. domácího úkolu v papírové podobě na začátku cvičení.

[editovat] 12. Další možnosti konfigurace AVR procesorů, další typy programátorů AVR, watchdog, BOR. Programování v jazyku C

[editovat] 13. Prezentace výsledků práce, zápočet

semestrální práce: Tachometr na kolo spolupráce s Josef Zitko

Osobní nástroje