Uživatel:Kotekpe3

Z MAM wiki

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

1. domaci ukol

s dovolením trochu spravím grafiku...


.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

1 domaci ukol konec

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
Osobní nástroje