?? motor_main._c
字號:
//ICC-AVR application builder : 2005-8-3
// Target : M16
// Crystal: 4.0000Mhz
//closed speed loop controlling
#include <iom16v.h>
#include <macros.h>
#pragma data:code
const unsigned char table[]={0xbd,0x84,0xd9,0xcd,0xe4,0x6d,0x7d,0x85,0xfd,0xed};//7segment
#pragma data:data
unsigned char ledbuff[]={0xbd,0xbd,0xbd,0xbd};
unsigned char adc_res8,count;
unsigned char ad_mux;
unsigned int adc_res16,count16;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xF0;//HIGH 4BIT AS OUTPUT
PORTB = 0x00;
DDRB = 0xfd;//t1 input other output
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;//port d as a output
}
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 2mSec
// actual value: 2.000mSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x16; //set count
OCR0 = 0x57; //set compare
TCCR0 = 0x05; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
unsigned char temp;
temp=SREG;
//unsigned int temp16;
TCCR1B=0X00;//STOP T1
TCCR0=0X00;//STOP T0
count++;
count16=TCNT1;
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
TCNT0 = 0x16; //reload counter value
OCR0=0X57;
TCCR0=0X05;//START TIMER0
TCCR1B=0X07;//START T1
if (count16==0)
{
TCCR0=0X00;
}
SREG=temp;
}
//TIMER1 initialize - prescale:Rising edge
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value: Out of range
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
OCR1AH = 0x00 /*INVALID SETTING*/;
OCR1AL = 0x00 /*INVALID SETTING*/;
OCR1BH = 0x00 /*INVALID SETTING*/;
OCR1BL = 0x00 /*INVALID SETTING*/;
//OCR1CH = $OCR1CH$;
//OCR1CL = $OCR1CL$;
ICR1H = 0x00 /*INVALID SETTING*/;
ICR1L = 0x00 /*INVALID SETTING*/;
TCCR1A = 0x00;
TCCR1B = 0x07; //start Timer
}
//TIMER2 initialize - prescale:1
// WGM: PWM Phase correct
// actual value: 15.686KHz (93.6%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x01; //setup
OCR2 = 0xFF;
TCCR2 = 0x61; //start
}
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
unsigned char temp;
temp=SREG;
OCR2=adc_res8;
SREG=temp;
}
//ADC initialize
// Conversion time: 3uS
void adc_init(void)
{ad_mux=0x01;
ADCSR = 0x00; //disable adc
ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f); //select adc input 0
ACSR = 0x80;
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
}
//#pragma interrupt_handler adc_isr:15
//void adc_isr(void)
//{
// unsigned char temp;
// temp=SREG;
// adc_res8=ADCH;
//hex2bcd(adc_res8);
//ad_mux=0x01;
//ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f);
// ADCSRA|=(1<<ADSC);//start adc again
// SREG=temp;
//}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
timer1_init();
timer2_init();
//adc_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x41; //enable timer0 timer2 interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay_1ms(void)
{
unsigned int i;
for (i=0;i<542;i++)
;
}
void hex2bcd(unsigned int cnt)
{
unsigned char i,temp;
for (i=0;i<4;i++)
{
temp=cnt%10;
ledbuff[i]=table[temp];
cnt=cnt/10;
}
}
void display(void)
{
unsigned char i;
for (i=0;i<4;i++)
{
PORTB=ledbuff[i];
PORTA=~(1<<(4+i));
delay_1ms();
PORTA|=(1<<(4+i));
}
}
main()
{
init_devices();
count=0;
while(1)
{
//hex2bcd(adc_res8);
hex2bcd(count16);
display();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -