搜索
bottom↓
回复: 2

LGT直接寄存器操作,ADC和串口

[复制链接]

出1070入962汤圆

发表于 2012-5-30 18:53:12 | 显示全部楼层 |阅读模式
做了一个气体压力传感器,板子去打样了,就先写写程序,运行在阿莫赠送的评估板上。
昨天为了没有外接电源而烧写错误,小郁闷一把。
用惯了CM3的库,突然想返璞归真一下,寄存器操作吧,清清爽爽的几行程序就搞定了。
  1. #include <avr\io.h>                  // GCC的标准io.h
  2. #include <avr\iolgt8f0xa.h>          // LGT的头文件
  3. #include <util\delay.h>                                 // 使用WINAVR自带的演示函数,F_CPU设定正确后延时还是比较准的
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <avr\wdt.h>



  7. void _putchar(char c)
  8. {
  9.         while((UCSR0A & (1 << UDRE0)) == 0);
  10.         UDR0 = c;

  11. }

  12. void putstr(unsigned char* buf)
  13. {
  14.         while (*buf)
  15.         {
  16.                 _putchar(*buf);
  17.                 buf++;
  18.         }
  19. }

  20. //初始化ADC,vref是参考源,LGT好像都是以VCC为参考源,所以这个参数写个0就可以,channl选择ADC0~ADC7
  21. int init_ADC(unsigned char vref,unsigned char channel)
  22. {
  23.         ADCSRA = 0;                        //disable ADC
  24.         DIDR0 = 0xFF;                //disable digital port
  25.         ADMUX = ((vref << 6) | channel);       

  26.         ADCSRA |= (1 << ADEN);                //enable ADC

  27.         return 0;
  28. }

  29. //单次读取ADC值
  30. int DrvADC_Convers(void)
  31. {
  32.         int retval;
  33.         ADCSRA |= (1 << ADSC);                //enable conversion
  34.         while(!(ADCSRA & (1 << ADIF)));
  35.         ADCSRA |= (1 << ADIF);                //clear ADC interrupt flag

  36.         retval = ADCL;
  37.         retval |= (ADCH << 8);
  38.         return retval;
  39. }


  40. int main()
  41. {
  42.         int ps = 0;       
  43.         unsigned char buf[32];
  44.         // 设置内部RC校正系数
  45.         OSCCAL = 0xa;
  46.         // 设置主时钟分频系数
  47.         CLKPR = 0x80;   //先将分频数修改允许位置位
  48.         CLKPR = 0x80;        //再写入分频数,这里为16M不分频

  49.         UCSR0A=0x00;
  50.         UBRR0H=0x00;
  51.         UBRR0L=0x67;   //9600bps
  52.         UCSR0B = 0x18; //0b00011000    允许:发送、接收
  53.         UCSR0C = 0x0E; //0b00001110    数据帧格式:8,N,1

  54.         DDRA = 0;          //PORTA设定为输入高阻       
  55.         PORTA = 0;

  56.         wdt_enable(WDTO_8S);  //看门狗
  57.         _delay_ms(250);

  58.         init_ADC(0x00,0x00);

  59.         putstr("READY!\r\n");
  60.         wdt_reset();          
  61.         while(1)
  62.         {
  63.                 _delay_ms(250);
  64.                 wdt_reset();

  65.                 memset((void *)buf, 0, 32);
  66.                 sprintf((void *)buf, "%d\r\n", DrvADC_Convers());
  67.                 putstr(buf);   
  68.         }

  69. }
复制代码
下面是AVRSTUDIO4.18的工程文件


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-31 15:03:05 | 显示全部楼层
这个就像为我的LGT MINI DEV量身定做一样,拿来测试下ADC了

出0入0汤圆

发表于 2012-5-31 15:15:31 | 显示全部楼层
我也喜欢一个TAB缩进
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 16:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表