搜索
bottom↓
楼主: slyt

我的高压并行编程器制作进程

[复制链接]

出0入0汤圆

发表于 2007-5-12 20:58:42 | 显示全部楼层
工行现在登陆不了(花了十多分钟也打不开网页),稍后或明早再转。

出0入0汤圆

 楼主| 发表于 2007-5-12 23:54:01 | 显示全部楼层
kk0510,按你说的,给你留了一块,是手中的最后一块了。是用EMS还是挂号,请确认,EMail或这里。

iamyanh,没有了啊,我这几天生病,没去做板,下礼拜准备再去做些。请发EM确认,不容易漏掉,做好后能及时通知,并提前给留出来。

出0入0汤圆

发表于 2007-5-13 11:03:13 | 显示全部楼层
已于07.05.13  11:00电子汇款成功,请查收。



致于是用EMS还是挂号,随你方便。谢谢



详址用EMail。








-----此内容被kk0510于2007-05-13,11:06:44编辑过

出0入0汤圆

发表于 2007-5-13 11:23:20 | 显示全部楼层
萧老师,7.3728M晶振价钱多少?我连ZIP插座和M8、232都有了,维独缺7.3728M晶振,如果价钱不高麻烦您一起邮一个过来,费用我给补上。谢了!

出0入0汤圆

发表于 2007-5-13 12:30:01 | 显示全部楼层


你ZIP插座和M8、232都买过,居然会不知道晶振多少钱一个?兄弟,你也挺牛的~~~~

出0入0汤圆

 楼主| 发表于 2007-5-13 12:58:22 | 显示全部楼层
kk0510,好的,晶振一起寄给你。还缺什么请告之,如果都是小元件,我用挂号寄。

出0入0汤圆

 楼主| 发表于 2007-5-13 20:17:06 | 显示全部楼层
1、空板没有了,成品板没有了,M8也没有了,请不要汇款了,等做好板再通知大家。有需要的请发EMail确认,以EMail为准,不容易遗漏和混淆。

    2、成品板都是EMS发的。空板有的是EMS,有的是挂号发的,请接到挂号的朋友不要有意见。

    3、要我板子的不少是学生,学生价:成品板100元。Email里向我说明是学生,收件地址是学校即可。


-----此内容被slyt于2007-05-13,20:24:56编辑过

出0入0汤圆

发表于 2007-5-14 09:05:17 | 显示全部楼层
看得出楼主是不以盈利为目的的,现在太少像楼主这样的人了!

有个小小的建议:既然楼主不以盈利为目的,不如把原理图、pcb文件、hex文件及上位机文件打包上传到这里,以供有条件的朋友们自己制作,也方便大家共同学习,同时也为楼主省了不少时间,以便继续开发支持更多器件的产品,等到达到出实用产品的时候,楼主就可以有丰厚的收人了!



我们公司过一阶段可能添一台PCB雕刻机,资金已批下,到时说不定能帮上楼主的忙。
-----此内容被lijian758于2007-05-14,09:30:38编辑过

出0入0汤圆

发表于 2007-5-14 09:46:13 | 显示全部楼层
支持楼主一下

出0入0汤圆

发表于 2007-5-14 09:47:12 | 显示全部楼层
呵呵,今天收到了楼主的PCB板,

出0入0汤圆

发表于 2007-5-14 22:50:50 | 显示全部楼层
根据楼主的原理图焊了一个,试了M48、M8的熔丝编程很好用。

  但是对M48的FLASH编程写入时有问题,写完后再从FLASH读出的数据与HEX文件调入的数据完全不同!将芯片选项改为M88,再同样对M48写入,则能正确写入数据。试了几片M48均如此。

  M8写入正常没有问题。

  不知楼主有没有遇到这问题

出0入0汤圆

发表于 2007-5-14 23:10:08 | 显示全部楼层
还有一个问题,M8HVPRO启动时只认上一次使用的COM口,如果插到其他的COM口回提示 无效端口,继而无法使用。

我因常用笔记本,没有串口,只能用USB to RS232线,在笔记本上可以转出COM4、COM5、COM6。但M8HVPRO无法自动认到这些口。

出0入0汤圆

 楼主| 发表于 2007-5-14 23:51:04 | 显示全部楼层
首先谢谢你。

1、M48的问题我没遇到过,试试看再作答复。

2、程序开始我是自动打开上次使用的端口,所以出现你所说的问题,我尽快修改程序,使之更灵活。提示无效端口后,程序就退出了吗?

出0入0汤圆

发表于 2007-5-14 23:55:08 | 显示全部楼层
看了整个过程,血都流了。非常感谢楼主这样人。真谢谢

出0入0汤圆

发表于 2007-5-15 00:23:25 | 显示全部楼层
提示无效端口后可以进入程序,但端口无法重新设置,无法使用了.

出0入0汤圆

 楼主| 发表于 2007-5-15 01:33:21 | 显示全部楼层
应该可以重新设置,在<设置端口>旁有个下拉菜单<打开、关闭端口>,或点左下角红、绿图标也能打开、关闭端口。





这是刚修改的主程序,修改了linwayavr提到的M48问题和串口问题,没做打包,解压后覆盖原同名文件即可。(因手边没有编程器,没能测试,应该不会有问题)

点击此处下载armok01154120.zip

出0入0汤圆

发表于 2007-5-15 07:28:25 | 显示全部楼层
这么迟了还再改程序,这种敬业精神令人佩服.

下载了修改的程序,在提示无效端口,进入主程序后,可以修改串口了.M48还没试

出0入0汤圆

发表于 2007-5-15 09:30:37 | 显示全部楼层
楼主这种废寝忘食的态度真是令人佩服!而且又不是为了赚钱

呵呵,有了楼主的高压编程器,以后就可以高枕无忧的做实验,随意烧拷文件了

出0入0汤圆

发表于 2007-5-15 10:41:41 | 显示全部楼层
M48测试了,没有问题。串口也可以随改随用了。非常感谢楼主的奉献!

另外有个小小BUG,不影响使用:在“其它”-“读写数据”-“FLASH”中读指定地址数据时,要点击“读”两次以上才能显示正确值。

另外,可否在“编程”中加入“校验Flash”和“校验EEprom”选项(类似Proisp),在程序中是否已有这些功能了?

出0入0汤圆

发表于 2007-5-15 11:18:34 | 显示全部楼层
支持楼主的无私奉献精神

出0入0汤圆

 楼主| 发表于 2007-5-15 13:12:17 | 显示全部楼层
linwayavr: “在“其它”-“读写数据”-“FLASH”中读指定地址数据时,要点击“读”两次以上才能显示正确值”-----刚才我试了试,这种情况我没出现过。不过还是根据你提供的现象,找了找出现这种情况的大概原因,修改了一下程序,你下载再试试。

点击此处下载armok01154157.zip

出0入0汤圆

发表于 2007-5-15 21:06:16 | 显示全部楼层
在地址匡中输入地址后,点"读",数据匡中的数据不会变化,再点"读",数据匡中的数据才变为该地址的实际数据.

出0入0汤圆

 楼主| 发表于 2007-5-15 23:32:26 | 显示全部楼层
我刚才试了,真邪了,没有出现你说的情况。注意,数据框是HEX,地址框是DEC。

出0入0汤圆

发表于 2007-5-16 06:59:08 | 显示全部楼层
佩服  楼主的钻研和奉献精神!

出0入0汤圆

发表于 2007-5-16 08:45:33 | 显示全部楼层
lz:107楼的建议是否考虑一下

出0入0汤圆

 楼主| 发表于 2007-5-16 11:41:39 | 显示全部楼层
所有制作过程的资料都上传网上了。最新更新是5月15日的。

出0入0汤圆

 楼主| 发表于 2007-5-16 12:08:25 | 显示全部楼层
to linwayavr:可不可以把你做的在这里秀一下,呵呵。

出0入0汤圆

发表于 2007-5-16 15:47:04 | 显示全部楼层
已经收到楼主的成品和pcb板,很好,回家用一下,哈哈。真不错也。

出0入0汤圆

发表于 2007-5-16 18:24:33 | 显示全部楼层
学校网络维护停了一天的网,终于熬到能上线了!

成品板今天也收到了,不错,很好用

出0入0汤圆

发表于 2007-5-16 21:35:54 | 显示全部楼层
我这个是参照楼主的电路图用试验板搭的,不太好看.

出0入0汤圆

发表于 2007-5-16 21:42:46 | 显示全部楼层
没有用DB9座,用了3根排针(RXD,TXD,GND)



出0入0汤圆

发表于 2007-5-16 22:24:28 | 显示全部楼层






背面很乱,将就看吧。我把USB转232的头剖开,取出电路板,与编程板焊在一块,这样就可以用USB的5V供电了,由于编程的12V电源只需要很小的电流,所以就利用MAX232内部的电荷泵再加上一些元件升压,再用12V稳压管稳压得到。

出0入0汤圆

发表于 2007-5-16 22:38:41 | 显示全部楼层
指示灯电路略做修改。我用的是红绿双色LED,加电后绿亮,当通过RS232与上位机存在通讯时,红随之闪烁。通讯结束红灭。

出0入0汤圆

发表于 2007-5-16 23:54:10 | 显示全部楼层
电路修改部分图

点击此处打开armok01154409.pdf

出0入0汤圆

发表于 2007-5-17 06:50:21 | 显示全部楼层
电路修改部分的gif图,与上面的pdf是一样的

出0入0汤圆

发表于 2007-5-17 06:59:23 | 显示全部楼层
图中的电容都可以用无极性的,这样就不用区分+,-极了.我的板上的电容都是贴片陶瓷电容,从坏光驱板上拆的,体积很小,容量很大.

出0入0汤圆

发表于 2007-5-17 07:06:29 | 显示全部楼层
请问slyt 箫天,你板上的boot跳线是接电路的那个地方啊?

出0入0汤圆

 楼主| 发表于 2007-5-17 08:16:25 | 显示全部楼层
linwayavr 很能干啊。

板上的boot是使用bootloader升级固件时短接用的。

问1:双色LED标准工作电流是多少?

问2:MAX232的工作电流是多少?

问3:从串口取电(把4、6、7、8并在一起),是否安全,能否支持整板用电?

问4:C5、C6大小与升压电压大小的关系?

出0入0汤圆

发表于 2007-5-17 16:40:16 | 显示全部楼层
如果能改用USB接口连接电脑,利用34063等电路升压到12V那就方便多了,只是上位机程序得重新编制,太麻烦了

出0入0汤圆

发表于 2007-5-17 16:40:18 | 显示全部楼层
如果能改用USB接口连接电脑,利用34063等电路升压到12V那就方便多了,只是上位机程序得重新编制,太麻烦了

出0入0汤圆

发表于 2007-5-17 19:29:32 | 显示全部楼层
1:双色LED中每个LED工作电流是20mA,与普通单色LED一样

2: MAX232的工作电流6mA-8mA

3: 从串口取电无法获得较大电流,一般在20mA以内,再大的话对串口安全不利.我测过这块板编程时总电流达40mA.

4: C5、C6大小与升压电压大小基本无关,大些则带负载能力好些,即能输出电流大些.

出0入0汤圆

发表于 2007-5-19 19:00:41 | 显示全部楼层
我用楼主的PCB做的编程器无反应,有几个问题:

1,请问编程器用的串口是公头吧??

2,232芯片用104电容行吗??

出0入0汤圆

发表于 2007-5-19 19:47:48 | 显示全部楼层
感谢箫天同志的无私奉献,有几个问题代表初级烧友请教

1.各个版本的固件烧写的时候熔丝多少?

2.带bootloader的固件(fuse:DFBF),这样表示是高位DF低位BF吗?

3.这个主控M8烧写完HEX和熔丝后,是不是主控M8就不能用ISP下载了? 呵呵



请箫天同志批改





顺便回答一下楼上的问题



我用楼主的PCB做的编程器无反应,有几个问题:

1,请问编程器用的串口是公头吧??

----还有你的线的问题,总之看这针上的数字 1就接1 2就接2,计算机上是公的座



2,232芯片用104电容行吗??

----好象太小,自少105吧,一般225,大点没有关系
-----此内容被eguy于2007-05-19,19:52:01编辑过

出0入0汤圆

发表于 2007-5-19 20:09:40 | 显示全部楼层
好东西,感谢无私奉献,手里有M8,M48被锁,看来是有希望了

出0入0汤圆

发表于 2007-5-19 20:26:03 | 显示全部楼层
前一段时间做过AVR的ISP编程器,自己写的代码,利用别人的串口软件可以读标识字,擦除,读内部FLASH,熔丝位,但是后来因为工作忙就没时间去写写内部FLASH和EEPROM的程序了。等有时间在写吧。

写完了在上传上来与大家共享。

出0入0汤圆

 楼主| 发表于 2007-5-19 21:35:18 | 显示全部楼层
to sudayan2006:你的问题eguy已回答很好。串口用公母无所谓,只要连线正确即可,注意的是TX—RX ,RX—TX,也就是2-3,3-2。

to eguy:

1、熔丝无特别要求,注意要设置为外部晶振。

2、是的,高位DF低位BF。

3、能啊,没有改变PC6和SPI位。

出0入0汤圆

发表于 2007-5-20 13:09:24 | 显示全部楼层
终于弄懂楼主的2和3的意思,脑子被弄乱了,现在大致明白

电脑的R232-2实际是接MAX232-7

电脑的R232-3实际是接MAX232-8

兄弟们,搞错是不行的呀






-----此内容被eguy于2007-05-20,13:26:59编辑过

出0入0汤圆

