AVR单片机的TWI中断模式

2019-11-07来源: 51hei关键字:AVR单片机  TWI  中断模式

使用AVR单片机内部的TWI功能,并采用中断工作模式,可以很好的使用Atmega系列的内部资源,并提高程序的稳定性;

#include


unsigned char i2c_sla;

unsigned char i2c_addrh,i2c_addrl;

unsigned char i2c_wr;

unsigned char i2c_sub_flag;

unsigned char i2c_num;

unsigned char *i2c_buf;

unsigned char i2c_end;


/***********************************************************************************************************************************************************************

函数名称:interrupt [TWI] void twi_isr(void)

函数功能:i2c底层中断处理函数(时钟SD2201和AT24C256共同的)

***********************************************************************************************************************************************************************/

interrupt [TWI] void twi_isr(void)

{


     unsigned char i2c_sta,tmp = 0;

     i2c_sta = TWSR;

     switch(i2c_sta)

     {

          case 0x08:

                   if(i2c_sub_flag == 1)

                   {

                        TWDR = i2c_sla&0xfe;

                   }

                   else

                   {

                        TWDR = i2c_sla;

                   }

                   //TWCR &= 0xcf;

                   //TWCR |= 0x80;

                   TWCR = 0x85;

                   break;

          case 0x10:

                   TWDR = i2c_sla;

                   //TWCR &= 0xcf;

                   //TWCR |= 0x80;

                   TWCR = 0x85;

                   //i2c_sub_flag = 1;

                   break;

          case 0x18:

                   if(i2c_sub_flag == 0)

                   {

                        if(i2c_num > 0)

                        {

                             TWDR = *i2c_buf;

                             //TWCR &= 0xcf;

                             //TWCR |= 0x80;

                             TWCR = 0x85;

                             i2c_buf++;

                             i2c_num--; 

                        }

                        else

                        {

                             //TWCR &= 0xdf;

                             //TWCR |= 0x90;

                             TWCR = 0x95;

                             i2c_end = 1;

                        }

                   }

                   if(i2c_sub_flag == 1)

                   {

                        TWDR = i2c_addrh;

                        //TWCR &= 0xcf;

                        //TWCR |= 0x80;

                        TWCR = 0x85; 

                        i2c_sub_flag = 2;

                   }

                   break;

          case 0x28:

                   if(i2c_sub_flag == 3)

                   {

                        if(i2c_wr == 0)

                        {

                             if(i2c_num > 0)

                             { 

                                  

                                  TWDR = *i2c_buf;

                                  i2c_buf++;

                                  //TWCR &= 0xcf;

                                  //TWCR |= 0x80;

                                  TWCR = 0x85;

                                  i2c_num--; 

                             }

                             else

                             {

                                  //TWCR &= 0xdf;

                                  //TWCR |= 0x90;

                                  TWCR = 0x95;

                                  i2c_end = 1;

                             }

                        }

                   }

                   if(i2c_sub_flag == 2)

                   {

                        TWDR = i2c_addrl;

                        //TWCR &= 0xcf;

                        //TWCR |= 0x80;

                        TWCR = 0x85;

                        i2c_sub_flag = 3;

                   }

                   

                   if(i2c_sub_flag == 3)

                   {

                        if(i2c_wr == 1)

                        {

                             //TWCR &= 0xef;

                             //TWCR |= 0xa0; 

                             TWCR = 0xa5;

                        }

                   }

                   if(i2c_sub_flag == 0)

                   {

                        if(i2c_num > 0)

{

[1] [2] [3]
关键字:AVR单片机  TWI  中断模式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479247.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:M16单片机l红外线解码程序+led数码管显示
下一篇:单片机AD接收UART发送模块电路图PCB与vb上位机源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

avr单片机汇编参考程序
该AVR的汇编程序选自《M128》,程序中体现了AVR汇编的基本特点,仅供大家参考。该应用系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。下图为简易时钟系统硬件电路图。                           图  简易24小时时钟硬件原理图系统使用8个LED数码管显示时、分、秒、1/100秒4个时段的数字,每个时段占用2个LED。显示方式采用动态扫描方式
发表于 2019-11-14
avr单片机汇编参考程序
AVR单片机一些学习笔记
下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。1、AVR单片机采用RISC架构,8051单片机采用CISC架构。 前者速度为后者的2~4倍,为流水线操作指令。2、 AVR单片机有32个通用寄存器(地址在RAM区从$0000开始到$001F),其中有6个(最后6个)合并为3个16位的X,Y,Z寄存器,用来存放地址指针,Z寄存器还可以寻址程序存储器。3、 哈佛结构,131条机器指令。4、 延迟开机功能。5、 内部自带RC振荡器,可提供1/2/4/8MHZ的工作时钟。6、 FLASH+EEPROM+SRAM+SPI+USART+TWI+PWM+RTC+10位ADC+模拟比较器+JTAG。7、 堆栈指针向下增长,51
发表于 2019-11-14
avr单片机mega32之ADC程序
查手册,写程序,有问题再讨论*****************************************************************//CPU:mega32//编译器:iar#include <ioavr.h>#include "adc.h"int main(void){        int m;adc_init();             m = adc_get(0);     &n
发表于 2019-11-14
基于LabVIEW和AVR单片机的镇痛仪系统实现
热点,韩式仪是其中的一个典型代表。随着电子技术便携化和智能化的发展,利用当前最新技术革新产品,研发新型镇痛医疗器械势在必行。针对镇痛仪电路研发要求,以及人体对低电频生理反映的特征,设计了基于LabVIEW和AVR单片机的一个精度高、稳定可靠、抗干扰能力强、功耗低、可扩展性强的医疗器械镇痛仪。1 系统总体介绍本系统包括上位机模块、通信模块和下位机模块,其中上位机采用LabVIEW软件编写的人机交互界面,使用方便,具有良好的可视化效果和可扩展性;通信部分采用即插即用的USB通信模块,其传输数据速率快,能满足对下位机监控数据实时反馈的要求;下位机模块主要由脉冲发生电路、升压电路和互补对称脉冲输出电路组成,其中主控芯片采用ATMEL
发表于 2019-11-14
基于LabVIEW和AVR单片机的镇痛仪系统实现
avr单片机PWM控制直流电机转速和正反转
用uln2003控制,下面是仿真原理图:源程序:/*****************************************************This program was produced by theCodeWizardAVR V2.03.4 StandardAutomatic Program Generator?Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.comProject : Version : Date    : 7/26/2009Author  :&n
发表于 2019-11-13
avr单片机PWM控制直流电机转速和正反转
avr单片机流水灯的程序
/******************************************************************************//*【编写时间】: 2011.07.07* 【作    者】: 雁翎电子* 【版    本】: V1.0* 【编译环境】: ICCAVR  * 【函数功能】: 流水灯实验* 【晶    振】:  8M                * 【芯    片】:  ATMEGA16A  
发表于 2019-11-12
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved