Diskuse:1. domácí úkol

Z MAM wiki

Přejít na: navigace, hledání

S kolegou Petrem Pavlatou jsme dali dohromady možný Vývojový diagram pro řešení úlohy..--Bruckner 3. 4. 2011, 13:28 (UTC)

kostra řešení - autor - Petr Pavlata a --Bruckner 5. 4. 2011, 19:58 (UTC)

// Ukol MAM, rizeni autosvetla
// Autori
Honza Brukner, Petr Pavlata
// Pouzivejte co chcete, ale pokud neuvedete puvodni autory, utrhnou vam hlavu

.INCLUDE "m8def.inc" .EQU PWM_PULSES = 36 ; value for 27.8 kHz PWM

.EQU PWM_PULSES = 45 ; value for 22.2 kHz PW

.ORG 0x0000 ;//sem skoci po resetu rjmp main

////////////////////////////////////
/vektory preruseni
///////////////////////////////////

.ORG 0x0001 rjmp spinac ; preruseni od spinace .ORG 0x0009 rjmp tick ;preruseni od citace

////////////////////////////////////
// Inicializace
///////////////////////////////////

inic: ; Stack pointer init: ldi r16,high(RAMEND); Main program start out SPH,r16 ; Set Stack Pointer to top of RAM ldi r16,low(RAMEND)

//porty

cbi DDRD,2 //INT0 jako vstup cbi PORTD,2 ///pullup

///ADC

cbi DDRC,0 //ADC vstup sbi PORTC, 0 //bez pullpu

ldi R17,0b11100000 // Nastaveni ADC / int. reference, 2.54, kanal 0 out ADMUX, R17 ldi R17,0b11100111 //ADC povolenoi, freerunning mode out ADCSRA, R17

////////////////////////
system timer
/
/ Timmer 0, vyvila preruseni kazdych 30ms

ldi R17, 0b00000101 ;/ nastaveni delicky Timmer 0 na clk/1024 out TCCR0,R17 in R17, TIMSK ori R17, 0b00000001; povoleni preruseni od T0 pri preteceni out TIMSK,R17 ldi R17, 16 out TCNT0,R17


////////////////////////////////
/Inicializace PWN, zatim nefunguje
/
///PWM_1

sbi DDRB,1


///PWM2

sbi DDRb,2 ldi R17, 0b01100011 ; Fast PWM Mode, out on OC0B, non Inverting out TCCR1A, R17 ; ldi R17, 0b00001111 ; WGM2:1 (Fast PWM), CS2..0:001 (internal clock, prescale=1) out TCCR1B, R17

//////////////////
sbi IVSEL,INT0 //povoleni preruseni od INT0

in r16, MCUCR ori r16, 0b00000011

sbi MCUCR, 0 // nastaveni INT0 reahce na vzestupnou hranu
sbi MCUCR, 1 /// ------/-------- nelze pouzit sbi

out MCUCR, R16 in r16, GICR ori r16, 0b01000000 out GICR, R16

////////// jeste je nutne zapnout preruseni pri preteceni timer 0 v jeho inicializaci


ret;


//////Hlavni program

main: rcall inic; sei ;///glogalni povoleni prerusovaciho subsystemu main_loop:

rcall read_ADC // CPI R18, 128

mov R17, R19 rcall set_pwm; rjmp main_loop

///////////////////
/ podprogramy
//////////////////
//////////////////
/ Cteni ADC
vysledek R18
/////////////////

read_ADC: in R18, ADCH ret

/////////////////
/nastaveni PWM
R16 PWM1, R17 PWM2
///////////////

set_pwm:

out OCR2, R17 ret

/rizeni vetla

rizeni_svetla: ;//// Tady by mel byt kod, ktery bu rozhodovat, v jake fazi se system nachazi (svetlo ;//// trvale svitici, pohasinani, doby a rychlost pohasinani. Na zaklade tohoto stavu ;//// nastaveni PWM kanalu ridiciho svetlo ;//// Rozhodovan ipomoci pomocneho citace, krok vyplyva z periody TIMER0, tj. asi 30ms set_pwm; ret

//////////////////
preruseni
////////////////
/ od casovace

tick: cli; zakaz preruseni pri teto akci ldi R17, 16 out TCNT0,R17 ; nove prednastaveni citace

rcall read_ADC; mov r17,R18 rcall set_pwm

ror R21; brvc zadna_akce; /test C, kdyz 0, tak skoc

;// ;/ sem skoci, pokud nastaven priznak (akce R21,1 == 1) ;/ ;/ `rcall rizeni_svetla;

zadna_akce: sei; reti

/ od spinace

spinac: cli; ldi R20, 0; ldi R21, 0b00000001; sei; reti

Osobní nástroje