发表于 2007-5-20 13:29:14 | 显示全部楼层
还有一个建议,熔丝位设置好了可以去掉2个晶振电容,不过我熔丝不太熟悉

出0入0汤圆

 楼主| 发表于 2007-5-20 13:53:20 | 显示全部楼层
2个晶振电容可以省略,没有影响。

出0入0汤圆

发表于 2007-5-20 18:42:29 | 显示全部楼层
不错 感谢箫天 我已经成功了 只测试了M8, 突然有一个设想



可以将它设置成一个专用的AVR恢复器来脱离计算机工作,通过开关选择芯片,通过一个按键,甚至加电就恢复..用LED指示工作状态..

出0入0汤圆

 楼主| 发表于 2007-5-20 22:05:49 | 显示全部楼层
不用通过开关选择芯片,每种芯片有自己的标识字,读标识字可自动辨认芯片类型。M8的引脚不够了,如果要LED显示成功与否,可以考虑把RESET脚设置为IO。

出0入0汤圆

发表于 2007-5-20 23:33:04 | 显示全部楼层
感谢eguy,我也成功啦

出0入0汤圆

发表于 2007-5-21 13:36:27 | 显示全部楼层
楼主能不能上传PCB文件,我们这边做PCB板不要钱

出0入0汤圆

发表于 2007-5-21 21:46:43 | 显示全部楼层
由于楼主是用DB9公,手上没这种串口线,这几天又比较忙,没时间做,今天终于做好了,接电后,我的M8,M16复活啦!!!谢谢楼主萧天

出0入104汤圆

发表于 2007-5-21 23:23:45 | 显示全部楼层
提供-个精简全功能的STK500v2 compatible bootloader.hex



:101C0000919A8FE594E09EBF8DBF11241FBE05C041

:101C10008CB95E9BFECF5E9A08958F929F92AF9291

:101C2000BF92CF92DF92EF92FF920F931F93CF93C9

:101C3000DF93CDB7DEB7CD51D1400FB6F894DEBFFC

:101C40000FBECDBF819BA8C1B99AC19880E981BF61

:101C500083E089B988E18AB95F9BFECF8CB18B3173

:101C6000D9F75F9BFECF8CB1082FBBE1BB2EB82606

:101C70005F9BFECF8CB1682F9927582F44275F9B1D

:101C8000FECF8CB1982F282F3327242B352B5F9B29

:101C9000FECF8CB18B256927682740E050E00BC050

:101CA0005F9BFECF8CB199276827FE01E40FF51FDB

:101CB00081834F5F5F4F4217530791F75F9BFECFC2

:101CC0008CB1681749F689818130B9F41A8288E0AD

:101CD0008B8381E48C8386E58D8382E58E8389E422

:101CE0008F8383E5888780E589878FE58A8782E30C

:101CF0008B87FBE0EF2EF12C2AC18330D1F48A814F

:101D0000813989F0823928F4813839F0803939F401

:101D100008C0823951F0863911F481E007C080E0B3

:101D200005C08FE003C082E001C08AE01A828B8385

:101D300059C0823009F4C6C0803109F4C3C0813172

:101D400009F4C0C08B3159F48D81882311F48EE1E0

:101D500032C0813011F483E92EC087E02CC08C3171

:101D600011F08A3161F41A828A3139F489E0E1E0B4

:101D7000F0E08093570084911FC081B71DC0883167

:101D800009F58B81803589F48C81883039F489E0BC

:101D9000E2E0F0E08093570084910DC089E0E0E03C

:101DA000F0E080935700849106C089E0E3E0F0E022

:101DB0008093570084911A828B831C82E4E0EE2E7C

:101DC000F12CC5C0893191F499E08D81836CE1E0FB

:101DD000F0E0082E90935700E89507B600FCFDCF81

:101DE0001A821B8273E0E72EF12CB1C0823121F4FC

:101DF0001A8288249924A8C0863059F48C819927A6

:101E0000D82ECC248D819927C82AD92ACC0CDD1C48

:101E100059C0833121F0853109F056C0C2C09A8182

:101E20002B8140E084164CE1940660F483E0F401D9

:101E300080935700E89507B600FCFDCFE0E4F0E0A2

:101E40008E0E9F1E892F9927582F4427822F99275E

:101E5000482B592BB601DE011B9611E02C91FD0198

:101E6000818112969927982F88273327822B932BCD

:101E70000C01FB0110935700E89511246E5F7F4F12

:101E80004250504059F785E0F60180935700E8959D

:101E900007B600FCFDCF81E180935700E8956B0108

:101EA00011C02EBB832F99278FBB2F5F3F4F81918E

:101EB0008DBBE29AE19AE199FECF4150504089F7FB

:101EC000C60ED71E1A8240C0843119F0863109F03F

:101ED00039C08A819927782F66278B819927682BAB

:101EE000792B1A828981FE013396843199F49B0102

:101EF000DF01F601859194918C93892F9927FD013B

:101F00008183129642E050E0C40ED51E225030402C

:101F100091F0EFCF9601AB01DF012EBB832F992704

:101F20008FBB2F5F3F4FE09A8DB38D934150504050

:101F3000A1F7C60ED71E53E0E52EF12CE60EF71ED4

:101F40001C9205C080EC8A8342E0E42EF12C8BE1E8

:101F50005FDE802F5DDE8F2D9927182F59DE0E2D25

:101F60008E2D56DE0B258EE053DE8EE018270127DE

:101F70005E010894A11CB11C09C0F50111915F011B

:101F8000812F46DE01270894E108F108E114F104ED

:101F9000A1F7802F3DDE60CE91981F921F92089589

:101FA000FFCF8A819927782F66278B819927682B05

:0C1FB000792B9601AB01FE013B9673CF2C

:0400000300001C00DD

:00000001FF


-----此内容被andy于2007-05-22,00:14:30编辑过

出0入104汤圆

发表于 2007-5-21 23:49:29 | 显示全部楼层
在这个电路是完全可以构成<<脱离PC的AVR芯片恢复器>>只增加1个按键、2支电阻、1只LED。

在TXD_PIN连接1支电阻1K再连接1个按键、按键另1端接地。



这按键有2个功能:

1. 在开机时按下按键,M8将进入bootloader状态,软件进行升级。

2. 在开机时没有按下按键时,进入正常PC上位机控制,在没有接收到(PC_TXD=HIGH=<M8_RXD>)

   信号,按下按键时执行脱离PC<<专用的AVR芯片恢复器>>工作程序。



在BS2_PIN连接1支电阻1只LED作为状态显示灯。



这电路再作合理的修改,可构成全功能的编程器,可编程AVR全系列的单片机<低压串行ISP编程、

高压串行ISP编程、高压并行编程>及对PIC的单片机讲行编程。



先增加1个由M8输出PWM可控制的升压电路(12V-14V),ADC其中1PIN作输入取样电压到M8作运算后

