搜索
bottom↓
回复: 31
打印 上一主题 下一主题

上传4程序库:LCD1602,DS1620,USART,PT2262和PT2272;加一个使用范例。

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2007-12-1 20:33:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先介绍一下程序库的构想,在OurAvr中大多数程序是以一个项目作为单元上传的,然后大家从中摄取经验应用在自己的程序中。
其实我认为,可以采用程序库的概念,将IC驱动和程序分开。这样我们可以为每一个IC或者模块写驱动,可以采用任意的AVRµC。

举例说明,LCD1602中有lcd1602.h,在这个文件里,用#define首先封装LCD1602的使用模式,例如:
#ifndef LCD1602_BIT
# warning "LCD1602_BIT not defined for LCD1602.h"
#define LCD1602_BIT 4
#endif
这样,这个驱动可以使用4线模式和8线模式。而且编译器可以通过 #if 来选择编译4线模式函数和8线模式函数,把没有用的代码cache在程序之外。

接下来用#define封装所有LCD1602的Interface借口,例如:
#ifndef LCD1602_RS
# warning "LCD1602_RS not defined for LCD1602.h"
#define LCD1602_RS (PA5)
#endif

#ifndef AVRM_PORT_LCD1602_RS
#warning "AVRM_PORT_LCD1602_RS not defined for LCD1602.h"
#define AVRM_PORT_LCD1602_RS (PORTA)
#endif

#ifndef AVRM_DDR_LCD1602_RS
#warning "AVRM_DDR_LCD1602_RS not defined for LCD1602.h"
#define AVRM_DDR_LCD1602_RS (DDRA)
#endif

在lcd1602.c中可以直接使用AVRM_DDR_LCD1602_RS |= _BV(LCD1602_RS);代替直接使用io的语句,最终使驱动和AvrµC分离开来。

上传4个程序库:LCD1602,DS1620,USART,PT2262和PT2272,但是偷懒了一下,我把所有的初始值设置为我需要的值。
如果要使用这些程序库,需要写一个main.h把所有需要的宏重新定义就可以了。

我同时上传了一个使用范例 main.c,在这个范例中,使用DS1620测试温度,用LCD1602显示温度。
Atmel162把串口收到的0-F的值显示在LCD上,同时通过PT2262驱动发送出去,然后通过PT2272驱动接受在显示到LCD上。

编译的时候需要分别编译每一个程序库,在Makefile中有例子。

最后需要说明一下环境,fedora7 + avrgcc + avrlib + minicom. 我不知道别的环境可不可行。

缺点:我没有考虑一个项目中使用多个相同模块或者IC的情况,如果要考虑这些会使程序库变得异常复杂。不知道大家有什么提议。

图片:


程序:
点击此处下载ourdev_184441.rar(文件大小:14K)

DS1620 DataSheet:
点击此处打开ourdev_184440.pdf(文件大小:196K)

Circuit 连接图:
以后补上

出0入0汤圆

2
发表于 2007-12-1 21:00:32 | 只看该作者
顶!我正好需要1602!谢谢啦~

出0入0汤圆

3
发表于 2007-12-1 23:03:46 | 只看该作者
楼主有没有测试传输的距离和数据随着距离的加大的稳定性!

出0入0汤圆

4
发表于 2007-12-1 23:37:34 | 只看该作者
"同时通过PT2262驱动发送出去,然后通过PT2272驱动接受在显示到LCD上。"
不明白这句什么意思?  发射接收还要通过2262--》2272

出0入0汤圆

5
 楼主| 发表于 2007-12-2 01:07:43 | 只看该作者
to  haizhilan Mazp
我用LED和实验版搭载一个PT2272接受平台,对于距离测试了大约30米左右不成问题。

但是我发现用avr控制PT2262有很大的问题,一般的PT2262发送模块都是把TE和GND连在一起了,不知道阿莫的是不是也一样。

如果只通过改变D0-D3的发送字符,PT2272不会立即响应。

所以我采用了一种新的方法,

首先把GND也接到一个IO上,然后每次转变D0-D3都要把端口(D0-D3,GND)的DDR翻转一次。

这样,PT2272会立即响应,稳定性很高。

