Uživatel:Kotekpe3

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
Řádka 1: Řádka 1:
 +
1. domaci ukol
 +
 +
 +
 +
.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
Example fan program for ATmega168 with Timer controlled PWM&Interrupt&Sleep
;
;

Verze z 14. 4. 2013, 20:54

1. domaci ukol


.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