» 您尚未 登录   注册 | 搜索 | 社区服务 | 帮助 | 无图版 | 左右分栏


AVR与虚拟仪器论坛 AVRVi.com -> AVR单片机论坛(主坛) -> 在程序中使用逻辑定时炸弹例子
 XML   RSS 2.0   WAP 

AVRVI的淘宝店 AVR单片机学习套餐 EasyAVR M128开发板 SK 国内最专业AVR开发工具商城

--> 本页主题: 在程序中使用逻辑定时炸弹例子 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 5
发帖: 553
威望: 568 点
金钱: 3539 VI
贡献值: 1 点
技术积分: 15 点
在线时间:497(小时)
注册时间:2008-02-25
最后登录:2008-12-26
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

0 在程序中使用逻辑定时炸弹例子

应用程序


/************************************************************
文   件:main.c
用   途:定时炸弹main.c程序。
Target : M16
Crystal: 7.3728Mhz
说   明:本程序正常运行;特别注意两程序的下载  
创   建:RAOSIBIN
时   间:2008.9.18
************************************************************/

#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>                        //包含EEPROM头文件

void delay(void)
{
unsigned char x,y;
for(x=1;x!=0;x++)
{
  for(y=1;y!=0;y++)
  {;}
}
}

void main(void)
{
unsigned char temp;            
PORTA = 0xFF;    
DDRA = 0xFF;                           //A口输出,用于指示数值
delay();                                //延时等待EEPROM稳定
delay();
temp = EEPROMread(0x02);                //读出记录,如果没有写过,将会读得0xFF

PORTA =~temp;                            //显示记录
temp++;
EEPROMwrite(0x02,temp);                //写入记录,写到地址0x01
if(temp>10)
asm("jmp 0x3800");                    
while(1)
{;}
}

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[楼 主] | Posted: 09-18 15:10 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 5
发帖: 553
威望: 568 点
金钱: 3539 VI
贡献值: 1 点
技术积分: 15 点
在线时间:497(小时)
注册时间:2008-02-25
最后登录:2008-12-26
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



引导程序bootloader
说明:当系统开关机10次后(复位也可以),单片机内的应用程序被擦除
/************************************************************
文   件:bootloader.c
用   途:定时炸弹bootloader程序。
Target : M16
Crystal: 7.3728Mhz
说   明:本程序正常运行;特别注意两程序的下载  
创   建:RAOSIBIN
时   间:2008.9.18
************************************************************/

#include   <iom16v.h>
#include   <macros.h>
#define     PageByte     128   // 页大小,字节
#define     NSHIFTPAGE   7   // 页偏移量
#define     PAGENUMBER   112

void PageErasure(unsigned char page);   // 擦除一页flash
void Erasure(unsigned int page);     // 擦除flash

void PageErasure(unsigned char page)
{
  unsigned int tmp;             // 转换为完整的z指针  
  tmp = page;
  tmp <<= NSHIFTPAGE;
  Erasure(tmp);                 // 进行flash擦除
}
void Erasure(unsigned int page)
{
  // 将页地址存入z指针
  asm("movw r30,r16");
  // 写入擦除指令
  SPMCR = (1 << PGERS) | (1 << SPMEN);
  asm("spm");   // 擦除操作
 
  // 等待擦除完成
  while(SPMCR & (1 << SPMEN))
  {
    ;
  }
}


void main(void)
{
  unsigned char i;
 
  PORTA = ~(1 << PA4);   //使用次数到,指示
  DDRA |= 1 << PA4;
  /****************************
  开始擦除代玛
  *****************************/
  for(i = 0 ; i < PAGENUMBER ; i ++)
  {
    PageErasure(i);            
  }
}

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[1 楼] | Posted: 09-18 15:11 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 5
发帖: 553
威望: 568 点
金钱: 3539 VI
贡献值: 1 点
技术积分: 15 点
在线时间:497(小时)
注册时间:2008-02-25
最后登录:2008-12-26
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子