我打算下一步用来控制我的小车,进一步测试一下。

———————————————————————————————————————————
to avr_c

其实我写的是PT2262 和 PT2272的驱动,我用一个162测试的。

当 162 从串口接收到一个(0-9,A-F)的字符Char时,162把这个字符显示到LCD上 PC-> Char,同时驱动PT2262发送一个16based数值(4位0-F,从Char转译过来的)。

这时,PT2272会收到这个数值,并显示到LCD上。

这样我就测试了PT2262 和 PT2272的驱动.
头像被屏蔽

出0入0汤圆

6
发表于 2007-12-2 06:11:53 | 只看该作者
COOL, 期待电路图。

出0入0汤圆

7
 楼主| 发表于 2007-12-2 17:14:25 | 只看该作者
最近较忙,过些日子补上。

出0入0汤圆

8
发表于 2008-7-7 00:08:39 | 只看该作者
大侠,有空能帮我看看这个2262发送和接受的程序么,都接到一个AVR m16上的








#include   "iom16v.h"  
#include   "macros.h"  



#define setD0      (PORTB |=0b10000000)
#define clrD0      (PORTB &=0b01111111)
#define setD1      (PORTD |=0b00000100)
#define clrD1      (PORTD &=0b11111011)
#define setD2      (PORTD |=0b00000010)
#define clrD2      (PORTD &=0b11111101)
#define setD3      (PORTD |=0b00000001)
#define clrD3      (PORTD &=0b11111110)
#define D0    PINB &=(1<<5)
#define D1    PINB &=(1<<4)
#define D2    PINB &=(1<<3)
#define D3    PINB &=(1<<2)

