tag 标签: mega128

相关博文
  • 热度 20
    2013-12-13 23:16
    1636 次阅读|
    4 个评论
    博文不知道该怎么开头,我没搞过 Arduino,今年五月份研究过一段时间Zigbee,CC2530的Datasheet看过,只是没买模块也没做测试,因为没有什么好的想法,烂脑袋……至于AVR,三年前开始玩的,玩了半年多,吃灰了,再也没碰过,凭着记忆,去回忆过去的点滴时光吧,本文不做任何技术讨论,如果有错误或者纰漏的地方,欢迎指正。 三年前,那时候就是个小屁孩,上大学没多久,开始玩51,用51搞过很多东西,某国产51单片机,STC89C52,大家都懂,内部12分频,慢的要死。不过对于这款51,我感觉最大的好处,在当时来说,便宜,容易上手,资料丰富,下载电路可以自行搭建并且非常容易实现。当然,有个最大的弊病就是速度太慢了,我用12864做了一套图形库,后果可想而知,我们当时戏称“拉窗帘”。 偶然的机会,当时在我面前有两个选择,要么玩32,要么玩AVR,权衡好久,我选择玩AVR,IC的型号为Mega128L,理由有这么几个: 1、STC89C52这个IC缺少很多片内外设,比如IIC、SPI等,如果我直接上STM32,调用库函数的话,可能不会有配置寄存器这么直观明显,也不会对这些外设和通信协议理解透彻,STM32也可以配置寄存器,但是一个从8bitMCU学习者直接上32bitMCU,恐怕自己会吃不消; 2、STC89C52这个IC的IO口是没有输入输出这个概念,STM32的GPIO是有8种模式,而AVR正好介入这两者之间,适合在原有基础上做适度的提升。 基于以上这两点,我选择玩Mega128。 X宝搜索,下单,收货。 买板子的时候顺便买了一个仿真器,板子到手后,第一步是流水灯,我用的IDE是AVRStudio,因为AVRStudio支持在线硬仿,写完程序后直接烧录或者在线仿真就可以,用起来还是非常方便的。 还记得前文我说的我为51写的12864的图形库吧,我把它移植到AVR上,并且优化了代码,窗帘效应没有了,那时候各种高兴。另外,板子的例程里面有ucos移植的步骤,并提供了一个已经移植好的框架,我在框架的基础上做了二次开发,配合我之前做的图形库,High了好长的一段时间。 从Mega128上,我开始探索和学习IC的内核架构,学习它的时钟体系,这也是为我后期学习STM32打下了很好的基础。2011年电子设计大赛,我当时参加比赛,准备了STC12C5A60S2、ATMega128L和STM32F103VC三款IC做主控,因为我在组里是负责程控部分,在前期准备的时候,为STC12C和Mega128均作了一套库,类似于STM32的那种库,这套库不仅支持片内资源,也支持很多片外外设,后期的比赛中,我的128立了大功。 AVRMega128还有一个很大的优点就是proteus的库里面支持它的仿真,话不多说,你懂得。 只是后来很不幸,电脑某次出现问题,整个硬盘都完蛋了,所有的资料,那个晚上,都没了,我当时抱着电脑都哭了,直到现在想想,心里都各种懊悔和难过。 废话不多说了,上几张跟Mega128相关的照片吧  
  • 热度 15
    2012-11-4 15:05
    2271 次阅读|
    0 个评论
    AVRstudio6下写的,IDE自带GCC。使用Timer1的输入捕获,晶振8M.   #include stdio.h #define F_CPU 8000000 #include util/delay.h #include avr/io.h #include avr/iom128.h #include avr/interrupt.h    //中断信号头文件   #define LED         PORTE                //数据口 #define LEDDDR         DDRE                 //数据口方向寄存器   #define PORT_DATA  PORTC #define PORT_SEL   PORTA #define DDR_DATA   DDRC #define DDR_SEL    DDRA   #define DDR_WAVE_TRIG DDRD #define DDR_WAVE_ECHO   DDRD #define PORT_WAVE_TRIG PORTD #define PORT_WAVE_ECHO   PORTD #define PIN__WAVE_TRIG  PIND #define PIN__WAVE_ECHO  PIND #define TRIG  PD6 #define ECHO  PD4   #define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us) #define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)   #define uchar           unsigned char #define uint            unsigned int #define ulong           unsigned long   volatile ulong ov_counter=0; volatile uint rising_edge,falling_edge; volatile ulong pulse_clocks = 1000;//高电平宽度 volatile uint    temp;   const char Table ={0x3f,0x06,0x5b,0x4f,0x66,                 0x6d,0x7d,0x07,0x7f,0x6f};   char Date ={1,2,3,4};   void Display(char *p) { char i,sel=0x01; for(i=0;i4;i++) { PORT_SEL = sel;     // 1 表示选通 PORT_DATA = ~Table ];   if(i == 0) PORT_DATA = ~(17);   delay_ms(2); PORT_DATA= 0xFF ; sel= sel1; } }   void Io_Init(Void) { DDR_DATA = 0xFF; PORT_DATA = 0x00;   DDR_SEL  = 0x0F; PORT_SEL = 0x0F;   DDR_WAVE_ECHO = ~(1ECHO);//ECHO设输入 ,ICP1 DDR_WAVE_TRIG |= (1TRIG);// 触发脉冲设输出   PORT_WAVE_ECHO = ~(1ECHO);//ECHO和TRIG均初始化为0 PORT_WAVE_TRIG = ~(1TRIG);     LEDDDR |= 0XFF;   LED = 0xFF; }   void Initial_Timer(void) { TCCR1B = 0; TCCR1A = 0x00; TCCR1B = (1ICNC1)|(1ICES1)|(1CS11);//8, 上升沿触发   TIMSK |= (1TICIE1)|(1TOIE1);//使能ICP捕捉中断,溢出中断 } /* (count * div)/8M * 340/2 m (count * div)/8M * 340/2 *1000 mm count*8/8000000 * 170*1000 = count*17/100 mm ; */ void Calc_Distance( char* p) { volatile unsigned long TN = 0; TN = (falling_edge*17/100);// 单位为mm p = TN/1000; p = (TN % 1000)/100; p = (TN % 100)/10; p = TN % 10; }   void GenerateTrig(void) { PORT_WAVE_TRIG |= (1TRIG); delay_us(30); PORT_WAVE_TRIG = ~(1TRIG); } /* void main() { unsigned int count = 0; Io_Init(); Initial_Timer(); //asm("SEI"); //打开全局中断   while(1) { GenerateTrig(); while(!(PIN__WAVE_ECHO (1 ECHO))) // wait for echo raising  {;}    TCNT1H = 0; TCNT1L = 0; while((PIN__WAVE_ECHO (1 ECHO))) // wait for echo falling  {;} falling_edge = TCNT1L; temp = TCNT1H; falling_edge |= temp8; Calc_Distance(Date); Display(Date);    Display(Date); }   } */ void main() { unsigned int count = 0; Io_Init(); Initial_Timer(); asm("SEI"); //打开全局中断   while(1) {   Calc_Distance(Date);   count++; if(count 100)//产生一次Trig { count = 0; GenerateTrig(); }   Display(Date); }   }   ISR(TIMER1_OVF_vect) { ov_counter++; }   ISR(TIMER1_CAPT_vect) {     if(PIN__WAVE_ECHO (1 ECHO)) //上升沿 { TCNT1H = 0;    TCNT1L = 0;    TCCR1B = ~(1ICES1); //改为下降沿中断    ov_counter=0;   LED ^= (1PE7); LED |= ~((1PE7)|(1PE6));     }     else //下降沿 {    falling_edge = ICR1L;    temp = ICR1H;    falling_edge |= temp8;     TCCR1B |= (1ICES1); LED ^= (1PE6); LED |= ~((1PE7)|(1PE6));     } }   /* ISR(TIMER1_CAPT_vect) { if(PIN__WAVE_ECHO (1 ECHO)) //上升沿 { rising_edge = ICR1L; temp = ICR1H; rising_edge |= temp8;   TCCR1B = ~(1ICES1); //改为下降沿中断 ov_counter=0;   LED ^= (1PE7); LED |= ~((1PE7)|(1PE6)); } else //下降沿 { falling_edge = ICR1L; temp = ICR1H; falling_edge |= temp8;   TCCR1B |= (1ICES1); pulse_clocks = (ulong)falling_edge - (ulong)rising_edge + (ulong)ov_counter*0x10000; LED ^= (1PE6); LED |= ~((1PE7)|(1PE6)); } } */
相关资源