再控制PWM的升压电路在所需要的电压。可参孝以下电路。



RESET脚要设置为IO及选用内部RC 8MHz振荡,将RC 8MHz振荡设置成7372800MHz,OSCCAL=0x80-0xA0。



提供-个精简全功能的STK500v2 compatible bootloader程序才900多byte,现在我的M8是选用内部RC 8MHz振荡设置成7372800MHz,

OSCCAL=0x90。







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

Title:     STK500v2 compatible bootloader

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

#include <inttypes.h>

#include <avr/io.h>

#include <avr/boot.h>

#include <avr/pgmspace.h>

#include <string.h>

#include <stdlib.h>

#include <inttypes.h>



#include <util/delay.h>



#include "command.h"



// Uncomment the following lines to save code space



//#define REMOVE_PROGRAM_LOCK_BIT_SUPPORT  // disable program lock bits

//#define REMOVE_BOOTLOADER_LED            // no LED to show active bootloader

//#define REMOVE_PROG_PIN_PULLUP           // disable internal pullup, use external





// Pin "PROG_PIN" on port "PROG_PORT" has to be pulled low

// (active low) to start the bootloader

// uncomment #define REMOVE_PROG_PIN_PULLUP if using an external pullup



#define PROG_PORT  PORTD

#define PROG_DDR   DDRD

#define PROG_IN    PIND

#define PROG_PIN   PIND1



/*

* Active-low LED on pin "PROGLED_PIN" on port "PROGLED_PORT"

* indicates that bootloader is active

*/

#define PROGLED_PORT PORTB

#define PROGLED_DDR  DDRB

#define PROGLED_PIN  PINB1



// define CPU frequency in Mhz here if not defined in Makefile





//  UART Baudrate, AVRStudio AVRISP only accepts 115200 bps



#define BAUDRATE 115200





//  Enable (1) or disable (0) USART double speed operation



#define UART_BAUDRATE_DOUBLE_SPEED                           0



/*

* HW and SW version, reported to AVRISP, must match version of AVRStudio

*/

#define CONFIG_PARAM_BUILD_NUMBER_LOW                0

#define CONFIG_PARAM_BUILD_NUMBER_HIGH                1

#define CONFIG_PARAM_HW_VER                                              0x0F

#define CONFIG_PARAM_SW_MAJOR                        2

#define CONFIG_PARAM_SW_MINOR                         0x0A

#define CONFIG_PARAM_OSC_CMATCH                 1





/*

* Calculate the address where the bootloader starts from FLASHEND and BOOTSIZE

* (adjust BOOTSIZE below and BOOTLOADER_ADDRESS in Makefile if you want to change the size of the bootloader)

*/

#define BOOTSIZE 512

#define APP_END  (FLASHEND -(2*BOOTSIZE) + 1)







/*

* Signature bytes are not available in avr-gcc io_xxx.h

*/

#if defined (__AVR_ATmega8__)

    #define SIGNATURE_BYTES 0x1E9307

#elif defined (__AVR_ATmega16__)

    #define SIGNATURE_BYTES 0x1E9403

#elif defined (__AVR_ATmega32__)

    #define SIGNATURE_BYTES 0x1E9502

#elif defined (__AVR_ATmega8515__)

    #define SIGNATURE_BYTES 0x1E9306

#elif defined (__AVR_ATmega8535__)

    #define SIGNATURE_BYTES 0x1E9308

#elif defined (__AVR_ATmega88__)

    #define SIGNATURE_BYTES 0x1E930A

#elif defined (__AVR_ATmega162__)

    #define SIGNATURE_BYTES 0x1E9404

#elif defined (__AVR_ATmega168__)

    #define SIGNATURE_BYTES 0x1E9406

#elif defined (__AVR_ATmega128__)

    #define SIGNATURE_BYTES 0x1E9702

#else

        #error "no signature definition for MCU available"

#endif





/*

*  Defines for the various USART registers

*/

#if  defined(__AVR_ATmega8__)    || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \

  || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \

/* ATMega8 with one USART */

#define        UART_BAUD_RATE_LOW             UBRRL

#define        UART_STATUS_REG                 UCSRA

#define        UART_CONTROL_REG             UCSRB

#define        UART_ENABLE_TRANSMITTER         TXEN

#define        UART_ENABLE_RECEIVER         RXEN

#define        UART_TRANSMIT_COMPLETE         TXC

#define        UART_RECEIVE_COMPLETE         RXC

#define        UART_DATA_REG                 UDR

#define UART_DOUBLE_SPEED        U2X



#elif  defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega162__) || defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__)

/* ATMega with two USART */

#define        UART_BAUD_RATE_LOW             UBRR0L

#define        UART_STATUS_REG                 UCSR0A

#define        UART_CONTROL_REG             UCSR0B

#define        UART_ENABLE_TRANSMITTER         TXEN0

#define        UART_ENABLE_RECEIVER         RXEN0

#define        UART_TRANSMIT_COMPLETE         TXC0

#define        UART_RECEIVE_COMPLETE         RXC0

#define        UART_DATA_REG                 UDR0

#define UART_DOUBLE_SPEED        U2X0



#else

        #error "no UART definition for MCU available"

#endif





//  Macros to map the new ATmega88/168 EEPROM bits



#ifdef  EEMPE                                                                           

#define EEMWE EEMPE

#define EEWE  EEPE

#endif





/*

* Macro to calculate UBBR from XTAL and baudrate

*/

#if UART_BAUDRATE_DOUBLE_SPEED



#if defined(__AVR_ATmega8__)

        // 选用MEGA8内部RC 8MHZ振荡

        #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5)  //-1.0+0.5

#elif defined (__AVR_ATmega16__)

        // 选用MEGA16内部RC 8MHZ振荡

        #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1)             //-1.0+0.5

#endif



#else

        #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*16.0)-1)       //-1.0+0.5

#endif





/*

* use 16bit address variable for ATmegas with <= 64K flash

*/

#if defined(RAMPZ)

typedef uint32_t address_t;

#else

typedef uint16_t address_t;

#endif





// function prototypes





static void sendchar(char C);

static unsigned char recchar(void);



/*

* since this bootloader is not linked against the avr-gcc crt1 functions,

* to reduce the code size, we need to provide our own initialization

*/

void __jumpMain     (void) __attribute__ ((naked)) __attribute__ ((section (".init9")));



void __jumpMain(void)

{

#ifndef REMOVE_PROG_PIN_PULLUP         

        PROG_PORT |= (1<<PROG_PIN);                // Enable internal pullup         

#endif

        SP=0X45F;                        // RAMEND

//  asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );

    asm volatile ( "clr __zero_reg__" );                       // GCC depends on register r1 set to 0

    asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) );  // set SREG to 0

    asm volatile ( "rjmp main");                               // jump to main()

}



// send single byte to USART, wait until transmission is completed



static void sendchar(char c)

{

    UART_DATA_REG = c;                                   // prepare transmission

    while (!(UART_STATUS_REG & (1 << UART_TRANSMIT_COMPLETE)));// wait until byte sent

    UART_STATUS_REG |= (1 << UART_TRANSMIT_COMPLETE);          // delete TXCflag

}





// Read single byte from USART, block if no data available



static unsigned char recchar(void)

{       

    while(!(UART_STATUS_REG & (1 << UART_RECEIVE_COMPLETE)));  // wait for data

    return UART_DATA_REG;

}



int main(void)

{

    address_t        address,eraseAddress;

        //unsigned char   msgParseState;

    unsigned int    i,msgLength;

        unsigned char   c, *p,seqNum,checksum;   

    unsigned char   msgBuffer[285];



        //Branch to bootloader or application code ?       

        if(PROG_IN & (1<<PROG_PIN))

        {             

#ifndef REMOVE_BOOTLOADER_LED

        // PROG_PIN pulled low, indicate with LED that bootloader is active

        PROGLED_DDR  |= (1<<PROGLED_PIN);

        PROGLED_PORT &= ~(1<<PROGLED_PIN);

#endif      

         

#if SELECT_HARDWARE_UART



        // Init UART

        // set baudrate and enable USART receiver and transmiter without interrupts

#if UART_BAUDRATE_DOUBLE_SPEED

        UART_STATUS_REG   |=  (1 <<UART_DOUBLE_SPEED);

#endif

        // 选用MEGA8内部RC 8MHZ振荡

                OSCCAL=0X90;                                //0xAD;

        // Init UART               

        UART_BAUD_RATE_LOW = UART_BAUD_SELECT(BAUDRATE,F_CPU);

        UART_CONTROL_REG   = (1 << UART_ENABLE_RECEIVER) | (1 << UART_ENABLE_TRANSMITTER);        

#else



#if defined (__AVR_ATmega8__)

        // 选用MEGA8内部RC 8MHZ振荡

                OSCCAL=0x90;                        //0x96;

#elif defined (__AVR_ATmega16__)

        // 选用MEGA16内部RC 8MHZ振荡

                OSCCAL=0xB7;

#endif

                PORTD |= 0B00000011;

                DDRD  |= 0B00000010;                       

#endif







                // main loop

                while(1)                             

                {

                msg_MESSAGE_START:

                               

                        c =        recchar();

                       

                        if ( c != MESSAGE_START ){

                                goto msg_MESSAGE_START;       

                        }

                   

                        checksum = MESSAGE_START^0;

                               

                        seqNum = recchar();

                        checksum ^= seqNum;               

                       

                        c =        recchar();

                        checksum ^= c;                   

                        msgLength = c << 8;

                       

                        c =        recchar();

                        checksum ^= c;

                        msgLength |= c;

                       

                        c =        recchar();                //TOKEN

                        checksum ^= c;                       

                       

                        for(i=0;i< msgLength;i++)

                        {

                                c =        recchar();

                                checksum ^= c;                               

                                msgBuffer = c;       

                        }

                       

                        if( recchar() != checksum ){

                                goto msg_MESSAGE_START;

                        }

                       

                        //Now process the STK500 commands, see Atmel Appnote AVR068                       

                if(msgBuffer[0]==CMD_SIGN_ON)

                {                                

                        msgBuffer[1]  = STATUS_CMD_OK;

                        msgBuffer[2]  = 8;

                        msgBuffer[3]  = 'A';

                        msgBuffer[4]  = 'V';

                        msgBuffer[5]  = 'R';

                        msgBuffer[6]  = 'I';

                        msgBuffer[7]  = 'S';

                        msgBuffer[8]  = 'P';

                        msgBuffer[9]  = '_';

                        msgBuffer[10] = '2';

                                msgLength           = 11;       

                    }

                else if(msgBuffer[0]==CMD_GET_PARAMETER)

                {

                    unsigned char value;

                        

                        switch(msgBuffer[1])

                        {

                                case PARAM_BUILD_NUMBER_LOW:

                                        value = CONFIG_PARAM_BUILD_NUMBER_LOW;

                                        break;                                    

                                case PARAM_BUILD_NUMBER_HIGH:

                                        value = CONFIG_PARAM_BUILD_NUMBER_HIGH;

                                        break;                                    

                                case PARAM_HW_VER:

                                        value = CONFIG_PARAM_HW_VER;

                                        break;                                    

                                case PARAM_SW_MAJOR:

                                        value = CONFIG_PARAM_SW_MAJOR;

                                        break;

                                case PARAM_SW_MINOR:

                                        value = CONFIG_PARAM_SW_MINOR;

                                        break;

                                       case PARAM_OSC_PSCALE:

                                                   value = CONFIG_PARAM_OSC_CMATCH;

                                                   break;

               

                                                default:

                                        value = 0;

                                        break;

                        }

                        msgLength = 3;                        

                        msgBuffer[1] = STATUS_CMD_OK;

                        msgBuffer[2] = value;

                    }   

                else if( (msgBuffer[0]==CMD_SET_PARAMETER)\

                                 ||(msgBuffer[0]== CMD_ENTER_PROGMODE_ISP)\

                                 ||(msgBuffer[0]==CMD_LEAVE_PROGMODE_ISP) )

                        {

                        msgLength = 2;                        

                        msgBuffer[1] = STATUS_CMD_OK;

            }

            else if(msgBuffer[0]==CMD_READ_SIGNATURE_ISP)

            {

                    unsigned char signatureIndex = msgBuffer[4];

                    unsigned char signature;



                    if ( signatureIndex == 0 )

                        signature = (SIGNATURE_BYTES >>16) & 0x000000FF;

                    else if ( signatureIndex == 1 )

                        signature = (SIGNATURE_BYTES >> 8) & 0x000000FF;

                    else

                        signature = SIGNATURE_BYTES & 0x000000FF;

                        msgLength = 4;

                        msgBuffer[1] = STATUS_CMD_OK;

                        msgBuffer[2] = signature;

                        msgBuffer[3] = STATUS_CMD_OK;                        

                }

                        else if( (msgBuffer[0]==CMD_READ_OSCCAL_ISP)\

                                 ||(msgBuffer[0]==CMD_READ_LOCK_ISP) )

            {           

                msgLength = 4;

                    msgBuffer[1] = STATUS_CMD_OK;

                                if(msgBuffer[0]==CMD_READ_LOCK_ISP)

                                        msgBuffer[2] = boot_lock_fuse_bits_get( GET_LOCK_BITS );

                                else

                                        msgBuffer[2] = OSCCAL;

                    msgBuffer[3] = STATUS_CMD_OK;                                                       

            }

            else if(msgBuffer[0]==CMD_READ_FUSE_ISP)

            {                    

                    unsigned char fuseBits;                    

                    

                    if ( msgBuffer[2] == 0x50 )

                    {

                        if ( msgBuffer[3] == 0x08 )

                            fuseBits = boot_lock_fuse_bits_get( GET_EXTENDED_FUSE_BITS );                           

                        else

                            fuseBits = boot_lock_fuse_bits_get( GET_LOW_FUSE_BITS );                           

                    }

                    else

                    {

                        fuseBits = boot_lock_fuse_bits_get( GET_HIGH_FUSE_BITS );

                    }                    

                    msgLength = 4;   

                        msgBuffer[1] = STATUS_CMD_OK;

                        msgBuffer[2] = fuseBits;                        

                        msgBuffer[3] = STATUS_CMD_OK;                                           

            }   

#ifndef REMOVE_PROGRAM_LOCK_BIT_SUPPORT

                        else if(msgBuffer[0]==CMD_PROGRAM_LOCK_ISP)

            {

                    unsigned char lockBits = msgBuffer[4];

                    

                    lockBits = (~lockBits) & 0x3C;  // mask BLBxx bits

                                    boot_lock_bits_set(lockBits);        // and program it

                                    boot_spm_busy_wait();

                    

                    msgLength = 3;

                        msgBuffer[1] = STATUS_CMD_OK;                        

                        msgBuffer[2] = STATUS_CMD_OK;                                                                

            }

#endif

            else if(msgBuffer[0]==CMD_CHIP_ERASE_ISP)

            {

                                eraseAddress = 0;

                    msgLength = 2;

                    msgBuffer[1] = STATUS_CMD_OK;

            }

            else if(msgBuffer[0]==CMD_LOAD_ADDRESS)

                        {

#if defined(RAMPZ)

                address = ( ((address_t)(msgBuffer[1])<<24)|((address_t)(msgBuffer[2])<<16)|((address_t)(msgBuffer[3])<<8)|(msgBuffer[4]) )<<1;

#else

                        address = ( ((msgBuffer[3])<<8)|(msgBuffer[4]) )<<1;  //convert word to byte address

#endif

                        msgLength = 2;

                        msgBuffer[1] = STATUS_CMD_OK;

            }  

            else if( (msgBuffer[0]==CMD_PROGRAM_FLASH_ISP)\

                                 ||(msgBuffer[0]==CMD_PROGRAM_EEPROM_ISP) )              

            {

                    unsigned int  size = ((msgBuffer[1])<<8) | msgBuffer[2];

                    unsigned char *p = msgBuffer+10;

                    unsigned int  data;

                    unsigned char highByte, lowByte;                    

                    address_t     tempaddress = address;

                  

                    if ( msgBuffer[0] == CMD_PROGRAM_FLASH_ISP )

                    {

                                // erase only main section (bootloader protection)

                                if  (  eraseAddress < APP_END )

                                {

                                        boot_page_erase(eraseAddress);        // Perform page erase

                                        boot_spm_busy_wait();                        // Wait until the memory is erased.

                                        eraseAddress += SPM_PAGESIZE;   // point to next page to be erase

                                }

                        

                                /* Write FLASH */

                                do {

                                    lowByte   = *p++;

                                    highByte  = *p++;

                                            

                                            data =  (highByte << 8) | lowByte;

                                            boot_page_fill(address,data);

                                

                                            address = address + 2;          // Select next word in memory

                                            size -= 2;                        // Reduce number of bytes to write by two   

                                    } while(size);                        // Loop until all bytes written

                                    

                                    boot_page_write(tempaddress);

                                    boot_spm_busy_wait();       

                                    boot_rww_enable();                                // Re-enable the RWW section                    

                            }

                            else

                            {

                                /* write EEPROM */

                                    do {

                                     EEARL = address;                        // Setup EEPROM address

                                EEARH = (address >> 8);

                                            address++;                                        // Select next EEPROM byte

        

                                            EEDR= *p++;                                    // get byte from buffer

                                EECR |= (1<<EEMWE);                        // Write data into EEPROM

                                EECR |= (1<<EEWE);

                           

                                            while (EECR & (1<<EEWE));        // Wait for write operation to finish

                                            size--;                                                // Decrease number of bytes to write

                                    } while(size);                                        // Loop until all bytes written                               

                            }

                               msgLength = 2;

                            msgBuffer[1] = STATUS_CMD_OK;                            

            }   

            else if( (msgBuffer[0]==CMD_READ_FLASH_ISP)\

                                 ||(msgBuffer[0]==CMD_READ_EEPROM_ISP) )                                             

            {

                    unsigned int  size = ((msgBuffer[1])<<8) | msgBuffer[2];                    

                    unsigned char *p = msgBuffer+1;

                    msgLength = size+3;

                    

                    *p++ = STATUS_CMD_OK;                    

                    if (msgBuffer[0] == CMD_READ_FLASH_ISP )

                    {

                        unsigned int data;

                        

                        // Read FLASH

                        do {                           

#if defined(RAMPZ)

                                        data = pgm_read_word_far(address);

#else

                                        data = pgm_read_word_near(address);

#endif

                                        *p++ = (unsigned char)data;         //LSB

                                        *p++ = (unsigned char)(data >> 8);        //MSB  

                                        address    += 2;           // Select next word in memory

                                        size -= 2;

                        }while (size);

                    }

                    else

                    {

                                      /* Read EEPROM */

                                    do {

                                        EEARL = address;                        // Setup EEPROM address

                                        EEARH = ((address >> 8));

                                        address++;                                        // Select next EEPROM byte

                                        EECR |= (1<<EERE);                        // Read EEPROM

                                        *p++ = EEDR;                                // Send EEPROM data

                                        size--;                                    

                                }while(size);

                    }

                    *p++ = STATUS_CMD_OK;

            }

                else

                        {

                    msgLength = 2;   

                    msgBuffer[1] = STATUS_CMD_FAILED;

                }



            /*

             * Now send answer message back

             */

                sendchar(MESSAGE_START);     

                checksum = MESSAGE_START^0;

                       

                sendchar(seqNum);

                checksum ^= seqNum;

                       

                c = ((msgLength>>8)&0xFF);

                sendchar(c);

                checksum ^= c;

                       

                c = msgLength & 0x00FF;

                sendchar(c);

                checksum ^= c;

      

                sendchar(TOKEN);

                checksum ^= TOKEN;

                       

            p = msgBuffer;

            while ( msgLength )

            {               

               c = *p++;

               sendchar(c);

               checksum ^=c;

               msgLength--;               

            }                  

                sendchar(checksum);                

                seqNum++;

            }//for



#ifndef REMOVE_BOOTLOADER_LED

        PROGLED_DDR  &= ~(1<<PROGLED_PIN);   // set to default     

#endif

    }

   

        /*

         * Now leave bootloader

         */

#ifndef REMOVE_PROG_PIN_PULLUP       

        PROG_PORT &= ~(1<<PROG_PIN);    // set to default

#endif       

//        boot_rww_enable();              // enable application section

       

//   (*((void(*)(void))PROG_START))();         

       

       

    asm volatile ( "push r1" "
\t"  // Jump to Reset vector in Application Section

                    "push r1" "
\t"

                    "ret"     "
\t"

                   ::);



     /*

     * Never return to stop GCC to generate exit return code

     * Actually we will never reach this point, but the compiler doesn't

     * understand this

     */

    for(;;);

}



