Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Un processore è interfacciato ad un TIMER (programmabile dal processore) e ad una periferica che gestisce un semaforo (SEMAF). Quest’ultima periferica è provvista anche di un registro contatore che indica il numero di autovetture passate davanti ad un semaforo.
- ;Normalmente il processore ogni 90 secondi (scanditi da TIMER) comanda il semaforo ad invertire l’abilitazione ai passaggi (da rosso a verde e viceversa). Prima di abilitare la commutazione del semaforo, il processore legge il numero di autovetture passate durante il periodo in cui il semaforo è a verde, se il numero di auto passate è maggiore di 50 unità allora il processore ritarda la commutazione del semaforo di altri 30 secondi (per una sola volta, riprogrammando TIMER).
- ;Ogni qual volta che il processore legge il valore del numero di autovetture azzera il contatore di SEMAF. Naturalmente una volta che il processore ha mantenuto per altri 30 secondi il semaforo a verde deve riprogrammare TIMER per il normale funzionamento (far inviare una interruzione dopo 90 sec.).
- ;Progettare l’interfaccia del TIMER e di SEMAF.
- ;Inoltre progettare il software per la gestione delle interruzioni provenienti da TIMER.
- org 400h
- timer equ 0h ;Timer, adds another 30 seconds to traffic light switch delay when needed
- semaf equ 1h ;Traffic lights, switches every 90 seconds
- ;If 50+ cars pass during that time, delays switch through timer
- colour equ 2h ;Traffic lights colour: 0 for red, 1 for green
- maxcar equ 50 ;Cap number of cars
- delay db 0 ;Checks if delay has taken place or not
- code
- jsr init
- seti
- main: jmp main ;Loops until interrupt
- halt
- init: push R0
- movl #90, R0
- outl timer, R0 ;Initializes traffic lights timer to 90 seconds
- movl #0, delay ;Initializes delay check to false
- start timer
- pop R0
- ret
- latency: push R1
- movl #30, R1
- outl timer, R1 ;Initializes traffic lights timer to 30 seconds
- movl #1, delay ;Switches delay check to true
- start timer
- pop R1
- ret
- driver 0, 700h ;Timer driver
- push R0
- inl semaf, R0
- cmpl #50, R0
- jn switch ;If less than 50 cars have passed, switches traffic lights colour
- movl #0, R0
- cmpl #delay, R0
- jnz switch ;If delay has already taken place, switches traffic lights colour
- jsr latency ;Delays switch by 30 seconds
- jmp closureB ;Pops register without resetting timer
- switch: movl #0, R0
- outl semaf, R0 ;Resets car counter
- outl #colour, R0
- cmpl #0, R0 ;Checks if traffic lights are red
- jz gogreen ;If so, switches to green
- movl #0, R0
- outl colour, R0 ;Switches traffic lights to red
- jmp closure
- gogreen: movl #1, R0
- outl colour, R0 ;Switches traffic lights to green
- closure: jsr init ;Restarts timer
- closureB: pop R0
- rti
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement