avr128硬件调试
ATmega128在开发应用中应注意的问题

ATmega128在开发应用中应注意的问题摘要: ATmega128是一种与51系列不同的单片机,本文应用ICCAVR和pony prog2000作为主要开发工具,通过分析其在开发过程中特殊的开发方法,从而达到更好地掌握和使用ATmega128的目的。
关键词: ATmega128 单片机ATmega128是AVR系列中功能最强的单片机,具有如下主要特点:(1)先进的RISC精简指令集结构:ATmega128具有133条功能强大的指令,大部分指令在单时钟周期内执行;有32b×8个通用工作寄存器;片内带有执行时间为2个时钟周期的硬件乘法器。
(2)非易失性程序和数据存储器:ATmega128具有128KB在线可重复编程Flash、4KB的E2PROM以及4KB内部SRAM。
在其BOOT区具有独立的加密位,可通过片内的引导程序实现在系统编程,写操作时真正可读。
(3)具有JTAG接口:通过JTAG接口对Flash、E2PROM熔丝位和加密位编程。
(4)增强的硬件功能:ATmega128具有2个带预分频器和一种比较模式的8位定时/计数器;2个扩充的带预分频器和比较模式、捕获模式的16位定时/计数器;独立振荡器的实时计数器;2通道8位PWM;6通道2~16位精度PWM;8通道10位A/D转换;输出比较调节器;8个单端通道;7个微分通道;2个增益为1x、10x或200x的微分通道;二线(I2C)串行接口;2路可编程串行UART接口;主/从SPI串行接口;带内部振荡器的可编程看门狗定时器等。
(5)独有的特点:上电复位和可编程的低电压检测;内部可校准的RC振荡器;5种睡眠模式,即空闲模式、ADC噪声抑制模式、省电模式、掉电模式、待命模式和扩展待命模式;可通过软件选择时钟频率;通过1个熔丝选定ATmega103兼容模式;全局上拉禁止。
笔者通过使用ATmega128单片机,总结出在使用ATmega128过程中应注意的问题,希望能给即将使用该单片机的读者提供有用的信息。
BK-AVR128说明书

图标,按提示直至安装完成.若提
第三章 快速入门
3.1 第一个 ICC AVR 程序 本章假设用户已经安装好所有必需的软件,如 ICCAVR AVRstudio,我们将以一 个 LED 闪 烁 程 序 讲 述 用 ICCAVR 开 发 软 件 编 写 一 个 简 单 的 程 序 , 并 在 BK-AVR128 开发反上进行实验及仿真.
8
点击 change 可改变软件的安装路径,一般按默认即可不用修改。
点击“Next”
9
点击 “Install”然后等待软件安装完成。
点击 “Finish” 软件安装完成。 2.3 ISP 下载器驱动安装
10
将我们提供的 USB 下载器软件及驱动文件解压到你的硬盘上,并将 ISP 下载器 插到计算机的 USB 接口。 如果之前还没安装过 USBASP 下载器驱动,插入 USB 后您的计算机将自动弹出下列提示框, 引导您安装 USB 驱动软件
2) 软件设置及使用 打开 AVRstudio 软件
19
执行菜单栏的”File|Open File”
20
选择.cof 后缀的文件,点击”打开”. 点击”保存”
21
选择芯片型号为 Atmega128,仿真器型号为 JTAG ICE,Port 端口号根据实际情 况设置(最大不能超过 com4),以上都设置好后点击 Finish 进入仿真操作. 端口号的查询方法:在桌面上”我的电脑图标”右击,选择“管理”-----设备管理 器------端口(COM 和 LPT)如下图
数码管(段 E)
数码管(段 F)
数码管(段 G)
数码管(段 dp)
矩阵键盘(行 1) 按键 K17
AT24C02(SCL)
矩阵键盘(行 2) 按键 K18
#2机ABBAVR试验报告

