From c9aef4bb808674fc4615ad02ca4953ecf3edd0bf Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Wed, 14 Nov 2012 21:11:32 +1000 Subject: [PATCH] Tested to work. Finished. --- BOM.ods | Bin 0 -> 15305 bytes Makefile | 4 ++-- chickenFan.c | 44 ++++++++++++++++++++++++++++++-------------- chickenFan.hex | 33 ++++++++++++++++----------------- 4 files changed, 48 insertions(+), 33 deletions(-) create mode 100644 BOM.ods diff --git a/BOM.ods b/BOM.ods new file mode 100644 index 0000000000000000000000000000000000000000..e3d5fbdf3e7871fcef34af886a4bc1c5100b7a56 GIT binary patch literal 15305 zcmeHubyQVb*Y}|$m5`Q3q@=sMyIZ>99N^F`5=x8GNJxWpw{$5T(j_3>4f1XDdaw6+ z?|sJmjq&~YEe2a3gffCapu2zI63E`# z-rU*4!Q9xv!Oq&$*x4EaW^x6aF+z-?)=)->gE`m?V(MaV4t8dQIyjjdn?bG2&7GD1 zCUei;h9L0~2z2+456D!vaqPk&#|vBiFp_ zd9B^!L!%|m(?;cnEKY$H8HkhsTPGnNiG?8nQ-|GwO@erS&Yw}F&-8twcZE;))?o(s1 zEXOCn#Y%hq`Zc{)@fatAUiAmR+wW3QBq!}baGgEzOopRQ|6XQZpLVS4u_@+D?4f_)?a+n%~XqvbjB52W<^Nn5nj(Y4N+AuCmp*ub9Mc zef(`04)Fnzpf~sG;c^(0W`R1gsOXH((Pu8``oKFb$b4mGrR`*KmCd-#_v;G=-Aebv zUTVMdB}7t*jmZ*2QPH;XLaofq%qSur(H1IPhgy%LH5ITr=XG%!grw*uCbf-F&s&V*R=R zSxv8u6sE@gwu(W)FvE_+F*L!A+&gQ})IgM65C)g=Ga5GQ z@8CarH1k1+jS7Tt!>*9bS*1-ZYM`UHwzwPz8ftWSD7-aQWgA~WT!odE=c6xl9*Z8| z)gFQ#&uEae9z(4}Qi)$RUOyM~Z72h7qUHLqUz<@a2Mz1I88x0k4;Lko&2pgBxP2eT z%};+*R8+JyoPOd{A{#9iU2+_pA`JE6^7}>#7SL6yrQ|VcrgR-_(Fn$B8d5_ z-S+1BJ0C$BRT^A(U=dLAN?stM7i*W9sH=}5l6nhUo0yo?yX{3H%swN}xV|`|6oCK8 zw`$Pf+Sx1^%4*(+Jv$*6OXsrvg(a&)VWVpD+16AAHRqB^&T5YE^9v^{D;nJLuMa>= zOX+I4idAV$?+_Nos_peYh&i_}WbJ%mK?Og@3q<}) zYl}|_&pijGo$fK!!29D?xa~dD1(qt4ZrAvOxtO*f)WX=!<+B04z5S=>E;k(Lky336 zvu-Mc95&8tp9r2VPL}h#`5oIb46@a)jy0sO6a+2!UKL5drZ^ubCtpD9!-!p)fwUAg zA0DkzUqvETHM$=xd-3Phn4Al0@}Zv^3>9U^<`Gm03*A24(D+c%pP=zs^m?`{;UXrGika0|Ice<*91U!$mON~T!XX_R`w~8<+C2O^@ z`bWz&OAla{J=eH5=U>8R+fZn)Ne8gI2nu7Bp6)q05Nt^lz#&(HBOWd*?}fuMfI& z(|mR9HC}C4*6TIaWrI-`#n6GZFCONo1@gN&!Am{V`0TnhVc!;rZ1q7F1Q`ESRFsmO zTzgxy&z1TmxmfW2+{L7Me;hg2WgoPC_w+;MoHap#-Tuw>aB7FrSG-QU!f@Zxg4h?F)$!F1+{{x#07^I5z_@=~{;x zh!sxE7uTZV5|k?7HKODNVBX7@NRmR221qtp_riu z_-xKCP2kR8^08t}SH1Jg#c?*5GBPr0-iNPTpUuXPr7%fx-S5W$C2@?EUTOc>lKBJ-=JAhVHU& zmgS_KGmbmK>8{OS6r-mJ{z-{QAJ9?U3zJj%TBdv+!}(eEe$%|yd%=A8S*iu< zv`CBD@z2WFOJc|o&D--egK&XWDU_;8JXb$TGG1DP=<=x1X%*!G3`}&dl~8ES%JhAa z0*s(!SpN^hTF=T%f>uwH`NnTG&4r_==;%;tHtL}3%k1A=?bQHm{jZH*(Vo%=#{td$)79zvaAsrPw^9rX;{&JMq*` z0x@_2W~|UgHtwRJ`cablk*?QA&mQ!ckE?LR47!OIraEqf0qSAW&m?f8!+s8TQ@(>K3L1i zf53G%w~uYi^okdrO6?tPY+a2~f4{k+##?h+bh-loE{XfomddczO~1z3tkai>RD?x5 z;>`+x(kaKkB~kkSsa}~x-Lszhsf@E{O#@Aw-u-|=;`)Gw-&^%Tk!}@m{I@~ta5cLs z?yKtK`dd7z3z~~MTC%@D+=X!gfCD&(WkH3SMdj3MOJ3OAlE%&${)YufV3*bY_$aAs zM|ZN+@=uketPC?o;;Ar1*Lduikmief5rdto)+EZnS?|cg2w+g1)9UuC-mlBgP5Hwk z5yN!cbPdSK$&a1hNiFGA3-kBmYUY?f3V#VAy5{CbV+YT=fAoi8j4SXu+nt3IeJCE1 z1zBirJ_Fe2+rCx4arvUxe`k{ZugdH@p{1@5jb{Hg&pv2rLGaMe@=zPYhnvc99 znbW>!j?Zyf{BsgV6fvL0T;$R6JZax6Vrqq?K-JEUj>TR*)cgH(9Z3Bjk)SMg_gikh z-&~EqG!5j$rJ#%cln?k2luanx1qKb(E5a`~)8u3Ef;n?X_OGkRn0BF5Po7X%ddKK= z8L(|B%7J^L$=T(pG{{EYG$4{|6zPteEV+NZF&=I7INB%kUHtg``1m*!hkn`2!%7>M zLh=iP_akF)P*E&{p6hB~?D_TS48%H{6ZgG~<(Emoms7Xu$&3=*~#Z7ro+ zg5WXiIU6>_czdy)1{}JkIuRlkArG>^33SJabPk^qSibJ!&?u+N#?s-Uc2n-5BMA3h zo^0XKYoggM18rsHPP1k?Kb#q0OZ@8KoTz6ZPe51NFZs8_dK}2aSA%$V^AJ2}9nwV7 z%r?jJYpsoR9tlRL!woaXHo|IHB|Dv^^PcR+hOFcl1)&0_c>n&rVk&>W$uSvE*i^u6 z25S>JY|l?qDv&CKNZM+A=@!i@WjfZTDea#Te(62L((TRy5qb9Q;!~=?Bh)Wr*>ZS{ zAQa)1A?8>Po3V71ub9uu%E~q$2uG0uwxiq1BC)6*W`)G1-$XWO&k#ZY)o{zLXlnd5-wv z`fCa-H664uI8*xTEyqN4IWO)g9}dtRN>e)@PQ zLkw`wbnBfr9xCx491RMsJP;OpdWes=b1QjK=yQc+!|s~Id4YrLfI0$e!c8Y;&m_2* zQvK>FEJr-bi15eakjWl4e>h!X`R+*KVJnA3=R$tj2m!Ct6d^xf0Etj==mHNHRYUKI zTf2vcRrB3-S|lQhv)fH77}#o~uqN&uXmuFgzog1OL|WpY03p_*4>hvGf5 ztBNL!jm2fjBz}v|Z8-8>AwMdeOP9xM76h!bO{lC`qX0U|OyL+^|Tl%>y2z?xKf&YedS>a4O)5JCj!s9R-oGOlG9OQX`ZTg5{% zmKK@7566vRC7B?4Lmi;2`9^jhgeMA(=brz>3Wj(1c7( zBc08?Qe*?bh5)u$C?dmx=DS-4yfXw0vXb|3Lr9}G_ikJ`0%ri%)dThlTmJMMzb`ad zO?G4`fs-tS>r9rzD%3gSQx!fj>2vPLL}=lF@5B@^=@_gsocEVpYwj~@Qy8$mLK0>s z#Pl~}HwoOJY`6bXngK)&-|(O6*D4Ea)@evDh*f#aBqhRpbtimU*!${&&|bM7m`CSt zL*xPi0z5nfE&)&>dt(mnG{UK|f)`~3j0pT1Kg=yRFgnVX$$Y`oCy1IX8} zceaio){a`;+%|JzEK3DGo^i)Y+UcJG}4F|%5 zNO*{r9(5CJNG!CI!UF}orZv~$@1(noj(nf$D_TSZFm~xPHu#d1n}_dZi)r0KQ4g-| z)2ODPWZ|Q=&yIWnPlgrBz2{+I2{8QyPiNlJssT=^R)KoHX?Nt(^d5Lh{YrDCoz`vR zYOiG-2)Hw>wza_)85@I19R112*~)_;?+8vB;!7dGRTNoWBmfz%52i)&DFIoA_O>>n z8<9G=S%l)r*PPA-yC;?dDP{aCZlkhVD81;iyI848wZs;rG>XYIG6G9^=28_h3`c^g zKFYkakLu=v*NynK-02INiuG?_`7AbrU~#`Q-FyCGiH*>l=jUb)7_OxS)mV_KMmLSO z`1$eU;nJ#R>D7Sun$G5dfF8(S3<5DNwc^Qy5?fm({FEE+ysR{G?TvGk*+QXb(dn3- zv`ymRt4bgR1EAgFLnS`1)9r&~m&F{Aeu__z$?3%5YQIV_;F)sRPh)>Zjj#jaBOu{G z4FhbgII^pOwz9yLu85W3!U@@0Ce3m)8Nn$`(sc*G&6>u4bvj4R^Sw$rL)6=iQ28|} zF+(jdiB=1MqgIm^)M+86YG|$a_$?bSt7Ca8=UGMHTUQyQ^(xSHKF#xb9GY#6WRH%H zj%#dw8_vYU!~`O&ELvlB%1^0e$pdYA$UM`rF;^xT85!Q?l!5~ptL&2Rs~b*FfOBBI zVbnjgk-3(l!*fw$xk{>noYqP)>)w6B>*Gk2FkHGn zT43!r)buJew5`b(@Mupv&JUWe59LxnqFc7gY1e=a>>WfOoOM?AMpimLV4L-+N4zZ9 zQG}z@t-iMdCrCh#dmb+12ZXeMFHI)RFu2{N08`6xg^^L<9*n3vRcb5-zTAHsM~$x~ z7hPnzq%8`Fi(Cskz{IR_d_W8Rp1)Jh?_xrklT! z88D$>yjGve34$>f3RsMANq92+2uDog&6n<}l(w`C44*?Vagm^bj+FBB3{($L)SiM^ z7%Ak5U+c+T9IhT22O_i)8AoROtR-4j+fBXiVo+C%<5ELI|BMk{)7wI%z~YrYHJ4=4 z8t_BrtgdMCzI|Ywpj3jXH3KI&!>PP6@orjcGdz;7`<+-j*`+?!d#OFuW zUO&j$-~S|+UHgpP?{LV}Kx=_+*P;i|Ax$_fPy%A%4u5s!vjbCk8IYyg_Bv!Dy;4or zd7@C3-tGf)e(Mo7OQpNgj)WS>)5cCIe`N?~Kfu&R@>H^y)jIT|=W{YGt}}3glIJ0x zo=N=SlVgUzd1+4HB@t+D6{u6Q;4UsH31sy~oSe4YVTGguRfOd&O7(Pi6?<^}@$oR@ zGB9&uvVSBA-|oF%6+^xz!nE*^l$-(pQi{|kD~1*l_T;tzNG<_E&Hl%Ft6_@1kcm9x zPOA@{0M1`PMT+JHRIfyi;$fO${~JW4~(x%;1UeNX@g| zxjN8OPNMfHLrWEptL$guCh~@xt)7%@)7U#0n}{bsD8sS#{d`t1jdfua$fwlR>Bt|4 z4DQU-*jfX+r*i;286`{-|0Ecdkl158)Igb+nFi1I)7WhW(MR6wD->3y+9hnO7ILnmO7EJ?6y)O>4v$FEOA;hAk z0r7m7Sj8#2gW!Ig-@wsucoYw6WX29*w zye(K(Gglw~q2Xk69Cgy5DyG=a%2=a7oyY6+Y4MGf1`xh=1BpN@*LXTk&T3%xH?sv1 zGOfzAbj1^3P0}$4D4st303?TwV?UGuzVy(x>3LQ{2?3i0O+%4cZ_K;}Za+Z}+ec!! z=rZEj>Du2;51AgzOo6e|N)k&xH~ zewt7CTA(^jgF@Joevg-+54&>>qadHkn4Hh5ZvMcrI{?HdhMDi*1J3m_B22m#?p+uH z>uPOoVN&8CCd}01Mp)kE(2zdWO@g> zesk$uA2>CN^%LVNV%-F+=xI;;W>WNZ%{@_ZS0?b?I%wA91TbkEBCc#tMJQhopCOQ$ zVNI4`^I+Y1Jiku4mmv5|Oc*3d%3pBw%O(2%1V3HF|8Ix?2X;uhg{w2ec>xu2tiF5l zCL^IJUMy-9@bhsV60pne9ueN%`PI;XFHm!5XKSz}l+oSZZbxSUy3C2;yJy&X{%)T# zKI;G;j5Nt!xnXecO=T08F;n`h4=2*B56&jFsvU#5PnW(-D3I1YlQd+z5-NuLL)+wkE$EEdj=)TWl0lf%qlZ0y}cf4yo zf4OL@{o@$f zs$hA`&1r9D9eWxldc4e0D7{1~W#cChnS&1h^WFEmAk>32? z1!OZ{0rS|w-PLs-|2ytCPc^H{sr}{mbl#KHBJob>sjdBm0eR=qSOmn+Otdaq3>|{3pwJj6lHO0ZEv?xsZPl{DbS*qIj6#*`n(;X7DXRjMuoXb zb-ir)lH);{c59UdtI`>)37s-7n7++Srcp!X2nYVjY5!R_6z6&{PhMoQA+S5zbc~i2 zo5w2n0EZB5P>DmVNJiQ4T_H@#ELOe(x{qM@H{6%Gd=DvQW5nOHMZg>bgE`sybbwCi2@GH z@mxfd_v2deeG@c6bmP#2OEUUu8BfrhMgco2@%kZrnzZb>PmcjkOaN!geF-(6SFZ|3 zSFvw|{ljlHQQ=#>8Qor($OxdHhpnxt)$_GYl6&wKesRhIGjgye_6mNt?TV!SpF=uedcPpGeyzCRqj;-^y@wpWGy7Gq1r~wgq z`Ju{JODX$;Oh$W7PsqI6Y2Q42)GeH{93s+8;~vf>90(*w0s{RzW}pI?VG02|-@P+% z2O0YI&}3fR@69a%ClVIyA{Tw3((?yCVScTJ8{VmC>su2=V z(idH$K@N_bLFknmW{i4CsNm$1r-5M=0%&mx)KDFZvE^d|8{UiO@P}wDg&{2I-|vNn ze2m)dYC_09kk*Lr&n{=j30yA_BzmC1k_6`pt>bQe9(|~fb1#}nQr%#9T%I!!o4vE! zJS_VC4vU;wHY1WmE%gce0JCorYMiPAURcozpYhLcFs<~ zu~XqW))n@0Ky8D@EW-0-J)$5DNmHl#zQ<KBikN2Z}S2S~DoQIMz>*#}T_O#brD+-R(YQbALz zM>rwqpT`_Sgy-$lR_^iWi^}Vozu1WA>oy~K_64S1Hy=YYVqOMUOl<&zV=tjhn{Ln_ z)f~MZhKEOSu&q%~c82JzmdiZhmGk}hk^3kjV{g7Zk9`&FyU)Gb1Y)5m;ru!>kgBfw zd3BX1Jb@g)XkT_gm*OBrm zfua8@VBv!)@I~i^!^Nvk@wdvF9&9vh7}19qd+{5vnP$z=T5hD6p+>Ye<5^y4<@is& z@7ZbZb*mpEkR?&uwR8z2pw!X4qFI}o>~71lV<0*V4|hT3H-q7S7J|d_^7-RKGF&S; z8a9{y*t5C!9}5%X!MrUDhnetHS$6NQo~TmUj?1iZzScp2fB%Vf!^k4VZu_j0R~d=k z9L{pm+@~!=(=>4yWo6?Cf{EdOZZ8TVwIN&0MD=^9E_hswqA940{y|b)8z=YxHcRoi zZdM6B zV$y40Dssk*(3Q!03mnwu+@Lv|MO=@lE&8Mcb0ZQRVQHnv(J{$u{cN86O=MDwDVb?4 z{kQ8{*&ctzcp)F7&k?e5u=qV&1561&u4(TPm3C zTviTWbXfW|}@C+^dVQ{J@SA!uvS6{yvXn$GRW`%bo=? zVPTAz5NxYlud*FI8kOUC?MyvRE{T$V@<#$RvpM{P!;_1ncy{`D=ZBv}i?0&UEr|Jh z`4?uj4Omd-p&iLZAi0K%{)ES%6_TWguC!RLt`fi75Bm5m)u35bqFhi47kc|xPFYTj z)Fom0{Czb&0aVVpvy~$eNI|8L3_m7e^~p1}2HQ{$ z{gNI%;=>+ne%6`A*Ewim{L7#B$d-Nf_-zbVWA{utw(P?LKqec`eRO+L?V1dFF56xEHbL^MLrfk2v|Jf$@+-?%%9nJ zRSjQpF}@7^EpAs^OzrrIVVBRS(`*KrQakB`%-G`cN}%)RcjZ@7$p~eaqsWLtHg(Qnl{l_mrQ!XsTY;;CoFJdB03M zzKQU|QwS{OhzJsY+P8s6VprYj(d%n=(>i38*bSxk8^_71>_m_o-UXJwyt1-f+_~3A z8viiQcpfZJYnjSs~vUX zMsMqyIVn73J9MwfxpO<7(d^TAH{p_92$@UK$HlqwaY?u6%l?W}>q6V!ps(d)jK>DO z2nTW-ohi*R&T;zQmq)EVYiMSs-@cU3lTUrZn)<}pyM|QGv(v$vi`|!UO1!nab`#6a zliWB{aDh&M=~C1&^+0+?L?Xvpg&-C+6X zG>BbpCM_~ujrVPZP@LZJBF*|BF{*F!J!4`o-Kz4Ou2+7Y;4P51MJsj^_Y7m2D)<4q^Fqa7L%{bpdt(!CWHpn#8!xvkSBqFw=ULfq ziXzlIROKrY!uC%yo@!L1zM(h7-2+SK)^HKpMy-BgxYBg>^a(R7^0d9py$H2;`Ruga z?5d4gQ=8G58Z(l+@R@MOhihiSEzLEEJoPGJjdYu(4ofK*{TkhV|8`mtB~3G4Flm5y zbg-aeVl6F-=YsUke=C5vO@$zXKz@?{&40UlKNITgVQ2m$;+xa4hs5 z&7|Vn!EGpeVJ|TZW2F|&*cg(>Myv^gYtK6^#Fz4~*{fw}nJV-sp2)qx*)6gme+iEyuhqTEE~SvH z>Af@3J6t6vWfobjEg#7S2M+1;;1^IISjn*u9(OhKVG5`jvi5Dfxxv?>Nal^}s?G|9 zXLzDiAB0G!aB&TW3}b2| zy2dJlT43`+f=s$K$VohABbhj_!Xdw2gW!>p#++?N{>v2+njs!^GJA6Cp~#pU9a|>8 zqFYvGGQ1Jh)WQsw`33lT^o<=X&Opy@a0(WxpJ`NJV7p`V;>+{|ad|Lfp}OnmXD1&d zbg%YkrB@B!G`Y32rCgDGO%AenOFZ%Yp}xaK`HMnApORJG6%|=03L5dCyc=Rn1P#ou zpC6#wJRwfWIc59!1w=k0C|EhGMoY?i%%mTA<$9cMVX{6}nu*f*{ZpM7}ES5>! z0Z9b1EVQ9Mb)a)7lL+!B7N~BPLcEYk_RY zl9EfMm=WAW_!%JVqCHn6fRTR}r1F+iqQ!SegqO5U*gsoc6GrIS+=a@0gQ;mE=&^wKcNI2h&L zFd9_vJl7KJrPkWtrmul^5KOjHrxe>k8fN-1HC#-=EABD5_ePmb8exM7*zD+>RI?O| ztUU4e{cbs31|?0QO)lc$ ztBo^BQHfsYgO4bbMvrGLHo^UQ0-X4?cPy{HvBK+_h!3XWry;&#rM}REv!~%~ zgxttgfu+pWk&l^z1d$(lTE1&He{RI^#LVEqAyq=Jq|N=*QnHKTjp?Y57>t6M>jhz0 zmpW-}Lb!dTVJRUD7DeB#3m;eYvq-467KZT!6se3F2K&T_$1mo7-_a~p`99^P%#4X;|$%`w%s9cc+JWLP4KE2%K@q@14!!x-=# zad~6iMG-_Ii8VJ5#^$J>^X!iushJtVF>K||OzK;y2o!bnH%V3;(tCkyTXRlY^lrCq zm0|+Yk6W?c4{K5A2HktgZg@|5vDTCH(LmcpP*vM7wU7IH*<9=3du2a97eXYO`>G>h zZ|3D&ZiFu-PwIsVUJN%C?Dmv8Gkz^YVT+g^&F9TeM1<4Rm+*sH&->z?K_rK9ls)RzvPw&v2X7n64dO*r*#rPjb~D2d}v{O6o-gxQt`nJPu0F zUGW*2AA?*f(lmUdwH>@sCpAhM!VBFIC~^p;n+Q}N9P|{el(gYU#NG^lV2({tl$Wju zB{M_u?)l)*EPRB)@a#O98SN7_nk_D2?L})v;Bz1R;!oYLNl?-_Tl^Su8q<;4wTeGG zO~Gs0-zsk-v`>+s-TK)d;oY4W7>(=rmk1zG8t`iW-(UJCcWee;90Gyv{(lq_m^&Na zh5P(Mzz3PDxf2v9B@m!sVPvKtGY6YO%zzZ40ELFSBm*~vkRS>_#KOYb)SUNMbpZoV zhG0wvu!5nyKW_<8xHy4%f7BuHf{pFXp}fwfyuTMD@cvHC`$N&sEADpIU|RtSD`#g1 zUM40tH#bH%Hb#h(B@+t|4-eCiyA*$@GBf>?&cVgW?gy2bDU-RK`CZ8al!=9rh3OaV zT@U}aow}p_y-N@X|{nc10s{{E%O(#g!s?oayP1_02qF?iXNCSX1p0L|uttjsK|3@pqHEIjJ0%)D&uysT`0aQ~g|C$FVB*xc!d zN_lG&Cv&AA^UlP^$njX-8tme3sLjo3$jMIj+f73UCy0%?sWTHB2eUoPV^J4tJ2M8> zKUDlBj^E6b_iz1Sfguw+s&W7H8%sy1h!-_a{>Acj95^a zOBswz{LH$#?A7_MTp6rjecEbreG4}|6>{P{+#w-zy4J9nPvE)I9S{lDb9GrtS;zYp=B^f^Nyb`Hj1bG!ed@1G2M$M@g05&hHX zoFJA?=Fs2z`A-jPsQ-b}*c4biKldM#sf&}-A4yp_0L>BaU>kH-dv(|TJ)esM+*OcJ z7h#Z5lw`6u23uR0Lw{s;i_}`d?PO?8XY>@i&x>-AId(Een$xd9k}258Xl*$*x4tsj zoQXN|g%imUX$xNX6;tnClqg2`O4xN2dSl|GM-;U;W0HoPT`Fu>7b-A+<0YG@NhiFF z-nFKbl_b8;GhziBZBb|nYnRCY6Mf>=*i1K9k@&poOL2ir36x|rL&)%nvsPotnHMs!Egtv_q!H5aG#`Gn@tFyUTZ(A#!;f*p#%AC04_Fr{*sCuKCxB0e) zqUIoSOpvOQ8RN=W6^X*I!gW z>k$9?jn4kxpzZHd^cUBEN|E>nDStuTze~9TyT6*(KS=o>(D(1c?!f4;R{Iaaeuu*U zt(^UTkn=k<{%_^baQsh0{|=S^F6Ry`|7u46BIhS`{=1Yr@cgUA{eu+1xA+Z8e@gnb zL+&_#;o%*a{?&&5LDIiK>#tS$OX%-#fb*9`;2SmPzW}SU9KyXjN(|tS6CMQe;kx_v Fe*obfV6y-K literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile index 36c577b..999e6c6 100644 --- a/Makefile +++ b/Makefile @@ -23,8 +23,8 @@ chickenFan.elf: chickenFan.c avr-gcc -Wall -Os -std=c99 -mmcu=attiny25 $^ -o $@ # Use with arduinoisp example sketch. See http://hlt.media.mit.edu/?p=1706 -.PHONY: program -program: chickenFan.hex +.PHONY: burn +burn: chickenFan.hex avrdude -P /dev/ttyUSB0 -b 19200 -c avrisp -p t25 -v -e -U flash:w:chickenFan.hex .PHONY: clean diff --git a/chickenFan.c b/chickenFan.c index 2cb98ac..9a20904 100644 --- a/chickenFan.c +++ b/chickenFan.c @@ -32,6 +32,7 @@ // required for avr-libc delay functions. // // avr-libc: tested with 1.8.0 +// // 1 MHz internal oscillator. Assumes default fuse settings. #define F_CPU 1000000UL @@ -46,13 +47,13 @@ #define SETBIT(port, bitnum) port |= _BV(bitnum) #define CLRBIT(port, bitnum) port &= (uint8_t) ~_BV(bitnum) -#define READBIT(port, bitnum) (!!(port & _BV(bitnum))) +#define READBIT(port, bitnum) (port & (_BV(bitnum))) // One-Wire active-low protocol #define ONEWIRE_PIN PB0 -#define ONEWIRE_LOW() {SETBIT(DDRB, ONEWIRE_PIN); CLRBIT(PORTB, ONEWIRE_PIN); } -#define ONEWIRE_HI() CLRBIT(DDRB, ONEWIRE_PIN) +#define ONEWIRE_LOW() SETBIT(DDRB, ONEWIRE_PIN); +#define ONEWIRE_HI() CLRBIT(DDRB, ONEWIRE_PIN); #define ONEWIRE_READ() READBIT(PINB, ONEWIRE_PIN) static void oneWireInit() @@ -69,6 +70,9 @@ static void oneWireInit() // Ok, we're -supposed- to check that the slave device // also pulls the line low, but we just assume it will // and wait until it has finished. + + // Tests with a CRO show the DS18B20 holding the line low + // for 100us. (datasheet says 60-240us) } _delay_us(480); } @@ -78,21 +82,21 @@ static void oneWireWrite(uint8_t value) // LSB first, active low for (int i = 0; i < 8; ++i) { - ONEWIRE_LOW(); - if (value & _BV(i)) { - // Min 1uS delay taken care of by ifcondition. - // Don't tempt fate by waiting too long. - + ONEWIRE_LOW(); ONEWIRE_HI(); _delay_us(60); } else { + ONEWIRE_LOW(); _delay_us(60); ONEWIRE_HI(); + // Ensure the weak pullup has time to work + _delay_us(4); } + _NOP(); // 1uS recovery time. Probably not needed. } } @@ -106,14 +110,21 @@ static uint8_t oneWireReadBit() // we need to read it towards the END of that 15uS // period. - ONEWIRE_LOW(); // Up to 4 cycles ? - _NOP(); // Ensure we wait 1us + ONEWIRE_LOW(); //2 cycles ONEWIRE_HI(); // 2 cycles + + // We -start- going high 5 cycles after going low. + // 2.5V ~ 2ms later. 5V ~ 4ms later. + // Need to leave sufficient time for the weak 10k pullup + // to raise the bus or else we'll read 0 instead of 1, + // but still sample early enough before the time slot + // runs out. + _NOP(); + _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); - _NOP(); // Up to 12 cycles since the pin went low. uint8_t bit = ONEWIRE_READ(); // 2 cycles for I/O access? _delay_us(60); // Ensure we wait out the rest of the read slot. @@ -121,13 +132,18 @@ static uint8_t oneWireReadBit() return bit; } -static uint8_t oneWireRead() +uint8_t oneWireRead() { uint8_t result = 0; + uint8_t mask = 1; // LSB first, active low - for (int i = 0; i < 8; ++ i) + for (uint8_t i = 0; i < 8; ++i) { - result |= oneWireReadBit() << i; + if (oneWireReadBit()) + { + result |= mask; + } + mask <<= 1; } return result; } diff --git a/chickenFan.hex b/chickenFan.hex index 02c9f9d..b36c262 100644 --- a/chickenFan.hex +++ b/chickenFan.hex @@ -1,20 +1,19 @@ :100000000EC013C012C011C010C00FC00EC00DC072 :100010000CC00BC00AC009C008C007C006C011242C -:100020001FBECFEDCDBF3CD07DC0EACFB89AC098FF -:1000300080EA8A95F1F7B8980000B099FECF80EA7F -:100040008A95F1F7089520E030E090E0B89AC098E2 -:10005000AC01022E02C0559547950A94E2F740FF85 -:1000600005C0B89844E14A95F1F704C044E14A95C7 -:10007000F1F7B89800002F5F3F4F2830310531F776 -:100080000895B89AC0980000B898000000000000D9 -:100090000000000086B394E19A95F1F7817008950D -:1000A000BC9AC498C3DF8CECCEDF84E4CCDFE9DFFC -:1000B0008823E9F3BBDF8CECC6DF8EEBC4DFC0E046 -:1000C000D0E010E0DEDF0C2E01C0880F0A94EAF7C2 -:1000D000182B2196C830D105A9F7C0E0D0E000E088 -:1000E000D0DF0C2E01C0880F0A94EAF7082B219666 -:1000F000C830D105A9F7802F8295807F12951F7097 -:10010000812B893114F0C49A03C0883109F0C49856 -:100110008FE79AE126E0815090402040E1F700C04F -:080120000000C0CFF894FFCFEE +:100020001FBECFEDCDBF4CD073C0EACFB89A80EAE7 +:100030008A95F1F7B8980000B099FECF80EA8A95CA +:10004000F1F7089520E030E090E0AC01022E02C00C +:10005000559547950A94E2F7B89A40FF05C0B898BD +:1000600044E14A95F1F706C044E14A95F1F7B898A2 +:1000700000C000C000002F5F3F4F2830310529F736 +:100080000895B89AB8980000000000000000000031 +:10009000000086B394E19A95F1F7817008951F935B +:1000A000CF93DF93D8E011E0C0E0EBDF8111C12BEB +:1000B000110FD150D1F78C2FDF91CF911F9108955F +:1000C000BC9AC498B3DF8CECBDDF84E4BBDFD9DF1E +:1000D0008823E9F3ABDF8CECB5DF8EEBB3DFDFDF3A +:1000E000C82FDDDF8295807FC295CF708C2B893140 +:1000F00014F0C49A03C0883109F0C4982FE78AE14C +:1001000096E0215080409040E1F700C00000DACF37 +:04011000F894FFCF91 :00000001FF -- 2.38.5