Uživatel:Koubazde
Z MAM wiki
Řádka 790: | Řádka 790: | ||
ret | ret | ||
------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ||
+ | |||
+ | tyden 9. | ||
+ | |||
+ | ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
+ | ;%%%%%%%%%%%%%JELINEK Martin, KOUBA Zdenek%%%%%%%%%%%% | ||
+ | ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
+ | ; | ||
+ | |||
+ | |||
+ | |||
+ | .INCLUDE "m88def.inc" ; info pro prekladac | ||
+ | |||
+ | |||
+ | .ORG 0x0000 rjmp START ; Resetovaci vektor/skok na hl. program | ||
+ | |||
+ | |||
+ | ;Main program start | ||
+ | START: | ||
+ | |||
+ | ;%%%%NASTAVENI%%%% | ||
+ | |||
+ | ;nastaveni IN/OUT ; PORTC ADC in!!! | ||
+ | |||
+ | SBI DDRC, 0 ; clk | ||
+ | SBI DDRC, 1 ; serial clk | ||
+ | SBI DDRC, 2 ; paralel clk | ||
+ | CBI DDRC, 4 ; change number input | ||
+ | |||
+ | |||
+ | LOOP: | ||
+ | |||
+ | |||
+ | VERYSMALLWAIT: | ||
+ | LDI R20, 0xFC | ||
+ | MOV R1, R20 | ||
+ | SMALLWAIT: | ||
+ | INC R1 | ||
+ | BRNE SMALLWAIT | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | SBIS PINC,4 | ||
+ | RJMP HODJEDNA | ||
+ | RJMP HODDVA | ||
+ | |||
+ | HODJEDNA: | ||
+ | LDI R16, 0b11111010 | ||
+ | RCALL REGISTR | ||
+ | RJMP LOOP | ||
+ | |||
+ | HODDVA: | ||
+ | LDI R16, 0b01111001 | ||
+ | RCALL REGISTR | ||
+ | RJMP LOOP | ||
+ | |||
+ | |||
+ | |||
+ | ; RCALL REGISTR | ||
+ | ; by MARTIN JELINEK | ||
+ | ; v registru R16 ocekava cislo | ||
+ | ; ovlada PORTC | ||
+ | ; pro posuvny registr 74595 | ||
+ | ; PIN9 - serial data input - PORTC 0 | ||
+ | ; PIN10 - master reset (active LOW) - trvale pripojit na Vcc | ||
+ | ; PIN11 - shift registr clock input - PORTC 1 | ||
+ | ; PIN12 - storage registr clock input - PORTC 2 | ||
+ | ; PIN13 - output enable (active LOW) - trvale pripojit na GND | ||
+ | |||
+ | REGISTR: | ||
+ | LDI R17, 128 ; pro osmibitove slovo (pro 7-bitove ulozit64) | ||
+ | |||
+ | POSUN_DALSI: | ||
+ | CBI PORTC, 0 ; vynuluje vystup | ||
+ | SBRC R16, 0 ; otestuje 0 bit v R17 | ||
+ | SBI PORTC, 0 ; vystup do 1 | ||
+ | SBI PORTC, 1 ; hodiny na shift registr - vzestup hr. | ||
+ | ROR R16 ; rotace vpravo R16 | ||
+ | CBI PORTC, 1 ; hodiny na shift registr - sestup hr. | ||
+ | SBRC R17, 0 ; neni posledni | ||
+ | RJMP POSUN_KONEC | ||
+ | ROR R17 ; rotace vpravo R17 | ||
+ | RJMP POSUN_DALSI | ||
+ | |||
+ | POSUN_KONEC: | ||
+ | SBI PORTC, 2 ; hodiny na storage registr - vzestup hr. | ||
+ | NOP | ||
+ | NOP | ||
+ | CBI PORTC, 2 ; hodiny na storage registr - sestup hr. | ||
+ | |||
+ | RET |
Verze z 11. 4. 2013, 10:07
.EQU DDRB = $17 ; DDRB address .EQU PORTB = $18 ; PORTB address .EQU PINB = $16 ; P
.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)
- pro led
SBI DDRB, LED_X ; SBI - Set Bit in I/O Register SBI DDRB, LED_Y
SHOW:
- pro klavesnici
SBI DDRB, 7 ; output pin 19 SBI PORTB, 2 ; enables pull-up rezistor on pin 14
GO: RCALL COLOR1 RCALL WAIT SBIS PINB, 2 ; skip if bit is set RCALL COLOR2 RCALL WAIT RJMP GO
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, 1 ; LDI nastaveni casu 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
........................................
tyden 5.
- 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
LDI R17, 0b00001111 ; pripravi hodnotu k presunu OUT DDRD, R17 ; D0-3, piny 2-5 nastavi vystupy OUT PORTC, R17 ; C0-3, piny 23-26 pull up rez
- Init
RCALL FAN_OFF
- GO
- SBIS PINC, 2
- RCALL FAN3W ; Simple PWM control of the FAN, if the key is pressed
- RJMP GO
LDI R16, 0x02 ; konstanta pro pwm
PWM: ; nastaveni 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
RJMP PWM
- P R O C E D U R E S
VERYSMALLWAIT:
LDI R20, 0xFC
MOV R1, R20
SMALLWAIT:
INC R1
BRNE SMALLWAIT
RET
WAIT: LDI R21, 4 WAIT1: INC R1 BRNE WAIT1 INC R2 BRNE WAIT1 DEC R21 BRNE WAIT1 RET
FAN_ON: SBI PORTB, FAN RET
FAN_OFF: CBI PORTB, FAN RET
FAN3W: LDI R16, 0x20 FAN3X:
RCALL FAN_ON
RCALL VERYSMALLWAIT ; pulse ratio controlled by number of waits RCALL VERYSMALLWAIT ; 4:1 in this case RCALL VERYSMALLWAIT RCALL VERYSMALLWAIT RCALL FAN_OFF RCALL VERYSMALLWAIT
INC R2
BRNE FAN3X
DEC R16
BRNE FAN3X
RET
- obsluha preruseni
- ...........UDELAT
- obsluha CTENI KLAVESNICE PRI preruseni
KEYPRESS:
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
KEY1:
SBIC PINC, 2
RJMP KEY2
LDI R16, 1 ;pressed key 1
RJMP KEYRET
KEY2:
SBIC PINC, 3
RJMP KEY3
LDI R16, 2
RJMP KEYRET
KEY3:
SBIC PINC, 4
RJMP KEY4
LDI R16, 3
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 SBIC PINC, 2
- etc.
KEY0: SBI PORTD, 0 SBI PORTD, 1 SBI PORTD, 2 CBI PORTD, 3 ;log. 0 to the row with *, 0, #, D SBIC PINC, 3 RJMP KEYRET LDI R16, 0 ;pressed key 0
KEYRET: RET
=======================
=== tyden 6
- example fan program for ATmega88 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 "m88def.inc"
.EQU PWM_PULSES = 36 ; value for 27.8 kHz PWM/maximalni hodnota pro PWM counter
- .EQU PWM_PULSES = 45 ; value for 22.2 kHz PWM
.ORG 0x0000
rjmp Main ; Resetovaci vektor/skok na hl. program
.ORG 0x0008 rjmp isr1 ; PCINT1 Handler/skok na obsluhu preruseni
- 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
- !!!!!zapojeni!!!!
- col1 col3 row1 row3
- col2 col4 row2 row4
- !!!kabel!!!
; vstup z klávesnice = sloupce 1-3 cbi DDRC, 2 ; 25 cbi DDRC, 3 ; 26 cbi DDRC, 4 ; 27
; set internal Pull-Ups for keyboard sbi PORTC, 2 sbi PORTC, 3 sbi PORTC, 4
; set driving outputs for keyboard (ROW1-ROW4) sbi DDRD, 0 ; 2 sbi DDRD, 1 ; 3 sbi DDRD, 2 ; 4 sbi DDRD, 3 ; 5
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 ; PWM output OC0B (PD5 pin cislo 11)
- 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: sbi PORTD, 0 sbi PORTD, 1 sbi PORTD, 2 cbi PORTD, 3 ;log. 0 to the row with *, 0, #, D sbic PINC, 3 rjmp KEY1 ldi R16, 0 ;pressed key 0 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 sbic PINC, 2 rjmp KEY2 ldi R16, 1 ;pressed key 1 rjmp KEYRET KEY2: sbic PINC, 3 rjmp KEY3 ldi R16, 2 rjmp KEYRET KEY3: sbic PINC, 4 rjmp KEY4 ldi R16, 3 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 sbic PINC, 2 rjmp KEY5 ldi R16, 4 ;pressed key 4 rjmp KEYRET KEY5: sbic PINC, 3 rjmp KEY6 ldi R16, 5 rjmp KEYRET KEY6: sbic PINC, 4 rjmp KEY7 ldi R16, 6 rjmp KEYRET
KEY7: sbi PORTD, 0 sbi PORTD, 1 cbi PORTD, 2 ;log. 0 to the row with 7, 8, 9, C sbi PORTD, 3 sbic PINC, 2 rjmp KEY8 ldi R16, 7 ;pressed key 7 rjmp KEYRET KEY8: sbic PINC, 3 rjmp KEY9 ldi R16, 8 rjmp KEYRET KEY9: sbic PINC, 4 rjmp KEYRET ldi R16, 9
KEYRET: cbi PORTD, 0 ; log. 0 on all rows for next key press catch cbi PORTD, 1 cbi PORTD, 2 cbi PORTD, 3 ret
===========================================================
Tyden 7 Ovladani vetraku, osetreni stisku 2 tlacitek na klavesnici, rozbeh z 0
- ===================================================
- ======= by Jelinek Martin and Kouba Zdenek=========
- ===================================================
- fan(ny) program for ATmega88 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 "m88def.inc"
.EQU PWM_PULSES = 36 ; value for 27.8 kHz PWM/maximalni hodnota pro PWM counter/podle pouziteho vetraku
- .EQU PWM_PULSES = 45 ; value for 22.2 kHz PWM
.ORG 0x0000
rjmp Main ; Resetovaci vektor/skok na hl. program
.ORG 0x0008 rjmp isr1 ; PCINT1 Handler/skok na obsluhu preruseni
- 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
ldi r19, 0 ;reg R19 je pouzit v rutine pro rozbehovy puls
- Keyboard init
- !!!!!zapojeni!!!!
- col1 col3 row1 row3
- col2 col4 row2 row4
- !!!kabel!!!
; vstup z klávesnice = sloupce 1-3 cbi DDRC, 2 ; 25 cbi DDRC, 3 ; 26 cbi DDRC, 4 ; 27
; set internal Pull-Ups for keyboard sbi PORTC, 2 sbi PORTC, 3 sbi PORTC, 4
; set driving outputs for keyboard (ROW1-ROW4) sbi DDRD, 0 ; 2 sbi DDRD, 1 ; 3 sbi DDRD, 2 ; 4 sbi DDRD, 3 ; 5
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 ; PWM output OC0B (PD5 pin cislo 11)
- 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:
mov R19, R17
rcall KEYPRESS
cpse R19, R16 ;pokud nejsou rovny, zmena cisla - muze jit o prechod 0 - non0
rcall TEST_START
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
- ===============================
TEST_START: ldi R18, 0x0 cpse R18, R19 ; was the old length 0? rcall STARTING_PULSE ; if yes, run the starting pulse ret
STARTING_PULSE: sbi PORTD, 5 rcall WAIT cbi PORTD, 5 ret
WAIT: LDI R18, 4 ; LDI - Load Immediate WAIT1: INC R1 BRNE WAIT1 INC R2 BRNE WAIT1 DEC R18 BRNE WAIT1 RET
- ===============================
- Keyboard decoding
KEYPRESS:
- inicializace
cbi DDRD, 0 ; nastaveni vstupu na PORTD cbi DDRD, 1 cbi DDRD, 2 cbi DDRD, 3
sbi PORTD, 0 ; nastaveni pull-up rezistoru na PORTD sbi PORTD, 1 sbi PORTD, 2 sbi PORTD, 3
KEY0:
sbi DDRD, 3 ;nastaveni vystupu
cbi PORTD, 3 ;log. 0 na radek *, 0, #, D
sbic PINC, 3 rjmp KEY1 ldi R16, 0 ;pressed key 0 rjmp KEYRET
KEY1:
cbi DDRD, 3 ;obnoveni vstupu
sbi PORTD, 3 ;obnovení pull-up rezistoru
sbi DDRD, 0 ;nastaveni vystupu cbi PORTD, 0 ;log. 0 na radek *, 0, #, D
sbic PINC, 2
rjmp KEY2
ldi R16, 1 ;pressed key 1
rjmp KEYRET
KEY2:
sbic PINC, 3
rjmp KEY3
ldi R16, 2
rjmp KEYRET
KEY3:
sbic PINC, 4
rjmp KEY4
ldi R16, 3
rjmp KEYRET
KEY4: cbi DDRD, 0 ;obnoveni vstupu sbi PORTD, 0 ;obnovení pull-up rezistoru
sbi DDRD, 1 ;nastaveni vystupu cbi PORTD, 1 ;log. 0 na radek *, 0, #, D
sbic PINC, 2
rjmp KEY5
ldi R16, 4 ;pressed key 4
rjmp KEYRET
KEY5:
sbic PINC, 3
rjmp KEY6
ldi R16, 5
rjmp KEYRET
KEY6:
sbic PINC, 4
rjmp KEY7
ldi R16, 6
rjmp KEYRET
KEY7: cbi DDRD, 1 ;obnoveni vstupu sbi PORTD, 1 ;obnovení pull-up rezistoru
sbi DDRD, 2 ;nastaveni vystupu cbi PORTD, 2 ;log. 0 na radek *, 0, #, D
sbic PINC, 2
rjmp KEY8
ldi R16, 7 ;pressed key 7
rjmp KEYRET
KEY8:
sbic PINC, 3
rjmp KEY9
ldi R16, 8
rjmp KEYRET
KEY9:
sbic PINC, 4
rjmp KEYRET
ldi R16, 9
KEYRET:
sbi DDRD, 0 ; nastaveni vystupu na PORTD 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
tyden 9.
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%JELINEK Martin, KOUBA Zdenek%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
.INCLUDE "m88def.inc" ; info pro prekladac
.ORG 0x0000 rjmp START ; Resetovaci vektor/skok na hl. program
- Main program start
START:
- %%%%NASTAVENI%%%%
- nastaveni IN/OUT ; PORTC ADC in!!!
SBI DDRC, 0 ; clk SBI DDRC, 1 ; serial clk SBI DDRC, 2 ; paralel clk CBI DDRC, 4 ; change number input
LOOP:
VERYSMALLWAIT:
LDI R20, 0xFC
MOV R1, R20
SMALLWAIT:
INC R1
BRNE SMALLWAIT
SBIS PINC,4
RJMP HODJEDNA
RJMP HODDVA
HODJEDNA: LDI R16, 0b11111010 RCALL REGISTR RJMP LOOP
HODDVA: LDI R16, 0b01111001 RCALL REGISTR RJMP LOOP
- RCALL REGISTR
- by MARTIN JELINEK
- v registru R16 ocekava cislo
- ovlada PORTC
- pro posuvny registr 74595
- PIN9 - serial data input - PORTC 0
- PIN10 - master reset (active LOW) - trvale pripojit na Vcc
- PIN11 - shift registr clock input - PORTC 1
- PIN12 - storage registr clock input - PORTC 2
- PIN13 - output enable (active LOW) - trvale pripojit na GND
REGISTR: LDI R17, 128 ; pro osmibitove slovo (pro 7-bitove ulozit64)
POSUN_DALSI: CBI PORTC, 0 ; vynuluje vystup SBRC R16, 0 ; otestuje 0 bit v R17 SBI PORTC, 0 ; vystup do 1 SBI PORTC, 1 ; hodiny na shift registr - vzestup hr. ROR R16 ; rotace vpravo R16 CBI PORTC, 1 ; hodiny na shift registr - sestup hr. SBRC R17, 0 ; neni posledni RJMP POSUN_KONEC ROR R17 ; rotace vpravo R17 RJMP POSUN_DALSI
POSUN_KONEC: SBI PORTC, 2 ; hodiny na storage registr - vzestup hr. NOP NOP CBI PORTC, 2 ; hodiny na storage registr - sestup hr.
RET