UNITROL® F三机励磁系统调试报告姓名日期姓名日期编制工厂试验审核工厂验收批准现场试验现场验收注:1、本调试报告前两部分(硬件设置、工厂试验)=出厂试验报告。
2、完成本调试报告的相关试验项目,表示已完成交接试验,设备可投入正常运行。
一、硬件设置1.1主控板 CON-2出厂编号:CH1:CH2:1.2 电源板 POW-1出厂编号:CH1:CH2:1.3 电力系统稳定器(PSS) UNS0869 出厂编号:CH1:CH2:1.4 功率接口板 UNS2861C出厂编号:CH1:CH2:*) HW-Code parameter must be setted manuallyFrequency SettingCurrent LimiterProportional gain K LIM with HEX switch S200Gain of Current IDCIe-max. Setpoint V LI with HEX switch S201Current RegulatorProportional gain K CR with HEX -Switch S202Inverter LimitEk1.5 信号处理板 UNS1860b,V1/V2,Modified 出厂编号:CH1:CH2:1.6 电源模块 UNS0868出厂编号:CH1:CH2:1.7 PT/CT接口板 UNS0862出厂编号:CH1:I1N p.u.Rated machine current divided by C.T. nominal current. Adjustment only required, if ratio <0.8.1.8 基本I/O接口板 UNS0863/C7出厂编号:1.10 跨接器 UNS0016b-E出厂编号:1.11 通道铭牌1.12 附加的硬件修改二、工厂试验2.1 外观检查〃设备及元件接地,接线排□〃元件布置□〃油漆□〃门把手功能□〃铭牌□2.2 MCB设置2.3 介电强度试验〃功率回路 2000V;50Hz;1Min □〃辅助交流和直流电源回路 1500V;50Hz;1Min □〃 PT和CT 回路 1500V;50Hz;1Min □2.4 供电电源检查〃辅助交流电源(照明、加热器) VAC □〃交流电源供电(可控硅桥输入) VAC □〃辅助直流电源 VDC □〃控制电压24V直流 VDC □2.5 变送器型号2.6 程序下载2.7 操作控制回路动作试验〃灭磁开关动作□〃照明电路动作□〃风扇电路动作□〃就地/远方动作□2.8 各附加单元整定与动作正确性试验〃数字量输入□〃模拟量输出□2.9 保护及报警监视试验〃小型断路器报警□〃灭磁开关跳闸报警□〃PT 断线报警□2.10 总体静态特性试验〃基准负载测试□2.11 测量值校验三、现场试验3.1 试验准备(发电机静止时)实际参数设置参照参数表详细信息参阅“调试指导”3.1.1 外观检查〃机壳安装妥善无可见损坏□〃外部连线,总线连接,外部接地□〃直流,灭磁开关,启励及灭磁回路□〃20℃时磁场电阻(含引线电缆电阻)3.1.2 绝缘试验〃主回路绝缘试验□3.1.3 供电电源〃交流电源(用于照明及加热器) V 〃直流电源 V 〃第二直流电源(可选) V 〃电子设备功能正常/内部电源电压正常 V3.1.4 软件〃软件下载(在AFT系统的两个通道中)□〃软件版本〃基本参数设定□3.1.5变送器检查□3.1.6 控制回路〃检查所有命令输入□〃检查所有信号输出□〃检查报警和跳闸回路□〃灭磁开关控制回路□〃启励电路灭磁开关控制回路□〃检查风扇控制回路灭磁开关控制回路□〃检查电压互感器(PT)和电流互感器(CT)□〃灭磁开关控制回路□〃检查模拟量输入和输出□3.1.7 保护装置〃跨接器的外观检查(校准BOD单元)□发电机接地检测检查□励磁机接地检测检查□3.2空载试验(发电机在额定转速下)3.2.1 手动通道〃将可控硅桥封脉冲,测量起励时的发电机电压U G%〃调整测量实际值(U G,U SYN,I F,U F)□〃设定参考值和预设值的限制值□〃在手动通道中调整PI参数□〃检查整流器电源电压和相位 V 〃检查分灭磁开关灭磁(灭磁电阻灭磁)□〃检查不分灭磁开关灭磁(逆变灭磁)□3.2.2 自动通道〃启励和软启励□〃调整测量实际值(U G,U SYN,I F,U F)□〃设定参考值和预设值的限制值□〃在自动通道中调整PID参数□〃设定及检查V/HZ限制器□〃检查灭磁回路(正常灭励和跳灭磁开关)□〃定义P/Q补偿□3.2.3 通道切换〃检查自动手动通道的切换,是否平滑无冲击□3.2.4 监视和保护〃检查PT 故障时自动到手动通道的切换动作定义□〃检查PT故障时通道1到通道2的切换动作定义□3.3并网功能试验(发电机在额定转速下)3.3.1并网后一般性试验〃校准发电机电流测量值/检查P和Q测量值□〃P≈0;Q滞相甩负荷试验□〃P≈0;Q进相甩负荷试验□〃自动通道作阶跃响应,优化动态性能□〃手动通道作阶跃响应,优化动态性能□〃检查叠加控制的影响□〃手动限制调整□3.3.2 IE限制器〃励磁电流IE过励限制器的定义和校核□〃用阶跃响应使限制器动作时优化动态响应过程□3.3.3 IG限制器〃定义电流IG过电流限制器 (过励和欠励时) □〃用阶跃响应使限制器动作时,优化动态响应过程□3.3.4 P/Q限制器〃定义P/Q特性曲线□〃P/Q限制器欠励检查□〃用阶跃响应使限制器动作时,优化动态过程□3.3.5恒功率因数控制器〃检查恒功率因数控制器的稳态和动态性能□〃检查功率因数的限制值□〃用增减按钮检查功率因数的参考值设定□3.3.6恒无功控制器〃检查恒无功控制器的稳态和动态性能□〃检查恒无功控制器的限制值□〃用增减按钮检查无功的参考值设定□3.3.7电力系统稳定器〃PSS参数计算□〃PSS作用检查□注:该试验由相关单位组织,设备供应单位参加。
TS8900-128开发板说明书