-----此内容被andy于2007-05-21,23:25:48编辑过

出0入0汤圆

发表于 2007-5-22 10:05:55 | 显示全部楼层
编程器出现问题了!当用恢复熔丝、读熔丝时就出现编程器无反应,其它得选项就没问题,为什么啊?










-----此内容被ken524012于2007-05-22,10:26:50编辑过

出0入0汤圆

发表于 2007-5-22 10:45:17 | 显示全部楼层
我晕,重新安装了程序,现在连串口通信都没了~~~5555

出0入0汤圆

 楼主| 发表于 2007-5-22 12:45:53 | 显示全部楼层
是成品板还是你自己焊的那个?

你重新安装的是什么程序?是PC端的还是固件?

出0入0汤圆

发表于 2007-5-22 12:56:57 | 显示全部楼层
是你的成品板,重新安装PC端的上位机

出0入0汤圆

 楼主| 发表于 2007-5-22 13:08:04 | 显示全部楼层
检查串口线是否接触不好,是否通讯正常。接电脑端的串口母头要4-6,7-8针短接。

重写一片M8固件,换下板上的M8试试。

实在不行寄给我。

加我的QQ,2:30前我在线。
-----此内容被slyt于2007-05-22,13:09:32编辑过

出0入0汤圆

发表于 2007-5-22 15:21:01 | 显示全部楼层
串口线应该是正常的,因为我拿了别人买的串口线试过了,也是一样,换了别外一台电脑的串口也不行,重新安装是上位机后现在检测不到串口信号,编程器没反应

