Dobrý den, potřeboval ybch poradit s projektem. Tohle je moje zadání: Na zvoleném portu počítače zobrazte pomocí led diod níže uvedenou sekvenci jednotlivých stavů (odpovídá světelným efektům semaforu). Časová prodleva mezi změnou jednotlivých stavů bude 1s, která bdue generována 16bit čítačem-časovačem s využitím obsluhy přerušení. Provádění programu bude možno odstartovat stistem tlačítka S1(funkce tlačítka start sekvence). Po stisku tlačítka S1, proběhne sekvence pouze jednou, k provedení (zopakování) celé sekvence bude třeba znovu stisknout tlačítko S1. Tlačítko S2 kitu bude přepínat mezi pracovním a klidovým režimem semaforu, kdy bude zobrazován stav [3] s periodou zobrazení 1s (bude svítit přerušovaně). kombinace zobrazované na portu počítače [0] 00000111; [1] 00011111; [2] 11100000; [3] 00011000; [4] 00000111; V první fázi tvorby programu nakreslete příslušný vývojový diagram
A tady je můj problém, který je relativně funkční, ale nevím, jak do toho přidat tlačítka. Nemohl by mi někdo poradit?
.NOLIST
.include "m32def.inc"
.LIST
.DEF Tmp = R17
.DEF pom = r18
.DEF citac = R0
.DEF pom_int = R1
rjmp main
;************* vektory preruseni
reti ;RESET Reset Handler
reti ;EXT_INT0 IRQ0 Handler
reti ;EXT_INT1 IRQ1 Handler
reti ;EXT_INT2 IRQ2 Handler
reti ;TIM2_COMP Timer2 Compare Handler
reti ;TIM2_OVF Timer2 Overflow Handler
reti ;TIM1_CAPT Timer1 Capture Handler
reti ;TIM1_OVF ;Timer1 Overflow Handler
reti ;TIM1_COMPB ; Timer1 CompareB Handler
reti ;EE_RDY EEPROM Ready Handler
reti ;TIM0_COMP Timer0 Compare Handler
reti ;TIM0_OVF Timer0 Overflow Handler
reti ;SPI_STC SPI Transfer Complete Handler
rjmp TIM1_COMPA; Timer1 CompareA Handler
reti ;USART_RXC USART RX Complete Handler
reti ;USART_UDRE UDR Empty Handler
reti ;USART_TXC USART TX Complete Handler
reti ;ADC ADC Conversion Complete Handler
reti ;ANA_COMP Analog Comparator Handler
reti ;TWI Two-wire Serial Interface Handler
reti ;SPM_RDY Store Program Memory Ready Handler
;************** obsluha preruseni pro citac TC0
TIM1_COMPA: in pom_int,SREG //muze se stat ze inc citac zmeni navesti ve stavovem registru
out SREG,pom_int //pro vylouceni vedlejsiho ucinku je ulozen predchozi stav ***
inc pom
// ldi tmp,250 //preddelickou mame vydeleno na 15625 / kit bezi 16MHZ takze 62500
// cpse pom,tmp //tak nechame projit kazdy 125ty krok a ziskame 125HZ / nebo 250HZ
// rjmp ven
ldi pom,0 //reset pomu
inc r20
cpse r20,r21
rjmp ven
ldi r20,0
ven: out SREG,pom_int //a zde je vlozen zpet***
reti
;************** hlavni program - zacatek
main:
;************** inicializace zasobniku
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
ldi r20,0
ldi r21,4
;************** inicializace SW citace
ldi tmp,0
mov citac,tmp
;************** nastaveni preddelicky na deleni 1
ldi tmp,0x01 //pak nastavit na 0x03 a bude to pro 256
out TCCR1B,tmp
ldi tmp,0xFA //nastaveni hodnoty 64000 pro komparátor A
out OCR1AH,tmp
;************** nastaveni smeru prenosu portu B je vystup
ldi tmp,0xFF
out DDRB,tmp
;************** povoleni preruseni citace/casovace1
ldi tmp,0x10 //v rezimu komparatoru A
out TIMSK,tmp
;************** povoleni vsech preruseni
sei //instrukce sei globalni povoleni preruseni
ldi pom,0 //vyresetovani meho pomocneho registru
cyklus: rcall vystup
cpi r20,1
breq ct_tab1
cpi r20,2
breq ct_tab2
cpi r20,3
breq ct_tab3
rjmp cyklus
vystup: mov tmp,citac
out PORTB,tmp
ret
ct_tab1:
LDI ZL,LOW(Tab*2)
adiw ZL,0
LPM
MOV citac,R0
rjmp cyklus
ct_tab2:
LDI ZL,LOW(Tab*2)
adiw ZL,1
LPM
MOV citac,R0
rjmp cyklus
ct_tab3:
LDI ZL,LOW(Tab*2)
adiw ZL,2
LPM
MOV citac,R0
rjmp cyklus
tab:
.DW 0x071F, 0xFFE0