TS8900-M128开发板说明书AVR mega128学习板专为AVR单片机初学者设计,简单实用、价格合理是AVR 学习板的最大特点。
电路板精心布局,模块划分清晰位置放置合理,符合正常使用习惯。
电路简单,学习板上安排了最常用最实用的功能电路,电路接口设计上合理配置尽量不复用,降低学习难度,把方便留给大家硬件资源介绍(如下图):1.CPU核心板mega128,AVR单片机主芯片,内包含有:128K Flash、4K SRAM、4KByte EEPROM,芯片可与AT mega64互换。
2.AT24C02,I2C总线器件,EEPROM数据存储器,256Byte EEPROM。
3.74HC595,SPI总线器件,SPI总线并口扩展器件,8位移位寄存器(串行输入,3S并行锁存输出)。
4.PCF8563T,时钟芯片。
5.RS232,RS232接口芯片,两组接口(和下面485接口共用CPU两组UART接口)。
6.MAX487,485网络驱动芯片,产品组网中最常用最方便的一种方式,大部分室外控制网络采用485通信。
7.8个输入按键、1个复位按键。
8.4位动态扫描LED数码管、8位LED发光二极管。
9.1个无源蜂鸣器。
10.2路A/D输入可调电位器。
11.1个三线扩展接口,可用来扩展热敏电阻、DS18B20数字温度计等实验。
12.LCD接口,液晶显示屏接口,可接LCD1602和LCD12864两种液晶屏.13.AVR JTAG仿真接口,AVR ISP下载接口。
14.所有IO口全部引出,方便扩展实验及测试。
15.CPU采用独立mega128核心板,方便升级及更换芯片。
16.在1路RS232外提供了1路RS485网络驱动芯片,实用的多点远程通信网络。
实验项目1.AVRISP程编下载——AVRISP下载线程序下载是AVR单片机程序固化的最基本方法,学习AVR单片机首先应该掌握的。
2.流水灯显示——流水灯显示为最基本的IO口输出实验。
ATMEGA128--AVR教程