现在手上没新的M8,明天去买片新了试试!!

昨天解锁的那片M8今天用来下载程序还是不行,可能是昨天熔丝没搞好

出0入0汤圆

发表于 2007-5-22 17:44:06 | 显示全部楼层
eguy说

电脑的R232-2实际是接MAX232-7  

电脑的R232-3实际是接MAX232-8

但是图上的电路好像不是这样接的呀

按楼主的图接上没问题吧???

出0入0汤圆

发表于 2007-5-22 19:27:51 | 显示全部楼层
重新用了块新的M8拷了固件,现在能检测到串口了,但是没办法修改熔丝位,还有就是下一个flash进M16现在花了5分钟还在拷,什么原因啊?

出0入0汤圆

发表于 2007-5-22 19:48:34 | 显示全部楼层
我晕死,整了半天终于有个熔丝能修改好了,但放实验板上ISP下载时还是无法进入编程模式,晕倒

还有个问题就是,有时按一下按键,会往下跑好几圈才出现字,有时是编程器无反应,有时就能读出熔丝位,恢复熔丝就基本上没成功过!都是编程器无反应,有时按读熔丝位会读出不同的熔丝位

我要的熔丝位和上位机写进去的经常不一致~~~


-----此内容被ken524012于2007-05-22,20:10:11编辑过

出0入0汤圆

发表于 2007-5-22 20:31:28 | 显示全部楼层
试了三个小时,终于成功把一片M8解锁了!

出0入0汤圆

 楼主| 发表于 2007-5-22 21:48:40 | 显示全部楼层
to greencamel:

eguy说的对,电脑的R232-2实际是接MAX232-7,电脑的R232-3实际是接MAX232-8。

这个图是板上的接口座,座的3接MAX232-7,2接MAX232-8。串口通讯线是2-3对接,就是eguy说的了。不管怎么接,总是电脑的RX接单片机的TX,TX接RX。

出0入0汤圆

 楼主| 发表于 2007-5-22 22:29:37 | 显示全部楼层
ken524012:估计是通信问题,明天给你寄根串口线。

出0入0汤圆

发表于 2007-5-22 22:35:37 | 显示全部楼层
按照楼主的资料手工焊接了一个 ,救活了我的两片48.

有点好奇 于是再试下,故意用ISP把48的RST设置成普通IO.  这下麻烦来了,怎么也修改不回去了.

点击 恢复熔丝--读熔丝位. 修改失败

点击 恢复熔丝--檫除芯便--读熔丝位.这下好了 欣喜万分.可是再断电重起,读出来再看,还是没有修改过来.

不知道是什么问题.

出0入0汤圆

发表于 2007-5-22 23:39:57 | 显示全部楼层
印象中好象的确遇到过这样的事情,但是也好象是用右下的编程按钮解决,擦除打钩...应该可以修改回...估计软件还是有一定的BUG,有待楼主完善..

出0入0汤圆

发表于 2007-5-22 23:51:49 | 显示全部楼层
slyt 箫天

      我好像明白了,你的意思串口通讯线和串口延长线是不一样的,通讯线一端的2和另一端的3口才是相通的??

     我是用串口延长线来做的,是要按eguy的图来做吧

出0入0汤圆

 楼主| 发表于 2007-5-23 02:33:00 | 显示全部楼层
对M48进行了重新测试,确实存在avr_c所说的问题。

正在查找原因,在没有公布新程序之前,请不要对Mx8系列熔丝的RST进行操作。

出0入0汤圆

发表于 2007-5-23 09:06:37 | 显示全部楼层
萧天老师,成功了,早上一来第一件事上电恢复熔丝,试了五分钟,终于把昨天解半天也没成功的别一块M8也解锁了

出0入0汤圆

 楼主| 发表于 2007-5-23 11:44:55 | 显示全部楼层
greencamel:延长线和通讯线不一样,延长线是一一对应,通讯线是,5-5,2-3,3-2,4-6,6-4,7-8,8-7。

出0入0汤圆

发表于 2007-5-23 15:47:26 | 显示全部楼层
昨晚刚出炉,呵呵,好东西,救活了我的M48和m8。

谢谢,箫天。

看来以后可以随便玩熔丝位了。

我手工焊接的,用USB供电,MC34063升压到15v后在用12v稳压管稳12v高压。

出0入0汤圆

发表于 2007-5-23 15:51:26 | 显示全部楼层
手机拍的,很烂,穷学生,买不起数码相机。

重新上传。

出0入0汤圆

发表于 2007-5-23 17:07:52 | 显示全部楼层
>>对M48进行了重新测试,确实存在avr_c所说的问题。正在查找原因



请 slyt 箫天 及 avr_c 把 +12V 到 AVR RESET 脚的 R1 电阻由 10K 换成 1K 试一试。

出0入0汤圆

发表于 2007-5-23 19:22:51 | 显示全部楼层
回楼上,试了 还是不行.

出0入0汤圆

