atmega8的optiboot

C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial_private.h
UPE was not declared in this scope

#define UPE0 UPE

变为

#ifndef UPE
#define UPE0 PE
#else
#define UPE0 UPE

board.txt:

##############################################################
atmega8a.name=Arduino atmega8a

atmega8a.upload.tool=avrdude
atmega8a.upload.protocol=arduino
atmega8a.upload.maximum_size=7680
atmega8a.upload.maximum_data_size=2048
atmega8a.upload.speed=115200

atmega8a.bootloader.tool=avrdude
atmega8a.bootloader.low_fuses=0xBF
atmega8a.bootloader.high_fuses=0xCC
atmega8a.bootloader.extended_fuses=0×05
atmega8a.bootloader.unlock_bits=0x3F
atmega8a.bootloader.lock_bits=0x0F
atmega8a.bootloader.file=optiboot/optiboot_atmega8.hex

atmega8a.build.mcu=atmega8
atmega8a.build.f_cpu=16000000L
atmega8a.build.board=AVR_UNO
atmega8a.build.core=arduino
atmega8a.build.variant=standard

文件: optiboot

自制CPU状态报告 2014/4/12

加速啊!超过datasheet(计划表)上的预定期限2周了!
第一条命令已经成功执行,但是在仿真器里还是有一些奇特的问题,我觉得根本就不可能发生的事情,例如说,一个D触发器用内置的三态门,一个用外置的,当电平不一致的时候竟然会短路(那时只有一个三态门启用),我怀疑是仿真软件出故障了,那只是一瞬间的事,我把另一个触发器也接上外置三态门以后,问题就解决了,但是要多一个三态门芯片,怎么那么奇怪啊……

另外,资金实在不够了,如果有人想要帮忙,一起开发这个设备的话,可以一起来,创客也有困难的时候,看到那个Magic-1都能跑Minix了,我这命令都还不全呢,要加速了。

今天上淘宝找芯片,发现芯片都是分散的,好几个商家,要付多次运费,真是麻烦,要是谁有卖比较全的74HC系列芯片,可以联系我一下,例如74HC4017,74HC161,74HC181等。

【注】找到一家比较全的,报价如下(后面为另一家对比值,这里就不说明具体商家了):

74HC126 1.2
74HC244 1.2 Y 0.79
74HC574 2.2 Y 0.79
74HC181 1.7
74HC154 2.5(大) 1.7(小 选这个)
74HC125 1.2(选) Y(不选) 0.68
62256 3.2
74HC161 1.2
25LC1024 7 选用winbond 25系列芯片
74HC4017 1.2
74HC08 1 Y 0.42
74HC32 1.2 Y 0.42
74HC04 1.1 Y 0.36
74HC164 1.3 Y 0.32
74HC00 1.2 Y 0.62
74HC21 1.4
74HC02 1.1 Y 0.56
74HC157 1.3

我还把命令修改了,GETF没掉了,改成新的EXT命令,有一个参数,输出这个参数来执行外部的东西,然后返回值输入到Index里,估计要用一个JTAG插口来连接外部数据,这就是一个扩展功能指令,虽然只有一个参数,但是可以重复执行,比如说EXT 1,EXT2连续执行,就相当于有两个参数了。
【说明:可能会改两个参数,第一个参数是激活哪个外部接口,第二个就是传入的数据】

GPIO也要准备弄了,估计要齐纳二极管来阻止大于5.1v的电压进入防止烧坏,GPIO一来,就少了好多寄存器(一排8个GPIO要两个8位寄存器),JE JS JL命令的话我要偷个懒,如果两个相等(JE触发),则让内存指针寄存器(16位那个)+1,这样可以在命令后面添加自己的JMP命令,好多了,也方便,指令也短了,操作也更多样了!

 

自制CPU状态报告 2014/3/15 星期六

哈哈,正好是三月15日,消费者权益保护日。
我在这周和上周做了个自制处理器的datasheet,在纸上手写的,和德州仪器的部分datasheet一样,真是古老。同时还给自己的CPU命了个名——TLUTonyLianLong’s Central Processing Unit),由TLU做成的电脑呢,就叫TC(TLU Computer)了,最早的TC是TC0,第一代产品。我先把TC的部分功能给模拟了出来,具体可以看我的github,TC模拟器的地址是https://github.com/TonyLianLong/TCSimulator,里面还有x86的成品linux二进制文件呢。我自己设计了寄存器和16个指令,其中寄存器是4-bit寻址的,而指令也是4-bit寻址的,内存是16-bit(实际上只用15-bit),Flash是24-bit。下午把SPI FLASH的数据读进SRAM的操作做好了,决定要把内存的0位置给空着,因为某些特殊原因(如果要我把0位置补上,至少要加两个D锁存器,太浪费了),同时还发现虽然74HC系列的芯片和CD系列的芯片都是CMOS芯片,比TTL慢,但是事实上74HC是快速CMOS,而CD系列不知道(可能是普通CMOS吧),因此74HC系列芯片比CD芯片快很多,据Datasheet上写,有的74HC芯片可以到50甚至100多Mhz,而CD4017呢?你给它施加15V的电压后频率也才5.5Mhz(看http://pdf1.alldatasheet.net/datasheet-pdf/view/26855/TI/CD4017.html),一般的5V下是2.5Mhz,就是这个限制了我的频率,但是我又找不到东西来替换这个芯片,现在我知道为什么人家用TTL了,我也想用……但是没办法,还是用CMOS吧,或者难道要我去用74HC4017?!这个频率可以到70Mhz多(看http://pdf1.alldatasheetcn.com/datasheet-pdf/view/15604/PHILIPS/74HC4017.html),是CD4017的30多倍啊,看起来好像不错。CD系列的好处据网上说是电压宽,20多V都烧不掉,datasheet上写18V,但是18V有什么用,接18V以后我的74HC芯片就烧了……74HC芯片只能用2~6V来驱动。
好了,就先这样,慢慢来。

自制CPU日程表

好吧,和BMOW一样,我也给自己写了个日程表。
我做的是一个普通单片机,无中断,于是会简单一点。

2014年

【已完成】

  1. 2 月28日开始设计CPU要用的芯片类型、命令、长度等(完成日期: http://www.tonylianlong.com/?p=179
  2. 3月7日成功设计Opcode判断器(74HC154)和加法器(74HC258/CD4008),决定少用点CD芯片,多用点74HC的,看起来速度好像快一点,74HC574作为buffer缓存
  3. 3月7日更换内存芯片

【未完成】

  1. 设计好ALU的各种命令 估计日期:4月前
  2. 设计好内存、Flash的读写操作 估计日期:4月
  3. 协同合作 估计日期:7月前
  4. 搭建在真的板子上 估计日期:7月

自制CPU设计

自制CPU列表:

http://members.iinet.net.au/~daveb/simplex/ringhome.html

Magic-1(最强) http://www.homebrewcpu.com/
BMOW-1 (一般) http://www.bigmessowires.com/
没名字的CPU(最弱) http://cpuville.com/
TTLCPU http://www.ttlcpu.com/articles/schematics

找到一个原理图:http://digitarworld.uw.hu/ttlcpu_schem.jpg,是http://digitarworld.uw.hu/ttlcpu.html的。

好吧,最近学了点X86指令集,看了点汇编代码和Opcode等的介绍,想自己也来做一个CPU(类似单片机,速度为1Mhz左右,无中断,8个8位寄存器,16条指令)。
有人说:你才了解个大概就想学飞呢。对,我是对这些没什么了解,这个计划的成功率也不是很高,最终看我能不能坚持下去咯,一般74芯片要上百块(块是数量,不是价格),还要看能耐如何。
很早以前我就知道一个叫BMOW的自制CPU了,貌似用了200多块74芯片呢。
想着扛着上面有两百块74芯片的洞洞板,然后几节AA电池驱动的电脑上街……别提有多爽了。
我上网查了查,74LS系列是TTL芯片,74HC系列是CMOS芯片(好像也兼容TTL),CD40系列呢,也是CMOS芯片,两个CMOS芯片,一个TTL芯片,要知道有的CMOS芯片和TTL芯片不兼容,那用CMOS芯片岂不是比TTL还要好?
是的,同时CMOS芯片的优点是省电,不过CMOS有一个致命弱点,那就是要30ns左右(如果没记错,来自http://zhidao.baidu.com/link?url=56QHswInE-YgjvCsPGyM7L6VWwHAdO6YtOujEGYEQAu9ZtaZIoIuw2SsJbqqsAdec1BHJThA2sEN_OCQTVNkpa,比TTL的5~10ns左右慢了很多),好吧,慢就慢,所以我还是选择了CMOS的芯片(我很奇怪为什么上面的CPU都是TTL系列的芯片,难道是历史原因)。
接下来,我自己设计了一个全加器和全减器,发现全加器有CD4008(一个是4bits的,两个就是8bits了),全减器可以用138(3-8译码器,74hc138)芯片来做,网上的全减器也比我设计的简单,我就不公布我的设计了。

设想:一个Index寄存器最经常调用,任何指令都是拿Index寄存器和另一个寄存器进行操作的,而另一个寄存器可以通过数据选择器来选择数据。【更正:使用三态门】

可参考http://cpuville.com/,很有用的网站,上面有很多关于门(gate)的基础知识。

GPIO(判断是否运行成功的方法)设计:
74HC589可作为GPIO输入
CD4021 并入串出
74HC595作为GPIO输出
使用EN使能来判断使用输入或者输出(数据选择器)

储存器:
25LC1024作为储存芯片(128KB)
IDT6167SA25P作为SRAM(2KB),为什么要SRAM而不是容量大的DRAM、SDRAM,那是因为SRAM不需要刷新,操控简单。
【更新】使用KM62256C芯片,32KB的芯片,15个Address脚

74HC573锁存器作为寄存器(参考:http://baike.baidu.com/link?url=qWXPLxROopql9kYQBhdVtZGr-iqTsUyP_xRjczoNnkNSM04z9UdYnBrMy0JKXI-r56Hebty6CL3hP11-BpDs_a)

寄存器读入方式:数据选择器选择读入的寄存器(看看有没有8选1的)【更正:使用三态门】
数据选择器:http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E9%80%89%E6%8B%A9%E5%99%A8

寄存器设计(N=无):
N Index寄存器(8位)
【更新】1~7寄存器为8位寄存器
N2 内存指针(代码)寄存器【更新】16位,不可随意更改,最高位为0(因为内存只有十五位)
0 寄存器0
1 寄存器1
2 寄存器2
3 寄存器3
4 寄存器4
5 寄存器5
6 寄存器6
7 寄存器7
-扩展-
8~9寄存器为16位寄存器
8 寄存器8
9 寄存器9

指令集设计:
HEX 名称 介绍(参数) 长度 [版本]
0 ADD Index+=寄存器(寄存器)II
1 GETR Index=寄存器(寄存器)II
2 SETR 寄存器=Index(寄存器)II
3 AND 按位与 Index = Index & 寄存器(寄存器)II
4 OR 按位或 Index = Index | 寄存器(寄存器)II
5 NOT 按位取反 Index = ~Index(无参数) I
6 RMV 右移 Index = Index>>右移数 (右移数) III
7 LMV 左移 Index = Index<<左移数 (左移数) III
8 GETM Index=内存[内存地址] (内存地址) IV
9 SETM 内存[内存地址]=Index (内存地址) IV
A JNZ 非0跳转(与JZ相反) if(Index != 0)jump(内存地址); (内存地址) IV
B JMP 无条件跳转 jump(内存地址); (内存地址) IV
C JZ 0跳转(与JNZ相反) if(Index == 0)jump(内存地址); (内存地址) IV
D NOP 耗费时间 (无参数) I
E GETF 获取Flash的数据 Index = Flash[Flash地址] (Flash地址) V
F SETI Index=8位数 (8位数) III
-扩展-
10 SUB 减法运算 Index-=寄存器 (寄存器)[II]
11 XOR 按位异或 Index = Index ^ 寄存器 (寄存器) [II]
12 GETFM 循环获取Flash的数据到内存 初始化:i=0 循环:内存[内存地址+i]=Flash[Flash地址+i];i++ [II]

好吧,发现SUB命令可以用ADD、NOT等命令代替。
SUB REG1,REG2 = NOT REG2;SETR REG0;SETI 1;ADD REG1;ADD REG0
(需要占用REG0)

备注:
Flash地址 24位
内存地址 14位(更正:14位地址寻址的单位是bit,而GETM,SETM的单位是byte,所以应该减去3位,为11位)
【更正】15位,此内存(新)的地址本来就是按照byte计算的。

指令不等长:
I 4 bits(0~F)操作码
II 4 bits操作码+4 bits (0~F)寄存器号
III 4 bits操作码+4位空+8 bits数字
IV 4 bits操作码+4位寄存器(内存的16位=Index的8位+寄存器的8位)
V 4 bits操作码+24位Flash地址
VI 4 bits操作码+1位空+15位内存地址+24位Flash地址

操作码分析完成(4-16译码器)。

震荡可使用NE555或有源晶振(参考:http://www.amobbs.com/thread-4650497-1-1.html)
NE555

http://www.838dz.com/calculator/1803.html

在703N的Openwrt上运行原厂busybox

我把原厂的busybox提取了出来,在Openwrt下试着运行。
root@arduino:/tmp# chmod +x busybox
root@arduino:/tmp# ./busybox
./busybox: can’t load library ‘libmsglog.so’
root@arduino:/tmp# ./busybox
BusyBox v1.01 (2012.08.01-03:58+0000) multi-call binary

Usage: busybox [function] [arguments]…
or: [function] [arguments]…

BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as!

Currently defined functions:
[, arping, brctl, busybox, cat, chmod, date, df, echo, false,
getty, ifconfig, init, insmod, kill, klogd, linuxrc, logger, login,
logread, ls, lsmod, mount, msh, ping, ps, reboot, rm, rmmod, route,
sh, syslogd, test, tftp, true, udhcpc, udhcpd, umount, vconfig

root@arduino:/tmp# ./busybox ls
TZ hosts overlay state
busybox lib resolv.conf sysinfo
dhcp.leases lock resolv.conf.auto
etc log run

而真正的busybox(Openwrt自带的):
root@arduino:/tmp# busybox
BusyBox v1.19.4 (2013-07-16 19:54:34 CST) multi-call binary.
Copyright (C) 1998-2011 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]…
or: busybox –list[-full]
or: function [arguments]…

BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.

Currently defined functions:
[, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp,
chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd,
df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep, find,
free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid, hwclock,
id, ifconfig, init, insmod, kill, killall, klogd, less, ln, lock,
logger, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp,
mount, mv, nc, netmsg, netstat, nice, nslookup, ntpd, passwd, pgrep,
pidof, ping, ping6, pivot_root, poweroff, printf, ps, pwd, reboot,
reset, rm, rmdir, rmmod, route, sed, seq, sh, sleep, sort,
start-stop-daemon, strings, switch_root, sync, sysctl, syslogd, tail,
tar, tee, telnet, telnetd, test, time, top, touch, tr, traceroute,
true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc,
wget, which, xargs, yes, zcat

root@arduino:/tmp#

自制路由4 Flash切换板

pcb线路:
brd
用一个CD4017来接通光耦隔离来更改flash的CS。
为什么用光耦隔离?不是高压,是便宜,而且能耗小。比如说我用继电器,我还要一个三极管来放大,这个光耦隔离就不用,加电阻接上即可。
以下是电路pdf和eagle文件:
router_chip
顺便附上Bom文档:
Part Value Device Package Description MF MPN OC_FARNELL OC_NEWARK TP_SIGNAL_NAME
C1 10uf C-EUC0805 C0805 CAPACITOR, European symbol
F1 8-Pin-Flash SPI_FLASH-X25XXSMD SO08 8pin SPI Flash series x25xx. Works with devices like W25X32 and BR25L32
F2 8-Pin-Flash SPI_FLASH-X25XXSMD SO08 8pin SPI Flash series x25xx. Works with devices like W25X32 and BR25L32
F3 8-Pin-Flash SPI_FLASH-X25XXSMD SO08 8pin SPI Flash series x25xx. Works with devices like W25X32 and BR25L32
F4 8-Pin-Flash SPI_FLASH-X25XXSMD SO08 8pin SPI Flash series x25xx. Works with devices like W25X32 and BR25L32
GND TPTP20SQ TPTP20SQ TP20SQ Test pad
H1 M04X2 M04X2 2X4
IC1 CD4017 4017N DIL16 COUNTER/DIVIDER
J1 0 R-EU_M0805 M0805 RESISTOR, European symbol
J3 0 R-EU_M0805 M0805 RESISTOR, European symbol
LED1 LEDCHIP-LED0805 CHIP-LED0805 LED
LED2 LEDCHIP-LED0805 CHIP-LED0805 LED
LED3 LEDCHIP-LED0805 CHIP-LED0805 LED
LED4 LEDCHIP-LED0805 CHIP-LED0805 LED
NEXT TPTP20SQ TPTP20SQ TP20SQ Test pad
OK1 PC817 PC817 DIL04 SHARP OPTO COUPLER PC817X4J000F 9707727 97K7059
OK2 PC817 PC817 DIL04 SHARP OPTO COUPLER PC817X4J000F 9707727 97K7059
OK3 PC817 PC817 DIL04 SHARP OPTO COUPLER PC817X4J000F 9707727 97K7059
OK4 PC817 PC817 DIL04 SHARP OPTO COUPLER PC817X4J000F 9707727 97K7059
R1 100k R-EU_M0805 M0805 RESISTOR, European symbol
R2 10k R-EU_R0805 R0805 RESISTOR, European symbol
R3 10k R-EU_M0805 M0805 RESISTOR, European symbol
R4 10k R-EU_M0805 M0805 RESISTOR, European symbol
R5 10k R-EU_M0805 M0805 RESISTOR, European symbol
R6 10k R-EU_M0805 M0805 RESISTOR, European symbol
R7 100 R-EU_M0805 M0805 RESISTOR, European symbol
R8 100 R-EU_M0805 M0805 RESISTOR, European symbol
R9 100 R-EU_M0805 M0805 RESISTOR, European symbol
R10 100 R-EU_M0805 M0805 RESISTOR, European symbol
R11 1k R-EU_R0805 R0805 RESISTOR, European symbol
RESET TPTP10SQ TPTP10SQ TP10SQ Test pad
S1 TAC_SWITCHSMD TACTILE_SWITCH_SMD Momentary Switch
S2 TAC_SWITCHPTH TACTILE-PTH Momentary Switch
VCC TPTP20SQ TPTP20SQ TP20SQ Test pad

Arduino控制的LED台灯

IMG_0208 美丽的台灯!IMG_0215 在暗处发着光

IMG_0216多彩的颜色IMG_0218

明亮的光IMG_0221

照射出的光线IMG_0223

从远处看IMG_0225 IMG_0227

开灯后IMG_0229

内部结构IMG_0233这就是新台灯

IMG_0235

底部是个Arduino Pro Mini,用PWM输出

IMG_0236

 

中国瓷瓶

源代码是开放的:
int i=0,j=0;
boolean k=0;
unsigned int b[]={3,5,9,10};
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(b[0],OUTPUT);
pinMode(b[1],OUTPUT);
pinMode(b[2],OUTPUT);
pinMode(b[3],OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(b[j],i);
Serial.print("Give ");
Serial.print(b[j]);
Serial.print(" ");
Serial.println(i);
if(!k){
if(i<255){
i++;
}else{
i=0;
if(j < 3){
j++;
}else{
k=!k;
j=3;
i=255;
delay(200);
}
}
}else{
if(i>0){
i--;
}else{
i=255;
if(j > 0){
j--;
}else{
k=!k;
j=0;
i=0;
delay(200);
}
}
}
delay(10);
}