Uživatel:Skolnjak

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m
 
Řádka 1: Řádka 1:
'''CV.4 = Klavesnice rozsviti diodu'''
'''CV.4 = Klavesnice rozsviti diodu'''
-
 
+
Zkuste prosím svou stránku trochu učesat
Řádka 379: Řádka 379:
'''Domaci ukol 1 (osvetleni auta)'''
'''Domaci ukol 1 (osvetleni auta)'''
 +
<pre>
.ORG 0x0000  
.ORG 0x0000  
jmp Main ; Reset Handler
jmp Main ; Reset Handler
Řádka 524: Řádka 525:
ret
ret
 +
</pre>

Aktuální verze z 15. 4. 2013, 08:47

CV.4 = Klavesnice rozsviti diodu

Zkuste prosím svou stránku trochu učesat



.EQU PINB = $16 ;adresa PINB .EQU DDRB = $17 ; DDRB address .EQU PORTB = $18 ; PORTB address


.EQU PIND = $10 ; PIND address .EQU DDRD = $11 ; DDRB address .EQU PORTD = $12 ; 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

SBI DDRD, 0 CBI PORTD, 0

CBI DDRB, 2 SBI PORTB, 2

CBI DDRB,3 SBI PORTB, 3


GO:

SBIS PINB, 3

	RJMP    TMA

SBIS PINB, 2 RJMP GO2 RCALL COLOR2

;RCALL COLOR2 RCALL WAIT RJMP GO

GO2: RCALL COLOR1 RJMP GO;

TMA: RCALL DARK RJMP GO;

P R O C E D U R E S

WAIT: LDI R16, 1 ; 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

DARK:

   CBI	PORTB, LED_X

CBI PORTB, LED_Y RET




CV.6 = Klavesnice pres pwm ovlada rychlost vetraku


Example fan program for ATmega168 with Timer controlled PWM&Interrupt&Sleep

Rotation speed is controlled by keyboard,
keys 0-9 represent the speed between 0 and 100 %
Fan starts to rotate with the first valid key press
To do
*** Catch only the key press, not key release
To do
*** Set higher value of PWM (=higher fan rpm) for
a few first periods to start the fan reliably
P4 CPU fan Ucc pin is supposed to be connected
to +15 V, GND pin is supposed to be connected
to NMOS Drain,, Source on GND, Gate on
pin 11 (OC0B, PD5). Fan runs when pin 11 is high.

.INCLUDE "m168def.inc" .EQU PWM_PULSES = 36 ; value for 27.8 kHz PWM

.EQU PWM_PULSES = 45 ; value for 22.2 kHz PWM

.ORG 0x0000

jmp Main ; Reset Handler

.ORG 0x0008

jmp isr1 ; PCINT1 Handler

Main program start

Main:

Stack pointer init
ldi r16,high(RAMEND); Main program start
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
Hardware initialization
Keyboard init
cbi DDRC, 2 ; set inputs for keyboard (COL1-3)
cbi DDRC, 3
cbi DDRC, 4
sbi PORTC, 2 ; set internal Pull-Ups for keyboard
sbi PORTC, 3
sbi PORTC, 4
sbi DDRD, 0 ; set driving outputs for keyboard
sbi DDRD, 1 ; (ROW1-ROW4)
sbi DDRD, 2
sbi DDRD, 3
cbi PORTD, 0 ; log. 0 on all rows
cbi PORTD, 1
cbi PORTD, 2
cbi PORTD, 3
Timer controlled PWM init
There are registers TCCR0A and TCCR0B for config, DDRD for output bit
enabling, OCR0A for counter lenght and OCR0A for pulse "high" lenght.
Register TIMSK0 controlls interrupts - not used, 0x00 by default

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, 5 ; set pin 11 as PWM output OC0B (PD5 pin)
Keyboard interrupt setup
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 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 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
Set sleep mode of the CPU
SMCR
0,0,0,0,SM2,SM1,SM0,SE SM2..0: Sleep Mode Select Bits, SE: Sleep enabled)
ldi r16,0b00000001 ; Idle mode 
out SMCR,r16 ; Sleep mode set
Sleep loop, wake up by the Interrupt, return with RETI back to sleep loop

loop:

sleep ; now AVR sleeps
nop ; return from Interrupt to this instruction
rjmp loop ; and sleep again
PCINT0 Service Routine
To do
*** rpm reading, regulation, etc.

isr1:

rcall KEYPRESS
mov R17, R16
lsl R17
lsl R17 ; multiply key number by 4 for 10 steps in 40 clock pulses of PWM
out OCR0B, R17  ; output pulse "high" lenght to PWM compare unit
reti ; return from Interrupt
Keyboard decoding

KEYPRESS:

KEY0:

cbi DDRD, 0
cbi DDRD, 1
cbi DDRD, 2
sbi DDRD, 3
sbic PINC, 3
rjmp KEY1
ldi R16, 0  ;pressed key 0
cbi DDRD, 5 ; vypne vystup PWM na PORTD 5
cbi  PORTD, 5
rjmp KEYRET

KEY1:

cbi  PORTD, 0 ;log. 0 to the row with 1, 2, 3, A
sbi  PORTD, 1 ;log. 1 on another three
sbi  PORTD, 2
sbi  PORTD, 3 
sbi DDRD, 0 
cbi DDRD, 1
cbi DDRD, 2
cbi DDRD, 3
sbic PINC, 2
rjmp KEY2
ldi R16, 1  ;pressed key 1
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY2:

cbi PORTD, 0 
sbi PORTD, 1 
sbi PORTD, 2 
sbi PORTD, 3
sbi DDRD, 0 
cbi DDRD, 1
cbi DDRD, 2
cbi DDRD, 3
sbic PINC, 3
rjmp KEY3
ldi R16, 2
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY3:

cbi PORTD, 0 
sbi PORTD, 1 
sbi PORTD, 2 
sbi PORTD, 3
sbi DDRD, 0 
cbi DDRD, 1
cbi DDRD, 2
cbi DDRD, 3


sbic PINC, 4
rjmp KEY4
ldi R16, 3
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY4:

sbi  PORTD, 0
cbi  PORTD, 1 ;log. 0 to the row with 4, 5, 6, B
sbi  PORTD, 2
sbi  PORTD, 3 
cbi DDRD, 0 
sbi DDRD, 1
cbi DDRD, 2
cbi DDRD, 3
sbic PINC, 2
rjmp KEY5
ldi R16, 4  ;pressed key 4
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY5:

sbi PORTD, 0 
cbi PORTD, 1 
sbi PORTD, 2 
sbi PORTD, 3
cbi DDRD, 0 
sbi DDRD, 1
cbi DDRD, 2
cbi DDRD, 3


sbic PINC, 3
rjmp KEY6
ldi R16, 5
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY6:

sbi PORTD, 0 
cbi PORTD, 1 
sbi PORTD, 2 
sbi PORTD, 3
cbi DDRD, 0 
sbi DDRD, 1
cbi DDRD, 2
cbi DDRD, 3
sbic PINC, 4
rjmp KEY7
ldi R16, 6
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY7:

cbi DDRD, 0 
cbi DDRD, 1
sbi DDRD, 2
cbi DDRD, 3
sbi PORTD, 0 
sbi PORTD, 1 
cbi PORTD, 2 
sbi PORTD, 3
sbic PINC, 2
rjmp KEY8
ldi R16, 7  ;pressed key 7
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY8:

sbi DDRD, 0 
sbi DDRD, 1
sbi DDRD, 2
sbi DDRD, 3
cbi DDRD, 0 
cbi DDRD, 1
sbi DDRD, 2
cbi DDRD, 3


sbic PINC, 3
rjmp KEY9
ldi R16, 8
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEY9:

sbi PORTD, 0 
sbi PORTD, 1 
cbi PORTD, 2 
sbi PORTD, 3
cbi DDRD, 0 
cbi DDRD, 1
sbi DDRD, 2
cbi DDRD, 3
sbic PINC, 4
rjmp KEYRET
ldi R16, 9
sbi DDRD, 5 ; vystup PWM na PORTD 5
rjmp KEYRET

KEYRET:

sbi DDRD, 0 
sbi DDRD, 1
sbi DDRD, 2
sbi DDRD, 3
cbi PORTD, 0 ; log. 0 on all rows for next key press catch
cbi PORTD, 1
cbi PORTD, 2
cbi PORTD, 3
ret





Domaci ukol 1 (osvetleni auta)

.ORG 0x0000 
	jmp Main ; Reset Handler

.ORG 0x0008 
	jmp Int ; PCINT1 Handler

Main:

;Nastaveni portu PD0 Vstup
	
	cbi DDRD, 0
	cbi PORTD, 0


;Nastaveni portu Vystup


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, 5	; set pin 11 as PWM output OC0B (PD5 pin)
	sbi DDRD, 6
	

;switch interrupt:

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

	ldi r26, PCMSK2 ; load address of PCMSK2 in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00000001 ; allow pin change interrupt on PortD0
	st X, r16 ; store new PCMSK2

	sei ; Enable interrupts


loop:
	
	
	rjmp loop ; and sleep again

Int:

;Test jaky uroven je na pinu D0
	
	sbic PIND,0
	jump zavreno
	jump otevreno


otevreno:
	
	ldi	R16, 9
	mov R17, R16
	lsl R17
	lsl R17	; multiply key number by 4 for 10 steps in 40 clock pulses of PWM
	out OCR0B, R17  ; output pulse "high" lenght to PWM compare unit 

	reti ; return from Interrupt
	
zavreno:
	
	ldi	R16, 9
	mov R17, R16
	lsl R17
	lsl R17	; multiply key number by 4 for 10 steps in 40 clock pulses of PWM
	out OCR0B, R17  ; output pulse "high" lenght to PWM compare unit 
	jmp wait
	jmp wait
	jmp wait
	jmp wait
	jmp wait
	
	ldi	R16, 8
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 7
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 6
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 5
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 4
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 3
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 2
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 1
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17
	jmp smallwait
	ldi	R16, 0
	mov R17, R16
	lsl R17
	lsl R17
	out OCR0B, R17

	reti ; return from Interrupt
	
wait:
	1s wait
	ret

smallwait:
	0,2s wait

	ret
Osobní nástroje