AVR教程(1):AVR单片机介绍作者:微雪电子文章来源: 点击数: 478 更新时间:2008-4-1 23:58:21 AVR,它来源于:1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。
AVR单片机特点每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,AVR 8-bit MCU最大的特点是:●哈佛结构,具备1MIPS / MHz的高速运行处理能力;●超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC 进行处理造成的瓶颈现象;●快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发;●作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力;●片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠;●大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comp arator,WDT等;●大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。
●性价比高。
开发AVR单片机,需要哪些编译器、调试器?软件名称类型简介官方网址AVR Studio IDE、汇编编译器ATMEL AVR Studio集成开发环境(IDE),可使用汇编语言进行开发(使用其它语言需第三方软件协助),集软硬件仿真、调试、下载编程于一体。
ATMEL官方及市面上通用的AVR开发工具都支持AVRStudio。
GCCAVR (WinAVR) C编译器GCC是Linux的唯一开发语言。
GCC的编译器优化程度可以说是目前世界上民用软件中做的最好的,另外,它有一个非常大优点是,免费!在国外,使用它的人几乎是最多的。
AVR单片机 mega128 例程大全

//16超声波LED显示#include <iom16v.h>//PA0接控制引脚PA7接接收引脚#include <macros.h>#define chao 100longint time=0;void delay(long int z){inti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}void main(){int o=0;DDRD=0xff;DDRA=0x0f;TCNT1H=0x00;TCNT1L=0x00;while(1){PORTA=0x0f;delay(1);PORTA=0x00;while((PINA&0x80)==0x00); TCCR1B=0x03;while((PINA&0x80)==0x80); TCCR1B=0x00;time=TCNT1H*256+TCNT1L; TCNT1H=0x00;TCNT1L=0x00;if(time<chao){if(time<chao){o=500;while(o--)PORTD=0x04;}}if(time>chao){if(time>chao){o=500;while(o--)PORTD=0x08;}}}}//AD#include<iom128v.h>#include<macros.h>#define unint unsigned int#define unchar unsigned char#pragma data:codeconst table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unint mega128_ad(){unintaddata;DDRF&=~BIT(0);PORTF&=~BIT(0);ADMUX=0;ADCSRA=0X80;ADCSRA|=BIT(ADSC);while(!(ADCSRA&(BIT(ADIF))));addata=ADCL;addata=addata+ADCH*256;returnaddata;}void show(count){unchar temp1,temp2,temp3,temp4;temp1=count/1000;temp2=(count%1000)/100;temp3=(count%100)/10;temp4=count%10;HC_595_OUT(table[temp4]);DDRB|=(1<<4);PORTB|=(1<<4);delay(10);DDRB|=(1<<4);PORTB&=~(1<<4);HC_595_OUT(table[temp3]);DDRB|=(1<<5);PORTB|=(1<<5);delay(10);DDRB|=(1<<5);PORTB&=~(1<<5);HC_595_OUT(table[temp2]);DDRB|=(1<<6);PORTB|=(1<<6);delay(10);DDRB|=(1<<6);PORTB&=~(1<<6);HC_595_OUT(table[temp1]);DDRB|=(1<<7);PORTB|=(1<<7);delay(10);DDRB|=(1<<7);PORTB&=~(1<<7);}void HC_595_OUT(count){PORTB&=~(1<<0);SPDR =count ;while(!(SPSR & (1<<SPIF)));delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)for(y=0;y<200;y++);}void main(){unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);PORTB = 0x0F;DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);while(1){count=mega128_ad();//用参数代替老是出问题,这一点需要再次认知考虑/*for(i=0;i<4;i++){ad[3-i]=shuzhi%10;shuzhi=shuzhi/10;}*/show(count);}}//ADC#include<iom128v.h>#include<macros.h>#define unint unsigned int#define unchar unsigned char#pragma data:codeconst table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unint mega128_ad(){unintaddata;DDRF&=~BIT(0);PORTF&=~BIT(0);ADMUX=0;ADCSRA=0X80;ADCSRA|=BIT(ADSC);while(!(ADCSRA&(BIT(ADIF)))); addata=ADCL;addata=addata+ADCH*256; returnaddata;}void show(count){unchar temp1,temp2,temp3,temp4;temp1=count/1000;temp2=(count%1000)/100;temp3=(count%100)/10;temp4=count%10;HC_595_OUT(table[temp4]);DDRB|=(1<<4);PORTB|=(1<<4);delay(10);DDRB|=(1<<4);PORTB&=~(1<<4);HC_595_OUT(table[temp3]);DDRB|=(1<<5);PORTB|=(1<<5);delay(10);DDRB|=(1<<5);PORTB&=~(1<<5);HC_595_OUT(table[temp2]);DDRB|=(1<<6);PORTB|=(1<<6);delay(10);DDRB|=(1<<6);PORTB&=~(1<<6);HC_595_OUT(table[temp1]);DDRB|=(1<<7);PORTB|=(1<<7); delay(10);DDRB|=(1<<7);PORTB&=~(1<<7);}void HC_595_OUT(count) {PORTB&=~(1<<0);SPDR =count ;while(!(SPSR & (1<<SPIF)));delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)for(y=0;y<200;y++);}void main()unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);PORTB = 0x0F;DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);while(1){count=mega128_ad();//用参数代替老是出问题,这一点需要再次认知考虑/*for(i=0;i<4;i++){ad[3-i]=shuzhi%10;shuzhi=shuzhi/10;}*/show(count);}}//CTC//该程序并未在示波器上测试,在仿真软件上仿真时只有PB5上有方波信号出现#include <iom128v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intvoid main(){DDRB|=0X60;TCCR1A=0X50;TCCR1B=0X09;OCR1A=0X7CF;}//D口矩阵键盘检测#include "config.h"#include <iom128v.h>#include <macros.h>#define unint unsigned int#define unchar unsigned charconst unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};unchar temp1,temp2,temp3,temp4;unintdata,z;void HC_595_init(){DDRC=0x80;PORTC=0x00;PORTB=0x0F;DDRB=0x07;SPCR =0x53;}void Seg7_Led_display(unint data) {unchar temp1,temp2,temp3,temp4;temp1=data/1000;temp2=(data%1000)/100;temp3=(data%100)/10;temp4=data%10;HC_595_OUT(Seg7_Data[temp4]);PORTB|=(1<<4);delay(20);PORTB&=~(1<<4);HC_595_OUT(Seg7_Data[temp3]);PORTB|=(1<<5);delay(20);PORTB&=~(1<<5);HC_595_OUT(Seg7_Data[temp2]); PORTB|=(1<<6);delay(20);PORTB&=~(1<<6);HC_595_OUT(Seg7_Data[temp1]);PORTB|=(1<<7);delay(20);PORTB&=~(1<<7);}void HC_595_OUT(unchar data){PORTB=0x06;SPDR =data ;while(SPSR==0);delay(10);PORTB=0x01;}void delay(unint z){uninti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}void delay_1us(void) //1us延时函{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsignedint i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1ms();voidBuzz_init(void){DDRG |= (1<<4);PORTG &=~ (1<<4);}void Beep(unsigned intH_time,unsignedintL_time) {PORTG |= (1<<4);delay_nms(H_time);PORTG &=~ (1<<4);delay_nms(L_time);}intkey_press(void){int k;delay_nms(5);PORTD=0x01;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x11) {Beep(100,50); PORTA=0x1F;k=1;}else if(PIND==0x21) {Beep(100,50); PORTA=0xFD;k=2;}else if(PIND==0x41) {Beep(100,50); PORTA=0xFB;k=3;}else if(PIND==0x81) {Beep(100,50);PORTA=0xF7;k=4;}else {;}} else {;}} else {;}//第二行delay_nms(5);PORTD=0x02;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x12){Beep(100,50);PORTA=0x1F;k=5;}else if(PIND==0x22) {Beep(100,50); PORTA=0xFD;k=6;}else if(PIND==0x42) {Beep(100,50); PORTA=0xFB;k=7;}else if(PIND==0x82) {Beep(100,50); PORTA=0xF7;k=8;}else {;}} else {;}} else {;}//第三行delay_nms(5);PORTD=0x04;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x14){Beep(100,50);PORTA=0x1F;k=9;}else if(PIND==0x24){Beep(100,50);PORTA=0xFD;k=10;}else if(PIND==0x44){Beep(100,50);PORTA=0xFB;k=11;}else if(PIND==0x84){Beep(100,50);PORTA=0xF7;k=12;}else {;}} else {;}} else {;}//第四行delay_nms(5);PORTD=0x08;delay_nms(5);if((PIND&0xF0)!=0x00) {delay_nms(10);if((PIND&0xF0)!=0x00) {if(PIND==0x18){}else if(PIND==0x28) {Beep(100,50); PORTA=0xFD;k=14;}else if(PIND==0x48) {Beep(100,50); PORTA=0xFB;k=15;}else if(PIND==0x88) {Beep(100,50); PORTA=0xF7;k=16;}else{;}} else {;}} else {;}return k;}void main(void){inti,j,x;DDRA=0xFF;PORTA=0xFF;DDRD=0x0F;DDRE=0xFF;PORTE=0xFF;Buzz_init();while(1){x=key_press();HC_595_init();Seg7_Led_display(x);}}//1602液晶#include<iom128v.h>#define uchar unsigned char#define uint unsigned int#define uchar unsigned char#define uint unsigned int#define RS 0#define RW 1#define EN 2ucharwz[]={"*WEN.JIU.LONG*"}; uchargd[]={"Good Luck!"}; voids_ms(uintms){for(;ms>1;ms--);}//写指令voidwritecom(uchar com){PORTC&=~(1<<RS); //RS=0 命令选择PORTC&=~(1<<RW); //RW=0 写选择PORTC|=(1<<EN); //EN=1 使能信号s_ms(500);PORTA = com; //输出指令s_ms(500);PORTC&=~(1<<EN); //EN=0}//1602初始化void LcdInit(void){writecom(0x01);writecom(0x02);writecom(0x06);writecom(0x0c);writecom(0x38); //没理解好这里设置的是四位总线,而且设不成5X10的点阵}//============================================ ====================// 描述:在任意位置写任意多个字符// 入口:’row‘要写的字符所在的行,只能为1或2;// ‘col’要写的字符所在的列,只能为0---15 // ‘num’要写字符的个数// ‘pbuffer’要写字符的首地址//============================================ ======================void WriteChar(ucharrow,ucharcol,uintnum,uchar*pBuffer){uchari,t,add;if (row == 1) add = 0x80 + col+0x10;else add = 0x80+0x40 + col+0x10;writecom(add);PORTC&=~(1<<RW);s_ms(500);PORTC|=(1<<RS);for(i=num;i!=0;i--){t = *pBuffer;PORTA = t;PORTC|=(1<<EN);s_ms(500);//必须有个延时PORTC&=~(1<<EN);pBuffer++;}}void main(){int i;DDRA=0xff;PORTA=0xff;DDRC=0xff;PORTC=0xff;LcdInit();WriteChar(1,1,14,wz); WriteChar(2,3,10,gd);for(i=0;i<16;i++){writecom(0X18);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);}}//按键加显示的最简写法.txt#include "config.h"#include <iom128v.h>#include <macros.h>#define unint unsigned int#define unchar unsigned charconst unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};unchar Seg7_Led_Buf[4],temp1,temp2,temp3,temp4; unintdata,z;void HC_595_init(){DDRC=0x80;PORTC=0x00;PORTB=0x0F;DDRB=0x07;SPCR =0x53;}void Seg7_Led_display(unint data) {unchar temp1,temp2,temp3,temp4;temp1=data/1000;temp2=(data%1000)/100;temp3=(data%100)/10;temp4=data%10;HC_595_OUT(Seg7_Data[temp4]);PORTB|=(1<<4);delay(20);PORTB&=~(1<<4);HC_595_OUT(Seg7_Data[temp3]);PORTB|=(1<<5);delay(20);PORTB&=~(1<<5);HC_595_OUT(Seg7_Data[temp2]); PORTB|=(1<<6);delay(20);PORTB&=~(1<<6);HC_595_OUT(Seg7_Data[temp1]); PORTB|=(1<<7);delay(20);PORTB&=~(1<<7);}void HC_595_OUT(unchar data) {PORTB=0x06;SPDR =data ;while(SPSR==0);delay(10);PORTB=0x01;}void delay(unint z){uninti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}voidKey_init(void){KEY_DDR &=~ 0xFF;KEY_PORT |= 0xFF;}unsigned char get_key(void){unsigned char Key_Value,tmp;Key_Value=KEY_PIN & 0xFF;if(Key_Value != 0xFF){delay_nms(2);if(Key_Value != 0xFF){Key_Value=PIND;}}returnKey_Value;}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsignedint i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1ms();}voidBuzz_init(void){BUZZ_DDR |= (1<<SPK);BUZZ_PORT &=~ (1<<SPK);}void Beep(unsigned intH_time,unsignedintL_time){BUZZ_PORT |= (1<<SPK); delay_nms(H_time); BUZZ_PORT &=~ (1<<SPK); delay_nms(L_time);}void main(void){unsigned char Key;DDRA=0xFF;PORTA=0x00;DDRE = 0xFF;PORTE = 0xFF;Key_init();Buzz_init();while(1){int w=10;Key=get_key();switch(Key){case (0xFE):{Beep(100,50);PORTA=0xFE;break;}case (0xFD):{Beep(100,50);PORTA=0xFD;HC_595_init();Seg7_Led_display( 617);break;}case (0xFB):{Beep(100,50);PORTA=0xFB;HC_595_init();while(w--){Seg7_Led_display( 327);}break;}case (0xF7):{PORTA=0xF7;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}case (0xEF):{PORTA=0xEF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 617);}break;}case (0xDF):{PORTA=0xDF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 327);}break;}case (0xBF):{PORTA=0xBF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}case (0x7F):{PORTA=0x7F;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}default:{break;}}}}//18B20#include "config.h" #include <iom128v.h> #include <macros.h> #include "hc595.h" #include "spi.h"#include "18b20.h" voidspi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}voidSPI_MasterTransmit(char Data){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,//0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,fvolatile unsigned char Seg7_Led_Buf[4],point=0,point_pos=0;//point是小数点标志1代表有小数点point_pos表示小数点位置void HC_595_init(void){OE_DDR |= (1<<OE);OE_PORT &= (1<<OE);PORTB = 0x0F;spi_init();Seg7_Led_Buf[0]=16;Seg7_Led_Buf[1]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[3]=16;}void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();void Seg7_Led_Update(void){HC_595_OUT(Seg7_Data[Seg7_Led_Buf[0]]);Seg7_Bit0_En();delay_nus(60);Seg7_Bit0_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[1]]);if((point==1)&&(point_pos==1))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[1]])|(1<<dp)); Seg7_Bit1_En();delay_nus(60);Seg7_Bit1_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[2]]);if((point==1)&&(point_pos==2))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[2]])|(1<<dp)); Seg7_Bit2_En();delay_nus(60);Seg7_Bit2_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[3]]);if((point==1)&&(point_pos==3))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[3]])|(1<<dp)); Seg7_Bit3_En();delay_nus(60);Seg7_Bit3_Dis();}void Seg7_Led_display(unsigned int data){if(data>9999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1) |(1<<Seg7_Bit2)|(1<<Seg7_Bit3));}else if(data>999){Seg7_Led_Buf[3]=data/1000;Seg7_Led_Buf[2]=(data%1000)/100;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else if(data>99){Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=(data%1000)/100;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else if(data>9){Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else{Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[1]=16;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}}/********************************************* ****************************** 函数名称:HC595显示浮点数据** 功能描述:** 输入:** 输出:** 全局变量:** 调用模块:** 说明:** 注意:********************************************** ****************************/void Seg7_Led_float(float data){unsignedint temp;/*重要说明:data+=0.00001;其中0.00001为容错值解决float数据类型在计算机内部存储的误差问题,可以解决显示问题但是会引入新的计算误差,如果精度要求大于0.00001建议更改容错值或者将此处注释掉*/data+=0.00001;point=1;if(data>999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1) |(1<<Seg7_Bit2)|(1<<Seg7_Bit3));}else if(data>99){temp=data*10;point_pos=1;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}else if(data>9){temp=data*100;point_pos=2;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}else{temp=data*1000;point_pos=3;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}point=0;}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{。
Mega128单片机调试与设置

