Att få mer I/O pins på ATTiny med Skift register (5 / 6 steg)
Steg 5: Exempel #2: kod
Denna kod är mycket mindre och enklare än i föregående exempel, eftersom denna tid vi inte använder ADC. Som ni kan se, SEND_BYTE subrutin är oförändrad och ganska mycket samma sak.
/*
* Skift registrera demo #2
* ATTiny13A löpning
*
* PIN-BELÄGGNING:
* PB0 - SKIFT Register klocka
* PB1 - SKIFT Register seriella Data
* PB2 - SKIFT Register Latch(Store)
* PB3 - Digital ingång (bit match)
* PB4 - LEDDE
* PB5 - RST
*
*/
.include "tn13Adef.inc"
def A = R16; g.p. variabel och/eller funktion argument
.def B = R17; Används i SEND_BYTE och ADC_START som tillfällig lagring
.def LED = R18; lagrar nuvarande LED utdata
.def BCT = R19; Bitars räknare för SEND_BYTE
.def TIM = R20; Lagrar hur många iterationer av TOV0 har gått
.def TMP = R21
.EQU SRCK = 0; PB0 = klocka
.EQU SRDA = 1; PB1 = seriella Data
.EQU SRLC = 2; Pb2 = Latch
/ * AVBRYTA VEKTORER * /
.org 0x0000; Återställa avbrott
rjmp RESET
.org 0x0003
rjmp TC0_OV; Timer0 Overflow avbrott
/*
* BÖRJA!
*/
RESET:
/ * SETUP STACK * /
LDI A, low(RAMEND); Ställ in buntpekaren
reda på SPL, A
/ * SETUP STIFT * /
LDI A, 0b0001_0111; Ställa in utgångsstift PB0... PB2(CLK,DATA,LATCH)
ut DDRB, A; PB4 - LED utgång
/ * SETUP TIMER0 * /
LDI A, 0b0000_0101; Ställa in Timer Prescaler 1/1024
ut TCCR0B, A; Avbryta varje ~ 27ms
LDI A, 0b00000010; Aktivera Timer0 Overflow avbrott
ut TIMSK0, A;
/ * ÅTERSTÄLL REGISTER * /
LDI A, 0x00; Rensa A
LDI LED, 0x10; Standard blink speed(~1Hz)
SEI; Aktivera avbrott
/ * Main loop * /
MAIN:
LDI A, 1. Ange den första biten
LDI TMP, 0; Tillfällig förvaring för nya LED försening
Nästa:
rcall SEND_BYTE; Skicka A att skifta Reg.
sbic PINB, 3. Sök efter matchen
eller TMP, A; Lägga till den för att leda
CLC; Tydligt bär
rol A; Rotera A
breq kontroll. Om A == 0, kontrollera och börja om
rjmp nästa; annat få nästa bit
Kontrollera:; Bara tilldela nollskilda värden
TST TMP; TMP == 0?
breq huvudsakliga; hoppa över
MOV LED, TMP; annars tilldela nya LED dröjsmål
rjmp MAIN
/*
* Skickar 8-bitars data från ett register till SKIFT Register
* (Samma som i föregående exempel)
*/
SEND_BYTE:
LDI BCT, 0b1000_0000; Ställa in bitars räknare
next_bit:
MOV B, A; Flytta databyte till temp-
och B, BCT; Kolla lite
breq noll. Hoppa över om 0
SBI PortB, SRDA; Skicka Data
rjmp SKIFT. flytta höger
Zero:
CBI PortB, SRDA
SKIFT:
SBI PortB, SRCK; CLK upp
NOP
CBI PortB, SRCK; CLK ner
CLC; Rensa bär flaggan
ror BCT; Shift bitars räknare
brne next_bit; Nästa iteration
SBI PortB, SRLC; När gjort, spärr
NOP
CBI PortB, SRLC
ret; Gjort
/ * Timer 0 spill avbrott * /
TC0_OV:
Inc TIM; TIM ++
CP TIM, ledde; TIM > LED?
brlo tidigt; för tidigt
push TMP; Spara gamla TMP värdet
i TIM, PINB; Läs aktuella hamnstatens
LDI TMP, 0x10;
ESO TIM, TMP; Toggle PB4
ut PORTB, TIM;
LDI TIM, 0; Återställ räknaren
pop TMP; Återställa TMP
tidigt:
Reti; returnera