int table[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

int scan[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  char data=0;
void PORT_init()
{
PORTA=0xff;
DDRA=0xff;
PORTB=0x00;
DDRB=0x81;
PORTC=0x00;
DDRC=0xff;
PORTD=0xf0;
DDRD=0x0f;
clrD0;
clrD1;
clrD2;
clrD3;
}  
   
void timer0_init()
{SREG=0x80;
TIMSK|=(1<<TOIE0);//開TO溢出中斷;
TCCR0=0x07;       //外部T0腳,上升沿驅動;
TCNT0=0xff;//初值
}  
   void INT1_init()
{SREG=0x80;                     /*使能全局中断*/
MCUCR=0x03;
  MCUCR|=((1<<ISC11)|(1<<ISC10));  /*上升沿触发方式*/
  GICR|=(1<<INT1);
}
   #pragma interrupt_handler timer0_ovf:10
void timer0_ovf()
{int delay=1000000;/*
int i;
for(i=0;i<8;i++)
{
  table=(~table);
}
*/

table[2]=~table[2];
receive();
TCNT0=0xff;      //定時器重新賦初值

}


#pragma interrupt_handler int1:3
void int1()
{
table[1]=~table[1];
send();
   GICR|=(1<<INT1);
   GICR|=(1<<INT0);
GICR|=(1<<INT2);
}
   
void send()
  {
     setD0;
         setD1;
         setD2;
         setD3;
   
  }
  
  void receive()
  {int i,delay;
  data=0;
  if(D3) data++;
  data<<1;
  if(D2) data++;
  data<<1;
  if(D1) data++;
  data<<1;
  if(D0) data++;
  
  if (data!=0)
  
  
  {
   
      table[3]=~table[3];
          
   delay=1000000000;
          while(delay--);
   }

  
  
  }
  
  
  void main()
  {
   int i,delay=10000000;
   PORT_init();
   timer0_init();
   INT1_init();
  // while(delay--)
  // delay=100000000;
  // while(delay--)
  
  
   while(1)
  
  {for(i=0;i<8;i++)
           {    delay=1000;
              PORTA=scan;
              PORTC=table;
              
              while(delay--);
           }


   }
  }

出0入42汤圆

9
发表于 2008-7-7 09:29:56 | 只看该作者
不知道 pollycat  的电路和要实现什么功能?

请注意变量取值范围:
delay=1000000000;  //?????

出0入0汤圆

10
发表于 2008-7-7 11:53:51 | 只看该作者
这只是个测试有无发送和接收的测试程序,现在只简单设了个假如有收到1111的信号就对点阵取反,原来亮着的点阵就会灭,来标志一下有没有收到信号而已。
现在主要是没有接受信号的问题,用万用表测2272的VT没有出现高电平,也就是说没有接收信号是吧


电路是,把我买的个PT2262和2272的无线发送模块,想知道我这样接线对不对。是带锁存器的四位数据的那种喔。
模块引出的一条黑线和一条红线分别接地和电源。我接的电源是直接从AVR MEGA16的电源那里引出来的+5v。不知这样可以不可以
然后四个数据脚接到单片机的接口,接受和发送设了相同的地址位。
接受的话就接了七个脚到单片机口咯,电源、地、VT,和四个数据位。地址也设了。

出0入0汤圆

11
发表于 2008-8-16 10:48:49 | 只看该作者
MARK

出0入0汤圆

12
发表于 2008-9-10 16:50:50 | 只看该作者
谢谢

出0入22汤圆

13
发表于 2008-9-10 16:51:57 | 只看该作者
谢谢楼主。

出0入0汤圆

14
发表于 2009-2-26 15:06:29 | 只看该作者
帮楼主顶起,让更多人收益

出0入0汤圆

15
发表于 2009-2-26 17:55:11 | 只看该作者

出0入0汤圆

16
发表于 2009-2-26 19:52:49 | 只看该作者
Mark~~~

出0入0汤圆

17
发表于 2009-7-15 20:39:18 | 只看该作者
顶一下

出0入0汤圆

18
发表于 2009-9-12 14:23:28 | 只看该作者

出0入0汤圆

19
发表于 2009-10-29 10:27:21 | 只看该作者
回复七楼:这样永远也成功不了,参考手册等自己搞。

出0入0汤圆

20
发表于 2010-1-26 03:04:30 | 只看该作者
顶!!!!!!!!

出0入0汤圆

21
发表于 2010-1-26 07:29:20 | 只看该作者
MARK一下!

出0入0汤圆

22
发表于 2010-1-26 09:45:25 | 只看该作者
MARK一下!

出0入0汤圆

23
发表于 2010-1-28 01:28:29 | 只看该作者
学习学习

出0入0汤圆

24
发表于 2010-2-26 14:01:24 | 只看该作者
电路图呢?好期待啊

出0入0汤圆

25
发表于 2010-2-26 16:54:59 | 只看该作者
回复【楼主位】zzsoft
-----------------------------------------------------------------------

ding

出0入0汤圆

26
发表于 2010-9-25 19:11:43 | 只看该作者
MARK一下!
好!

出0入0汤圆

27
发表于 2011-8-2 09:57:16 | 只看该作者
回复【楼主位】zzsoft  
-----------------------------------------------------------------------
楼主,小弟最近在看PT2262的datasheet,在datasheet里面有一处疑问:
出现在第七页:

"OSCILLATOR   
The Oscillator Frequency for the IR Type of Operation is twice the carrier frequency. Thus, the  
oscillator frequency should be kept at 76 KHz.  A 430K ~ 560KΩ oscillator resistor between OSC 1 and  
OSC 2 pins is recommended. It should be noted that the carrier is a 50% duty cycle frequency. "
为什么振荡频率为载波频率的两倍,如果是射频模式那个振荡模式也要符合这条件吗?
(datasheet里面说:OSC1、OSC2两端的电阻决定振荡频率)
所以推荐红外发射的时候的电阻为430K-560K,可是我接了1M的电阻也会发出40K的信号(我用我51开发板板上的只接受40K红外载波的接收头,发现接收头输出端出现低电平,这应该可以说明有40K的载波发出吧)

这个是datasheet的链接:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4922602&bbs_page_no=1&search_mode=3&search_text=Helloeveryon&bbs_id=9999

出0入0汤圆

28
发表于 2011-8-2 11:17:05 | 只看该作者
mark

出0入0汤圆

29
发表于 2011-9-27 23:57:42 | 只看该作者
最近正为1620头痛中...

出0入0汤圆

30
发表于 2011-10-12 22:18:24 | 只看该作者
mark

出0入0汤圆

31
发表于 2011-10-19 00:26:15 | 只看该作者
标志一下

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-8 04:20

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

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