发表于 2007-5-23 23:28:44 | 显示全部楼层
我查看了资料,相信原因是在 RESET 脚未加 +12V 时,而时钟熔丝位设为RC, +5V 早已供应给AVR,所以AVR已正常运行内部程式,而 AVR RESET 脚已不再接至内部RESET电路而改接I/O电路,导至不能进入高压编程模式。这时限在加上+5V时相信大约为 4ms.



出0入0汤圆

 楼主| 发表于 2007-5-24 00:11:23 | 显示全部楼层
eblc1388说的有道理,我也是考虑可能是这个原因。明天改电路试试。

出0入0汤圆

发表于 2007-5-24 08:30:14 | 显示全部楼层
楼主您好,我一个朋友最近正好锁死了几片M16,如果再做好板子的话能否告知一声。

正好在同一个城市,会更方便一些。

出0入0汤圆

 楼主| 发表于 2007-5-25 01:21:21 | 显示全部楼层
wentao:做好我通知你。最好给我发个EMail,不容易遗漏。



恢复写有程序的、RESET熔丝位被编程的M48、M8成功。

1、修改了PCB电路,刻断一条线,连了一根线。

2、用M8的PB.6作为5V电压输出为目标芯片供电。

3、用内部RC 8MHz振荡,试验计算出最佳OSCCAL值。

4、修改了固件程序和PC端程序。



本想用M8的PC6(RESET)为目标芯片提供5V电压,结果在调试过程中锁了好几片,怕给大家自制造成不必要的麻烦,因而放弃,改为使用M8内部RC,去掉外部晶振,由PB6输出电压。



现在程序很乱,待整理后将固件、PC端程序、PCB修改位置图、最佳OSCCAL值的得到方法等上传这里。

出0入0汤圆

发表于 2007-5-25 01:59:47 | 显示全部楼层
这是我今天在面包板上搭建搂主电路时发现的,请搂主留意。



就算目标 AVR VCC 引脚悬空,所有接至目标 AVR, 而处於高输出状态的接脚线路(例如 RDY/BUSY, /OE, /WR ...),由於目标 AVR 脚内使用了保护二极管的原因,皆可变相输电给目标 AVR,使 AVR 进入正常运行状态,此时目标 AVR Vcc 电压约为 4.4V。

出0入0汤圆

发表于 2007-5-25 02:23:32 | 显示全部楼层
楼主您好,板子做好了的话,我也想买一块,谢谢

信箱:xinwenzhi@163.com
-----此内容被nbanba于2007-05-25,02:44:51编辑过

出0入0汤圆

 楼主| 发表于 2007-5-26 15:28:43 | 显示全部楼层



</font>这一步非常重要,固件程序根据此值计算最佳的校正值使串口通信最稳定。</p>

<p><font size="3">安装包程序下载</font></font>




 </font></p>

出0入0汤圆

发表于 2007-5-26 15:36:17 | 显示全部楼层
是不是只要不对RSTDISBL熔丝位进行操作,就没必要修改PCB板?呵呵,实力有限,怕把它搞坏了

出0入0汤圆

发表于 2007-5-26 15:54:32 | 显示全部楼层
支持一下,我也需要一只成品板,我有两片M8锁了。

出0入0汤圆

发表于 2007-5-26 16:19:26 | 显示全部楼层
下载不了,能传上来吗??谢谢

出0入0汤圆

发表于 2007-5-26 16:42:46 | 显示全部楼层
EEPROM的00地址不推荐使用的啊!!!

出0入0汤圆

 楼主| 发表于 2007-5-26 17:10:58 | 显示全部楼层
  这一步非常重要,固件程序根据此值计算最佳的校正值使串口通信最稳定。



<font size="3">安装包程序下载</font>

出0入0汤圆

 楼主| 发表于 2007-5-26 18:31:00 | 显示全部楼层
PCB修改方法:







出0入0汤圆

 楼主| 发表于 2007-5-26 19:20:17 | 显示全部楼层
终于可以上传了。

安装程序包下载:点击此处下载armok01155542.zip



ken524012:是的。一般不需要修改RESETDISABLE位。用USBASP及并口下载线容易在不稳定时或误操作将熔丝位设置成外部RC或外部时钟,或改写SPI位,造成所谓的芯片锁定了,无法ISP编程。上述情况我都遇到过,没有出现将RESETDISABLE位改写的情况。



avr_c:为什么?



AVR-MEGA128:可以。请给我发邮件,说明要老版还是修改板。



已做好一些PCB板,还是上次的那种。有需要成品板或PCB的请EM我。需要成品板请说明是否需要改为修改板。

出0入0汤圆

发表于 2007-5-27 10:42:50 | 显示全部楼层
刚刚购买到了宽体的ZIF28。

不知道PCB上面M8的固件,应该采用哪个版本?

谢谢先。

出0入0汤圆

 楼主| 发表于 2007-5-27 11:16:37 | 显示全部楼层
不按图修改PCB板的话都是用5月26日(不含)以前的,在我的网页上虚线以上的。

出0入0汤圆

发表于 2007-5-27 23:16:52 | 显示全部楼层
为 箫天 同志的

无私奉献精神 表示感谢。

从头看下来,也很累啊,呵呵,又恐整理一下,做一个板子,期待 箫天 把程序功能完善,谢谢!

出0入0汤圆

 楼主| 发表于 2007-5-28 00:37:47 | 显示全部楼层
利用休息日,进一步对修改版的固件、bootloader、PC程序进行了修改,彻底解决对M8、M48等RSTDISBL熔丝位已编程的恢复问题,试验写入各种程序,包括程序中对PC6有IO操作,都能轻松恢复,哈哈,那个爽啊。





开始提供成品板和PCB,成品板按修改的提供,背面有一飞线。为研究这个编程器已花了不少钱,因为已做好了板子,不想浪费。</font>

出0入0汤圆

发表于 2007-5-28 13:15:21 | 显示全部楼层
楼主的好东西啊,让不少人受益啊!!顶起来!

出0入0汤圆

发表于 2007-5-28 13:19:00 | 显示全部楼层
楼主是否可以将所有资料进行系统整理一下,提供原理图等资料,以便我们菜鸟学习?谢谢你。

出0入0汤圆

发表于 2007-5-28 22:21:10 | 显示全部楼层
刚购买到了宽体的ZIF28,今天才发现——宽体的ZIF28的“中间”,也是“宽体”的——不能使用M8......

我真是老糊涂了!!!

今天把  萧天老师的电路图重新录入,准备自己画PCB、使用窄体的ZIF插座。

按照自己的实际情况,准备使用USB+5V供电,MAX232升压提供+12V......适当增加电源回路的去耦......



感谢  萧天老师!



点击此处打开armok01155789.pdf

出0入0汤圆

 楼主| 发表于 2007-5-28 23:03:51 | 显示全部楼层
温馨提示wxfhw:如果自己重新画电路板,建议按照26日后的修改板画,192楼的安装程序安装后有电路图。此板功能更强,更稳定。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 22:09

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

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