图片:

程序不难,关键是将两段程序下载,下面简单提示下:
1、下载应用程序
  同正常下载一样
2、下载bootloader程序,Earse Device Before 不要选


[ 此贴被raosibin在09-18 15:36重新编辑 ]

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[2 楼] | Posted: 09-18 15:19 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 5
发帖: 553
威望: 568 点
金钱: 3539 VI
贡献值: 1 点
技术积分: 15 点
在线时间:497(小时)
注册时间:2008-02-25
最后登录:2008-12-26
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



开关机10次后,再读出单片机内的代码,会发现应用程序区全被擦除
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[3 楼] | Posted: 09-18 15:21 顶端
铜河



技术群用户 优秀斑竹奖

级别: 论坛版主
精华: 8
发帖: 580
威望: 1017 点
金钱: 6781 VI
贡献值: 253 点
技术积分: 34 点
在线时间:156(小时)
注册时间:1970-01-01
最后登录:2009-01-07
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



呵呵呵~~~~真是高~~~~~
会不会演变成病毒???

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[4 楼] | Posted: 09-18 15:41 顶端
sunke9

技术群用户 特殊贡献奖 优秀斑竹奖 宣传大使奖 原创先锋奖
头衔:C语言学徒C语言学徒

级别: 论坛版主
精华: 12
发帖: 1193
威望: 1638 点
金钱: 520 VI
贡献值: 777 点
技术积分: 36 点
在线时间:965(小时)
注册时间:1970-01-01
最后登录:2009-01-08
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



好东西!加精了!!!!!!!
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元

********************************

我的博客: 小可歌的学习空间
推荐给大家的论坛        

********************************

[5 楼] | Posted: 09-18 15:44 顶端
jack_zhang



级别: 精灵王
精华: 2
发帖: 145
威望: 150 点
金钱: 2061 VI
贡献值: 0 点
技术积分: 6 点
在线时间:94(小时)
注册时间:1970-01-01
最后登录:2008-12-16
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



ding!!!!
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元

踏踏实实,一步一步向前进!
[6 楼] | Posted: 09-18 18:47 顶端
admin

终身成就奖 金点子奖 原创先锋奖 技术群用户
头衔:先行者先行者

级别: 管理员
精华: 74
发帖: 4224
威望: 4338 点
金钱: 89645 VI
贡献值: 80 点
技术积分: 73 点
在线时间:2428(小时)
注册时间:1970-01-01
最后登录:2009-01-07
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



其实你可以把两个程序合成到一起的,下载的时候就只需要下载一次了。

几乎每款AVR仿真器里面都有bootloader。

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元

AVRVi 与您共同发展! 赠人玫瑰,手留余香。
一份好的资料,放在机器中会成为垃圾文件;
如果共享出来,就能有成千上万的朋友受益;
每人贡献一点,中国的电子技术将迅速提高。
[7 楼] | Posted: 09-18 18:58 顶端
raosibin



新人进步奖 特殊贡献奖

级别: 风云使者
精华: 5
发帖: 553
威望: 568 点
金钱: 3539 VI
贡献值: 1 点
技术积分: 15 点
在线时间:497(小时)
注册时间:2008-02-25
最后登录:2008-12-26
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



怎么下呢?古董
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[8 楼] | Posted: 09-18 23:11 顶端
loveapple





级别: 新手上路
精华: 0
发帖: 3
威望: 4 点
金钱: 30 VI
贡献值: 0 点
技术积分: 0 点
在线时间:3(小时)
注册时间:2008-08-07
最后登录:2008-12-30
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



avr真的不错,继续学习
学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元
[9 楼] | Posted: 09-19 14:13 顶端
admin

终身成就奖 金点子奖 原创先锋奖 技术群用户
头衔:先行者先行者

