Uživatel:Koubazde
Z MAM wiki
Prosím zformátujte. Horčík
Obsah |
[editovat] tyden 4.
.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
[editovat] 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 ; 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 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
[editovat] 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
[editovat] 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
[editovat] Domaci ukol 1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;%%%%%1. home work - JELINEK Martin, KOUBA Zdenek%%%%% ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ;po startu dojde k inicializaci HW ;==nastaveni vstupu a vystupu ;==vystupy vynulovany ;==nastaveni PWM a AD prevodniku ;==nastaveni a nasledne pouziti SLEEP MODu .INCLUDE "m88def.inc" ; info pro prekladac .EQU OSV_INT = 1 ; prirazeni pinu pro osvetleni interieru .EQU DOOR_IN = 2 ; prirazeni pinu pro dverni kontakt .EQU OSV_PALUB = 5 ; prirazeni pinu pro osvetleni interieru (PD5) .EQU AD_IN = 4 ; prirazeni pinu pro potenciometr .EQU STMIVANI = 100 ; pocet stmivacich kroku interniho osvetleni (0-255) .EQU PWM_PULSES = 50 ; pocet pulzu osvetleni palubni desky za 1 periodu PWM .ORG 0x0000 rjmp START ; Resetovaci vektor/skok na hl. program .ORG 0x0008 rjmp PALUBKA ; vektor preruseni/skok na obsluhu nastaveni palubniho osvetleni ;Main program start START: ;%%%%NASTAVENI%%%% ;nastaveni IN/OUT ; zvolit port podle pouziteho procesoru!!!!!!!!!!!!!!!! SBI DDRB, OSV_INT ; nastaveni vystupniho pinu pro osvetleni interieru CBI DDRB, DOOR_IN ; nastaveni vstupniho pinu pro dverni kontakt SBI DDRD, OSV_PALUB ; nastaveni vystupniho pinu pro osvetleni interieru CBI DDRB, AD_IN ; nastaveni vstupniho pinu pro potenciometr ; nastaveni SLEEP modu ; 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 ;nastaveni A/D converteru ldi R16,0b10001111 ; ADC enable (8.bit), enable interrupt (4.bit), prescaler 128 out ADCSRA,R16 ; vystup: ; 2. a 1. bit ADCL (ADC9, ADC8) ; 8. - 1. bit ADCH (ADC7 - ADC0) ;nastaveni hardwarove PWM PWM_PALUB_INIT: ; timer 0 ldi R17, 0x00 ; disable all interrupts out TIMSK0, R17 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, OSV_PALUB ; PWM output - pin pro osvetleni palubni desky ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ;==========ovladani osvetleni palubni desky potenciometrem ;(popis funkce) ; ;AD prevod nastaven pravidelne ;dokonceni AD prevodu vyvolava preruseni ;v preruseni je cislo z AD prevodniku predano do PWM ;%%%%OBSLUHA_PRERUSENI%%%% PALUBKA: MOV R20, ADCH out OCR0B, R20 ; output pulse "high" lenght to PWM compare unit reti ; return from Interrupt ;==========ovladani vnitrniho osvetleni dvernim kontaktem ;(popis funkce) ; ;kontakt pripojen na pin (DOOR_IN) ;zmena na pinu probudi mikrokontroler ze sleep modu ;rozhodne se, zda se jedna o sepnuti 1), ci rozepnuti kontaktu 2) ;1) nastaveni vystupu do log. 1 ;1) sleep mode ;2) cekaci smycka 5 sec ;2) softwarova klesajici PWM ;2) sleep mode ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ;%%%%PROCEDURY%%%% ; Sleep loop, wake up by the Interrupt, return with RETI back to sleep loop LOOP: sleep ; prechod do sleep modu nop ; return from Interrupt to this instruction SBIC PINB, DOOR_IN ; je kontakt sepnut? NE-pokracuje ZHASINEJ1 rjmp TURN_ON ; skok na sepnuti svetla ZHASINEJ1: ldi R16, 0x0 cpse R16, R17 ; je R17 nula? NE-pokracuje CEKEJ5SEC rjmp CEKEJ5SEC ; skok na CEKEJ5SEC rjmp LOOP ; skok na LOOP, R17 bylo=0, je zhasnuto CEKEJ5SEC: ; cekaci smycka pred zapocetim stmivani LDI R3, 20 ; doba je nastavovana cislem ukladanym do registru R3 WAIT1: INC R1 BRNE WAIT1 INC R2 BRNE WAIT1 DEC R3 BRNE WAIT1 LDI R17, STMIVANI ; ulozi pocet stmivacich kroku(=x) do R17=x´ LDI R19, STMIVANI ; R19=y ZHASINEJ2: MOV R18, R17 ; R18=x´´ DEC R17 SUB R19, R17 PWM_PIN_ON: SBI PORTB, OSV_INT ; zapne interni svetlo WAIT2: INC R1 ; po zapnuti ceka BRNE WAIT2 DEC R18 BRNE WAIT2 PWM_PIN_OFF: CBI PORTB, OSV_INT ; vypne interni svetlo WAIT3: INC R1 ; po vypnuti ceka BRNE WAIT3 DEC R19 BRNE WAIT3 cpse R16, R17 ; je R17 nula? NE-pokracuje ZHASINEJ2: rjmp ZHASINEJ2: ; skok na ZHASINEJ2: rjmp LOOP ; skok na LOOP, R17 bylo=0, je zhasnuto definitivne TURN_ON: SBI PORTB, OSV_INT ; zapne interni svetlo rjmp LOOP ; skok na LOOP TURN_OFF: CBI PORTB, OSV_INT ; vypne interni svetlo rjmp LOOP ; skok na LOOP
[editovat] 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
[editovat] tyden 11
.INCLUDE "C:\\Program Files\\Atmel\\AVR Tools\\AvrAssembler2\\Appnotes\\m88def.inc" ; info pro prekladac .global shift_reg_led ; deklarace funkce shift_reg_led: ; návìští, které musí být stejné, jako jméno funkce 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
[editovat] Domací úkol 2
Zadání
Studenti 1-10 mají RAM umístěnou v rozsahu adres 4000h až 5FFFh, EPROM 8000h až FFFFh, studenti 11-20 mají RAM umístěnou v rozsahu adres C000h až DFFFh, EPROM 4000h až BFFFh. Adresy I/O jsou uvedeny v tabulce na konci stránky. Pozor na kolizi paměti a I/O, pokud k ní dochází, je pro danou adresu třeba zakázat paměť, tj. místo buňky paměti je na dané adrese I/O obvod.
Student 9: Konec volného prostoru nezabraného RAM a EPROM, každá periferie zabírá rozsah (zrcadlí se v rozsahu) 256 adres, INPUT na stejné adrese jako OUT1 (tj. zabráno celkem 512 adres)
Řešení
Pro realizaci logických součinů lze využít např. obvod CD74HCT21 (2 čtyřvstupová hradla AND) pro součit adresových signálů A5 - A11 a SN74LVC1G11 (trojvstupové hradlo AND) pro součin výstupů Y1, Y3 a Y7 členu U7. Pro invertování výstupního signálu Y2 členu U7 lze využít např. obvod HCT2G04.
EPROM | 0x8000 | 0xFFFF |
OUT1 / INPUT | 0x7F00 | 0x7FFF |
OUT2 | 0x7E00 | 0x7EFF |
RAM | 0x4000 | 0x5FFF |
[editovat] Semestralni prace - Ovladani ventilatoru teplovzdusneho rozvodu
Viz Jelínek Martin, Zdeněk Kouba: Ovládání ventilátoru teplovzdušného rozvodu
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;%%%%%SEM. PRACE - JELINEK Martin, KOUBA Zdenek%%%%% ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ;po startu dojde k inicializaci HW ;==nastaveni vstupu a vystupu ;==vystupy vynulovany ;==nastaveni COUNTERU1 a AD prevodniku ;==nastaveni a nasledne pouziti SLEEP MODu .INCLUDE "m88def.inc" ; info pro prekladac ;VSTUPY: .EQU LOW_START = 1 ; prirazeni pinu pro tlacitko 1 (PB1 pin cislo 15) .EQU HIGH_STOP = 2 ; prirazeni pinu pro tlacitko 2 (PB2 pin cislo 16) .EQU ZERO_CR = 3 ; prirazeni pinu pro detekci nuly (PB3 pin cislo 17) .EQU AD_IN = 0 ; prirazeni pinu pro termistor (PC0 pin cislo 23) ;VYSTUPY: .EQU OUT = 5 ; prirazeni pinu pro optotriak (PD5 pin cislo 11) .EQU LED_IND = 6 ; prirazeni pinu pro kontrolní LED (PD6 pin cislo 12) ;NASTAVENI TEPLOTY .EQU TEMP_LOW = 128 ; nastavení komparacni hodnoty (0-255) .EQU TEMP_HIGH = 192 ; nastavení komparacni hodnoty (0-255) ; HYSTEREZE .EQU HYST = 10 ;REGISTR PRO UCHOVANI A POROVNAVANI NASTAVENE TEPLOTY .EQU TEMP_TRASH = R17 .ORG 0x0000 rjmp START ; Resetovaci vektor/skok na hl. program .ORG 0x0005 rjmp TLACITKO ; vektor preruseni/skok na obsluhu tlacitek .ORG 0x000D rjmp COUNTER1 ; Timer/Counter1 overflow - vektor preruseni/skok na obsluhu preteceni counteru1 ;Main program start START: ;nastaveni IN/OUT ; PORTC ADC in!!! CBI DDRB, LOW_START ; nastaveni vstupniho pinu tlacitko 1 (PB1 pin cislo 15) CBI DDRB, HIGH_STOP ; nastaveni vstupniho pinu pro pro tlacitko 2 (PB2 pin cislo 16) SBI PORTB, LOW_START ; pull-up pro tlacitko 1 SBI PORTB, HIGH_STOP ; pull-up pro tlacitko 2 CBI DDRC, AD_IN ; nastaveni vstupniho pinu pro termistor (PC0 pin cislo 23) SBI DDRD, OUT ; nastaveni vystupniho pinu pro optotriak (PD5 pin cislo 11) SBI DDRD, LED_IND ; nastaveni vystupniho pinu pro kontrolní LED (PD6 pin cislo 12) SBI DDRB, ZERO_CR ; nastaveni docasne-vystupniho pinu pro detekci nuly (PB3 pin cislo 17)-aby nedelal preruseni ;nastaveni SLEEP modu ;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 ;nastaveni A/D converteru ldi R16,0b10000111 ; ADC enable (7.bit), permit (enable interrupt (3.bit)), prescaler 128 out ADCSRA,R16 ldi R16,0b11100000 ; Internal 1.1V voltage reference with external capacitor at AREF pin (7.,6.bit), ADLAR (5.bit), input PORTC 0 (low 4 bit) out ADMUX,R16 ; vystup: pro ADLAR=1 ; 7. a 6. bit ADCL (ADC1 - ADC0) ; 7. - 0. bit ADCH (ADC9 - ADC2) ;nastaveni counteru1 ; 16bit, prescaler 256 - preruseni kazdych 17,8 sec ;TCCR1A: COM1A1 COM1A0 COM1B1 COM1B0 0 0 WGM11 WGM10 ; 0 0 0 0 0 0 0 0 ... normal mode ldi R16, 0x00 out TCCR1A, R16 ;TCCR1B: ICNC1 ICES1 0 WGM13 WGM12 CS12 CS11 CS10 ; 0 0 0 0 0 1 0 0 ... Clock select - clk_IO/256 ldi R16, 0b00000100 out TCCR1B, R16 ;TIMSK1: 0 0 ICIE1 0 0 OCIE1B OCIE1A TOIE1 ; 0 0 1 0 0 0 0 1 ... interrupt on overflow ldi R16, 0b00100001 out TIMSK1, R16 ;inicializace registru temperature-treshhold ldi TEMP_TRASH, TEMP_LOW ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ;%%%%PROCEDURY%%%% ;Sleep loop, wake up by the Interrupt, return with RETI back to sleep loop LOOP: SLEEP ; prechod do sleep modu nop ; return from Interrupt to this instruction RJMP LOOP ; skok na LOOP ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ;%%%%OBSLUHA_PRERUSENI%%%% TLACITKO: ; do registru se ulozi hodnota low nebo high podle stisku tlacitka sbic PINB, LOW_START ldi TEMP_TRASH, TEMP_LOW sbic PINB, HIGH_START ldi TEMP_TRASH, TEMP_HIGH reti ; return from Interrupt COUNTER1: ;zakaze se preruseni od tlacitek ldi R16, 0x00 out PCICR, R16 ; porovna se hodnota z AD prevodniku (ADCH) cp TEMP_TRASH, ADCH brge TEMP_LESS_TRASH ; je mene - odchod, vypnuti vystupu brlt TEMP_MORE_TRaSH ; je vice - detekce nuly, pak zapnuti vystupu TEMP_LESS_TRASH: sbis PIND, OUT rjmp EXIT ; pokud jiz vystup byl vypnuty, rovnou odchod ldi R18, HYST add TEMP_TRASH, R18 cbi PORTD, OUT CBI PORTD, LED_IND ; LED_OFF rjmp EXIT TEMP_MORE_TRASH: sbic PIND, OUT rjmp EXIT ; pokud jiz vystup byl zapnuty, rovnou na odchod subi TEMP_TRASH, HYST CBI DDRB, ZERO_CR ; nastaví pin (PB3 cislo 17) jako vstup SBI PORTD, LED_IND ; LED_ON ZERO: SBIS DDRB, ZERO_CR ; detekce kladne pulvlny rjmp ZERO NO_ZERO: SBIC DDRB, ZERO_CR ; detekce nuly rjmp NO_ZERO SBI PORTD, OUT SBI DDRB, ZERO_CR ; nastaví jako vystup - nedela preruseni rjmp EXIT EXIT: ; odchod: povoleni preruseni ldi R16, 0x01 out PCICR, R16 reti ; return from Interrupt