Mega128单片机调试与设置一、单片机型号为ATmega128A二、调试软件为iccavr7.22和AVRstudio4.0连调三、流程:1.在iccavr中建立工程文件。
2.在iccavr中新建一个项目,并保存。
注意保存文件名必须为.c才可以。
如下图。
3.在右上方file里面右键添加.c 文件。
4.然后编写程序。
注意一般程序包括如下库文件:#include <iom128v.h>#include <macros.h>#include <stdio.h>#include <string.h>5.在利用系统生成(build)钱,一定要进行系统相关的设置,此项非常重要,否则会出现各种问题。
特别是单片机的选取,一定要按照下图选取,选择ATmega1280是不对的。
具体设置在project -> options6.设置完毕后,建立工程。
7.无错误应该为下图8.然后打开AVRstudio,打开projectwizard -> open,然后打开后缀名为.cof 的文件,如下图所示:然后会自动生成后缀名为.aps的工程文件9.然后选择10.连接成功后直接进入到如下界面11.点击黑色的AVR进行基本的设置单片机为ATmega128,JTAG mode ,然后添加 .hex 文件。
熔丝位的设置如下,只有这几个有“√”,特别要注意将M103C 的“√”去掉。
内部1M 晶振用外部8M 晶振用注意此处要修改烧入单片机的程序名称,后缀名为 .hex ,在iccavr 建立的工程文件里添加点击program 即将程序烧写进入单片机中其他一般不要设置。
12.都设置完毕后就可以进行debug或者是烧写程序了。
Debug点击绿色按钮或者在debug里选择。
AVR_128_spi串口通信程序

UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);//发送接收使能,接收中断使能
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据,UCSZ12,11,10共同确定
DDRD|=BIT(3); //设置发送口为输出
}
/*串口0单字符发送,查询方式*/
{
UCSR1B = 0x00; //禁止发送和接收
UCSR1A = 0x02; //倍速异步模式 USX0=1
UBRR1L=(Crystal/8/Baud1-1)%256; //根据数据手册的计算法
UBRR1H=(Crystal/8/Baud1-1)/256; //如果不是倍速则(Crystal/16/Baud1-1)
Flag1=1;
UCSR1B|=BIT(RXCIE1);//重开接收中断
}
以下是主机部份 #include <iom128v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #include "delay.h" #include "lcd.h" void port_init(void); //SPI initialize // clock rate: 1843199hz void spi_init(void) { SPCR = 0x74; //setup SPI
init_devices(); LCD1602_initial(); LCD1602_sendbyte(iDat,1+0x30 ); // while(1) //{ for(i=0;i<2;i++) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。
于是自己去买了一块16L的芯片,觉得还行。
一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie ,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。
后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。
后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。
icc avr 是iom128v.h(姑且以128为例),winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。
记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。
其实前两个软件只需把头文件稍微改一下基本上可以通用。
而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。
总体说winavr给人的感觉是比较专业/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}/***************************************************************************/ /*ADC测试程序 *//*目标器件:ATmega128 *//*晶振:RC 8MHZ *//*编译环境:ICCAVR 7.13A *//*E-Mail:number007cool@ *//*时间:2010年11月13日 *///Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//***************************************************************************/ /*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/ extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/ unsigned int adc_rel=0;/**************************************************************************** 函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/ void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/**************************************************************************** 函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/ #pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/**************************************************************************** 函数功能:延时子程序入口参数:出口参数:****************************************************************************/ void delay(void){int i;for(i=0;i<1800;i++);}/**************************************************************************** 函数功能:显示子程序入口参数:k出口参数:****************************************************************************/ void display(unsigned int k)//发光二极管显示初始化{DDRE|=1<<2;PORTE|=1<<2;DDRA=0XFF;PORTA=k;}#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=~(1<<SS)#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} //开第一个数码管的位选#define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} //关第一个数码管的位选#define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);}#define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);}#define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);}#define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);}#define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);}#define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);}#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,fvolatile unsigned char led_buffer[4];void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{for (i=0;i<n;i++)delay_1ms();}/*完成spi的初始化*/void spi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}/*spi主机传送数据*/void SPI_MasterTransmit(char Data){/* 启动数据传输 */SPDR = Data;/* 等待传输结束 */while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595PORTB = 0x0F; //同时打开四个数码管的位选spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp));elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1<<dp));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high valueTCNT1L = 0x81; //reload counter low valuecountnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}/************************************************文件:main.c用途:注意:内部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData) {while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来 }}/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。