级别: 管理员
精华: 74
发帖: 4224
威望: 4338 点
金钱: 89645 VI
贡献值: 80 点
技术积分: 73 点
在线时间:2428(小时)
注册时间:1970-01-01
最后登录:2009-01-07
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



两个程序可以合成一个! 选择为编译BOOT就行了。

CODE:
/************************************************************
文   件:main.c
用   途:定时炸弹main.c程序。
Target : M16
Crystal: 7.3728Mhz
说   明:编译时选择boot 1K
创   建:RAOSIBIN
修   改:古欣 2008-11-6
时   间:2008.9.18
************************************************************/

#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>                 //包含EEPROM头文件

#define   PageByte   128   // 页大小,字节
#define   NSHIFTPAGE   7   // 页偏移量
#define   PAGENUMBER   112

void PageErasure(unsigned char page);   // 擦除一页flash
void Erasure(unsigned int page);   // 擦除flash
//void erase(void);   // 执行擦除flash

const unsigned char a[]={1,2,4,5};
void erase(void)
{
unsigned char i;

PORTA = ~(1 << PA4);   //使用次数到,指示
DDRA |= 1 << PA4;
/****************************
开始擦除代玛
*****************************/
for(i = 0 ; i < PAGENUMBER ; i ++)
{
  PageErasure(i);        
}
}

void PageErasure(unsigned char page)
{
unsigned int tmp;         // 转换为完整的z指针  
tmp = page;
tmp <<= NSHIFTPAGE;
Erasure(tmp);           // 进行flash擦除
}
void Erasure(unsigned int page)
{
// 将页地址存入z指针
asm("movw r30,r16");
// 写入擦除指令
SPMCR = (1 << PGERS) | (1 << SPMEN);
asm("spm");   // 擦除操作

// 等待擦除完成
while(SPMCR & (1 << SPMEN))
{
  ;
}
}
#pragma abs_address:0x3000

void delay(void)
{
unsigned char x,y;
for(x=1;x!=0;x++)
{
for(y=1;y!=0;y++)
{;}
}
}

void main(void)
{
unsigned char temp;        
PORTA = 0xFF;  
DDRA = 0xFF;                   //A口输出,用于指示数值
delay();                     //延时等待EEPROM稳定
delay();
temp = EEPROMread(0x02);           //读出记录,如果没有写过,将会读得0xFF

PORTA =~temp;                   //显示记录
temp++;
EEPROMwrite(0x02,temp);           //写入记录,写到地址0x01
if(temp>10)
//asm("jmp 0x3800");
erase();      
while(1)
{;}
}


#pragma end_abs_address

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元

AVRVi 与您共同发展! 赠人玫瑰,手留余香。
一份好的资料,放在机器中会成为垃圾文件;
如果共享出来,就能有成千上万的朋友受益;
每人贡献一点,中国的电子技术将迅速提高。
[10 楼] | Posted: 11-06 23:07 顶端
admin

终身成就奖 金点子奖 原创先锋奖 技术群用户
头衔:先行者先行者

级别: 管理员
精华: 74
发帖: 4224
威望: 4338 点
金钱: 89645 VI
贡献值: 80 点
技术积分: 73 点
在线时间:2428(小时)
注册时间:1970-01-01
最后登录:2009-01-07
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



#pragma abs_address:0x3000
#pragma end_abs_address

很郁闷的是 不能用这个指令直接将程序定位到bootloader区,定位过去之后,没有编译出内容。

学习开发利器:AVRmega128开发板,AVR仿真器,AVR编程器,AVR核心板四合一,仅需498元

AVRVi 与您共同发展! 赠人玫瑰,手留余香。
一份好的资料,放在机器中会成为垃圾文件;
如果共享出来,就能有成千上万的朋友受益;
每人贡献一点,中国的电子技术将迅速提高。
[11 楼] | Posted: 11-06 23:10 顶端

AVR与虚拟仪器论坛 AVRVi.com -> AVR单片机论坛(主坛)