Subversion Repositories svnkaklik

Compare Revisions

No changes between revisions

Ignore whitespace Rev 150 → Rev 151

/programy/Atmel_C/AVRcam/AVRcam.elf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programy/Atmel_C/AVRcam/AVRcam.hex
0,0 → 1,268
:1000000063C0EAC7EAC77AC079C078C077C076C053
:10001000E5C774C073C0A8C571C070C06FC06EC0A2
:100020006DC013C66BC02AC693C692C691C690C651
:100030008FC68EC68DC622C68BC68AC689C688C69E
:1000400087C686C685C62AC683C682C681C680C6BE
:100050007FC67EC67DC625C67BC67AC679C678C6EB
:1000600077C676C675C625C673C672C671C670C613
:100070006FC66EC66DC664C66BC66AC669C668C6FC
:1000800067C666C665C664C663C662C661C660C624
:100090005FC65EC65DC623C65BC65AC659C658C68D
:1000A00057C656C655C6FDC553C652C651C650C6DC
:1000B0004FC64EC64DC61FC64BC64AC649C648C6E1
:1000C00047C646C645C636C611241FBECFE5D4E096
:1000D000DEBFCDBF10E0A0E6B0E0EEE9F0E102C087
:1000E00005900D92A037B107D9F712E0A0E7B0E074
:1000F00001C01D92A43EB107E1F731C076C78F9AC7
:100100008F9A8A98979890EF87B3892387BB87B394
:10011000892B87BB84B3892384BB8EB5887F8EBD32
:1001200085B78C6085BF85B7836085BF8BB78064DA
:100130008BBF86E083BF85B78F7885BF85B7806822
:1001400085BF80E093E020E3FC0111922A95E9F756
:1001500040E350E061E070E07DD708950895CFE579
:10016000D4E0DEBFCDBFAAD6F1D42CD5C8DF7894B9
:10017000FAD594D27FD088EE93E065D603D080E0A4
:1001800090E08CC7CF93809172008823B9F080FFF4
:1001900009C0F894809172008E7F809372007894E9
:1001A000F8D0ACD28091720081FF08C0F8948091A1
:1001B00072008D7F809372007894B9D09091700016
:1001C000809171009817F9F232D0C82F99278031A9
:1001D000910511F1813191057CF48230910509F18D
:1001E000833091051CF40197D1F0CDCF8430910577
:1001F000C1F00897B1F0C7CF8038910591F08138F0
:1002000091051CF4809769F0BECF8138910549F0C3
:100210008039910549F0B7CF8C2F33D005C08C2F92
:1002200058D28C2F2ED0AFCF8C2F53D2ACCFF89486
:10023000209171008CE692E0FC01E20FF11D9081AB
:10024000822F8F5F8770809371007894892F992710
:100250000895382FF894209170008CE692E0FC010C
:10026000E20FF11D3083822F8F5F877080937000C3
:100270007894089580E4E8E7F0E011928A95E9F730
:10028000089599278430910551F18530910534F412
:100290008130910531F1029771F008958038910510
:1002A000C1F0813891051CF48097B9F00895813828
:1002B0009105F1F0089561E081E166D56AD588EE97
:1002C00093E0C1D51092730082E0809374002FD028
:1002D000089581E08093740002C018D108950CD075
:1002E000089580917400882329F084E0B2DF089596
:1002F0001092740008950895809174008130A9F4DB
:1003000010927700809175008093760010927500AE
:1003100080E4E8E7F0E011928A95E9F7829BFECF4E
:1003200060E073E08CEB91E0F0D508950895809142
:100330007400823011F580917300880F90EBECEB24
:10034000F1E011929A95E9F790EBECE0F1E011926F
:100350009A95E9F7829BFECF8299FECF882339F0E8
:10036000849BFECF81508499FECF8823C9F76CE02F
:1003700071E08CEB91E010D608958091740081308B
:1003800039F48499FECF60E073E08CEB91E0BDD549
:100390000895DF92EF92FF920F931F93CF93DF9315
:1003A000CDB7DEB721970FB6F894DEBF0FBECDBF35
:1003B000009160001091610080917400823009F01A
:1003C00054C08BE0CDD380917300CAD3DD242D2D92
:1003D00033270F2EFCEBEF2EF1E0FF2EF02DE20E77
:1003E000F31EF7018081898389818F7089838981D8
:1003F0008295807F89838901045F1E4FF801808187
:10040000982F9F708981892B89838981A9D3F801CD
:100410008181898389818F70898389818295807F99
:100420008983F7018181982F9F708981892B898326
:10043000898196D3F2E0DF0E4FEA4D1540F68FE04A
:100440008FD3809173008F5F80937300883408F49A
:100450004AC0109273001092740089B78B7F89BFD5
:1004600060E081E191D495D443C0809174008130E3
:1004700009F03EC0A1D080917700992787709070D5
:10048000079711F5DD24F80187818130B9F4868161
:10049000282F33278481A901481B51094330510576
:1004A0006CF4809177009927821B930B039734F0AB
:1004B000178280917500815080937500085F1F4FEF
:1004C000D39457E05D15F8F6809177008F5F8093A5
:1004D0007700803941F480E2BCDE89B78B7F89BF29
:1004E0001092770005C08091720082608093720044
:1004F00021960FB6F894DEBF0FBECDBFDF91CF912E
:100500001F910F91FF90EF90DF900895DF92EF928F
:10051000FF920F931F93CF93DF93809175008823F1
:1005200009F440C08AE001D3C0916000D09161001D
:1005300080917500FAD2DD248F81813061F580E0F1
:1005400098819038D9F0903411F481E017C090323E
:1005500011F482E013C0903111F483E00FC09830A1
:1005600011F484E00BC0943011F485E007C09230A0
:1005700011F486E003C0913009F487E01B810C81FF
:10058000FD80EE80D2D2812FD0D2802FCED28F2D7F
:10059000CCD28E2DCAD22896D39487E08D1560F6E2
:1005A0008FEFC3D284E055DEDF91CF911F910F9181
:1005B000FF90EF90DF9008951F93CF93ACEBB1E0E5
:1005C00060E0C62F71E010E05D91C70F7D91670F6D
:1005D000552309F45DC0743008F45AC0E0916000FE
:1005E000F0916100412F8081581751F5878181304A
:1005F00039F58681282F3327809177009927019735
:1006000028173907E9F481819281C81710F09C17E7
:1006100040F4681710F0961720F48C1788F06917CB
:1006200078F0C18362838381C81708F4C38385810E
:10063000861708F4658380917700868311E004C0F3
:1006400038964F5F483078F2112311F5809175008C
:100650008830F0F4E0916000F0916100412F8781D3
:10066000882321F038964F5F4830C8F35083C18308
:100670006283C38380917700848365838091770050
:10068000868381E08783809175008F5F80937500FA
:10069000603B08F498CFCF911F9108951092BF004E
:1006A0001092C0001092C1001092C20080E4E3ECEE
:1006B000F0E011928A95E9F780E4E4E9F2E0119222
:1006C0008A95E9F780E2E4E7F2E011928A95E9F78A
:1006D000089599278031910551F0813191051CF4DD
:1006E000019739F008958039910529F0089506D0D1
:1006F00008950ED00895E6D1089508959091BA0016
:100700008091BB00981711F0FED12AD20895089568
:10071000CF939091B8008091B900981709F46FC0F9
:10072000C9E0DFD1382F8D3029F58091BE008823B4
:1007300011F42CD106C002D18091BE008F5F80934E
:10074000BE0084E690E07FD38091620088508230C2
:1007500020F484D180E97DDD04C077D180E979DDA2
:1007600051D01092BE0080E4E3ECF0E011928A9543
:10077000E9F73EC08032D9F48091BE00882311F49D
:1007800005D10FC08091BE00992701968034910554
:100790003CF01092BC001092BD001092BE0026C02A
:1007A000CDD08091BE008F5F8093BE0021C0815468
:1007B0008A3118F08F5E8A30C8F42091BD00822FF4
:1007C0009927FC01E154FF4F30838091BC00982FA2
:1007D0009F5F9093BC00822F8F5F8093BD00943009
:1007E00038F0C09362001092BD0002C0C093620056
:1007F0009091B8008091B900981709F092CFE894D1
:10080000CF910895DF92EF92FF920F931F93CF93B2
:10081000DF93EE2480916200813009F487C0882341
:1008200069F4C3E6D0E080916300882309F47EC0B8
:1008300089917BD188818823D9F778C08091620023
:10084000873011F48BDC72C080916200833029F410
:1008500084E690E0F8D282E028C080916200823085
:10086000B1F4FF24F3948091BE00F81670F48F2D3C
:100870009927FC01ED53FF4F6181808185D282E091
:10088000F80E8091BE00F81690F383D24FC080918D
:100890006200843029F484E690E0D5D280E805C077
:1008A00080916200853019F481E8D3DC3FC08091EB
:1008B00062008630D9F5FF248091BE00F816B0F5AD
:1008C0008F2D99278C0100501D4FFC01ED53FF4FD8
:1008D0002181F80120830196B5D3982FF8018081FA
:1008E0009817F9F0DD24F2E0FE15D0F08F2D99274E
:1008F0008C0100501D4FEC012196F8016081CE0162
:10090000BAD3E394CE019ED3982FF8018081981733
:1009100011F4DD24D394DD2019F4F2E0FE1568F71C
:10092000EE24F3948091BE00F81650F2DF91CF913F
:100930001F910F91FF90EF90DF9008958FEB90E063
:1009400055D3AC018F3F910571F068F089E0809339
:1009500062002091BE0083EC90E0FC01E20FF11DEB
:100960008FEF808308C08091BE0023EC30E0F90156
:10097000E80FF11D408383E0EFEBF0E011928A95E0
:10098000E9F71092BD001092BC0008958091BF005D
:10099000803531F48091C000873411F481E048C083
:1009A0008091BF00873439F48091C000863519F4F6
:1009B000109262003FC08091BF00843431F4809176
:1009C000C000863411F483E033C08091BF008334CB
:1009D00031F48091C000823511F482E029C0809109
:1009E000BF00853431F48091C000843511F484E077
:1009F0001FC08091BF00833531F48091C0008D34D9
:100A000011F486E015C08091BF00843431F48091E8
:100A1000C000843511F485E00BC08091BF008235A1
:100A200031F48091C000833511F487E001C089E082
:100A30008093620083E0EFEBF0E011928A95E9F792
:100A40001092BD001092BC00089581E46ED083E442
:100A50006CD08BE46AD08DE068D008958EE465D0C8
:100A600083E463D08BE461D08DE05FD00895DC0136
:100A70006623A9F0F89461506F3F81F024E932E0D9
:100A80009091BA00F901E90FF11D8D918083892FB2
:100A90008F5F8F738093BA00615090F778940895B8
:100AA0000F931F93CF938C01C62FC150CF3F31F0CE
:100AB000F80181918F0154D0C150D0F7CF911F918F
:100AC0000F9108959091BA008091BB00981741F062
:100AD0001AD046D09091BA008091BB009817C1F708
:100AE0000895F8942091B90084E792E0FC01E20FA8
:100AF000F11D9081822F8F5F8F718093B900789460
:100B0000892F99270895F8942091BB0084E992E0F9
:100B1000FC01E20FF11D9081822F8F5F8F73809314
:100B2000BB007894892F99270895382FF894209145
:100B3000BA0084E992E0FC01E20FF11D3083822FBC
:100B40008F5F8F738093BA007894089510BC82E110
:100B500089B988E98AB986E880BD82E08BB90895B1
:100B60005D9BFECF8CB908951F920F920FB60F9226
:100B700011242F938F939F93EF93FF932091B800AD
:100B800084E792E0FC01E20FF11D8CB180832F5FBE
:100B90002F712093B800209170008CE692E0FC0148
:100BA000E20FF11D81E08083280F277020937000F1
:100BB000FF91EF919F918F912F910F900FBE0F900A
:100BC0001F90189511B888E480B90895982F8091E6
:100BD00008018823E4F306B604FCFDCF90930301DB
:100BE0007093050160930401409307011092060180
:100BF0001092090185EA86BF809108018068809380
:100C000008010895982F809108018823E4F39093B8
:100C1000030170930501609304014093070181E093
:100C2000809306011092090185EA86BF8091080130
:100C3000806880930801089590E0809108018823DE
:100C40000CF491E0892F992708951F920F920FB607
:100C50000F9211248F939F93AF93BF93EF93FF93C2
:100C600081B1887F9927AA27BB27FC013897E135F6
:100C7000F10508F06DC0ED5EFF4F09948091090108
:100C8000833008F05DC080910301982F990F809107
:100C90000601890F83B986B78F7D4AC0109209017A
:100CA00011C0809109018F5F8093090186B7806B25
:100CB0003FC0809107018150809307018091070117
:100CC0008823F1F1E0910401F0910501808183B95D
:100CD000CF010196909305018093040109C0809192
:100CE0000701815080930701809107018823D9F47F
:100CF00086B780681DC0E0910401F091050183B1C1
:100D000080838091040190910501019690930501E3
:100D100080930401809107018150809307018091A5
:100D20000701882319F086B7806C02C086B78F7BD5
:100D300086BF0EC0E0910401F091050183B180836C
:100D400086B7806986BF809108018F7780930801FC
:100D5000FF91EF91BF91AF919F918F910F900FBE37
:100D60000F901F90189560E284E10ED060E489E353
:100D70000BD068E282E108D065E088E205D061E04E
:100D800083E102D006D00895282F362FC9012FD035
:100D90000895CF93DF93CDB7DEB722970FB6F894BF
:100DA000DEBF0FBECDBF90910A0180910B01981755
:100DB000A9F037D089839A8342E0BE016F5F7F4FED
:100DC00080E604DF84E690E03ED036DF8130E9F350
:100DD00090910A0180910B01981759F722960FB64E
:100DE000F894DEBF0FBECDBFDF91CF9108959C0177
:100DF00051E040910A01842F9927880F991FFC0127
:100E0000EC52FD4F20833183842F850F87708093B0
:100E10000A0190910B01891709F450E0852F992759
:100E2000089540910B01842F9927880F991FFC0189
:100E3000EC52FD4F20813181842F8F5F877080932A
:100E40000B01C9010895CF93DF93CDB7DEB7249787
:100E50000FB6F894DEBF0FBECDBF9C0119821A8277
:100E60001B821C8219821A8289819A8182179307B8
:100E7000E0F41B821C828B819C81885E934058F435
:100E800000008B819C8101968B839C838B819C814C
:100E9000885E9340A8F389819A81019689839A8319
:100EA00089819A818217930720F324960FB6F894CC
:100EB000DEBF0FBECDBFDF91CF9108951F938E9AF5
:100EC000969A84EF91E0BFDF1FEB82B3812382BB50
:100ED00084EF91E0B8DF969A84EF91E0B4DF82B3BB
:100EE000812382BB84EF91E0AEDF969A84EF91E09C
:100EF000AADF82B3812382BB84EF91E0A4DF969ABC
:100F00001F910895969A96988895E6F13EB53760B8
:100F10003EBD00E010E520E0B92FA82FF72FE62F07
:100F2000D72F39B7346039BF30E54FEF4DBD3CBDE9
:100F3000C62F3BB730683BBF969A889596983BB7CB
:100F40003F773BBF00000000E6B3C3B3CF703081F2
:100F5000E6B3488950A13423352376F03217A1F344
:100F6000969A00009698412F0CB5102F041B2D93D4
:100F70000D93232F0000E8CF0FEF011B03953D9346
:100F80000C9300C03EB5387F3EBD969A9698E89483
:100F90000895969A96988895AEF3B92FA82FD72FD3
:100FA000C62F30E54FEF4DBD3CBD3EB537603EBD71
:100FB000000039B7346039BF3BB730683BBF969A01
:100FC000889596983BB73F773BBF000033B346B355
:100FD0003D934993DEF7D6CF18951895309172005E
:100FE000316030937200689418951895FC01882739
:100FF0009927E89421912223E9F02032D9F329306E
:10100000C9F32A30B9F32C30A9F32D3099F32637E0
:1010100089F32B3219F02D3221F468942191222387
:1010200049F020333CF02A332CF420532FD0820F88
:10103000911DF4CF8115910521F01EF480959095B6
:1010400001960895E199FECF9FBB8EBBE09A992748
:101050008DB308954115510569F0DC01E199FECF8A
:101060007FBB6EBBE09A6F5F7F4F0DB20D92415018
:101070005040B1F70895E199FECF9FBB8EBB6DBB89
:101080000FB6F894E29AE19A0FBE08957AE0979F1E
:0E109000902D879F802D910D11240895FFCF84
:10109E0078000841565263616D2076312E340D0072
:00000001FF
/programy/Atmel_C/AVRcam/AVRcam.lss
0,0 → 1,4253
 
AVRcam.elf: file format elf32-avr
 
Sections:
Idx Name Size VMA LMA File off Algn
0 .noinit 00000030 00800300 00800300 00001162 2**0
ALLOC
1 .bss 00000274 00800070 00800070 00001162 2**0
ALLOC
2 .data 00000010 00800060 0000109e 00001152 2**0
CONTENTS, ALLOC, LOAD, DATA
3 .text 0000109e 00000000 00000000 000000b4 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
4 .eeprom 00000000 00810000 00810000 00001162 2**0
CONTENTS
5 .stab 00003f30 00000000 00000000 00001164 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 0000181e 00000000 00000000 00005094 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
 
00000000 <__vectors>:
0: 63 c0 rjmp .+198 ; 0xc8
2: ea c7 rjmp .+4052 ; 0xfd8
4: ea c7 rjmp .+4052 ; 0xfda
6: 7a c0 rjmp .+244 ; 0xfc
8: 79 c0 rjmp .+242 ; 0xfc
a: 78 c0 rjmp .+240 ; 0xfc
c: 77 c0 rjmp .+238 ; 0xfc
e: 76 c0 rjmp .+236 ; 0xfc
10: e5 c7 rjmp .+4042 ; 0xfdc
12: 74 c0 rjmp .+232 ; 0xfc
14: 73 c0 rjmp .+230 ; 0xfc
16: a8 c5 rjmp .+2896 ; 0xb68
18: 71 c0 rjmp .+226 ; 0xfc
1a: 70 c0 rjmp .+224 ; 0xfc
1c: 6f c0 rjmp .+222 ; 0xfc
1e: 6e c0 rjmp .+220 ; 0xfc
20: 6d c0 rjmp .+218 ; 0xfc
22: 13 c6 rjmp .+3110 ; 0xc4a
24: 6b c0 rjmp .+214 ; 0xfc
 
00000026 <__ctors_end>:
26: 2a c6 rjmp .+3156 ; 0xc7c
28: 93 c6 rjmp .+3366 ; 0xd50
2a: 92 c6 rjmp .+3364 ; 0xd50
2c: 91 c6 rjmp .+3362 ; 0xd50
2e: 90 c6 rjmp .+3360 ; 0xd50
30: 8f c6 rjmp .+3358 ; 0xd50
32: 8e c6 rjmp .+3356 ; 0xd50
34: 8d c6 rjmp .+3354 ; 0xd50
36: 22 c6 rjmp .+3140 ; 0xc7c
38: 8b c6 rjmp .+3350 ; 0xd50
3a: 8a c6 rjmp .+3348 ; 0xd50
3c: 89 c6 rjmp .+3346 ; 0xd50
3e: 88 c6 rjmp .+3344 ; 0xd50
40: 87 c6 rjmp .+3342 ; 0xd50
42: 86 c6 rjmp .+3340 ; 0xd50
44: 85 c6 rjmp .+3338 ; 0xd50
46: 2a c6 rjmp .+3156 ; 0xc9c
48: 83 c6 rjmp .+3334 ; 0xd50
4a: 82 c6 rjmp .+3332 ; 0xd50
4c: 81 c6 rjmp .+3330 ; 0xd50
4e: 80 c6 rjmp .+3328 ; 0xd50
50: 7f c6 rjmp .+3326 ; 0xd50
52: 7e c6 rjmp .+3324 ; 0xd50
54: 7d c6 rjmp .+3322 ; 0xd50
56: 25 c6 rjmp .+3146 ; 0xca2
58: 7b c6 rjmp .+3318 ; 0xd50
5a: 7a c6 rjmp .+3316 ; 0xd50
5c: 79 c6 rjmp .+3314 ; 0xd50
5e: 78 c6 rjmp .+3312 ; 0xd50
60: 77 c6 rjmp .+3310 ; 0xd50
62: 76 c6 rjmp .+3308 ; 0xd50
64: 75 c6 rjmp .+3306 ; 0xd50
66: 25 c6 rjmp .+3146 ; 0xcb2
68: 73 c6 rjmp .+3302 ; 0xd50
6a: 72 c6 rjmp .+3300 ; 0xd50
6c: 71 c6 rjmp .+3298 ; 0xd50
6e: 70 c6 rjmp .+3296 ; 0xd50
70: 6f c6 rjmp .+3294 ; 0xd50
72: 6e c6 rjmp .+3292 ; 0xd50
74: 6d c6 rjmp .+3290 ; 0xd50
76: 64 c6 rjmp .+3272 ; 0xd40
78: 6b c6 rjmp .+3286 ; 0xd50
7a: 6a c6 rjmp .+3284 ; 0xd50
7c: 69 c6 rjmp .+3282 ; 0xd50
7e: 68 c6 rjmp .+3280 ; 0xd50
80: 67 c6 rjmp .+3278 ; 0xd50
82: 66 c6 rjmp .+3276 ; 0xd50
84: 65 c6 rjmp .+3274 ; 0xd50
86: 64 c6 rjmp .+3272 ; 0xd50
88: 63 c6 rjmp .+3270 ; 0xd50
8a: 62 c6 rjmp .+3268 ; 0xd50
8c: 61 c6 rjmp .+3266 ; 0xd50
8e: 60 c6 rjmp .+3264 ; 0xd50
90: 5f c6 rjmp .+3262 ; 0xd50
92: 5e c6 rjmp .+3260 ; 0xd50
94: 5d c6 rjmp .+3258 ; 0xd50
96: 23 c6 rjmp .+3142 ; 0xcde
98: 5b c6 rjmp .+3254 ; 0xd50
9a: 5a c6 rjmp .+3252 ; 0xd50
9c: 59 c6 rjmp .+3250 ; 0xd50
9e: 58 c6 rjmp .+3248 ; 0xd50
a0: 57 c6 rjmp .+3246 ; 0xd50
a2: 56 c6 rjmp .+3244 ; 0xd50
a4: 55 c6 rjmp .+3242 ; 0xd50
a6: fd c5 rjmp .+3066 ; 0xca2
a8: 53 c6 rjmp .+3238 ; 0xd50
aa: 52 c6 rjmp .+3236 ; 0xd50
ac: 51 c6 rjmp .+3234 ; 0xd50
ae: 50 c6 rjmp .+3232 ; 0xd50
b0: 4f c6 rjmp .+3230 ; 0xd50
b2: 4e c6 rjmp .+3228 ; 0xd50
b4: 4d c6 rjmp .+3226 ; 0xd50
b6: 1f c6 rjmp .+3134 ; 0xcf6
b8: 4b c6 rjmp .+3222 ; 0xd50
ba: 4a c6 rjmp .+3220 ; 0xd50
bc: 49 c6 rjmp .+3218 ; 0xd50
be: 48 c6 rjmp .+3216 ; 0xd50
c0: 47 c6 rjmp .+3214 ; 0xd50
c2: 46 c6 rjmp .+3212 ; 0xd50
c4: 45 c6 rjmp .+3210 ; 0xd50
c6: 36 c6 rjmp .+3180 ; 0xd34
 
000000c8 <__init>:
c8: 11 24 eor r1, r1
ca: 1f be out 0x3f, r1 ; 63
cc: cf e5 ldi r28, 0x5F ; 95
ce: d4 e0 ldi r29, 0x04 ; 4
d0: de bf out 0x3e, r29 ; 62
d2: cd bf out 0x3d, r28 ; 61
 
000000d4 <__do_copy_data>:
d4: 10 e0 ldi r17, 0x00 ; 0
d6: a0 e6 ldi r26, 0x60 ; 96
d8: b0 e0 ldi r27, 0x00 ; 0
da: ee e9 ldi r30, 0x9E ; 158
dc: f0 e1 ldi r31, 0x10 ; 16
de: 02 c0 rjmp .+4 ; 0xe4
 
000000e0 <.do_copy_data_loop>:
e0: 05 90 lpm r0, Z+
e2: 0d 92 st X+, r0
 
000000e4 <.do_copy_data_start>:
e4: a0 37 cpi r26, 0x70 ; 112
e6: b1 07 cpc r27, r17
e8: d9 f7 brne .-10 ; 0xe0
 
000000ea <__do_clear_bss>:
ea: 12 e0 ldi r17, 0x02 ; 2
ec: a0 e7 ldi r26, 0x70 ; 112
ee: b0 e0 ldi r27, 0x00 ; 0
f0: 01 c0 rjmp .+2 ; 0xf4
 
000000f2 <.do_clear_bss_loop>:
f2: 1d 92 st X+, r1
 
000000f4 <.do_clear_bss_start>:
f4: a4 3e cpi r26, 0xE4 ; 228
f6: b1 07 cpc r27, r17
f8: e1 f7 brne .-8 ; 0xf2
fa: 31 c0 rjmp .+98 ; 0x15e
 
000000fc <__bad_interrupt>:
fc: 76 c7 rjmp .+3820 ; 0xfea
 
000000fe <CamInt_init>:
#endif
/* set up the mega8 ports that will be interfacing
with the camera */
CAM_CONTROL_PORT_DIR |= (1<<CAM_RESET_LINE); /* cam reset is output */
fe: 8f 9a sbi 0x11, 7 ; 17
CAM_CONTROL_PORT_DIR |= 0x80; /* set just the MSB as an output */
100: 8f 9a sbi 0x11, 7 ; 17
CAM_CONTROL_PORT_DIR &= 0xFB; /* make sure bit2 is clear (input) */
102: 8a 98 cbi 0x11, 2 ; 17
CAM_CONTROL_PORT &= 0x7F; /* set reset line low */
104: 97 98 cbi 0x12, 7 ; 18
CAM_G_BUS_DIR &= 0xF0; /* 4-bit G bus all inputs */
106: 90 ef ldi r25, 0xF0 ; 240
108: 87 b3 in r24, 0x17 ; 23
10a: 89 23 and r24, r25
10c: 87 bb out 0x17, r24 ; 23
CAM_G_BUS_DIR |= 0xF0; /* disable the pull-up on PB4 and PB5 */
10e: 87 b3 in r24, 0x17 ; 23
110: 89 2b or r24, r25
112: 87 bb out 0x17, r24 ; 23
CAM_RB_BUS_DIR &= 0xF0; /* 4-bit RB bus all inputs */
114: 84 b3 in r24, 0x14 ; 20
116: 89 23 and r24, r25
118: 84 bb out 0x14, r24 ; 20
/* ensure that timer1 is disabled to start...eventually, when PCLK needs
to feed timer1 through the external counter, it will be enabled on an
"as needed" basis...*/
TCCR1B &= ~( (1<<CS12)|(1<<CS11)|(1<<CS10) );
11a: 8e b5 in r24, 0x2e ; 46
11c: 88 7f andi r24, 0xF8 ; 248
11e: 8e bd out 0x2e, r24 ; 46
/* we'll turn on the interrupt after we assign the initial TCNT value */
/* set up External Interrupt1 to interrupt us on rising edges (HREF)...
this is needed to indicate when the first pixel of each line is about to start, so
we can synch up with it...this interrupt will be disabled once HREF goes high */
MCUCR |= (1<<ISC11) | (1<<ISC10); /* rising edge interrupt */
120: 85 b7 in r24, 0x35 ; 53
122: 8c 60 ori r24, 0x0C ; 12
124: 85 bf out 0x35, r24 ; 53
/* the interrupt will be enabled when we are ready to detect the rising edge of
HREF...its now primed and ready to go */
/* set up External Interrupt0 to interrupt us on rising edges (VSYNC) */
MCUCR |= (1<<ISC01) | (1<<ISC00); /* rising edge interrupt */
126: 85 b7 in r24, 0x35 ; 53
128: 83 60 ori r24, 0x03 ; 3
12a: 85 bf out 0x35, r24 ; 53
GICR |= (1<<INT0); /* interrupt request enabled */
12c: 8b b7 in r24, 0x3b ; 59
12e: 80 64 ori r24, 0x40 ; 64
130: 8b bf out 0x3b, r24 ; 59
/* set up TimerO to count and be clocked from an external pulse source
(HREF) on falling edges...eventually, we need to enable the interrupt
for this! FIX THIS */
TCCR0 = (1<<CS02)|(1<<CS01)|(0<<CS00);
132: 86 e0 ldi r24, 0x06 ; 6
134: 83 bf out 0x33, r24 ; 51
/* setting up the PCLK counter with Timer1 will be done right after
we start receiving pixels in each line...we sacrifice the first pixel
in each line, but we'll account for it...*/
/* set up the mega8 so that its sleep mode puts it in an IDLE sleep
mode, where it can wake up as fast as possible */
set_sleep_mode(SLEEP_MODE_IDLE);
136: 85 b7 in r24, 0x35 ; 53
138: 8f 78 andi r24, 0x8F ; 143
13a: 85 bf out 0x35, r24 ; 53
/* umm....we need to actually enable the sleep mode...*/
MCUCR |= 0x80;
13c: 85 b7 in r24, 0x35 ; 53
13e: 80 68 ori r24, 0x80 ; 128
140: 85 bf out 0x35, r24 ; 53
/* initialize the memLookup table */
memset(colorMap,0x00,NUM_ELEMENTS_IN_COLOR_MAP);
142: 80 e0 ldi r24, 0x00 ; 0
144: 93 e0 ldi r25, 0x03 ; 3
146: 20 e3 ldi r18, 0x30 ; 48
148: fc 01 movw r30, r24
14a: 11 92 st Z+, r1
14c: 2a 95 dec r18
14e: e9 f7 brne .-6 ; 0x14a
/* read the color map out of EEPROM */
eeprom_read_block(colorMap, (unsigned char*)0x01,NUM_ELEMENTS_IN_COLOR_MAP);
150: 40 e3 ldi r20, 0x30 ; 48
152: 50 e0 ldi r21, 0x00 ; 0
154: 61 e0 ldi r22, 0x01 ; 1
156: 70 e0 ldi r23, 0x00 ; 0
158: 7d d7 rcall .+3834 ; 0x1054
 
#if OUTPUT_INITIAL_COLOR_MAP
UIMgr_txBuffer("\r\n",2);
for (i=0; i<NUM_ELEMENTS_IN_COLOR_MAP; i++)
{
memset(asciiBuffer,0x00,5);
itoa(colorMap[i],asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
if (i==15 || i == 31)
{
/* break up the output */
UIMgr_txBuffer("\r\n",2);
}
}
#endif
 
#ifndef NO_CRYSTAL
CamInt_resetCam();
#endif
}
15a: 08 95 ret
 
0000015c <CamInt_resetCam>:
 
/***********************************************************
Function Name: CamInt_resetCam
Function Description: This function is responsible
for resetting the camera. This is accomplished by
toggling the reset line on the OV6620 for ~100 mS.
Inputs: none
Outputs: none
IMPORTANT NOTE: This function has effectively been removed
since resetting the camera now causes the camera to not
output the clock signal. Thus, if we reset the cam, the
AVR has no clock, and thus doesn't run...
***********************************************************/
void CamInt_resetCam(void)
{
15c: 08 95 ret
 
0000015e <main>:
Inputs: none
Outputs: int
***********************************************************/
int main(void)
{
15e: cf e5 ldi r28, 0x5F ; 95
160: d4 e0 ldi r29, 0x04 ; 4
162: de bf out 0x3e, r29 ; 62
164: cd bf out 0x3d, r28 ; 61
/* initialize all of the interface modules */
DebugInt_init();
166: aa d6 rcall .+3412 ; 0xebc
UartInt_init();
168: f1 d4 rcall .+2530 ; 0xb4c
I2CInt_init();
16a: 2c d5 rcall .+2648 ; 0xbc4
CamInt_init();
16c: c8 df rcall .-112 ; 0xfe
/* initialize the remaining modules that will process
data...interrupts need to be on for these */
ENABLE_INTS();
16e: 78 94 sei
CamConfig_init();
170: fa d5 rcall .+3060 ; 0xd66
UIMgr_init();
172: 94 d2 rcall .+1320 ; 0x69c
FrameMgr_init();
174: 7f d0 rcall .+254 ; 0x274
/* provide a short delay for the camera to stabilize before
we let the executive start up */
Utility_delay(1000);
176: 88 ee ldi r24, 0xE8 ; 232
178: 93 e0 ldi r25, 0x03 ; 3
17a: 65 d6 rcall .+3274 ; 0xe46
/* the rest of the application will be under the
control of the Executive. */
Exec_run();
17c: 03 d0 rcall .+6 ; 0x184
/* this should never be reached */
return(0);
}
17e: 80 e0 ldi r24, 0x00 ; 0
180: 90 e0 ldi r25, 0x00 ; 0
182: 8c c7 rjmp .+3864 ; 0x109c
 
00000184 <Exec_run>:
Inputs: none
Outputs: none
***********************************************************/
void Exec_run(void)
{
184: cf 93 push r28
unsigned char eventGenerated;
while(1)
{
if (fastEventBitmask)
186: 80 91 72 00 lds r24, 0x0072
18a: 88 23 and r24, r24
18c: b9 f0 breq .+46 ; 0x1bc
{
/* an event needing fast processing has been received */
/* a received line needs to be processed...this
needs to be processed as quickly as possible */
if (fastEventBitmask & FEV_ACQUIRE_LINE_COMPLETE)
18e: 80 ff sbrs r24, 0
190: 09 c0 rjmp .+18 ; 0x1a4
{
DISABLE_INTS();
192: f8 94 cli
fastEventBitmask &= ~FEV_ACQUIRE_LINE_COMPLETE;
194: 80 91 72 00 lds r24, 0x0072
198: 8e 7f andi r24, 0xFE ; 254
19a: 80 93 72 00 sts 0x0072, r24
ENABLE_INTS();
19e: 78 94 sei
FrameMgr_processLine();
1a0: f8 d0 rcall .+496 ; 0x392
/* also check if serial data needs to be sent
out through UIMgr */
UIMgr_transmitPendingData();
1a2: ac d2 rcall .+1368 ; 0x6fc
 
/* we can't just call acquire line again here,
since we don't know if we need to acquire another
line or not (it depends on the FrameMgr to figure
this out) */
}
if (fastEventBitmask & FEV_PROCESS_LINE_COMPLETE)
1a4: 80 91 72 00 lds r24, 0x0072
1a8: 81 ff sbrs r24, 1
1aa: 08 c0 rjmp .+16 ; 0x1bc
{
DISABLE_INTS();
1ac: f8 94 cli
fastEventBitmask &= ~FEV_PROCESS_LINE_COMPLETE;
1ae: 80 91 72 00 lds r24, 0x0072
1b2: 8d 7f andi r24, 0xFD ; 253
1b4: 80 93 72 00 sts 0x0072, r24
ENABLE_INTS();
1b8: 78 94 sei
FrameMgr_acquireLine();
1ba: b9 d0 rcall .+370 ; 0x32e
}
}
if (IS_DATA_IN_EVENT_FIFO() == TRUE)
1bc: 90 91 70 00 lds r25, 0x0070
1c0: 80 91 71 00 lds r24, 0x0071
1c4: 98 17 cp r25, r24
1c6: f9 f2 breq .-66 ; 0x186
{
eventGenerated = Exec_readEventFifo();
1c8: 32 d0 rcall .+100 ; 0x22e
1ca: c8 2f mov r28, r24
switch(eventGenerated)
1cc: 99 27 eor r25, r25
1ce: 80 31 cpi r24, 0x10 ; 16
1d0: 91 05 cpc r25, r1
1d2: 11 f1 breq .+68 ; 0x218
1d4: 81 31 cpi r24, 0x11 ; 17
1d6: 91 05 cpc r25, r1
1d8: 7c f4 brge .+30 ; 0x1f8
1da: 82 30 cpi r24, 0x02 ; 2
1dc: 91 05 cpc r25, r1
1de: 09 f1 breq .+66 ; 0x222
1e0: 83 30 cpi r24, 0x03 ; 3
1e2: 91 05 cpc r25, r1
1e4: 1c f4 brge .+6 ; 0x1ec
1e6: 01 97 sbiw r24, 0x01 ; 1
1e8: d1 f0 breq .+52 ; 0x21e
1ea: cd cf rjmp .-102 ; 0x186
1ec: 84 30 cpi r24, 0x04 ; 4
1ee: 91 05 cpc r25, r1
1f0: c1 f0 breq .+48 ; 0x222
1f2: 08 97 sbiw r24, 0x08 ; 8
1f4: b1 f0 breq .+44 ; 0x222
1f6: c7 cf rjmp .-114 ; 0x186
1f8: 80 38 cpi r24, 0x80 ; 128
1fa: 91 05 cpc r25, r1
1fc: 91 f0 breq .+36 ; 0x222
1fe: 81 38 cpi r24, 0x81 ; 129
200: 91 05 cpc r25, r1
202: 1c f4 brge .+6 ; 0x20a
204: 80 97 sbiw r24, 0x20 ; 32
206: 69 f0 breq .+26 ; 0x222
208: be cf rjmp .-132 ; 0x186
20a: 81 38 cpi r24, 0x81 ; 129
20c: 91 05 cpc r25, r1
20e: 49 f0 breq .+18 ; 0x222
210: 80 39 cpi r24, 0x90 ; 144
212: 91 05 cpc r25, r1
214: 49 f0 breq .+18 ; 0x228
216: b7 cf rjmp .-146 ; 0x186
{
case (EV_DUMP_FRAME):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_ENABLE_TRACKING):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_DISABLE_TRACKING):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_ACQUIRE_LINE_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
218: 8c 2f mov r24, r28
21a: 33 d0 rcall .+102 ; 0x282
UIMgr_dispatchEvent(eventGenerated);
21c: 05 c0 rjmp .+10 ; 0x228
break;
case (EV_ACQUIRE_FRAME_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_PROCESS_LINE_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_PROCESS_FRAME_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_SERIAL_DATA_RECEIVED):
UIMgr_dispatchEvent(eventGenerated);
21e: 8c 2f mov r24, r28
220: 58 d2 rcall .+1200 ; 0x6d2
FrameMgr_dispatchEvent(eventGenerated);
222: 8c 2f mov r24, r28
224: 2e d0 rcall .+92 ; 0x282
break;
226: af cf rjmp .-162 ; 0x186
 
case (EV_SERIAL_DATA_PENDING_TX):
UIMgr_dispatchEvent(eventGenerated);
228: 8c 2f mov r24, r28
22a: 53 d2 rcall .+1190 ; 0x6d2
break;
22c: ac cf rjmp .-168 ; 0x186
 
0000022e <Exec_readEventFifo>:
default:
break;
}
}
/* toggle the debug line */
 
}
}
 
/***********************************************************
Function Name: Exec_readEventFifo
Function Description: This function is responsible for
reading a single event out of the event fifo.
Inputs: none
Outputs: unsigned char-the data read
***********************************************************/
static unsigned char Exec_readEventFifo(void)
{
unsigned char dataByte, tmpTail;
DISABLE_INTS();
22e: f8 94 cli
/* just return the current tail from the tx fifo */
dataByte = Exec_eventFifo[Exec_eventFifoTail];
230: 20 91 71 00 lds r18, 0x0071
234: 8c e6 ldi r24, 0x6C ; 108
236: 92 e0 ldi r25, 0x02 ; 2
238: fc 01 movw r30, r24
23a: e2 0f add r30, r18
23c: f1 1d adc r31, r1
23e: 90 81 ld r25, Z
tmpTail = (Exec_eventFifoTail+1) & (EXEC_EVENT_FIFO_MASK);
240: 82 2f mov r24, r18
242: 8f 5f subi r24, 0xFF ; 255
244: 87 70 andi r24, 0x07 ; 7
Exec_eventFifoTail = tmpTail;
246: 80 93 71 00 sts 0x0071, r24
ENABLE_INTS();
24a: 78 94 sei
return(dataByte);
24c: 89 2f mov r24, r25
24e: 99 27 eor r25, r25
}
250: 08 95 ret
 
00000252 <Exec_writeEventFifo>:
 
/***********************************************************
Function Name: Exec_writeEventFifo
Function Description: This function is responsible for
writing a single event to the event fifo and
updating the appropriate pointers.
Inputs: data - the byte to write to the Fifo
Outputs: none
***********************************************************/
void Exec_writeEventFifo(unsigned char event)
{
252: 38 2f mov r19, r24
unsigned char tmpHead;
 
DISABLE_INTS();
254: f8 94 cli
Exec_eventFifo[Exec_eventFifoHead] = event;
256: 20 91 70 00 lds r18, 0x0070
25a: 8c e6 ldi r24, 0x6C ; 108
25c: 92 e0 ldi r25, 0x02 ; 2
25e: fc 01 movw r30, r24
260: e2 0f add r30, r18
262: f1 1d adc r31, r1
264: 30 83 st Z, r19
 
/* now move the head up */
tmpHead = (Exec_eventFifoHead + 1) & (EXEC_EVENT_FIFO_MASK);
266: 82 2f mov r24, r18
268: 8f 5f subi r24, 0xFF ; 255
26a: 87 70 andi r24, 0x07 ; 7
Exec_eventFifoHead = tmpHead;
26c: 80 93 70 00 sts 0x0070, r24
ENABLE_INTS();
270: 78 94 sei
}
272: 08 95 ret
 
00000274 <FrameMgr_init>:
Outputs: none
***********************************************************/
void FrameMgr_init(void)
{
memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
274: 80 e4 ldi r24, 0x40 ; 64
276: e8 e7 ldi r30, 0x78 ; 120
278: f0 e0 ldi r31, 0x00 ; 0
27a: 11 92 st Z+, r1
27c: 8a 95 dec r24
27e: e9 f7 brne .-6 ; 0x27a
}
280: 08 95 ret
 
00000282 <FrameMgr_dispatchEvent>:
 
 
/***********************************************************
Function Name: FrameMgr_dispatchEvent
Function Description: This function is responsible for
taking an incoming event and performing the needed
actions with it as pertains to the FrameMgr.
Inputs: event - the generated event
Outputs: none
***********************************************************/
void FrameMgr_dispatchEvent(unsigned char event)
{
switch(event)
282: 99 27 eor r25, r25
284: 84 30 cpi r24, 0x04 ; 4
286: 91 05 cpc r25, r1
288: 51 f1 breq .+84 ; 0x2de
28a: 85 30 cpi r24, 0x05 ; 5
28c: 91 05 cpc r25, r1
28e: 34 f4 brge .+12 ; 0x29c
290: 81 30 cpi r24, 0x01 ; 1
292: 91 05 cpc r25, r1
294: 31 f1 breq .+76 ; 0x2e2
296: 02 97 sbiw r24, 0x02 ; 2
298: 71 f0 breq .+28 ; 0x2b6
{
case EV_DUMP_FRAME:
/* try re-initializing the camera before we start dumping */
CamConfig_setCamReg(0x11,0x01); /* reduce the frame rate for dumping*/
CamConfig_sendFifoCmds();
Utility_delay(1000); /* allow the new frame rate to settle */
lineCount = 0;
currentState = ST_FrameMgr_DumpingFrame;
//CamIntAsm_waitForNewDumpFrame(currentLineBuffer,previousLineBuffer);
FrameMgr_acquireLine();
break;
case EV_ENABLE_TRACKING:
currentState = ST_FrameMgr_TrackingFrame;
FrameMgr_acquireFrame();
break;
case EV_ACQUIRE_FRAME_COMPLETE:
FrameMgr_processFrame();
break;
case EV_PROCESS_FRAME_COMPLETE:
FrameMgr_acquireFrame();
break;
 
case EV_SERIAL_DATA_RECEIVED:
if (currentState != ST_FrameMgr_idle)
{
/* we need to go back to processing line data, since
serial data reception interrupted us....just trash the
frame and act like the frame has been processed, which
will kick off the system to wait for the next line */
PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
}
break;
case EV_DISABLE_TRACKING:
/* tracking needs to be turned off */
currentState = ST_FrameMgr_idle;
break;
}
}
29a: 08 95 ret
29c: 80 38 cpi r24, 0x80 ; 128
29e: 91 05 cpc r25, r1
2a0: c1 f0 breq .+48 ; 0x2d2
2a2: 81 38 cpi r24, 0x81 ; 129
2a4: 91 05 cpc r25, r1
2a6: 1c f4 brge .+6 ; 0x2ae
2a8: 80 97 sbiw r24, 0x20 ; 32
2aa: b9 f0 breq .+46 ; 0x2da
2ac: 08 95 ret
2ae: 81 38 cpi r24, 0x81 ; 129
2b0: 91 05 cpc r25, r1
2b2: f1 f0 breq .+60 ; 0x2f0
2b4: 08 95 ret
2b6: 61 e0 ldi r22, 0x01 ; 1
2b8: 81 e1 ldi r24, 0x11 ; 17
2ba: 66 d5 rcall .+2764 ; 0xd88
2bc: 6a d5 rcall .+2772 ; 0xd92
2be: 88 ee ldi r24, 0xE8 ; 232
2c0: 93 e0 ldi r25, 0x03 ; 3
2c2: c1 d5 rcall .+2946 ; 0xe46
2c4: 10 92 73 00 sts 0x0073, r1
2c8: 82 e0 ldi r24, 0x02 ; 2
2ca: 80 93 74 00 sts 0x0074, r24
2ce: 2f d0 rcall .+94 ; 0x32e
2d0: 08 95 ret
2d2: 81 e0 ldi r24, 0x01 ; 1
2d4: 80 93 74 00 sts 0x0074, r24
2d8: 02 c0 rjmp .+4 ; 0x2de
2da: 18 d1 rcall .+560 ; 0x50c
2dc: 08 95 ret
2de: 0c d0 rcall .+24 ; 0x2f8
2e0: 08 95 ret
2e2: 80 91 74 00 lds r24, 0x0074
2e6: 88 23 and r24, r24
2e8: 29 f0 breq .+10 ; 0x2f4
2ea: 84 e0 ldi r24, 0x04 ; 4
2ec: b2 df rcall .-156 ; 0x252
2ee: 08 95 ret
2f0: 10 92 74 00 sts 0x0074, r1
2f4: 08 95 ret
2f6: 08 95 ret
 
000002f8 <FrameMgr_acquireFrame>:
 
/***********************************************************
Function Name: FrameMgr_acquireFrame
Function Description: This function is responsible for
beginning of the acquisition of a new frame of data
from the camera interface. The acquisition of this line
depends on the current state of the FrameMgr.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_acquireFrame(void)
{
if (currentState == ST_FrameMgr_TrackingFrame)
2f8: 80 91 74 00 lds r24, 0x0074
2fc: 81 30 cpi r24, 0x01 ; 1
2fe: a9 f4 brne .+42 ; 0x32a
{
trackedLineCount = 0;
300: 10 92 77 00 sts 0x0077, r1
numPrevTrackedObjects = numCurrTrackedObjects;
304: 80 91 75 00 lds r24, 0x0075
308: 80 93 76 00 sts 0x0076, r24
numCurrTrackedObjects = 0;
30c: 10 92 75 00 sts 0x0075, r1
/* clear out the tracking table, and wait for the new frame
to start */
memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
310: 80 e4 ldi r24, 0x40 ; 64
312: e8 e7 ldi r30, 0x78 ; 120
314: f0 e0 ldi r31, 0x00 ; 0
316: 11 92 st Z+, r1
318: 8a 95 dec r24
31a: e9 f7 brne .-6 ; 0x316
//CamIntAsm_waitForNewTrackingFrame(currentLineBuffer,colorMap);
WAIT_FOR_VSYNC_HIGH();
31c: 82 9b sbis 0x10, 2 ; 16
31e: fe cf rjmp .-4 ; 0x31c
CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
320: 60 e0 ldi r22, 0x00 ; 0
322: 73 e0 ldi r23, 0x03 ; 3
324: 8c eb ldi r24, 0xBC ; 188
326: 91 e0 ldi r25, 0x01 ; 1
328: f0 d5 rcall .+3040 ; 0xf0a
}
}
32a: 08 95 ret
32c: 08 95 ret
 
0000032e <FrameMgr_acquireLine>:
 
/***********************************************************
Function Name: FrameMgr_acquireLine
Function Description: This function is responsible for
acquiring a line of data from the camera interface.
The acquisition of this line depends on the current
state of the FrameMgr.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_acquireLine(void)
{
unsigned char tmpLineCount;
/* clearing out the buffers takes too long...we should
just overwrite the data here without a problem when
we start acquiring...at no point do we check for
a 0x00 value in the current or previous lineBuffers,
so it was a bit excessive :-) */
/* check which state we are in and proceed as needed */
if (currentState == ST_FrameMgr_DumpingFrame)
32e: 80 91 74 00 lds r24, 0x0074
332: 82 30 cpi r24, 0x02 ; 2
334: 11 f5 brne .+68 ; 0x37a
{
tmpLineCount = lineCount*2;
336: 80 91 73 00 lds r24, 0x0073
33a: 88 0f add r24, r24
/* clearing out the line data in dump mode is ok, and actually
is needed, since it is possible for the first dump line in
a frame to come back with the last line captured of the
last capture session...*/
memset(currentLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
33c: 90 eb ldi r25, 0xB0 ; 176
33e: ec eb ldi r30, 0xBC ; 188
340: f1 e0 ldi r31, 0x01 ; 1
342: 11 92 st Z+, r1
344: 9a 95 dec r25
346: e9 f7 brne .-6 ; 0x342
memset(previousLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
348: 90 eb ldi r25, 0xB0 ; 176
34a: ec e0 ldi r30, 0x0C ; 12
34c: f1 e0 ldi r31, 0x01 ; 1
34e: 11 92 st Z+, r1
350: 9a 95 dec r25
352: e9 f7 brne .-6 ; 0x34e
/* wait for another VSYNC so we know which frame to use
to start looking for a line to receive */
WAIT_FOR_VSYNC_HIGH();
354: 82 9b sbis 0x10, 2 ; 16
356: fe cf rjmp .-4 ; 0x354
WAIT_FOR_VSYNC_LOW();
358: 82 99 sbic 0x10, 2 ; 16
35a: fe cf rjmp .-4 ; 0x358
/* look at lineCount to determine how many HREFs we should
wait before we start sampling */
while(tmpLineCount != 0)
35c: 88 23 and r24, r24
35e: 39 f0 breq .+14 ; 0x36e
{
WAIT_FOR_HREF_HIGH();
360: 84 9b sbis 0x10, 4 ; 16
362: fe cf rjmp .-4 ; 0x360
tmpLineCount--;
364: 81 50 subi r24, 0x01 ; 1
WAIT_FOR_HREF_LOW();
366: 84 99 sbic 0x10, 4 ; 16
368: fe cf rjmp .-4 ; 0x366
36a: 88 23 and r24, r24
36c: c9 f7 brne .-14 ; 0x360
}
/* we should now be ready to sample our line...*/
CamIntAsm_acquireDumpLine(currentLineBuffer,previousLineBuffer);
36e: 6c e0 ldi r22, 0x0C ; 12
370: 71 e0 ldi r23, 0x01 ; 1
372: 8c eb ldi r24, 0xBC ; 188
374: 91 e0 ldi r25, 0x01 ; 1
376: 10 d6 rcall .+3104 ; 0xf98
}
else if (currentState == ST_FrameMgr_TrackingFrame)
{
WAIT_FOR_HREF_LOW();
CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
}
}
378: 08 95 ret
37a: 80 91 74 00 lds r24, 0x0074
37e: 81 30 cpi r24, 0x01 ; 1
380: 39 f4 brne .+14 ; 0x390
382: 84 99 sbic 0x10, 4 ; 16
384: fe cf rjmp .-4 ; 0x382
386: 60 e0 ldi r22, 0x00 ; 0
388: 73 e0 ldi r23, 0x03 ; 3
38a: 8c eb ldi r24, 0xBC ; 188
38c: 91 e0 ldi r25, 0x01 ; 1
38e: bd d5 rcall .+2938 ; 0xf0a
390: 08 95 ret
 
00000392 <FrameMgr_processLine>:
 
/***********************************************************
Function Name: FrameMgr_processLine
Function Description: This function is responsible for
parsing the received image line and performing either
connected region mapping (if in the Tracking state) or
sending out the raw sampled data (if in the Dumping
state).
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_processLine(void)
{
392: df 92 push r13
394: ef 92 push r14
396: ff 92 push r15
398: 0f 93 push r16
39a: 1f 93 push r17
39c: cf 93 push r28
39e: df 93 push r29
3a0: cd b7 in r28, 0x3d ; 61
3a2: de b7 in r29, 0x3e ; 62
3a4: 21 97 sbiw r28, 0x01 ; 1
3a6: 0f b6 in r0, 0x3f ; 63
3a8: f8 94 cli
3aa: de bf out 0x3e, r29 ; 62
3ac: 0f be out 0x3f, r0 ; 63
3ae: cd bf out 0x3d, r28 ; 61
unsigned char i;
volatile unsigned char dataToSend;
unsigned char *pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
3b0: 00 91 60 00 lds r16, 0x0060
3b4: 10 91 61 00 lds r17, 0x0061
#ifdef DEBUG_TRACKED_LINE
unsigned char *pSendData;
unsigned char asciiBuffer[5];
unsigned char pixelCount = 0;
#endif
if (currentState == ST_FrameMgr_DumpingFrame)
3b8: 80 91 74 00 lds r24, 0x0074
3bc: 82 30 cpi r24, 0x02 ; 2
3be: 09 f0 breq .+2 ; 0x3c2
3c0: 54 c0 rjmp .+168 ; 0x46a
{
/* we want to sit in a tight loop and send the acquired data
sitting in current and previous line buffers out the serial
port...it is sent out the serial port immediately instead
of going into the UIMgr tx fifo because we can't do anything
until its sent out anyway...may as well just get it out now */
/* currentLineBuffer is getting "g" previousLineBuffer is getting "b-r" */
UartInt_txByte(0x0B); /* send the header byte */
3c2: 8b e0 ldi r24, 0x0B ; 11
3c4: cd d3 rcall .+1946 ; 0xb60
UartInt_txByte(lineCount); /* send the line count */
3c6: 80 91 73 00 lds r24, 0x0073
3ca: ca d3 rcall .+1940 ; 0xb60
for (i=0; i<NUM_PIXELS_IN_A_DUMP_LINE; i+=2)
3cc: dd 24 eor r13, r13
{
/* when a dump line is sampled, the upper byte can potentially
have garbage in it...we don't have time to mask it off as we're
sampling, so it is done here before we send it out...we also
combine the samples together so we really are sending up a
sample for line N as well as line N+1 */
dataToSend = currentLineBuffer[i];
3ce: 2d 2d mov r18, r13
3d0: 33 27 eor r19, r19
3d2: 0f 2e mov r0, r31
3d4: fc eb ldi r31, 0xBC ; 188
3d6: ef 2e mov r14, r31
3d8: f1 e0 ldi r31, 0x01 ; 1
3da: ff 2e mov r15, r31
3dc: f0 2d mov r31, r0
3de: e2 0e add r14, r18
3e0: f3 1e adc r15, r19
3e2: f7 01 movw r30, r14
3e4: 80 81 ld r24, Z
3e6: 89 83 std Y+1, r24 ; 0x01
dataToSend &= 0x0F;
3e8: 89 81 ldd r24, Y+1 ; 0x01
3ea: 8f 70 andi r24, 0x0F ; 15
3ec: 89 83 std Y+1, r24 ; 0x01
dataToSend <<= 4;
3ee: 89 81 ldd r24, Y+1 ; 0x01
3f0: 82 95 swap r24
3f2: 80 7f andi r24, 0xF0 ; 240
3f4: 89 83 std Y+1, r24 ; 0x01
dataToSend |= (previousLineBuffer[i] & 0x0F);
3f6: 89 01 movw r16, r18
3f8: 04 5f subi r16, 0xF4 ; 244
3fa: 1e 4f sbci r17, 0xFE ; 254
3fc: f8 01 movw r30, r16
3fe: 80 81 ld r24, Z
400: 98 2f mov r25, r24
402: 9f 70 andi r25, 0x0F ; 15
404: 89 81 ldd r24, Y+1 ; 0x01
406: 89 2b or r24, r25
408: 89 83 std Y+1, r24 ; 0x01
/* dataToSend should be packed now */
UartInt_txByte(dataToSend);
40a: 89 81 ldd r24, Y+1 ; 0x01
40c: a9 d3 rcall .+1874 ; 0xb60
/* flip the colors around since we are doing all G on Y and BR on UV */
dataToSend = previousLineBuffer[i+1];
40e: f8 01 movw r30, r16
410: 81 81 ldd r24, Z+1 ; 0x01
412: 89 83 std Y+1, r24 ; 0x01
dataToSend &= 0x0F;
414: 89 81 ldd r24, Y+1 ; 0x01
416: 8f 70 andi r24, 0x0F ; 15
418: 89 83 std Y+1, r24 ; 0x01
dataToSend <<= 4;
41a: 89 81 ldd r24, Y+1 ; 0x01
41c: 82 95 swap r24
41e: 80 7f andi r24, 0xF0 ; 240
420: 89 83 std Y+1, r24 ; 0x01
dataToSend |= (currentLineBuffer[i+1] & 0x0F);
422: f7 01 movw r30, r14
424: 81 81 ldd r24, Z+1 ; 0x01
426: 98 2f mov r25, r24
428: 9f 70 andi r25, 0x0F ; 15
42a: 89 81 ldd r24, Y+1 ; 0x01
42c: 89 2b or r24, r25
42e: 89 83 std Y+1, r24 ; 0x01
/* dataToSend should be packed now */
UartInt_txByte(dataToSend);
430: 89 81 ldd r24, Y+1 ; 0x01
432: 96 d3 rcall .+1836 ; 0xb60
434: f2 e0 ldi r31, 0x02 ; 2
436: df 0e add r13, r31
438: 4f ea ldi r20, 0xAF ; 175
43a: 4d 15 cp r20, r13
43c: 40 f6 brcc .-112 ; 0x3ce
}
UartInt_txByte(0x0F); /* send line end */
43e: 8f e0 ldi r24, 0x0F ; 15
440: 8f d3 rcall .+1822 ; 0xb60
/* once all the data is sent, increment out line count by 2 since
we really get 2 lines worth of pixels on each pass */
/* Update...increment only by 1, but only send 72 double-lines */
lineCount++;
442: 80 91 73 00 lds r24, 0x0073
446: 8f 5f subi r24, 0xFF ; 255
448: 80 93 73 00 sts 0x0073, r24
/* check to see if we have retrieved all of the needed lines */
if (lineCount >= 72) /* half 144, since we send two lines at a time */
44c: 88 34 cpi r24, 0x48 ; 72
44e: 08 f4 brcc .+2 ; 0x452
450: 4a c0 rjmp .+148 ; 0x4e6
{
/* we're done, so send the dump complete?...nope, just change
states and we should be fine */
lineCount = 0;
452: 10 92 73 00 sts 0x0073, r1
currentState = ST_FrameMgr_idle;
456: 10 92 74 00 sts 0x0074, r1
/* disable the PCLK counting overflow interrupt */
TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
45a: 89 b7 in r24, 0x39 ; 57
45c: 8b 7f andi r24, 0xFB ; 251
45e: 89 bf out 0x39, r24 ; 57
CamConfig_setCamReg(0x11,0x00); /* reset the frame rate to normal*/
460: 60 e0 ldi r22, 0x00 ; 0
462: 81 e1 ldi r24, 0x11 ; 17
464: 91 d4 rcall .+2338 ; 0xd88
CamConfig_sendFifoCmds();
466: 95 d4 rcall .+2346 ; 0xd92
468: 43 c0 rjmp .+134 ; 0x4f0
}
else
{
/* we have more lines to acquire in this frame, so keep on truckin...*/
PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
}
}
else if (currentState == ST_FrameMgr_TrackingFrame)
46a: 80 91 74 00 lds r24, 0x0074
46e: 81 30 cpi r24, 0x01 ; 1
470: 09 f0 breq .+2 ; 0x474
472: 3e c0 rjmp .+124 ; 0x4f0
{
#ifdef DEBUG_TRACKED_LINE
/* send the received line over serial...this should only send
until a pixelCount == 176 */
pSendData = currentLineBuffer;
itoa(trackedLineCount,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
while(pixelCount < ACTUAL_NUM_PIXELS_IN_A_LINE)
{
memset(asciiBuffer,0x00,5);
itoa(*pSendData++,asciiBuffer,10); /* color is first byte */
UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data */
UIMgr_txBuffer(" ",1);
 
pixelCount += *pSendData; /* run-length is second byte */
memset(asciiBuffer,0x00,5);
itoa(*pSendData++,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
}
UIMgr_txBuffer("\n\r",2);
 
trackedLineCount++;
if (trackedLineCount == 144)
{
UIMgr_txBuffer(" FC \n\r",8);
trackedLineCount = 0;
PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
}
else
{
PUBLISH_EVENT(EV_PROCESS_LINE_COMPLETE);
}
#else
/* determine if any of the RLE blocks overlap */
FrameMgr_findConnectedness();
474: a1 d0 rcall .+322 ; 0x5b8
/* we also want to remove any objects that are less than
a minimum height...we already removed portions of the
run-length that are less than MIN_PIXEL_WIDTH in the
findConnectedness() routine...doing it here instead of
a function to speed things up...this may end up slowing down the
frame rate slightly, and can be removed if this isn't needed */
/* run this routine once every 8 lines */
if ( (trackedLineCount & RUN_OBJECT_FILTER_MASK) == RUN_OBJECT_FILTER_MASK)
476: 80 91 77 00 lds r24, 0x0077
47a: 99 27 eor r25, r25
47c: 87 70 andi r24, 0x07 ; 7
47e: 90 70 andi r25, 0x00 ; 0
480: 07 97 sbiw r24, 0x07 ; 7
482: 11 f5 brne .+68 ; 0x4c8
{
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
484: dd 24 eor r13, r13
{
if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE)
486: f8 01 movw r30, r16
488: 87 81 ldd r24, Z+7 ; 0x07
48a: 81 30 cpi r24, 0x01 ; 1
48c: b9 f4 brne .+46 ; 0x4bc
{
/* check to see if the object is already in
our past...i.e., its last */
if ( (*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) -
48e: 86 81 ldd r24, Z+6 ; 0x06
490: 28 2f mov r18, r24
492: 33 27 eor r19, r19
494: 84 81 ldd r24, Z+4 ; 0x04
496: a9 01 movw r20, r18
498: 48 1b sub r20, r24
49a: 51 09 sbc r21, r1
49c: 43 30 cpi r20, 0x03 ; 3
49e: 51 05 cpc r21, r1
4a0: 6c f4 brge .+26 ; 0x4bc
*(pTrackedObjectData + Y_UPPER_LEFT_OFFSET)) < MIN_OBJECT_TRACKING_HEIGHT)
{
/* the object is less than the minimum height...see if it is adjacent
to the current line we just processed...if so, leave it here...otherwise,
it needs to be invalidated since its too small */
if ( trackedLineCount - *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) > 2)
4a2: 80 91 77 00 lds r24, 0x0077
4a6: 99 27 eor r25, r25
4a8: 82 1b sub r24, r18
4aa: 93 0b sbc r25, r19
4ac: 03 97 sbiw r24, 0x03 ; 3
4ae: 34 f0 brlt .+12 ; 0x4bc
{
/* invalidate the object */
*(pTrackedObjectData + VALID_OBJECT_OFFSET) = FALSE;
4b0: 17 82 std Z+7, r1 ; 0x07
numCurrTrackedObjects--;
4b2: 80 91 75 00 lds r24, 0x0075
4b6: 81 50 subi r24, 0x01 ; 1
4b8: 80 93 75 00 sts 0x0075, r24
}
}
}
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
4bc: 08 5f subi r16, 0xF8 ; 248
4be: 1f 4f sbci r17, 0xFF ; 255
4c0: d3 94 inc r13
4c2: 57 e0 ldi r21, 0x07 ; 7
4c4: 5d 15 cp r21, r13
4c6: f8 f6 brcc .-66 ; 0x486
}
}
trackedLineCount++;
4c8: 80 91 77 00 lds r24, 0x0077
4cc: 8f 5f subi r24, 0xFF ; 255
4ce: 80 93 77 00 sts 0x0077, r24
if (trackedLineCount == ACTUAL_NUM_LINES_IN_A_FRAME)
4d2: 80 39 cpi r24, 0x90 ; 144
4d4: 41 f4 brne .+16 ; 0x4e6
{
/* an entire frame of tracking data has been acquired, so
publish an event letting the system know this fact */
PUBLISH_EVENT(EV_ACQUIRE_FRAME_COMPLETE);
4d6: 80 e2 ldi r24, 0x20 ; 32
4d8: bc de rcall .-648 ; 0x252
/* disable the PCLK counting overflow interrupt */
TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
4da: 89 b7 in r24, 0x39 ; 57
4dc: 8b 7f andi r24, 0xFB ; 251
4de: 89 bf out 0x39, r24 ; 57
trackedLineCount = 0;
4e0: 10 92 77 00 sts 0x0077, r1
4e4: 05 c0 rjmp .+10 ; 0x4f0
}
else
{
PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
4e6: 80 91 72 00 lds r24, 0x0072
4ea: 82 60 ori r24, 0x02 ; 2
4ec: 80 93 72 00 sts 0x0072, r24
}
#endif
}
else
{
/* ...and here? */
}
}
4f0: 21 96 adiw r28, 0x01 ; 1
4f2: 0f b6 in r0, 0x3f ; 63
4f4: f8 94 cli
4f6: de bf out 0x3e, r29 ; 62
4f8: 0f be out 0x3f, r0 ; 63
4fa: cd bf out 0x3d, r28 ; 61
4fc: df 91 pop r29
4fe: cf 91 pop r28
500: 1f 91 pop r17
502: 0f 91 pop r16
504: ff 90 pop r15
506: ef 90 pop r14
508: df 90 pop r13
50a: 08 95 ret
 
0000050c <FrameMgr_processFrame>:
 
/***********************************************************
Function Name: FrameMgr_processFrame
Function Description: This function is responsible for
parsing the completed frame and performing all actions
needed at this level.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_processFrame(void)
{
50c: df 92 push r13
50e: ef 92 push r14
510: ff 92 push r15
512: 0f 93 push r16
514: 1f 93 push r17
516: cf 93 push r28
518: df 93 push r29
unsigned char i,k,color;
#if DEBUG_FRAME_DATA
unsigned char asciiBuffer[5];
unsigned char j;
#endif
unsigned char *pTableData = (unsigned char *)pCurrentTrackedObjectTable;
unsigned char tmpUpperLeftX,tmpUpperLeftY,tmpLowerRightX,tmpLowerRightY;
#if DEBUG_FRAME_DATA
/* we want to send all of the currently tracked table out
the serial port for debugging */
for (i=0; i<numCurrTrackedObjects; i++)
{
UIMgr_txBuffer("----------\r\n",12);
for (j=0; j<SIZE_OF_TRACKED_OBJECT; j++)
{
memset(asciiBuffer,0x00,5);
itoa(*pTableData++,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data
+ 1 space */
UIMgr_txBuffer("\r\n",2);
}
}
/* finally, send a new line */
UIMgr_txBuffer("\r\n",2);
memset(asciiBuffer,0x00,5);
itoa(numCurrTrackedObjects,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" PFC\r\n",5);
 
#else
/* we only send tracking packets if there are tracked objects */
if (numCurrTrackedObjects > 0)
51a: 80 91 75 00 lds r24, 0x0075
51e: 88 23 and r24, r24
520: 09 f4 brne .+2 ; 0x524
522: 40 c0 rjmp .+128 ; 0x5a4
{
UIMgr_writeTxFifo(0x0A); /* header byte for a tracking packet */
524: 8a e0 ldi r24, 0x0A ; 10
526: 01 d3 rcall .+1538 ; 0xb2a
/* reset the pointer */
pTableData = (unsigned char *)pCurrentTrackedObjectTable;
528: c0 91 60 00 lds r28, 0x0060
52c: d0 91 61 00 lds r29, 0x0061
UIMgr_writeTxFifo(numCurrTrackedObjects); /* num of objects tracked */
530: 80 91 75 00 lds r24, 0x0075
534: fa d2 rcall .+1524 ; 0xb2a
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
536: dd 24 eor r13, r13
{
/* we only want to process objects that have their objectValid flag
set to TRUE */
if ( *(pTableData + VALID_OBJECT_OFFSET) == TRUE)
538: 8f 81 ldd r24, Y+7 ; 0x07
53a: 81 30 cpi r24, 0x01 ; 1
53c: 61 f5 brne .+88 ; 0x596
{
/* the object is valid...convert the color from bit position to value...remember,
each bit in the "color" byte corresponds to a color */
k=0;
53e: 80 e0 ldi r24, 0x00 ; 0
color = *(pTableData + COLOR_OFFSET);
540: 98 81 ld r25, Y
if (color == 128) k=0;
542: 90 38 cpi r25, 0x80 ; 128
544: d9 f0 breq .+54 ; 0x57c
else if (color == 64) k=1;
546: 90 34 cpi r25, 0x40 ; 64
548: 11 f4 brne .+4 ; 0x54e
54a: 81 e0 ldi r24, 0x01 ; 1
54c: 17 c0 rjmp .+46 ; 0x57c
else if (color == 32) k=2;
54e: 90 32 cpi r25, 0x20 ; 32
550: 11 f4 brne .+4 ; 0x556
552: 82 e0 ldi r24, 0x02 ; 2
554: 13 c0 rjmp .+38 ; 0x57c
else if (color == 16) k=3;
556: 90 31 cpi r25, 0x10 ; 16
558: 11 f4 brne .+4 ; 0x55e
55a: 83 e0 ldi r24, 0x03 ; 3
55c: 0f c0 rjmp .+30 ; 0x57c
else if (color == 8) k=4;
55e: 98 30 cpi r25, 0x08 ; 8
560: 11 f4 brne .+4 ; 0x566
562: 84 e0 ldi r24, 0x04 ; 4
564: 0b c0 rjmp .+22 ; 0x57c
else if (color == 4) k=5;
566: 94 30 cpi r25, 0x04 ; 4
568: 11 f4 brne .+4 ; 0x56e
56a: 85 e0 ldi r24, 0x05 ; 5
56c: 07 c0 rjmp .+14 ; 0x57c
else if (color == 2) k=6;
56e: 92 30 cpi r25, 0x02 ; 2
570: 11 f4 brne .+4 ; 0x576
572: 86 e0 ldi r24, 0x06 ; 6
574: 03 c0 rjmp .+6 ; 0x57c
else if (color == 1) k=7;
576: 91 30 cpi r25, 0x01 ; 1
578: 09 f4 brne .+2 ; 0x57c
57a: 87 e0 ldi r24, 0x07 ; 7
tmpUpperLeftX = *(pTableData + X_UPPER_LEFT_OFFSET); /* get the upper left X */
57c: 1b 81 ldd r17, Y+3 ; 0x03
tmpUpperLeftY = *(pTableData + Y_UPPER_LEFT_OFFSET); /* get the upper left Y */
57e: 0c 81 ldd r16, Y+4 ; 0x04
tmpLowerRightX = *(pTableData + X_LOWER_RIGHT_OFFSET); /* get the lower right X */
580: fd 80 ldd r15, Y+5 ; 0x05
tmpLowerRightY = *(pTableData + Y_LOWER_RIGHT_OFFSET); /* get the lower right Y */
582: ee 80 ldd r14, Y+6 ; 0x06
UIMgr_writeTxFifo(k); /* send the color first */
584: d2 d2 rcall .+1444 ; 0xb2a
UIMgr_writeTxFifo(tmpUpperLeftX);
586: 81 2f mov r24, r17
588: d0 d2 rcall .+1440 ; 0xb2a
UIMgr_writeTxFifo(tmpUpperLeftY);
58a: 80 2f mov r24, r16
58c: ce d2 rcall .+1436 ; 0xb2a
UIMgr_writeTxFifo(tmpLowerRightX);
58e: 8f 2d mov r24, r15
590: cc d2 rcall .+1432 ; 0xb2a
UIMgr_writeTxFifo(tmpLowerRightY);
592: 8e 2d mov r24, r14
594: ca d2 rcall .+1428 ; 0xb2a
}
 
/* move our pointer up to the beginning of the next object */
pTableData += SIZE_OF_TRACKED_OBJECT;
596: 28 96 adiw r28, 0x08 ; 8
598: d3 94 inc r13
59a: 87 e0 ldi r24, 0x07 ; 7
59c: 8d 15 cp r24, r13
59e: 60 f6 brcc .-104 ; 0x538
}
/* all done...send the end of tracking packets char */
UIMgr_writeTxFifo(0xFF);
5a0: 8f ef ldi r24, 0xFF ; 255
5a2: c3 d2 rcall .+1414 ; 0xb2a
}
#endif
 
/* the tracked object table will be cleared out right before we start
to wait for VSYNC to indicate a new frame...so it doesn't need to be
done now */
/* schedule the next action to acquire a new frame */
PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
5a4: 84 e0 ldi r24, 0x04 ; 4
5a6: 55 de rcall .-854 ; 0x252
}
5a8: df 91 pop r29
5aa: cf 91 pop r28
5ac: 1f 91 pop r17
5ae: 0f 91 pop r16
5b0: ff 90 pop r15
5b2: ef 90 pop r14
5b4: df 90 pop r13
5b6: 08 95 ret
 
000005b8 <FrameMgr_findConnectedness>:
 
/***********************************************************
Function Name: FrameMgr_findConnectedness
Function Description: This function is responsible for
finding the connectedness between two particular run-
length encoded lines of pixel data. It updates the
trackingTable as needed.
Inputs: none
Outputs: none
***********************************************************/
static void FrameMgr_findConnectedness(void)
{
5b8: 1f 93 push r17
5ba: cf 93 push r28
trackedColor_t currColor;
unsigned char *pCurrLineColorInfo = currentLineBuffer;
5bc: ac eb ldi r26, 0xBC ; 188
5be: b1 e0 ldi r27, 0x01 ; 1
unsigned char *pTrackedObjectData;
register unsigned char currPixelRunStart=0;
5c0: 60 e0 ldi r22, 0x00 ; 0
register unsigned char currPixelRunFinish=0;
5c2: c6 2f mov r28, r22
register unsigned char lastLineXStart=0;
register unsigned char lastLineXFinish=0;
register unsigned char runLength=1;
5c4: 71 e0 ldi r23, 0x01 ; 1
unsigned char i;
bool_t colorConnected;
do
{
/* grab both the current color and the number of pixels
in the run...remember, pixels start at 1, not 0! */
colorConnected = FALSE;
5c6: 10 e0 ldi r17, 0x00 ; 0
currColor = *pCurrLineColorInfo++;
5c8: 5d 91 ld r21, X+
currPixelRunStart += runLength;
5ca: c7 0f add r28, r23
runLength = *pCurrLineColorInfo++;
5cc: 7d 91 ld r23, X+
currPixelRunFinish += runLength;
5ce: 67 0f add r22, r23
/* make sure that the run-length is at least as wide as
the minimum horizontal tracking width, and we care about the color */
if ( (currColor != notTracked) && (runLength > MIN_OBJECT_TRACKING_WIDTH) )
5d0: 55 23 and r21, r21
5d2: 09 f4 brne .+2 ; 0x5d6
5d4: 5d c0 rjmp .+186 ; 0x690
5d6: 74 30 cpi r23, 0x04 ; 4
5d8: 08 f4 brcc .+2 ; 0x5dc
5da: 5a c0 rjmp .+180 ; 0x690
{
/* this run contains a color we care about, so
either it will begin a new tracked object, or it
is connected to a currently tracked object...
compare it with each object in the tracking
table...we can't just look at the numTrackedObjects because
it is entirely possible that the first couple of objects could
be invalid...
 
NOTE: Instead of accessing each element in the trackedObjectTable
through the 'i' index, and then accessing the fields in each structure,
a pointer to each entry is established each time through the loop, followed
by accessing the elements through specified offsets. GCC seems to be
able to optimize this code much better than simply accessing the elements
of each structure in the array the more normal way...*/
pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
5dc: e0 91 60 00 lds r30, 0x0060
5e0: f0 91 61 00 lds r31, 0x0061
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
5e4: 41 2f mov r20, r17
{
if ( (currColor == *(pTrackedObjectData + COLOR_OFFSET)) &&
5e6: 80 81 ld r24, Z
5e8: 58 17 cp r21, r24
5ea: 51 f5 brne .+84 ; 0x640
5ec: 87 81 ldd r24, Z+7 ; 0x07
5ee: 81 30 cpi r24, 0x01 ; 1
5f0: 39 f5 brne .+78 ; 0x640
5f2: 86 81 ldd r24, Z+6 ; 0x06
5f4: 28 2f mov r18, r24
5f6: 33 27 eor r19, r19
5f8: 80 91 77 00 lds r24, 0x0077
5fc: 99 27 eor r25, r25
5fe: 01 97 sbiw r24, 0x01 ; 1
600: 28 17 cp r18, r24
602: 39 07 cpc r19, r25
604: e9 f4 brne .+58 ; 0x640
(*(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE) &&
(*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) == trackedLineCount - 1) )
{
/* found a color match and the object is valid...check to see if there is
connectedness */
lastLineXStart = *(pTrackedObjectData + LAST_LINE_X_START_OFFSET);
606: 81 81 ldd r24, Z+1 ; 0x01
lastLineXFinish = *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET);
608: 92 81 ldd r25, Z+2 ; 0x02
/* Check for the 5 following types of line connectedness:
---------------------
| |
---------------------
-------------------------
| |
------------------------- */
if ( ( (currPixelRunStart >= lastLineXStart) &&
60a: c8 17 cp r28, r24
60c: 10 f0 brcs .+4 ; 0x612
60e: 9c 17 cp r25, r28
610: 40 f4 brcc .+16 ; 0x622
612: 68 17 cp r22, r24
614: 10 f0 brcs .+4 ; 0x61a
616: 96 17 cp r25, r22
618: 20 f4 brcc .+8 ; 0x622
61a: 8c 17 cp r24, r28
61c: 88 f0 brcs .+34 ; 0x640
61e: 69 17 cp r22, r25
620: 78 f0 brcs .+30 ; 0x640
(currPixelRunStart <= lastLineXFinish) ) ||
/* ---------------------
| |
---------------------
-------------------
| |
-------------------
OR
------------------------------
| |
------------------------------
---------
| |
--------- */
( (currPixelRunFinish >= lastLineXStart) &&
(currPixelRunFinish <= lastLineXFinish) ) ||
/* -------------------------------
| |
-------------------------------
-------------------------------
| |
-------------------------------
OR
-------------
| |
-------------
-------------------------------
| |
------------------------------- */
( (currPixelRunStart <= lastLineXStart) &&
(currPixelRunFinish >= lastLineXFinish) ) )
{
/* THERE IS CONNECTEDNESS...update the lastLineXStart and lastLineXFinish
data pointed to by pTrackedObjectData */
*(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart;
622: c1 83 std Z+1, r28 ; 0x01
*(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish;
624: 62 83 std Z+2, r22 ; 0x02
/* check if the bounding box needs to be updated */
if (*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) > currPixelRunStart)
626: 83 81 ldd r24, Z+3 ; 0x03
628: c8 17 cp r28, r24
62a: 08 f4 brcc .+2 ; 0x62e
{
/* need to update the bounding box for the upper left point to
enclose this new left-most point...we never have to update the
upper left Y point, since each scan line we process moves from
top to bottom */
*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart;
62c: c3 83 std Z+3, r28 ; 0x03
}
 
if ( *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) < currPixelRunFinish)
62e: 85 81 ldd r24, Z+5 ; 0x05
630: 86 17 cp r24, r22
632: 08 f4 brcc .+2 ; 0x636
{
/* need to update the bounding box for the lower right X point to
enclose this new right-most point */
*(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish;
634: 65 83 std Z+5, r22 ; 0x05
}
/* the lower right 'y' point always gets updated when connectedness is found */
*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount;
636: 80 91 77 00 lds r24, 0x0077
63a: 86 83 std Z+6, r24 ; 0x06
/* set a flag indicating that that color run is part of another
object and thus doesn't need to be added as a new entry into the
tracking table */
colorConnected = TRUE;
63c: 11 e0 ldi r17, 0x01 ; 1
break;
63e: 04 c0 rjmp .+8 ; 0x648
}
}
/* go to the next object */
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
640: 38 96 adiw r30, 0x08 ; 8
642: 4f 5f subi r20, 0xFF ; 255
644: 48 30 cpi r20, 0x08 ; 8
646: 78 f2 brcs .-98 ; 0x5e6
}
if (colorConnected == FALSE)
648: 11 23 and r17, r17
64a: 11 f5 brne .+68 ; 0x690
{
/* a new entry needs to be made to the tracking table, since we have
a run-length with a color, and it isn't connected to anything...but we
can only do this if there is space left in the trackedObject table */
if (numCurrTrackedObjects < MAX_TRACKED_OBJECTS)
64c: 80 91 75 00 lds r24, 0x0075
650: 88 30 cpi r24, 0x08 ; 8
652: f0 f4 brcc .+60 ; 0x690
{
/* space is available...add the object...but first we need to find an
invalid object in the object tracking table */
pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
654: e0 91 60 00 lds r30, 0x0060
658: f0 91 61 00 lds r31, 0x0061
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
65c: 41 2f mov r20, r17
{
if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == FALSE) break;
65e: 87 81 ldd r24, Z+7 ; 0x07
660: 88 23 and r24, r24
662: 21 f0 breq .+8 ; 0x66c
/* if we haven't broken above, then the object must have been valid...
go ahead and move the pointer to the next object to check it */
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
664: 38 96 adiw r30, 0x08 ; 8
666: 4f 5f subi r20, 0xFF ; 255
668: 48 30 cpi r20, 0x08 ; 8
66a: c8 f3 brcs .-14 ; 0x65e
}
/* now that we have a pointer to the tracked object to be updated, update all
the fields */
*(pTrackedObjectData + COLOR_OFFSET) = currColor; /* color */
66c: 50 83 st Z, r21
*(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart; /* lastLineXStart */
66e: c1 83 std Z+1, r28 ; 0x01
*(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish; /* lastLineXFinish */
670: 62 83 std Z+2, r22 ; 0x02
*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart; /* x_upperLeft */
672: c3 83 std Z+3, r28 ; 0x03
*(pTrackedObjectData + Y_UPPER_LEFT_OFFSET) = trackedLineCount; /* y_upperLeft */
674: 80 91 77 00 lds r24, 0x0077
678: 84 83 std Z+4, r24 ; 0x04
*(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish; /* x_lowerRight */
67a: 65 83 std Z+5, r22 ; 0x05
*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount; /* y_lowerRight */
67c: 80 91 77 00 lds r24, 0x0077
680: 86 83 std Z+6, r24 ; 0x06
*(pTrackedObjectData + VALID_OBJECT_OFFSET) = TRUE; /* objectValid flag */
682: 81 e0 ldi r24, 0x01 ; 1
684: 87 83 std Z+7, r24 ; 0x07
numCurrTrackedObjects++;
686: 80 91 75 00 lds r24, 0x0075
68a: 8f 5f subi r24, 0xFF ; 255
68c: 80 93 75 00 sts 0x0075, r24
}
}
/* move the pointer to the beginning of the next tracked object */
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
}
} while(currPixelRunFinish < ACTUAL_NUM_PIXELS_IN_A_LINE);
690: 60 3b cpi r22, 0xB0 ; 176
692: 08 f4 brcc .+2 ; 0x696
694: 98 cf rjmp .-208 ; 0x5c6
}
696: cf 91 pop r28
698: 1f 91 pop r17
69a: 08 95 ret
 
0000069c <UIMgr_init>:
Outputs: none
***********************************************************/
void UIMgr_init(void)
{
memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH+1);
69c: 10 92 bf 00 sts 0x00BF, r1
6a0: 10 92 c0 00 sts 0x00C0, r1
6a4: 10 92 c1 00 sts 0x00C1, r1
6a8: 10 92 c2 00 sts 0x00C2, r1
memset(tokenBuffer,0x00,MAX_TOKEN_COUNT);
6ac: 80 e4 ldi r24, 0x40 ; 64
6ae: e3 ec ldi r30, 0xC3 ; 195
6b0: f0 e0 ldi r31, 0x00 ; 0
6b2: 11 92 st Z+, r1
6b4: 8a 95 dec r24
6b6: e9 f7 brne .-6 ; 0x6b2
memset(UIMgr_txFifo,0x00,UI_MGR_TX_FIFO_SIZE);
6b8: 80 e4 ldi r24, 0x40 ; 64
6ba: e4 e9 ldi r30, 0x94 ; 148
6bc: f2 e0 ldi r31, 0x02 ; 2
6be: 11 92 st Z+, r1
6c0: 8a 95 dec r24
6c2: e9 f7 brne .-6 ; 0x6be
memset(UIMgr_rxFifo,0x00,UI_MGR_RX_FIFO_SIZE);
6c4: 80 e2 ldi r24, 0x20 ; 32
6c6: e4 e7 ldi r30, 0x74 ; 116
6c8: f2 e0 ldi r31, 0x02 ; 2
6ca: 11 92 st Z+, r1
6cc: 8a 95 dec r24
6ce: e9 f7 brne .-6 ; 0x6ca
}
6d0: 08 95 ret
 
000006d2 <UIMgr_dispatchEvent>:
 
/***********************************************************
Function Name: UIMgr_dispatchEvent
Function Description: This function is responsible for
processing events that pertain to the UIMgr.
Inputs: event - the generated event
Outputs: none
***********************************************************/
void UIMgr_dispatchEvent(unsigned char event)
{
switch(event)
6d2: 99 27 eor r25, r25
6d4: 80 31 cpi r24, 0x10 ; 16
6d6: 91 05 cpc r25, r1
6d8: 51 f0 breq .+20 ; 0x6ee
6da: 81 31 cpi r24, 0x11 ; 17
6dc: 91 05 cpc r25, r1
6de: 1c f4 brge .+6 ; 0x6e6
6e0: 01 97 sbiw r24, 0x01 ; 1
6e2: 39 f0 breq .+14 ; 0x6f2
{
case EV_ACQUIRE_LINE_COMPLETE:
UIMgr_transmitPendingData();
break;
case EV_SERIAL_DATA_RECEIVED:
UIMgr_processReceivedData();
break;
case EV_SERIAL_DATA_PENDING_TX:
UIMgr_flushTxBuffer();
break;
}
}
6e4: 08 95 ret
6e6: 80 39 cpi r24, 0x90 ; 144
6e8: 91 05 cpc r25, r1
6ea: 29 f0 breq .+10 ; 0x6f6
6ec: 08 95 ret
6ee: 06 d0 rcall .+12 ; 0x6fc
6f0: 08 95 ret
6f2: 0e d0 rcall .+28 ; 0x710
6f4: 08 95 ret
6f6: e6 d1 rcall .+972 ; 0xac4
6f8: 08 95 ret
6fa: 08 95 ret
 
000006fc <UIMgr_transmitPendingData>:
/***********************************************************
Function Name: UIMgr_transmitPendingData
Function Description: This function is responsible for
transmitting a single byte of data if data is waiting
to be sent. Otherwise, if nothing is waiting, the
function just returns.
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_transmitPendingData(void)
{
if (IS_DATA_IN_TX_FIFO() == TRUE)
6fc: 90 91 ba 00 lds r25, 0x00BA
700: 80 91 bb 00 lds r24, 0x00BB
704: 98 17 cp r25, r24
706: 11 f0 breq .+4 ; 0x70c
{
/* data is waiting...send a single byte */
UartInt_txByte( UIMgr_readTxFifo() );
708: fe d1 rcall .+1020 ; 0xb06
70a: 2a d2 rcall .+1108 ; 0xb60
}
}
70c: 08 95 ret
70e: 08 95 ret
 
00000710 <UIMgr_processReceivedData>:
/***********************************************************
Function Name: UIMgr_processReceivedData
Function Description: This function is responsible for
parsing any serial data waiting in the rx fifo
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_processReceivedData(void)
{
710: cf 93 push r28
unsigned char tmpData = 0;
 
/* still need to add a mechanism to handle token counts
that are excessive!!! FIX ME!!! */
while(IS_DATA_IN_RX_FIFO() == TRUE)
712: 90 91 b8 00 lds r25, 0x00B8
716: 80 91 b9 00 lds r24, 0x00B9
71a: 98 17 cp r25, r24
71c: 09 f4 brne .+2 ; 0x720
71e: 6f c0 rjmp .+222 ; 0x7fe
720: c9 e0 ldi r28, 0x09 ; 9
{
tmpData = UIMgr_readRxFifo();
722: df d1 rcall .+958 ; 0xae2
724: 38 2f mov r19, r24
if (tmpData == '\r')
726: 8d 30 cpi r24, 0x0D ; 13
728: 29 f5 brne .+74 ; 0x774
{
/* we have reached a token separator */
if (tokenCount == 0)
72a: 80 91 be 00 lds r24, 0x00BE
72e: 88 23 and r24, r24
730: 11 f4 brne .+4 ; 0x736
{
/* convert the command */
UIMgr_convertTokenToCmd();
732: 2c d1 rcall .+600 ; 0x98c
734: 06 c0 rjmp .+12 ; 0x742
}
else
{
/* convert a value */
UIMgr_convertTokenToValue();
736: 02 d1 rcall .+516 ; 0x93c
tokenCount++;
738: 80 91 be 00 lds r24, 0x00BE
73c: 8f 5f subi r24, 0xFF ; 255
73e: 80 93 be 00 sts 0x00BE, r24
}
/* either way, it is time to try to process the received
token list since we have reached the end of the cmd. */
Utility_delay(100);
742: 84 e6 ldi r24, 0x64 ; 100
744: 90 e0 ldi r25, 0x00 ; 0
746: 7f d3 rcall .+1790 ; 0xe46
if (receivedCmd == invalidCmd ||
748: 80 91 62 00 lds r24, 0x0062
74c: 88 50 subi r24, 0x08 ; 8
74e: 82 30 cpi r24, 0x02 ; 2
750: 20 f4 brcc .+8 ; 0x75a
receivedCmd == noCmd )
{
UIMgr_sendNck();
752: 84 d1 rcall .+776 ; 0xa5c
PUBLISH_EVENT(EV_SERIAL_DATA_PENDING_TX);
754: 80 e9 ldi r24, 0x90 ; 144
756: 7d dd rcall .-1286 ; 0x252
758: 04 c0 rjmp .+8 ; 0x762
}
else
{
UIMgr_sendAck();
75a: 77 d1 rcall .+750 ; 0xa4a
/* publish the serial data pending event, so it
will push the ACK out before we execute the cmd */
PUBLISH_EVENT(EV_SERIAL_DATA_PENDING_TX);
75c: 80 e9 ldi r24, 0x90 ; 144
75e: 79 dd rcall .-1294 ; 0x252
UIMgr_executeCmd();
760: 51 d0 rcall .+162 ; 0x804
}
/* reset any necessary data */
tokenCount = 0;
762: 10 92 be 00 sts 0x00BE, r1
memset(tokenBuffer,0x00,MAX_TOKEN_COUNT);
766: 80 e4 ldi r24, 0x40 ; 64
768: e3 ec ldi r30, 0xC3 ; 195
76a: f0 e0 ldi r31, 0x00 ; 0
76c: 11 92 st Z+, r1
76e: 8a 95 dec r24
770: e9 f7 brne .-6 ; 0x76c
772: 3e c0 rjmp .+124 ; 0x7f0
}
else if (tmpData == ' ') /* space char */
774: 80 32 cpi r24, 0x20 ; 32
776: d9 f4 brne .+54 ; 0x7ae
{
/* the end of a token has been reached */
if (tokenCount == 0)
778: 80 91 be 00 lds r24, 0x00BE
77c: 88 23 and r24, r24
77e: 11 f4 brne .+4 ; 0x784
{
UIMgr_convertTokenToCmd();
780: 05 d1 rcall .+522 ; 0x98c
tokenCount++; /* check this...why is this being incremented here??? This
782: 0f c0 rjmp .+30 ; 0x7a2
means we have received a token, with tokenCount == 0, which means it is a
command...why is this contributing to tokenCount?
This might cause the set color map command to include too much data, since
it sets the color map based on tokenCount...CHECK*/
}
else
{
/* check to see if this token is going to push
us over the limit...if so, abort the transaction */
if (tokenCount+1 >= MAX_TOKEN_COUNT)
784: 80 91 be 00 lds r24, 0x00BE
788: 99 27 eor r25, r25
78a: 01 96 adiw r24, 0x01 ; 1
78c: 80 34 cpi r24, 0x40 ; 64
78e: 91 05 cpc r25, r1
790: 3c f0 brlt .+14 ; 0x7a0
{
/* we received too many tokens, and
need to NCK this request, since its too
large...reset everything...*/
charCount=0;
792: 10 92 bc 00 sts 0x00BC, r1
charIndex=0;
796: 10 92 bd 00 sts 0x00BD, r1
tokenCount=0;
79a: 10 92 be 00 sts 0x00BE, r1
receivedCmd = invalidCmd;
79e: 26 c0 rjmp .+76 ; 0x7ec
}
else
{
/* tokenCount is still in range...*/
UIMgr_convertTokenToValue();
7a0: cd d0 rcall .+410 ; 0x93c
tokenCount++;
7a2: 80 91 be 00 lds r24, 0x00BE
7a6: 8f 5f subi r24, 0xFF ; 255
7a8: 80 93 be 00 sts 0x00BE, r24
7ac: 21 c0 rjmp .+66 ; 0x7f0
}
}
}
else if ( (tmpData >= 'A' && tmpData <= 'Z') ||
7ae: 81 54 subi r24, 0x41 ; 65
7b0: 8a 31 cpi r24, 0x1A ; 26
7b2: 18 f0 brcs .+6 ; 0x7ba
7b4: 8f 5e subi r24, 0xEF ; 239
7b6: 8a 30 cpi r24, 0x0A ; 10
7b8: c8 f4 brcc .+50 ; 0x7ec
(tmpData >= '0' && tmpData <= '9') )
{
/* a valid range of token was received */
asciiTokenBuffer[charIndex] = tmpData;
7ba: 20 91 bd 00 lds r18, 0x00BD
7be: 82 2f mov r24, r18
7c0: 99 27 eor r25, r25
7c2: fc 01 movw r30, r24
7c4: e1 54 subi r30, 0x41 ; 65
7c6: ff 4f sbci r31, 0xFF ; 255
7c8: 30 83 st Z, r19
charCount++;
7ca: 80 91 bc 00 lds r24, 0x00BC
7ce: 98 2f mov r25, r24
7d0: 9f 5f subi r25, 0xFF ; 255
7d2: 90 93 bc 00 sts 0x00BC, r25
charIndex++;
7d6: 82 2f mov r24, r18
7d8: 8f 5f subi r24, 0xFF ; 255
7da: 80 93 bd 00 sts 0x00BD, r24
if (charCount > MAX_TOKEN_LENGTH)
7de: 94 30 cpi r25, 0x04 ; 4
7e0: 38 f0 brcs .+14 ; 0x7f0
{
/* we have received a token that cannot be handled...
set the received cmd to an invalid cmd, and wait
for the \r to process it */
receivedCmd = invalidCmd;
7e2: c0 93 62 00 sts 0x0062, r28
charIndex = 0; /* ...so we won't overwrite memory */
7e6: 10 92 bd 00 sts 0x00BD, r1
7ea: 02 c0 rjmp .+4 ; 0x7f0
}
}
else
{
/* an invalid character was received */
receivedCmd = invalidCmd;
7ec: c0 93 62 00 sts 0x0062, r28
7f0: 90 91 b8 00 lds r25, 0x00B8
7f4: 80 91 b9 00 lds r24, 0x00B9
7f8: 98 17 cp r25, r24
7fa: 09 f0 breq .+2 ; 0x7fe
7fc: 92 cf rjmp .-220 ; 0x722
}
} /* end while */
asm volatile("clt"::); /* clear out the T flag in case it wasn't
7fe: e8 94 clt
cleared already */
}
800: cf 91 pop r28
802: 08 95 ret
 
00000804 <UIMgr_executeCmd>:
 
/***********************************************************
Function Name: UIMgr_executeCmd
Function Description: This function is responsible for
executing whatever cmd is stored in the receivedCmd
object.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_executeCmd(void)
{
804: df 92 push r13
806: ef 92 push r14
808: ff 92 push r15
80a: 0f 93 push r16
80c: 1f 93 push r17
80e: cf 93 push r28
810: df 93 push r29
unsigned char i,eepromData, num_writes=0;
812: ee 24 eor r14, r14
unsigned char *pData;
unsigned char eeprom_write_succeeded = FALSE;
#if DEBUG_COLOR_MAP
unsigned char asciiBuffer[5];
#endif
 
if (receivedCmd == pingCmd)
814: 80 91 62 00 lds r24, 0x0062
818: 81 30 cpi r24, 0x01 ; 1
81a: 09 f4 brne .+2 ; 0x81e
81c: 87 c0 rjmp .+270 ; 0x92c
{
}
else if (receivedCmd == getVersionCmd)
81e: 88 23 and r24, r24
820: 69 f4 brne .+26 ; 0x83c
{
pData = AVRcamVersion;
822: c3 e6 ldi r28, 0x63 ; 99
824: d0 e0 ldi r29, 0x00 ; 0
while(*pData != 0)
826: 80 91 63 00 lds r24, 0x0063
82a: 88 23 and r24, r24
82c: 09 f4 brne .+2 ; 0x830
82e: 7e c0 rjmp .+252 ; 0x92c
{
UIMgr_writeTxFifo(*pData++);
830: 89 91 ld r24, Y+
832: 7b d1 rcall .+758 ; 0xb2a
834: 88 81 ld r24, Y
836: 88 23 and r24, r24
838: d9 f7 brne .-10 ; 0x830
83a: 78 c0 rjmp .+240 ; 0x92c
}
}
else if (receivedCmd == resetCameraCmd)
83c: 80 91 62 00 lds r24, 0x0062
840: 87 30 cpi r24, 0x07 ; 7
842: 11 f4 brne .+4 ; 0x848
{
CamInt_resetCam();
844: 8b dc rcall .-1770 ; 0x15c
846: 72 c0 rjmp .+228 ; 0x92c
}
else if (receivedCmd == dumpFrameCmd)
848: 80 91 62 00 lds r24, 0x0062
84c: 83 30 cpi r24, 0x03 ; 3
84e: 29 f4 brne .+10 ; 0x85a
{
/* publish the event that will indicate that
a request has come to dump a frame...this will
be received by the FrameMgr, which will begin
dumping the frame...a short delay is needed
here to keep the Java demo app happy (sometimes
it wouldn't be able to receive the serial data
as quickly as AVRcam can provide it). */
Utility_delay(100);
850: 84 e6 ldi r24, 0x64 ; 100
852: 90 e0 ldi r25, 0x00 ; 0
854: f8 d2 rcall .+1520 ; 0xe46
PUBLISH_EVENT(EV_DUMP_FRAME);
856: 82 e0 ldi r24, 0x02 ; 2
858: 28 c0 rjmp .+80 ; 0x8aa
}
else if (receivedCmd == setCameraRegsCmd)
85a: 80 91 62 00 lds r24, 0x0062
85e: 82 30 cpi r24, 0x02 ; 2
860: b1 f4 brne .+44 ; 0x88e
{
/* we need to gather the tokens and
build config cmds to be sent to the camera */
for (i=1; i<tokenCount; i+=2) /* starts at 1 since first token
862: ff 24 eor r15, r15
864: f3 94 inc r15
866: 80 91 be 00 lds r24, 0x00BE
86a: f8 16 cp r15, r24
86c: 70 f4 brcc .+28 ; 0x88a
is the CR cmd */
{
CamConfig_setCamReg(tokenBuffer[i],tokenBuffer[i+1]);
86e: 8f 2d mov r24, r15
870: 99 27 eor r25, r25
872: fc 01 movw r30, r24
874: ed 53 subi r30, 0x3D ; 61
876: ff 4f sbci r31, 0xFF ; 255
878: 61 81 ldd r22, Z+1 ; 0x01
87a: 80 81 ld r24, Z
87c: 85 d2 rcall .+1290 ; 0xd88
87e: 82 e0 ldi r24, 0x02 ; 2
880: f8 0e add r15, r24
882: 80 91 be 00 lds r24, 0x00BE
886: f8 16 cp r15, r24
888: 90 f3 brcs .-28 ; 0x86e
}
CamConfig_sendFifoCmds();
88a: 83 d2 rcall .+1286 ; 0xd92
88c: 4f c0 rjmp .+158 ; 0x92c
}
else if (receivedCmd == enableTrackingCmd)
88e: 80 91 62 00 lds r24, 0x0062
892: 84 30 cpi r24, 0x04 ; 4
894: 29 f4 brne .+10 ; 0x8a0
{
/* publish the event...again with a short delay */
Utility_delay(100);
896: 84 e6 ldi r24, 0x64 ; 100
898: 90 e0 ldi r25, 0x00 ; 0
89a: d5 d2 rcall .+1450 ; 0xe46
PUBLISH_EVENT(EV_ENABLE_TRACKING);
89c: 80 e8 ldi r24, 0x80 ; 128
89e: 05 c0 rjmp .+10 ; 0x8aa
}
else if (receivedCmd == disableTrackingCmd)
8a0: 80 91 62 00 lds r24, 0x0062
8a4: 85 30 cpi r24, 0x05 ; 5
8a6: 19 f4 brne .+6 ; 0x8ae
{
PUBLISH_EVENT(EV_DISABLE_TRACKING);
8a8: 81 e8 ldi r24, 0x81 ; 129
8aa: d3 dc rcall .-1626 ; 0x252
8ac: 3f c0 rjmp .+126 ; 0x92c
}
else if (receivedCmd == setColorMapCmd)
8ae: 80 91 62 00 lds r24, 0x0062
8b2: 86 30 cpi r24, 0x06 ; 6
8b4: d9 f5 brne .+118 ; 0x92c
{
/* copy the received tokens into the color map */
for (i=0; i<tokenCount; i++)
8b6: ff 24 eor r15, r15
8b8: 80 91 be 00 lds r24, 0x00BE
8bc: f8 16 cp r15, r24
8be: b0 f5 brcc .+108 ; 0x92c
{
colorMap[i] = tokenBuffer[i+1];
8c0: 8f 2d mov r24, r15
8c2: 99 27 eor r25, r25
8c4: 8c 01 movw r16, r24
8c6: 00 50 subi r16, 0x00 ; 0
8c8: 1d 4f sbci r17, 0xFD ; 253
8ca: fc 01 movw r30, r24
8cc: ed 53 subi r30, 0x3D ; 61
8ce: ff 4f sbci r31, 0xFF ; 255
8d0: 21 81 ldd r18, Z+1 ; 0x01
8d2: f8 01 movw r30, r16
8d4: 20 83 st Z, r18
/* write each colorMap byte to EEPROM, but only those
that changed...this will help reduce wear on the EEPROM */
eepromData = eeprom_read_byte( (unsigned char*)(i+1));
8d6: 01 96 adiw r24, 0x01 ; 1
8d8: b5 d3 rcall .+1898 ; 0x1044
8da: 98 2f mov r25, r24
if (eepromData != colorMap[i])
8dc: f8 01 movw r30, r16
8de: 80 81 ld r24, Z
8e0: 98 17 cp r25, r24
8e2: f9 f0 breq .+62 ; 0x922
{
/* need to actually perform the write because the
data in eeprom is different than the current colorMap */
eeprom_write_succeeded = FALSE;
8e4: dd 24 eor r13, r13
while(eeprom_write_succeeded == FALSE && num_writes < MAX_EEPROM_WRITE_ATTEMPTS)
8e6: f2 e0 ldi r31, 0x02 ; 2
8e8: fe 15 cp r31, r14
8ea: d0 f0 brcs .+52 ; 0x920
8ec: 8f 2d mov r24, r15
8ee: 99 27 eor r25, r25
8f0: 8c 01 movw r16, r24
8f2: 00 50 subi r16, 0x00 ; 0
8f4: 1d 4f sbci r17, 0xFD ; 253
8f6: ec 01 movw r28, r24
8f8: 21 96 adiw r28, 0x01 ; 1
{
eeprom_write_byte((unsigned char*)(i+1),colorMap[i]);
8fa: f8 01 movw r30, r16
8fc: 60 81 ld r22, Z
8fe: ce 01 movw r24, r28
900: ba d3 rcall .+1908 ; 0x1076
num_writes++;
902: e3 94 inc r14
eepromData = eeprom_read_byte( (unsigned char*)(i+1));
904: ce 01 movw r24, r28
906: 9e d3 rcall .+1852 ; 0x1044
908: 98 2f mov r25, r24
if (eepromData == colorMap[i])
90a: f8 01 movw r30, r16
90c: 80 81 ld r24, Z
90e: 98 17 cp r25, r24
910: 11 f4 brne .+4 ; 0x916
{
eeprom_write_succeeded = TRUE;
912: dd 24 eor r13, r13
914: d3 94 inc r13
916: dd 20 and r13, r13
918: 19 f4 brne .+6 ; 0x920
91a: f2 e0 ldi r31, 0x02 ; 2
91c: fe 15 cp r31, r14
91e: 68 f7 brcc .-38 ; 0x8fa
}
}
num_writes = 0;
920: ee 24 eor r14, r14
922: f3 94 inc r15
924: 80 91 be 00 lds r24, 0x00BE
928: f8 16 cp r15, r24
92a: 50 f2 brcs .-108 ; 0x8c0
}
}
 
#if DEBUG_COLOR_MAP
/* for debugging...send out the entire color map */
UIMgr_txBuffer("\r\n",2);
for (i=0; i<NUM_ELEMENTS_IN_COLOR_MAP; i++)
{
memset(asciiBuffer,0x00,5);
itoa(colorMap[i],asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
if (i==15 || i == 31)
{
/* break up the output */
UIMgr_txBuffer("\r\n",2);
}
}
#endif
}
}
92c: df 91 pop r29
92e: cf 91 pop r28
930: 1f 91 pop r17
932: 0f 91 pop r16
934: ff 90 pop r15
936: ef 90 pop r14
938: df 90 pop r13
93a: 08 95 ret
 
0000093c <UIMgr_convertTokenToValue>:
 
/***********************************************************
Function Name: UIMgr_convertTokenToValue
Function Description: This function is responsible for
converting a received token to a hex value It will
access the asciiTokenBuffer directly, and store the
result in the appropriate token buffer.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_convertTokenToValue(void)
{
unsigned int newValue;
newValue = atoi(asciiTokenBuffer);
93c: 8f eb ldi r24, 0xBF ; 191
93e: 90 e0 ldi r25, 0x00 ; 0
940: 55 d3 rcall .+1706 ; 0xfec
942: ac 01 movw r20, r24
if (newValue > 255)
944: 8f 3f cpi r24, 0xFF ; 255
946: 91 05 cpc r25, r1
948: 71 f0 breq .+28 ; 0x966
94a: 68 f0 brcs .+26 ; 0x966
{
/* the value is too large */
receivedCmd = invalidCmd;
94c: 89 e0 ldi r24, 0x09 ; 9
94e: 80 93 62 00 sts 0x0062, r24
tokenBuffer[tokenCount] = 0xFF; /* to indicate an error */
952: 20 91 be 00 lds r18, 0x00BE
956: 83 ec ldi r24, 0xC3 ; 195
958: 90 e0 ldi r25, 0x00 ; 0
95a: fc 01 movw r30, r24
95c: e2 0f add r30, r18
95e: f1 1d adc r31, r1
960: 8f ef ldi r24, 0xFF ; 255
962: 80 83 st Z, r24
964: 08 c0 rjmp .+16 ; 0x976
}
else
{
/* copy the value into the tokenBuffer */
tokenBuffer[tokenCount] = newValue;
966: 80 91 be 00 lds r24, 0x00BE
96a: 23 ec ldi r18, 0xC3 ; 195
96c: 30 e0 ldi r19, 0x00 ; 0
96e: f9 01 movw r30, r18
970: e8 0f add r30, r24
972: f1 1d adc r31, r1
974: 40 83 st Z, r20
}
memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH);
976: 83 e0 ldi r24, 0x03 ; 3
978: ef eb ldi r30, 0xBF ; 191
97a: f0 e0 ldi r31, 0x00 ; 0
97c: 11 92 st Z+, r1
97e: 8a 95 dec r24
980: e9 f7 brne .-6 ; 0x97c
charIndex = 0;
982: 10 92 bd 00 sts 0x00BD, r1
charCount = 0;
986: 10 92 bc 00 sts 0x00BC, r1
}
98a: 08 95 ret
 
0000098c <UIMgr_convertTokenToCmd>:
/***********************************************************
Function Name: UIMgr_convertTokenToCmd
Function Description: This function is responsible for
parsing a received 2-character command. It will
access the asciiTokenBuffer directly.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_convertTokenToCmd(void)
{
if ( (asciiTokenBuffer[0] == 'P') &&
98c: 80 91 bf 00 lds r24, 0x00BF
990: 80 35 cpi r24, 0x50 ; 80
992: 31 f4 brne .+12 ; 0x9a0
994: 80 91 c0 00 lds r24, 0x00C0
998: 87 34 cpi r24, 0x47 ; 71
99a: 11 f4 brne .+4 ; 0x9a0
(asciiTokenBuffer[1] == 'G') )
{
/* we got a "ping" command...but we still need to see
if we are going to get the \r */
receivedCmd = pingCmd;
99c: 81 e0 ldi r24, 0x01 ; 1
99e: 48 c0 rjmp .+144 ; 0xa30
}
else if ( (asciiTokenBuffer[0] == 'G') &&
9a0: 80 91 bf 00 lds r24, 0x00BF
9a4: 87 34 cpi r24, 0x47 ; 71
9a6: 39 f4 brne .+14 ; 0x9b6
9a8: 80 91 c0 00 lds r24, 0x00C0
9ac: 86 35 cpi r24, 0x56 ; 86
9ae: 19 f4 brne .+6 ; 0x9b6
(asciiTokenBuffer[1] == 'V') )
{
/* we got the "get version" command */
receivedCmd = getVersionCmd;
9b0: 10 92 62 00 sts 0x0062, r1
9b4: 3f c0 rjmp .+126 ; 0xa34
}
else if ( (asciiTokenBuffer[0] == 'D') &&
9b6: 80 91 bf 00 lds r24, 0x00BF
9ba: 84 34 cpi r24, 0x44 ; 68
9bc: 31 f4 brne .+12 ; 0x9ca
9be: 80 91 c0 00 lds r24, 0x00C0
9c2: 86 34 cpi r24, 0x46 ; 70
9c4: 11 f4 brne .+4 ; 0x9ca
(asciiTokenBuffer[1] == 'F') )
{
/* we should go into frame dump mode */
receivedCmd = dumpFrameCmd;
9c6: 83 e0 ldi r24, 0x03 ; 3
9c8: 33 c0 rjmp .+102 ; 0xa30
}
else if ( (asciiTokenBuffer[0] == 'C') &&
9ca: 80 91 bf 00 lds r24, 0x00BF
9ce: 83 34 cpi r24, 0x43 ; 67
9d0: 31 f4 brne .+12 ; 0x9de
9d2: 80 91 c0 00 lds r24, 0x00C0
9d6: 82 35 cpi r24, 0x52 ; 82
9d8: 11 f4 brne .+4 ; 0x9de
(asciiTokenBuffer[1] == 'R') )
{
/* the user wants to set registers in the OV6620 */
receivedCmd = setCameraRegsCmd;
9da: 82 e0 ldi r24, 0x02 ; 2
9dc: 29 c0 rjmp .+82 ; 0xa30
}
else if ( (asciiTokenBuffer[0] == 'E') &&
9de: 80 91 bf 00 lds r24, 0x00BF
9e2: 85 34 cpi r24, 0x45 ; 69
9e4: 31 f4 brne .+12 ; 0x9f2
9e6: 80 91 c0 00 lds r24, 0x00C0
9ea: 84 35 cpi r24, 0x54 ; 84
9ec: 11 f4 brne .+4 ; 0x9f2
(asciiTokenBuffer[1] == 'T') )
{
/* the user wants to enable tracking */
receivedCmd = enableTrackingCmd;
9ee: 84 e0 ldi r24, 0x04 ; 4
9f0: 1f c0 rjmp .+62 ; 0xa30
}
else if ( (asciiTokenBuffer[0] == 'S') &&
9f2: 80 91 bf 00 lds r24, 0x00BF
9f6: 83 35 cpi r24, 0x53 ; 83
9f8: 31 f4 brne .+12 ; 0xa06
9fa: 80 91 c0 00 lds r24, 0x00C0
9fe: 8d 34 cpi r24, 0x4D ; 77
a00: 11 f4 brne .+4 ; 0xa06
(asciiTokenBuffer[1] == 'M') )
{
/* the user wants to set the color map */
receivedCmd = setColorMapCmd;
a02: 86 e0 ldi r24, 0x06 ; 6
a04: 15 c0 rjmp .+42 ; 0xa30
}
else if ( (asciiTokenBuffer[0] == 'D') &&
a06: 80 91 bf 00 lds r24, 0x00BF
a0a: 84 34 cpi r24, 0x44 ; 68
a0c: 31 f4 brne .+12 ; 0xa1a
a0e: 80 91 c0 00 lds r24, 0x00C0
a12: 84 35 cpi r24, 0x54 ; 84
a14: 11 f4 brne .+4 ; 0xa1a
(asciiTokenBuffer[1] == 'T') )
{
receivedCmd = disableTrackingCmd;
a16: 85 e0 ldi r24, 0x05 ; 5
a18: 0b c0 rjmp .+22 ; 0xa30
}
else if ( (asciiTokenBuffer[0] == 'R') &&
a1a: 80 91 bf 00 lds r24, 0x00BF
a1e: 82 35 cpi r24, 0x52 ; 82
a20: 31 f4 brne .+12 ; 0xa2e
a22: 80 91 c0 00 lds r24, 0x00C0
a26: 83 35 cpi r24, 0x53 ; 83
a28: 11 f4 brne .+4 ; 0xa2e
(asciiTokenBuffer[1] == 'S') )
{
receivedCmd = resetCameraCmd;
a2a: 87 e0 ldi r24, 0x07 ; 7
a2c: 01 c0 rjmp .+2 ; 0xa30
}
else
{
/* don't recognize the cmd */
receivedCmd = invalidCmd;
a2e: 89 e0 ldi r24, 0x09 ; 9
a30: 80 93 62 00 sts 0x0062, r24
}
memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH);
a34: 83 e0 ldi r24, 0x03 ; 3
a36: ef eb ldi r30, 0xBF ; 191
a38: f0 e0 ldi r31, 0x00 ; 0
a3a: 11 92 st Z+, r1
a3c: 8a 95 dec r24
a3e: e9 f7 brne .-6 ; 0xa3a
charIndex = 0;
a40: 10 92 bd 00 sts 0x00BD, r1
charCount = 0;
a44: 10 92 bc 00 sts 0x00BC, r1
}
a48: 08 95 ret
 
00000a4a <UIMgr_sendAck>:
/***********************************************************
Function Name: UIMgr_sendAck
Function Description: This function is responsible for
queuing up an ACK to be sent to the user.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_sendAck(void)
{
UIMgr_writeTxFifo('A');
a4a: 81 e4 ldi r24, 0x41 ; 65
a4c: 6e d0 rcall .+220 ; 0xb2a
UIMgr_writeTxFifo('C');
a4e: 83 e4 ldi r24, 0x43 ; 67
a50: 6c d0 rcall .+216 ; 0xb2a
UIMgr_writeTxFifo('K');
a52: 8b e4 ldi r24, 0x4B ; 75
a54: 6a d0 rcall .+212 ; 0xb2a
UIMgr_writeTxFifo('\r');
a56: 8d e0 ldi r24, 0x0D ; 13
a58: 68 d0 rcall .+208 ; 0xb2a
}
a5a: 08 95 ret
 
00000a5c <UIMgr_sendNck>:
 
/***********************************************************
Function Name: UIMgr_sendNck
Function Description: This function is responsible for
queueing up an NCK to be sent to the user.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_sendNck(void)
{
UIMgr_writeTxFifo('N');
a5c: 8e e4 ldi r24, 0x4E ; 78
a5e: 65 d0 rcall .+202 ; 0xb2a
UIMgr_writeTxFifo('C');
a60: 83 e4 ldi r24, 0x43 ; 67
a62: 63 d0 rcall .+198 ; 0xb2a
UIMgr_writeTxFifo('K');
a64: 8b e4 ldi r24, 0x4B ; 75
a66: 61 d0 rcall .+194 ; 0xb2a
UIMgr_writeTxFifo('\r');
a68: 8d e0 ldi r24, 0x0D ; 13
a6a: 5f d0 rcall .+190 ; 0xb2a
}
a6c: 08 95 ret
 
00000a6e <UIMgr_writeBufferToTxFifo>:
 
 
/***********************************************************
Function Name: UIMgr_writeBufferToTxFifo
Function Description: This function is responsible for
placing "length" bytes into the tx FIFO.
Inputs: pData - a pointer to the data to send
length - the number of bytes to send
Outputs: none
***********************************************************/
void UIMgr_writeBufferToTxFifo(unsigned char *pData, unsigned char length)
{
a6e: dc 01 movw r26, r24
unsigned char tmpHead;
if (length == 0)
a70: 66 23 and r22, r22
a72: a9 f0 breq .+42 ; 0xa9e
{
return;
}
DISABLE_INTS();
a74: f8 94 cli
while(length-- != 0)
a76: 61 50 subi r22, 0x01 ; 1
a78: 6f 3f cpi r22, 0xFF ; 255
a7a: 81 f0 breq .+32 ; 0xa9c
a7c: 24 e9 ldi r18, 0x94 ; 148
a7e: 32 e0 ldi r19, 0x02 ; 2
{
UIMgr_txFifo[UIMgr_txFifoHead] = *pData++;
a80: 90 91 ba 00 lds r25, 0x00BA
a84: f9 01 movw r30, r18
a86: e9 0f add r30, r25
a88: f1 1d adc r31, r1
a8a: 8d 91 ld r24, X+
a8c: 80 83 st Z, r24
/* now move the head up */
tmpHead = (UIMgr_txFifoHead + 1) & (UI_MGR_TX_FIFO_MASK);
a8e: 89 2f mov r24, r25
a90: 8f 5f subi r24, 0xFF ; 255
a92: 8f 73 andi r24, 0x3F ; 63
UIMgr_txFifoHead = tmpHead;
a94: 80 93 ba 00 sts 0x00BA, r24
a98: 61 50 subi r22, 0x01 ; 1
a9a: 90 f7 brcc .-28 ; 0xa80
}
ENABLE_INTS();
a9c: 78 94 sei
}
a9e: 08 95 ret
 
00000aa0 <UIMgr_txBuffer>:
 
/***********************************************************
Function Name: UIMgr_txBuffer
Function Description: This function is responsible for
sending 'length' bytes out using the UartInterface
module.
Inputs: pData - a pointer to the data to send
length - the number of bytes to send
Outputs: none
***********************************************************/
void UIMgr_txBuffer(unsigned char *pData, unsigned char length)
{
aa0: 0f 93 push r16
aa2: 1f 93 push r17
aa4: cf 93 push r28
aa6: 8c 01 movw r16, r24
aa8: c6 2f mov r28, r22
while(length-- != 0)
aaa: c1 50 subi r28, 0x01 ; 1
aac: cf 3f cpi r28, 0xFF ; 255
aae: 31 f0 breq .+12 ; 0xabc
{
UartInt_txByte(*pData++);
ab0: f8 01 movw r30, r16
ab2: 81 91 ld r24, Z+
ab4: 8f 01 movw r16, r30
ab6: 54 d0 rcall .+168 ; 0xb60
ab8: c1 50 subi r28, 0x01 ; 1
aba: d0 f7 brcc .-12 ; 0xab0
}
}
abc: cf 91 pop r28
abe: 1f 91 pop r17
ac0: 0f 91 pop r16
ac2: 08 95 ret
 
00000ac4 <UIMgr_flushTxBuffer>:
 
/***********************************************************
Function Name: UIMgr_flushTxBuffer
Function Description: This function is responsible for
sending all data currently in the serial tx buffer
to the user.
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_flushTxBuffer(void)
{
while(IS_DATA_IN_TX_FIFO() == TRUE)
ac4: 90 91 ba 00 lds r25, 0x00BA
ac8: 80 91 bb 00 lds r24, 0x00BB
acc: 98 17 cp r25, r24
ace: 41 f0 breq .+16 ; 0xae0
{
UartInt_txByte(UIMgr_readTxFifo() );
ad0: 1a d0 rcall .+52 ; 0xb06
ad2: 46 d0 rcall .+140 ; 0xb60
ad4: 90 91 ba 00 lds r25, 0x00BA
ad8: 80 91 bb 00 lds r24, 0x00BB
adc: 98 17 cp r25, r24
ade: c1 f7 brne .-16 ; 0xad0
}
}
ae0: 08 95 ret
 
00000ae2 <UIMgr_readRxFifo>:
 
/***********************************************************
Function Name: UIMgr_readRxFifo
Function Description: This function is responsible for
reading a single byte of data from the rx fifo, and
updating the appropriate pointers.
Inputs: none
Outputs: unsigned char-the data read
***********************************************************/
static unsigned char UIMgr_readRxFifo(void)
{
unsigned char dataByte, tmpTail;
/* just return the current tail from the rx fifo */
DISABLE_INTS();
ae2: f8 94 cli
dataByte = UIMgr_rxFifo[UIMgr_rxFifoTail];
ae4: 20 91 b9 00 lds r18, 0x00B9
ae8: 84 e7 ldi r24, 0x74 ; 116
aea: 92 e0 ldi r25, 0x02 ; 2
aec: fc 01 movw r30, r24
aee: e2 0f add r30, r18
af0: f1 1d adc r31, r1
af2: 90 81 ld r25, Z
tmpTail = (UIMgr_rxFifoTail+1) & (UI_MGR_RX_FIFO_MASK);
af4: 82 2f mov r24, r18
af6: 8f 5f subi r24, 0xFF ; 255
af8: 8f 71 andi r24, 0x1F ; 31
UIMgr_rxFifoTail = tmpTail;
afa: 80 93 b9 00 sts 0x00B9, r24
ENABLE_INTS();
afe: 78 94 sei
return(dataByte);
b00: 89 2f mov r24, r25
b02: 99 27 eor r25, r25
}
b04: 08 95 ret
 
00000b06 <UIMgr_readTxFifo>:
 
/***********************************************************
Function Name: UIMgr_readTxFifo
Function Description: This function is responsible for
reading a single byte of data from the tx fifo, and
updating the appropriate pointers.
Inputs: none
Outputs: unsigned char-the data read
***********************************************************/
static unsigned char UIMgr_readTxFifo(void)
{
unsigned char dataByte, tmpTail;
/* just return the current tail from the tx fifo */
DISABLE_INTS();
b06: f8 94 cli
dataByte = UIMgr_txFifo[UIMgr_txFifoTail];
b08: 20 91 bb 00 lds r18, 0x00BB
b0c: 84 e9 ldi r24, 0x94 ; 148
b0e: 92 e0 ldi r25, 0x02 ; 2
b10: fc 01 movw r30, r24
b12: e2 0f add r30, r18
b14: f1 1d adc r31, r1
b16: 90 81 ld r25, Z
tmpTail = (UIMgr_txFifoTail+1) & (UI_MGR_TX_FIFO_MASK);
b18: 82 2f mov r24, r18
b1a: 8f 5f subi r24, 0xFF ; 255
b1c: 8f 73 andi r24, 0x3F ; 63
UIMgr_txFifoTail = tmpTail;
b1e: 80 93 bb 00 sts 0x00BB, r24
ENABLE_INTS();
b22: 78 94 sei
return(dataByte);
b24: 89 2f mov r24, r25
b26: 99 27 eor r25, r25
}
b28: 08 95 ret
 
00000b2a <UIMgr_writeTxFifo>:
 
/***********************************************************
Function Name: UIMgr_writeTxFifo
Function Description: This function is responsible for
writing a single byte to the TxFifo and
updating the appropriate pointers.
Inputs: data - the byte to write to the Fifo
Outputs: none
***********************************************************/
void UIMgr_writeTxFifo(unsigned char data)
{
b2a: 38 2f mov r19, r24
unsigned char tmpHead;
 
DISABLE_INTS();
b2c: f8 94 cli
UIMgr_txFifo[UIMgr_txFifoHead] = data;
b2e: 20 91 ba 00 lds r18, 0x00BA
b32: 84 e9 ldi r24, 0x94 ; 148
b34: 92 e0 ldi r25, 0x02 ; 2
b36: fc 01 movw r30, r24
b38: e2 0f add r30, r18
b3a: f1 1d adc r31, r1
b3c: 30 83 st Z, r19
 
/* now move the head up */
tmpHead = (UIMgr_txFifoHead + 1) & (UI_MGR_TX_FIFO_MASK);
b3e: 82 2f mov r24, r18
b40: 8f 5f subi r24, 0xFF ; 255
b42: 8f 73 andi r24, 0x3F ; 63
UIMgr_txFifoHead = tmpHead;
b44: 80 93 ba 00 sts 0x00BA, r24
ENABLE_INTS();
b48: 78 94 sei
}
b4a: 08 95 ret
 
00000b4c <UartInt_init>:
void UartInt_init(void)
{
/* set up the baud rate registers so the UART will operate
at 115.2 Kbps */
UBRRH = 0x00;
b4c: 10 bc out 0x20, r1 ; 32
 
#ifdef NO_CRYSTAL
UBRRL = 18; /* 18 for double clocking at 115.2 kbps */
b4e: 82 e1 ldi r24, 0x12 ; 18
b50: 89 b9 out 0x09, r24 ; 9
#else
UBRRL = 0x08; /* for 16 MHz crystal at 115.2 kbps */
#endif
/* enable the tx and rx capabilities of the UART...as well
as the receive complete interrupt */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
b52: 88 e9 ldi r24, 0x98 ; 152
b54: 8a b9 out 0x0a, r24 ; 10
/* set up the control registers so the UART works at 8N1 */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
b56: 86 e8 ldi r24, 0x86 ; 134
b58: 80 bd out 0x20, r24 ; 32
#ifdef NO_CRYSTAL
/* set the baud rate to use the double-speed */
UCSRA = (1<<U2X);
b5a: 82 e0 ldi r24, 0x02 ; 2
b5c: 8b b9 out 0x0b, r24 ; 11
#endif
}
b5e: 08 95 ret
 
00000b60 <UartInt_txByte>:
 
/***********************************************************
Function Name: UartInt_txByte
Function Description: This function is responsible for
transmitting a single byte on the uart.
Inputs: txByte - the byte to send
Outputs: none
NOTES: When the TX UDRE (data register empty) is set, there
is puposefully no interrupt...thus, to send a string of
data out, the calling routine needs to hold up the entire
application while this takes place (or just send one
byte at a time at strtegically timed intervals, like
the stats data is sent out :-)
***********************************************************/
void UartInt_txByte(unsigned char txByte)
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
b60: 5d 9b sbis 0x0b, 5 ; 11
b62: fe cf rjmp .-4 ; 0xb60
/* Put data into buffer, sends the data */
UDR = txByte;
b64: 8c b9 out 0x0c, r24 ; 12
}
b66: 08 95 ret
 
00000b68 <__vector_11>:
 
/***********************************************************
Function Name: SIG_UART_RECV ISR
Function Description: This function is responsible for
handling the interrupt caused when a data byte is
received by the UART.
Inputs: none
Outputs: none
NOTES: This function was originally written in assembly,
but moved over to C when the setting of the "T" bit at
the end of the routine was no longer necessary (this
theoretically allowed the AVRcam to respond to serial
bytes in the middle of tracking or dumping a frame.
But it wasn't really needed, and understanding the C
is easier :-)
***********************************************************/
SIGNAL(SIG_UART_RECV)
{
b68: 1f 92 push r1
b6a: 0f 92 push r0
b6c: 0f b6 in r0, 0x3f ; 63
b6e: 0f 92 push r0
b70: 11 24 eor r1, r1
b72: 2f 93 push r18
b74: 8f 93 push r24
b76: 9f 93 push r25
b78: ef 93 push r30
b7a: ff 93 push r31
unsigned char tmpHead;
/* read the data byte, put it in the serial queue, and
post the event */
UIMgr_rxFifo[UIMgr_rxFifoHead] = UDR;
b7c: 20 91 b8 00 lds r18, 0x00B8
b80: 84 e7 ldi r24, 0x74 ; 116
b82: 92 e0 ldi r25, 0x02 ; 2
b84: fc 01 movw r30, r24
b86: e2 0f add r30, r18
b88: f1 1d adc r31, r1
b8a: 8c b1 in r24, 0x0c ; 12
b8c: 80 83 st Z, r24
 
/* now move the head up */
tmpHead = (UIMgr_rxFifoHead + 1) & (UI_MGR_RX_FIFO_MASK);
b8e: 2f 5f subi r18, 0xFF ; 255
b90: 2f 71 andi r18, 0x1F ; 31
UIMgr_rxFifoHead = tmpHead;
b92: 20 93 b8 00 sts 0x00B8, r18
/* write the serial received event to the event fifo */
Exec_eventFifo[Exec_eventFifoHead] = EV_SERIAL_DATA_RECEIVED;
b96: 20 91 70 00 lds r18, 0x0070
b9a: 8c e6 ldi r24, 0x6C ; 108
b9c: 92 e0 ldi r25, 0x02 ; 2
b9e: fc 01 movw r30, r24
ba0: e2 0f add r30, r18
ba2: f1 1d adc r31, r1
ba4: 81 e0 ldi r24, 0x01 ; 1
ba6: 80 83 st Z, r24
 
/* now move the head up */
tmpHead = (Exec_eventFifoHead + 1) & (EXEC_EVENT_FIFO_MASK);
ba8: 28 0f add r18, r24
baa: 27 70 andi r18, 0x07 ; 7
Exec_eventFifoHead = tmpHead;
bac: 20 93 70 00 sts 0x0070, r18
}
bb0: ff 91 pop r31
bb2: ef 91 pop r30
bb4: 9f 91 pop r25
bb6: 8f 91 pop r24
bb8: 2f 91 pop r18
bba: 0f 90 pop r0
bbc: 0f be out 0x3f, r0 ; 63
bbe: 0f 90 pop r0
bc0: 1f 90 pop r1
bc2: 18 95 reti
 
00000bc4 <I2CInt_init>:
Outputs: none
***********************************************************/
void I2CInt_init(void)
{
TWSR = 0;
bc4: 11 b8 out 0x01, r1 ; 1
/* init the speed of the I2C interface, running at
100 Kbps */
TWBR = (FOSC / I2C_SPEED - 16)/2;
bc6: 88 e4 ldi r24, 0x48 ; 72
bc8: 80 b9 out 0x00, r24 ; 0
}
bca: 08 95 ret
 
00000bcc <I2CInt_writeData>:
 
/***********************************************************
Function Name: I2CInt_writeData
Function Description: This function is responsible for
initiating the process of writing a sequence of bytes
an I2C slave address. This function will try to write
the data three times before giving up.
Inputs: address: the address of the I2C slave device
data: a pointer to the data to be written
to the slave...for camera interfacing,
the data follows a <register #><data>
format
bytes: the number of bytes to write
Outputs: none
***********************************************************/
void I2CInt_writeData(unsigned char address, unsigned char *data, unsigned char bytes)
{
bcc: 98 2f mov r25, r24
while(status & (1<<BUSY)); /* Bus is busy wait (or exit with error code) */
bce: 80 91 08 01 lds r24, 0x0108
bd2: 88 23 and r24, r24
bd4: e4 f3 brlt .-8 ; 0xbce
while(TWCR & (1<<TWSTO));
bd6: 06 b6 in r0, 0x36 ; 54
bd8: 04 fc sbrc r0, 4
bda: fd cf rjmp .-6 ; 0xbd6
/* copy the needed data and state info to our local I2C command structure */
twi_address = address;
bdc: 90 93 03 01 sts 0x0103, r25
twi_data = data;
be0: 70 93 05 01 sts 0x0105, r23
be4: 60 93 04 01 sts 0x0104, r22
twi_bytes = bytes;
be8: 40 93 07 01 sts 0x0107, r20
twi_ddr = TW_WRITE;
bec: 10 92 06 01 sts 0x0106, r1
 
retry_cnt = 0;
bf0: 10 92 09 01 sts 0x0109, r1
/* Generate start condition, the remainder of the transfer is interrupt driven and
will be performed in the background */
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
bf4: 85 ea ldi r24, 0xA5 ; 165
bf6: 86 bf out 0x36, r24 ; 54
status |= (1<<BUSY);
bf8: 80 91 08 01 lds r24, 0x0108
bfc: 80 68 ori r24, 0x80 ; 128
bfe: 80 93 08 01 sts 0x0108, r24
}
c02: 08 95 ret
 
00000c04 <I2CInt_readData>:
 
/***********************************************************
Function Name: I2CInt_readData
Function Description: This funcion is responsible for
reading the specified number of bytes from a slave
device.
Inputs: address: the slave address to read from
data: a pointer to where the data will be stored
bytes: the number of bytes to read
Outputs: none
***********************************************************/
void I2CInt_readData(unsigned char address, unsigned char *data, unsigned char bytes)
{
c04: 98 2f mov r25, r24
/* Bus is busy wait (or exit with error code) */
while(status & (1<<BUSY));
c06: 80 91 08 01 lds r24, 0x0108
c0a: 88 23 and r24, r24
c0c: e4 f3 brlt .-8 ; 0xc06
 
twi_address = address;
c0e: 90 93 03 01 sts 0x0103, r25
twi_data = data;
c12: 70 93 05 01 sts 0x0105, r23
c16: 60 93 04 01 sts 0x0104, r22
twi_bytes = bytes;
c1a: 40 93 07 01 sts 0x0107, r20
twi_ddr = TW_READ;
c1e: 81 e0 ldi r24, 0x01 ; 1
c20: 80 93 06 01 sts 0x0106, r24
 
retry_cnt = 0;
c24: 10 92 09 01 sts 0x0109, r1
/* Generate start condition, the remainder of the transfer is interrupt driven and
will be performed in the background */
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
c28: 85 ea ldi r24, 0xA5 ; 165
c2a: 86 bf out 0x36, r24 ; 54
status |= (1<<BUSY);
c2c: 80 91 08 01 lds r24, 0x0108
c30: 80 68 ori r24, 0x80 ; 128
c32: 80 93 08 01 sts 0x0108, r24
}
c36: 08 95 ret
 
00000c38 <I2CInt_isI2cBusy>:
 
/***********************************************************
Function Name: I2CInt_isI2cBusy
Function Description: This funcion is responsible for
indicating if the I2C bus is currently busy to external
modules.
device.
Inputs: none
Outputs: bool_t - indicating if bus is busy
***********************************************************/
bool_t I2CInt_isI2cBusy(void)
{
bool_t retVal = FALSE;
c38: 90 e0 ldi r25, 0x00 ; 0
if ( (status & (1<<BUSY)) != 0)
c3a: 80 91 08 01 lds r24, 0x0108
c3e: 88 23 and r24, r24
c40: 0c f4 brge .+2 ; 0xc44
{
retVal = TRUE;
c42: 91 e0 ldi r25, 0x01 ; 1
}
return(retVal);
c44: 89 2f mov r24, r25
c46: 99 27 eor r25, r25
}
c48: 08 95 ret
 
00000c4a <__vector_17>:
 
/***********************************************************
Function Name: <interrupt handler for I2C>
Function Description: This function is responsible for
implementing the control logic needed to perform a
read or write operation with an I2C slave.
Inputs: none
Outputs: none
***********************************************************/
SIGNAL(SIG_2WIRE_SERIAL)
{
c4a: 1f 92 push r1
c4c: 0f 92 push r0
c4e: 0f b6 in r0, 0x3f ; 63
c50: 0f 92 push r0
c52: 11 24 eor r1, r1
c54: 8f 93 push r24
c56: 9f 93 push r25
c58: af 93 push r26
c5a: bf 93 push r27
c5c: ef 93 push r30
c5e: ff 93 push r31
unsigned char TWI_status = TWSR & TW_STATUS_MASK; /* grab just the status bits */
c60: 81 b1 in r24, 0x01 ; 1
c62: 88 7f andi r24, 0xF8 ; 248
/* the entire I2C handler is state-based...determine
what needs to be done based on TWI_status */
switch(TWI_status)
c64: 99 27 eor r25, r25
c66: aa 27 eor r26, r26
c68: bb 27 eor r27, r27
c6a: fc 01 movw r30, r24
c6c: 38 97 sbiw r30, 0x08 ; 8
c6e: e1 35 cpi r30, 0x51 ; 81
c70: f1 05 cpc r31, r1
c72: 08 f0 brcs .+2 ; 0xc76
c74: 6d c0 rjmp .+218 ; 0xd50
c76: ed 5e subi r30, 0xED ; 237
c78: ff 4f sbci r31, 0xFF ; 255
c7a: 09 94 ijmp
{
case TW_START: /* Start condition */
case TW_REP_START: /* Repeated start condition */
if(retry_cnt > MAX_TWI_RETRIES)
c7c: 80 91 09 01 lds r24, 0x0109
c80: 83 30 cpi r24, 0x03 ; 3
c82: 08 f0 brcs .+2 ; 0xc86
c84: 5d c0 rjmp .+186 ; 0xd40
{
/* generate stop condition if we've reached our retry limit */
TWCR |= (1<<TWINT)|(1<<TWSTO);
status &= ~(1<<BUSY);
return;
}
/* indicate read or write */
TWDR = (twi_address<<1) + twi_ddr;
c86: 80 91 03 01 lds r24, 0x0103
c8a: 98 2f mov r25, r24
c8c: 99 0f add r25, r25
c8e: 80 91 06 01 lds r24, 0x0106
c92: 89 0f add r24, r25
c94: 83 b9 out 0x03, r24 ; 3
/* TWSTA must be cleared...also clears TWINT */
TWCR &= ~(1<<TWSTA);
c96: 86 b7 in r24, 0x36 ; 54
c98: 8f 7d andi r24, 0xDF ; 223
c9a: 4a c0 rjmp .+148 ; 0xd30
break;
 
case TW_MT_SLA_ACK: /* Slave acknowledged address, */
retry_cnt = 0;
c9c: 10 92 09 01 sts 0x0109, r1
/* tx the data, and increment the data pointer */
TWDR = *twi_data;
ca0: 11 c0 rjmp .+34 ; 0xcc4
twi_data++;
 
/* clear the int to continue */
TWCR |= (1<<TWINT);
break;
 
case TW_MT_SLA_NACK: /* Slave didn't acknowledge address, */
case TW_MR_SLA_NACK:
retry_cnt++;
ca2: 80 91 09 01 lds r24, 0x0109
ca6: 8f 5f subi r24, 0xFF ; 255
ca8: 80 93 09 01 sts 0x0109, r24
 
/* retry...*/
TWCR |= (1<<TWINT)|(1<<TWSTA)|(1<<TWSTO);
cac: 86 b7 in r24, 0x36 ; 54
cae: 80 6b ori r24, 0xB0 ; 176
cb0: 3f c0 rjmp .+126 ; 0xd30
break;
 
case TW_MT_DATA_ACK: /* Slave Acknowledged data, */
if(--twi_bytes > 0)
cb2: 80 91 07 01 lds r24, 0x0107
cb6: 81 50 subi r24, 0x01 ; 1
cb8: 80 93 07 01 sts 0x0107, r24
cbc: 80 91 07 01 lds r24, 0x0107
cc0: 88 23 and r24, r24
cc2: f1 f1 breq .+124 ; 0xd40
{
/* more data to send, so send it */
TWDR = *twi_data;
cc4: e0 91 04 01 lds r30, 0x0104
cc8: f0 91 05 01 lds r31, 0x0105
ccc: 80 81 ld r24, Z
cce: 83 b9 out 0x03, r24 ; 3
twi_data++;
cd0: cf 01 movw r24, r30
cd2: 01 96 adiw r24, 0x01 ; 1
cd4: 90 93 05 01 sts 0x0105, r25
cd8: 80 93 04 01 sts 0x0104, r24
TWCR |= (1<<TWINT);
cdc: 09 c0 rjmp .+18 ; 0xcf0
}
else
{
/* generate the stop condition if needed */
TWCR |= (1<<TWSTO)|(1<<TWINT);
status &= ~(1<<BUSY);
}
break;
 
case TW_MT_DATA_NACK: /* Slave didn't acknowledge data */
/* send the stop condition */
TWCR |= (1<<TWINT)|(1<<TWSTO);
status &= ~(1<<BUSY);
break;
 
case TW_MR_SLA_ACK: /* Slave acknowledged address */
if(--twi_bytes > 0)
cde: 80 91 07 01 lds r24, 0x0107
ce2: 81 50 subi r24, 0x01 ; 1
ce4: 80 93 07 01 sts 0x0107, r24
ce8: 80 91 07 01 lds r24, 0x0107
cec: 88 23 and r24, r24
cee: d9 f4 brne .+54 ; 0xd26
{
/* if there is more than one byte to read, acknowledge */
TWCR |= (1<<TWEA)|(1<<TWINT);
}
else
{
/* no acknowledge */
TWCR |= (1<<TWINT);
cf0: 86 b7 in r24, 0x36 ; 54
cf2: 80 68 ori r24, 0x80 ; 128
cf4: 1d c0 rjmp .+58 ; 0xd30
}
break;
 
case TW_MR_DATA_ACK: /* Master acknowledged data */
/* grab the received data */
*twi_data = TWDR;
cf6: e0 91 04 01 lds r30, 0x0104
cfa: f0 91 05 01 lds r31, 0x0105
cfe: 83 b1 in r24, 0x03 ; 3
d00: 80 83 st Z, r24
twi_data++;
d02: 80 91 04 01 lds r24, 0x0104
d06: 90 91 05 01 lds r25, 0x0105
d0a: 01 96 adiw r24, 0x01 ; 1
d0c: 90 93 05 01 sts 0x0105, r25
d10: 80 93 04 01 sts 0x0104, r24
if(--twi_bytes > 0)
d14: 80 91 07 01 lds r24, 0x0107
d18: 81 50 subi r24, 0x01 ; 1
d1a: 80 93 07 01 sts 0x0107, r24
d1e: 80 91 07 01 lds r24, 0x0107
d22: 88 23 and r24, r24
d24: 19 f0 breq .+6 ; 0xd2c
{
/* get the next data byte and ack */
TWCR |= (1<<TWEA)|(1<<TWINT);
d26: 86 b7 in r24, 0x36 ; 54
d28: 80 6c ori r24, 0xC0 ; 192
d2a: 02 c0 rjmp .+4 ; 0xd30
}
else
{
/* clear out the enable acknowledge bit */
TWCR &= ~(1<<TWEA);
d2c: 86 b7 in r24, 0x36 ; 54
d2e: 8f 7b andi r24, 0xBF ; 191
d30: 86 bf out 0x36, r24 ; 54
}
break;
d32: 0e c0 rjmp .+28 ; 0xd50
 
case TW_MR_DATA_NACK: /* Master didn't acknowledge data -> end of read process */
/* read data, and generate the stop condition */
*twi_data = TWDR;
d34: e0 91 04 01 lds r30, 0x0104
d38: f0 91 05 01 lds r31, 0x0105
d3c: 83 b1 in r24, 0x03 ; 3
d3e: 80 83 st Z, r24
TWCR |= (1<<TWSTO)|(1<<TWINT);
d40: 86 b7 in r24, 0x36 ; 54
d42: 80 69 ori r24, 0x90 ; 144
d44: 86 bf out 0x36, r24 ; 54
status &= ~(1<<BUSY);
d46: 80 91 08 01 lds r24, 0x0108
d4a: 8f 77 andi r24, 0x7F ; 127
d4c: 80 93 08 01 sts 0x0108, r24
break;
}
}
d50: ff 91 pop r31
d52: ef 91 pop r30
d54: bf 91 pop r27
d56: af 91 pop r26
d58: 9f 91 pop r25
d5a: 8f 91 pop r24
d5c: 0f 90 pop r0
d5e: 0f be out 0x3f, r0 ; 63
d60: 0f 90 pop r0
d62: 1f 90 pop r1
d64: 18 95 reti
 
00000d66 <CamConfig_init>:
Outputs: none
***********************************************************/
void CamConfig_init(void)
{
CamConfig_setCamReg(0x14,0x20); /* reduce frame size */
d66: 60 e2 ldi r22, 0x20 ; 32
d68: 84 e1 ldi r24, 0x14 ; 20
d6a: 0e d0 rcall .+28 ; 0xd88
CamConfig_setCamReg(0x39,0x40); /* gate PCLK with HREF */
d6c: 60 e4 ldi r22, 0x40 ; 64
d6e: 89 e3 ldi r24, 0x39 ; 57
d70: 0b d0 rcall .+22 ; 0xd88
CamConfig_setCamReg(0x12,0x28); /* set RGB mode, with no AWB */
d72: 68 e2 ldi r22, 0x28 ; 40
d74: 82 e1 ldi r24, 0x12 ; 18
d76: 08 d0 rcall .+16 ; 0xd88
CamConfig_setCamReg(0x28,0x05); /* set color sequencer */
d78: 65 e0 ldi r22, 0x05 ; 5
d7a: 88 e2 ldi r24, 0x28 ; 40
d7c: 05 d0 rcall .+10 ; 0xd88
CamConfig_setCamReg(0x13,0x01); /* un-tri-state the Y/UV lines */
d7e: 61 e0 ldi r22, 0x01 ; 1
d80: 83 e1 ldi r24, 0x13 ; 19
d82: 02 d0 rcall .+4 ; 0xd88
/* send the first four cmds in the I2C fifo */
CamConfig_sendFifoCmds();
d84: 06 d0 rcall .+12 ; 0xd92
}
d86: 08 95 ret
 
00000d88 <CamConfig_setCamReg>:
 
 
/***********************************************************
Function Name: CamConfig_setCamReg
Function Description: This function is responsible for
creating an I2C cmd structure and placing it into the
cmd fifo.
Inputs: reg - the register to modify
val - the new value of the register
Outputs: none
***********************************************************/
void CamConfig_setCamReg(unsigned char reg, unsigned char val)
{
i2cCmd_t cmd;
cmd.configReg = reg;
d88: 28 2f mov r18, r24
cmd.data = val;
d8a: 36 2f mov r19, r22
#ifndef SIMULATION
CamConfig_writeTxFifo(cmd);
d8c: c9 01 movw r24, r18
d8e: 2f d0 rcall .+94 ; 0xdee
#endif
}
d90: 08 95 ret
 
00000d92 <CamConfig_sendFifoCmds>:
/***********************************************************
Function Name: CamConfig_sendFifoCmds
Function Description: This function is responsible for
sending the entire contents of the config fifo. This
function won't return until the configuration process
is complete (or an error is encountered).
Inputs: none
Outputs: none
Note: Since this function is written to use the TWI
interrupt in the I2CInterface module, there will be
some busy-waiting here...no big deal, since we end up
having to trash the frame that we are executing this
slave write in anyway (since we can't meet the strict
timing requirements and write i2c at the same time).
***********************************************************/
void CamConfig_sendFifoCmds(void)
{
d92: cf 93 push r28
d94: df 93 push r29
d96: cd b7 in r28, 0x3d ; 61
d98: de b7 in r29, 0x3e ; 62
d9a: 22 97 sbiw r28, 0x02 ; 2
d9c: 0f b6 in r0, 0x3f ; 63
d9e: f8 94 cli
da0: de bf out 0x3e, r29 ; 62
da2: 0f be out 0x3f, r0 ; 63
da4: cd bf out 0x3d, r28 ; 61
i2cCmd_t cmd;
while (CamConfig_txFifoHead != CamConfig_txFifoTail)
da6: 90 91 0a 01 lds r25, 0x010A
daa: 80 91 0b 01 lds r24, 0x010B
dae: 98 17 cp r25, r24
db0: a9 f0 breq .+42 ; 0xddc
{
cmd = CamConfig_readTxFifo();
db2: 37 d0 rcall .+110 ; 0xe22
db4: 89 83 std Y+1, r24 ; 0x01
db6: 9a 83 std Y+2, r25 ; 0x02
I2CInt_writeData(CAM_ADDRESS,&cmd.configReg,SIZE_OF_I2C_CMD);
db8: 42 e0 ldi r20, 0x02 ; 2
dba: be 01 movw r22, r28
dbc: 6f 5f subi r22, 0xFF ; 255
dbe: 7f 4f sbci r23, 0xFF ; 255
dc0: 80 e6 ldi r24, 0x60 ; 96
dc2: 04 df rcall .-504 ; 0xbcc
Utility_delay(100);
dc4: 84 e6 ldi r24, 0x64 ; 100
dc6: 90 e0 ldi r25, 0x00 ; 0
dc8: 3e d0 rcall .+124 ; 0xe46
/* wait for the I2C transaction to complete */
while(I2CInt_isI2cBusy() == TRUE);
dca: 36 df rcall .-404 ; 0xc38
dcc: 81 30 cpi r24, 0x01 ; 1
dce: e9 f3 breq .-6 ; 0xdca
dd0: 90 91 0a 01 lds r25, 0x010A
dd4: 80 91 0b 01 lds r24, 0x010B
dd8: 98 17 cp r25, r24
dda: 59 f7 brne .-42 ; 0xdb2
}
}
ddc: 22 96 adiw r28, 0x02 ; 2
dde: 0f b6 in r0, 0x3f ; 63
de0: f8 94 cli
de2: de bf out 0x3e, r29 ; 62
de4: 0f be out 0x3f, r0 ; 63
de6: cd bf out 0x3d, r28 ; 61
de8: df 91 pop r29
dea: cf 91 pop r28
dec: 08 95 ret
 
00000dee <CamConfig_writeTxFifo>:
 
/***********************************************************
Function Name: CamConfig_writeTxFifo
Function Description: This function is responsible for
adding a new command to the tx fifo. It adjusts all
needed pointers.
Inputs: cmd - the i2cCmd_t to add to the fifo
Outputs: bool_t - indicating if writing to the fifo
causes it to wrap
***********************************************************/
bool_t CamConfig_writeTxFifo(i2cCmd_t cmd)
{
dee: 9c 01 movw r18, r24
unsigned char tmpHead;
bool_t retVal = TRUE;
df0: 51 e0 ldi r21, 0x01 ; 1
CamConfig_txFifo[CamConfig_txFifoHead] = cmd;
df2: 40 91 0a 01 lds r20, 0x010A
df6: 84 2f mov r24, r20
df8: 99 27 eor r25, r25
dfa: 88 0f add r24, r24
dfc: 99 1f adc r25, r25
dfe: fc 01 movw r30, r24
e00: ec 52 subi r30, 0x2C ; 44
e02: fd 4f sbci r31, 0xFD ; 253
e04: 20 83 st Z, r18
e06: 31 83 std Z+1, r19 ; 0x01
/* see if we need to wrap */
tmpHead = (CamConfig_txFifoHead+1) & (CAM_CONFIG_TX_FIFO_MASK);
e08: 84 2f mov r24, r20
e0a: 85 0f add r24, r21
e0c: 87 70 andi r24, 0x07 ; 7
CamConfig_txFifoHead = tmpHead;
e0e: 80 93 0a 01 sts 0x010A, r24
/* check to see if we have filled up the queue */
if (CamConfig_txFifoHead == CamConfig_txFifoTail)
e12: 90 91 0b 01 lds r25, 0x010B
e16: 89 17 cp r24, r25
e18: 09 f4 brne .+2 ; 0xe1c
{
/* we wrapped the fifo...return false */
retVal = FALSE;
e1a: 50 e0 ldi r21, 0x00 ; 0
}
return(retVal);
e1c: 85 2f mov r24, r21
e1e: 99 27 eor r25, r25
}
e20: 08 95 ret
 
00000e22 <CamConfig_readTxFifo>:
 
/***********************************************************
Function Name: CamConfig_readTxFifo
Function Description: This function is responsible for
reading a cmd out of the tx fifo.
Inputs: none
Outputs: i2cCmd_t - the cmd read from the fifo
***********************************************************/
static i2cCmd_t CamConfig_readTxFifo(void)
{
i2cCmd_t cmd;
unsigned char tmpTail;
/* just return the current tail from the rx fifo */
cmd = CamConfig_txFifo[CamConfig_txFifoTail];
e22: 40 91 0b 01 lds r20, 0x010B
e26: 84 2f mov r24, r20
e28: 99 27 eor r25, r25
e2a: 88 0f add r24, r24
e2c: 99 1f adc r25, r25
e2e: fc 01 movw r30, r24
e30: ec 52 subi r30, 0x2C ; 44
e32: fd 4f sbci r31, 0xFD ; 253
e34: 20 81 ld r18, Z
e36: 31 81 ldd r19, Z+1 ; 0x01
tmpTail = (CamConfig_txFifoTail+1) & (CAM_CONFIG_TX_FIFO_MASK);
e38: 84 2f mov r24, r20
e3a: 8f 5f subi r24, 0xFF ; 255
e3c: 87 70 andi r24, 0x07 ; 7
CamConfig_txFifoTail = tmpTail;
e3e: 80 93 0b 01 sts 0x010B, r24
return(cmd);
}
e42: c9 01 movw r24, r18
e44: 08 95 ret
 
00000e46 <Utility_delay>:
if needed...this isn't really a millisecond, so DON'T
depend on it for exact timing...
***********************************************************/
void Utility_delay(unsigned short numMs)
{
e46: cf 93 push r28
e48: df 93 push r29
e4a: cd b7 in r28, 0x3d ; 61
e4c: de b7 in r29, 0x3e ; 62
e4e: 24 97 sbiw r28, 0x04 ; 4
e50: 0f b6 in r0, 0x3f ; 63
e52: f8 94 cli
e54: de bf out 0x3e, r29 ; 62
e56: 0f be out 0x3f, r0 ; 63
e58: cd bf out 0x3d, r28 ; 61
e5a: 9c 01 movw r18, r24
volatile unsigned short i=0,j=0;
e5c: 19 82 std Y+1, r1 ; 0x01
e5e: 1a 82 std Y+2, r1 ; 0x02
e60: 1b 82 std Y+3, r1 ; 0x03
e62: 1c 82 std Y+4, r1 ; 0x04
#ifndef SIMULATION
for (i=0; i<numMs; i++)
e64: 19 82 std Y+1, r1 ; 0x01
e66: 1a 82 std Y+2, r1 ; 0x02
e68: 89 81 ldd r24, Y+1 ; 0x01
e6a: 9a 81 ldd r25, Y+2 ; 0x02
e6c: 82 17 cp r24, r18
e6e: 93 07 cpc r25, r19
e70: e0 f4 brcc .+56 ; 0xeaa
{
for (j=0; j<1000; j++)
e72: 1b 82 std Y+3, r1 ; 0x03
e74: 1c 82 std Y+4, r1 ; 0x04
e76: 8b 81 ldd r24, Y+3 ; 0x03
e78: 9c 81 ldd r25, Y+4 ; 0x04
e7a: 88 5e subi r24, 0xE8 ; 232
e7c: 93 40 sbci r25, 0x03 ; 3
e7e: 58 f4 brcc .+22 ; 0xe96
{
asm volatile("nop"::);
e80: 00 00 nop
e82: 8b 81 ldd r24, Y+3 ; 0x03
e84: 9c 81 ldd r25, Y+4 ; 0x04
e86: 01 96 adiw r24, 0x01 ; 1
e88: 8b 83 std Y+3, r24 ; 0x03
e8a: 9c 83 std Y+4, r25 ; 0x04
e8c: 8b 81 ldd r24, Y+3 ; 0x03
e8e: 9c 81 ldd r25, Y+4 ; 0x04
e90: 88 5e subi r24, 0xE8 ; 232
e92: 93 40 sbci r25, 0x03 ; 3
e94: a8 f3 brcs .-22 ; 0xe80
e96: 89 81 ldd r24, Y+1 ; 0x01
e98: 9a 81 ldd r25, Y+2 ; 0x02
e9a: 01 96 adiw r24, 0x01 ; 1
e9c: 89 83 std Y+1, r24 ; 0x01
e9e: 9a 83 std Y+2, r25 ; 0x02
ea0: 89 81 ldd r24, Y+1 ; 0x01
ea2: 9a 81 ldd r25, Y+2 ; 0x02
ea4: 82 17 cp r24, r18
ea6: 93 07 cpc r25, r19
ea8: 20 f3 brcs .-56 ; 0xe72
}
}
#endif
}
eaa: 24 96 adiw r28, 0x04 ; 4
eac: 0f b6 in r0, 0x3f ; 63
eae: f8 94 cli
eb0: de bf out 0x3e, r29 ; 62
eb2: 0f be out 0x3f, r0 ; 63
eb4: cd bf out 0x3d, r28 ; 61
eb6: df 91 pop r29
eb8: cf 91 pop r28
eba: 08 95 ret
 
00000ebc <DebugInt_init>:
Inputs: none
Outputs: none
***********************************************************/
void DebugInt_init(void)
{
ebc: 1f 93 push r17
/* set PortD pin6 for output */
DDRD |= 0x40;
ebe: 8e 9a sbi 0x11, 6 ; 17
/* turn on LED */
PORTD |= 0x40;
ec0: 96 9a sbi 0x12, 6 ; 18
Utility_delay(500);
ec2: 84 ef ldi r24, 0xF4 ; 244
ec4: 91 e0 ldi r25, 0x01 ; 1
ec6: bf df rcall .-130 ; 0xe46
PORTD &= 0xBF;
ec8: 1f eb ldi r17, 0xBF ; 191
eca: 82 b3 in r24, 0x12 ; 18
ecc: 81 23 and r24, r17
ece: 82 bb out 0x12, r24 ; 18
Utility_delay(500);
ed0: 84 ef ldi r24, 0xF4 ; 244
ed2: 91 e0 ldi r25, 0x01 ; 1
ed4: b8 df rcall .-144 ; 0xe46
PORTD |= 0x40;
ed6: 96 9a sbi 0x12, 6 ; 18
Utility_delay(500);
ed8: 84 ef ldi r24, 0xF4 ; 244
eda: 91 e0 ldi r25, 0x01 ; 1
edc: b4 df rcall .-152 ; 0xe46
PORTD &= 0xBF;
ede: 82 b3 in r24, 0x12 ; 18
ee0: 81 23 and r24, r17
ee2: 82 bb out 0x12, r24 ; 18
Utility_delay(500);
ee4: 84 ef ldi r24, 0xF4 ; 244
ee6: 91 e0 ldi r25, 0x01 ; 1
ee8: ae df rcall .-164 ; 0xe46
PORTD |= 0x40;
eea: 96 9a sbi 0x12, 6 ; 18
Utility_delay(500);
eec: 84 ef ldi r24, 0xF4 ; 244
eee: 91 e0 ldi r25, 0x01 ; 1
ef0: aa df rcall .-172 ; 0xe46
PORTD &= 0xBF;
ef2: 82 b3 in r24, 0x12 ; 18
ef4: 81 23 and r24, r17
ef6: 82 bb out 0x12, r24 ; 18
Utility_delay(500);
ef8: 84 ef ldi r24, 0xF4 ; 244
efa: 91 e0 ldi r25, 0x01 ; 1
efc: a4 df rcall .-184 ; 0xe46
PORTD |= 0x40;
efe: 96 9a sbi 0x12, 6 ; 18
}
f00: 1f 91 pop r17
f02: 08 95 ret
 
00000f04 <CamIntAsm_waitForNewTrackingFrame>:
; set, and the function will return.
;*****************************************************************
CamIntAsm_waitForNewTrackingFrame:
sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
f04: 96 9a sbi 0x12, 6 ; 18
cbi _SFR_IO_ADDR(PORTD),PD6
f06: 96 98 cbi 0x12, 6 ; 18
sleep
f08: 88 95 sleep
 
00000f0a <CamIntAsm_acquireTrackingLine>:
 
;*****************************************************************
; REMEMBER...everything from here on out is critically timed to be
; synchronized with the flow of pixel data from the camera...
;*****************************************************************
 
CamIntAsm_acquireTrackingLine:
brts _cleanUp
f0a: e6 f1 brts .+120 ; 0xf84
;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
;cbi _SFR_IO_ADDR(PORTD),PD6
in tmp1,_SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
f0c: 3e b5 in r19, 0x2e ; 46
ori tmp1, 0x07 ; feed Timer1
f0e: 37 60 ori r19, 0x07 ; 7
out _SFR_IO_ADDR(TCCR1B),tmp1
f10: 3e bd out 0x2e, r19 ; 46
; The line is about to start...
ldi pixelCount,0 ; Initialize the RLE stats...
f12: 00 e0 ldi r16, 0x00 ; 0
ldi pixelRunStart,PIXEL_RUN_START_INITIAL ; Remember, we always calculate
f14: 10 e5 ldi r17, 0x50 ; 80
; the pixel run length as
; TCNT1L - pixelRunStart
ldi lastColor,0x00 ; clear out the last color before we start
f16: 20 e0 ldi r18, 0x00 ; 0
mov XH,currLineBuffHigh ; Load the pointer to the current line
f18: b9 2f mov r27, r25
mov XL,currLineBuffLow ; buffer into the X pointer regs
f1a: a8 2f mov r26, r24
mov ZH,colorMapHigh ; Load the pointers to the membership
f1c: f7 2f mov r31, r23
mov ZL,colorMapLow ; lookup tables (ZL and YL will be overwritten
f1e: e6 2f mov r30, r22
mov YH,colorMapHigh ; as soon as we start reading data) to Z and Y
f20: d7 2f mov r29, r23
in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
f22: 39 b7 in r19, 0x39 ; 57
ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
f24: 34 60 ori r19, 0x04 ; 4
out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
f26: 39 bf out 0x39, r19 ; 57
ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
f28: 30 e5 ldi r19, 0x50 ; 80
ldi tmp2,0xFF ; interrupts) after 176 pixels
f2a: 4f ef ldi r20, 0xFF ; 255
out _SFR_IO_ADDR(TCNT1H),tmp2
f2c: 4d bd out 0x2d, r20 ; 45
out _SFR_IO_ADDR(TCNT1L),tmp1
f2e: 3c bd out 0x2c, r19 ; 44
mov YL,colorMapLow
f30: c6 2f mov r28, r22
in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
f32: 3b b7 in r19, 0x3b ; 59
; only use this interrupt to synchronize
; the beginning of the line
ori tmp1, HREF_INTERRUPT_ENABLE_MASK
f34: 30 68 ori r19, 0x80 ; 128
out _SFR_IO_ADDR(GICR), tmp1
f36: 3b bf out 0x3b, r19 ; 59
 
00000f38 <_trackFrame>:
;*******************************************************************************************
; Track Frame handler
;*******************************************************************************************
_trackFrame:
sbi _SFR_IO_ADDR(PORTD),PD6
f38: 96 9a sbi 0x12, 6 ; 18
sleep ; ...And we wait...
f3a: 88 95 sleep
; Returning from the interrupt/sleep wakeup will consume
; 14 clock cycles (7 to wakeup from idle sleep, 3 to vector, and 4 to return)
 
; Disable the HREF interrupt
cbi _SFR_IO_ADDR(PORTD),PD6
f3c: 96 98 cbi 0x12, 6 ; 18
in tmp1, _SFR_IO_ADDR(GICR)
f3e: 3b b7 in r19, 0x3b ; 59
andi tmp1, HREF_INTERRUPT_DISABLE_MASK
f40: 3f 77 andi r19, 0x7F ; 127
out _SFR_IO_ADDR(GICR), tmp1
f42: 3b bf out 0x3b, r19 ; 59
; A couple of NOPs are needed here to sync up the pixel data...the number (2)
; of NOPs was determined emperically by trial and error.
nop
f44: 00 00 nop
...
 
00000f48 <_acquirePixelBlock>:
nop
_acquirePixelBlock: ; Clock Cycle Count
in ZL,RB_PORT ; sample the red value (PINB) (1)
f48: e6 b3 in r30, 0x16 ; 22
in YL,G_PORT ; sample the green value (PINC) (1)
f4a: c3 b3 in r28, 0x13 ; 19
andi YL,0x0F ; clear the high nibble (1)
f4c: cf 70 andi r28, 0x0F ; 15
ldd color,Z+RED_MEM_OFFSET ; lookup the red membership (2)
f4e: 30 81 ld r19, Z
in ZL,RB_PORT ; sample the blue value (PINB) (1)
f50: e6 b3 in r30, 0x16 ; 22
ldd greenData,Y+GREEN_MEM_OFFSET; lookup the green membership (2)
f52: 48 89 ldd r20, Y+16 ; 0x10
ldd blueData,Z+BLUE_MEM_OFFSET ; lookup the blue membership (2)
f54: 50 a1 ldd r21, Z+32 ; 0x20
and color,greenData ; mask memberships together (1)
f56: 34 23 and r19, r20
and color,blueData ; to produce the final color (1)
f58: 35 23 and r19, r21
brts _cleanUpTrackingLine ; if some interrupt routine has (1...not set)
f5a: 76 f0 brts .+28 ; 0xf78
; come in and set our T flag in
; SREG, then we need to hop out
; and blow away this frames data (common cleanup)
cp color,lastColor ; check to see if the run continues (1)
f5c: 32 17 cp r19, r18
breq _acquirePixelBlock ; (2...equal)
f5e: a1 f3 breq .-24 ; 0xf48
; ___________
; 16 clock cycles
; (16 clock cycles = 1 uS = 1 pixelBlock time)
; Toggle the debug line to indicate a color change
sbi _SFR_IO_ADDR(PORTD),PD6
f60: 96 9a sbi 0x12, 6 ; 18
nop
f62: 00 00 nop
cbi _SFR_IO_ADDR(PORTD),PD6
f64: 96 98 cbi 0x12, 6 ; 18
mov tmp2,pixelRunStart ; get the count value of the
f66: 41 2f mov r20, r17
; current pixel run
in pixelCount,_SFR_IO_ADDR(TCNT1L) ; get the current TCNT1 value
f68: 0c b5 in r16, 0x2c ; 44
mov pixelRunStart,pixelCount ; reload pixelRunStart for the
f6a: 10 2f mov r17, r16
; next run
sub pixelCount,tmp2 ; pixelCount = TCNT1L - pixelRunStart
f6c: 04 1b sub r16, r20
st X+,lastColor ; record the color run in the current line buffer
f6e: 2d 93 st X+, r18
st X+,pixelCount ; with its length
f70: 0d 93 st X+, r16
mov lastColor,color ; set lastColor so we can figure out when it changes
f72: 23 2f mov r18, r19
nop ; waste one more cycle for a total of 16
f74: 00 00 nop
rjmp _acquirePixelBlock
f76: e8 cf rjmp .-48 ; 0xf48
 
00000f78 <_cleanUpTrackingLine>:
; _cleanUpTrackingLine is used to write the last run length block off to the currentLineBuffer so
; that all 176 pixels in the line are accounted for.
_cleanUpTrackingLine:
ldi pixelCount,0xFF ; the length of the last run is ALWAYS 0xFF minus the last
f78: 0f ef ldi r16, 0xFF ; 255
sub pixelCount,pixelRunStart ; pixelRunStart
f7a: 01 1b sub r16, r17
inc pixelCount ; increment pixelCount since we actually need to account
f7c: 03 95 inc r16
; for the overflow of TCNT1
st X+,color ; record the color run in the current line buffer
f7e: 3d 93 st X+, r19
st X,pixelCount
f80: 0c 93 st X, r16
rjmp _cleanUp
f82: 00 c0 rjmp .+0 ; 0xf84
 
00000f84 <_cleanUp>:
_cleanUpDumpLine:
; NOTE: If serial data is received, to interrupt the tracking of a line, we'll
; get a EV_SERIAL_DATA_RECEIVED event, and the T bit set so we will end the
; line's processing...however, the PCLK will keep on ticking for the rest of
; the frame/line, which will cause the TCNT to eventually overflow and
; interrupt us, generating a EV_ACQUIRE_LINE_COMPLETE event. We don't want
; this, so we need to actually turn off the PCLK counting each time we exit
; this loop, and only turn it on when we begin acquiring lines....
; NOT NEEDED FOR NOW...
;in tmp1, _SFR_IO_ADDR(TIMSK) ; disable TIMER1 to stop counting
;andi tmp1, DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses
;out _SFR_IO_ADDR(TIMSK),tmp1
 
_cleanUp:
; Disable the external clocking of the Timer1 counter
in tmp1, _SFR_IO_ADDR(TCCR1B)
f84: 3e b5 in r19, 0x2e ; 46
andi tmp1, 0xF8
f86: 38 7f andi r19, 0xF8 ; 248
out _SFR_IO_ADDR(TCCR1B),tmp1
f88: 3e bd out 0x2e, r19 ; 46
; Toggle the debug line to indicate the line is complete
sbi _SFR_IO_ADDR(PORTD),PD6
f8a: 96 9a sbi 0x12, 6 ; 18
cbi _SFR_IO_ADDR(PORTD),PD6
f8c: 96 98 cbi 0x12, 6 ; 18
clt ; clear out the T bit since we have detected
f8e: e8 94 clt
 
00000f90 <_exit>:
; the interruption and are exiting to handle it
_exit:
ret
f90: 08 95 ret
 
00000f92 <CamIntAsm_waitForNewDumpFrame>:
;*****************************************************************
; Function Name: CamIntAsm_waitForNewDumpFrame
; Function Description: This function is responsible for
; going to sleep until a new frame begins (indicated by
; VSYNC transitioning from low to high. This will wake
; the "VSYNC sleep" up and allow it to continue with
; acquiring a line of pixel data to dump out to the UI.
; Inputs: r25 - MSB of currentLineBuffer
; r24 - LSB of currentLineBuffer
; r23 - MSB of prevLineBuffer
; r22 - LSB of prevLineBuffer
; Outputs: none
; NOTES: This function doesn't really return...it sorta just
; floats into the acquireDumpLine function after the "VSYNC sleep"
; is awoken.
;*****************************************************************
CamIntAsm_waitForNewDumpFrame:
sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
f92: 96 9a sbi 0x12, 6 ; 18
cbi _SFR_IO_ADDR(PORTD),PD6
f94: 96 98 cbi 0x12, 6 ; 18
sleep
f96: 88 95 sleep
 
00000f98 <CamIntAsm_acquireDumpLine>:
 
;*****************************************************************
; REMEMBER...everything from here on out is critically timed to be
; synchronized with the flow of pixel data from the camera...
;*****************************************************************
 
CamIntAsm_acquireDumpLine:
brts _cleanUp
f98: ae f3 brts .-22 ; 0xf84
;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
;cbi _SFR_IO_ADDR(PORTD),PD6
mov XH,currLineBuffHigh ; Load the pointer to the current line
f9a: b9 2f mov r27, r25
mov XL,currLineBuffLow ; buffer into the X pointer regs
f9c: a8 2f mov r26, r24
 
mov YH,prevLineBuffHigh ; Load the pointer to the previous line
f9e: d7 2f mov r29, r23
mov YL,prevLineBuffLow ; buffer into the Y pointer regs
fa0: c6 2f mov r28, r22
ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
fa2: 30 e5 ldi r19, 0x50 ; 80
ldi tmp2,0xFF ; interrupts) after 176 pixels
fa4: 4f ef ldi r20, 0xFF ; 255
out _SFR_IO_ADDR(TCNT1H),tmp2
fa6: 4d bd out 0x2d, r20 ; 45
out _SFR_IO_ADDR(TCNT1L),tmp1
fa8: 3c bd out 0x2c, r19 ; 44
in tmp1, _SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
faa: 3e b5 in r19, 0x2e ; 46
ori tmp1, 0x07 ; feed Timer1
fac: 37 60 ori r19, 0x07 ; 7
out _SFR_IO_ADDR(TCCR1B),tmp1
fae: 3e bd out 0x2e, r19 ; 46
nop
fb0: 00 00 nop
in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
fb2: 39 b7 in r19, 0x39 ; 57
ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
fb4: 34 60 ori r19, 0x04 ; 4
out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
fb6: 39 bf out 0x39, r19 ; 57
in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
fb8: 3b b7 in r19, 0x3b ; 59
; only use this interrupt to synchronize
; the beginning of the line
ori tmp1, HREF_INTERRUPT_ENABLE_MASK
fba: 30 68 ori r19, 0x80 ; 128
out _SFR_IO_ADDR(GICR), tmp1
fbc: 3b bf out 0x3b, r19 ; 59
 
00000fbe <_dumpFrame>:
;*******************************************************************************************
; Dump Frame handler
;*******************************************************************************************
_dumpFrame:
sbi _SFR_IO_ADDR(PORTD),PD6
fbe: 96 9a sbi 0x12, 6 ; 18
sleep ; ...And we wait...
fc0: 88 95 sleep
 
cbi _SFR_IO_ADDR(PORTD),PD6
fc2: 96 98 cbi 0x12, 6 ; 18
in tmp1, _SFR_IO_ADDR(GICR) ; disable the HREF interrupt
fc4: 3b b7 in r19, 0x3b ; 59
andi tmp1, HREF_INTERRUPT_DISABLE_MASK ; so we don't get interrupted
fc6: 3f 77 andi r19, 0x7F ; 127
out _SFR_IO_ADDR(GICR), tmp1 ; while dumping the line
fc8: 3b bf out 0x3b, r19 ; 59
...
 
00000fcc <_sampleDumpPixel>:
nop ; Remember...if we ever remove the "cbi" instruction above,
; we need to add two more NOPs to cover this
; Ok...the following loop needs to run in 8 clock cycles, so we can get every
; pixel in the line...this shouldn't be a problem, since the PCLK timing was
; reduced by a factor of 2 whenever we go to dump a line (this is to give us
; enough time to do the sampling and storing of the pixel data). In addition,
; it is assumed that we will have to do some minor processing on the data right
; before we send it out, like mask off the top 4-bits of each, and then pack both
; low nibbles into a single byte for transmission...we just don't have time to
; do that here (only 8 instruction cycles :-) )
_sampleDumpPixel:
in tmp1,G_PORT ; sample the G value (1)
fcc: 33 b3 in r19, 0x13 ; 19
in tmp2,RB_PORT ; sample the R/B value (1)
fce: 46 b3 in r20, 0x16 ; 22
st X+,tmp1 ; store to the currLineBuff and inc ptrs(2)
fd0: 3d 93 st X+, r19
st Y+,tmp2 ; store to the prevLineBuff and inc ptrs(2)
fd2: 49 93 st Y+, r20
brtc _sampleDumpPixel ; loop back unless flag is set (2...if not set)
fd4: de f7 brtc .-10 ; 0xfcc
; ___________
; 8 cycles normally
; if we make it here, it means the T flag is set, and we must have been interrupted
; so we need to exit (what if we were interrupted for serial? should we disable it?)
rjmp _cleanUpDumpLine
fd6: d6 cf rjmp .-84 ; 0xf84
 
00000fd8 <__vector_1>:
 
;***********************************************************
; Function Name: <interrupt handler for External Interrupt0>
; Function Description: This function is responsible
; for handling a rising edge on the Ext Interrupt 0. This
; routine simply returns, since we just want to wake up
; whenever the VSYNC transitions (meaning the start of a new
; frame).
; Inputs: none
; Outputs: none
;***********************************************************
SIG_INTERRUPT0:
; This will wake us up when VSYNC transitions high...we just want to return
reti
fd8: 18 95 reti
 
00000fda <__vector_2>:
;***********************************************************
; Function Name: <interrupt handler for External Interrupt1>
; Function Description: This function is responsible
; for handling a falling edge on the Ext Interrupt 1. This
; routine simply returns, since we just want to wake up
; whenever the HREF transitions (meaning the pixels
; are starting after VSYNC transitioned, and we need to
; start acquiring the pixel blocks
; Inputs: none
; Outputs: none
;***********************************************************
SIG_INTERRUPT1:
; This will wake us up when HREF transitions high...we just want to return
reti
fda: 18 95 reti
 
00000fdc <__vector_8>:
;***********************************************************
; Function Name: <interrupt handler for Timer0 overflow>
; Function Description: This function is responsible
; for handling the Timer0 overflow (hooked up to indicate
; when we have reached the number of HREFs required in a
; single frame). We set the T flag in the SREG to
; indicate to the _acquirePixelBlock routine that it needs
; to exit, and then set the appropriate action to take in
; the eventList of the Executive module.
; Inputs: none
; Outputs: none
; Note: Originally, the HREF pulses were also going to
; be counted by a hardware counter, but it didn't end up
; being necessary
;***********************************************************
;SIG_OVERFLOW0:
; set ; set the T bit in SREG
; lds tmp1,eventBitmask
; ori tmp1,EV_ACQUIRE_FRAME_COMPLETE
; sts eventBitmask,tmp1
; reti
;***********************************************************
; Function Name: <interrupt handler for Timer1 overflow>
; Function Description: This function is responsible
; for handling the Timer1 overflow (hooked up to indicate
; when we have reached the end of a line of pixel data,
; since PCLK is hooked up to overflow TCNT1 after 176
; pixels). This routine generates an acquire line complete
; event in the fastEventBitmask, which is streamlined for
; efficiency reasons.
;***********************************************************
SIG_OVERFLOW1:
lds tmp1,fastEventBitmask ; set a flag indicating
fdc: 30 91 72 00 lds r19, 0x0072
ori tmp1,FEV_ACQUIRE_LINE_COMPLETE ; a line is complete
fe0: 31 60 ori r19, 0x01 ; 1
sts fastEventBitmask,tmp1
fe2: 30 93 72 00 sts 0x0072, r19
set ; set the T bit in SREG
fe6: 68 94 set
;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
;cbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
 
reti
fe8: 18 95 reti
 
00000fea <__vector_default>:
 
; This is the default handler for all interrupts that don't
; have handler routines specified for them.
.global __vector_default
__vector_default:
reti
fea: 18 95 reti
 
00000fec <atoi>:
fec: fc 01 movw r30, r24
fee: 88 27 eor r24, r24
ff0: 99 27 eor r25, r25
ff2: e8 94 clt
 
00000ff4 <.atoi_loop>:
ff4: 21 91 ld r18, Z+
ff6: 22 23 and r18, r18
ff8: e9 f0 breq .+58 ; 0x1034
ffa: 20 32 cpi r18, 0x20 ; 32
ffc: d9 f3 breq .-10 ; 0xff4
ffe: 29 30 cpi r18, 0x09 ; 9
1000: c9 f3 breq .-14 ; 0xff4
1002: 2a 30 cpi r18, 0x0A ; 10
1004: b9 f3 breq .-18 ; 0xff4
1006: 2c 30 cpi r18, 0x0C ; 12
1008: a9 f3 breq .-22 ; 0xff4
100a: 2d 30 cpi r18, 0x0D ; 13
100c: 99 f3 breq .-26 ; 0xff4
100e: 26 37 cpi r18, 0x76 ; 118
1010: 89 f3 breq .-30 ; 0xff4
1012: 2b 32 cpi r18, 0x2B ; 43
1014: 19 f0 breq .+6 ; 0x101c
1016: 2d 32 cpi r18, 0x2D ; 45
1018: 21 f4 brne .+8 ; 0x1022
 
0000101a <.atoi_neg>:
101a: 68 94 set
 
0000101c <.atoi_loop2>:
101c: 21 91 ld r18, Z+
101e: 22 23 and r18, r18
1020: 49 f0 breq .+18 ; 0x1034
 
00001022 <.atoi_digit>:
1022: 20 33 cpi r18, 0x30 ; 48
1024: 3c f0 brlt .+14 ; 0x1034
1026: 2a 33 cpi r18, 0x3A ; 58
1028: 2c f4 brge .+10 ; 0x1034
102a: 20 53 subi r18, 0x30 ; 48
102c: 2f d0 rcall .+94 ; 0x108c
102e: 82 0f add r24, r18
1030: 91 1d adc r25, r1
1032: f4 cf rjmp .-24 ; 0x101c
 
00001034 <.atoi_sig>:
1034: 81 15 cp r24, r1
1036: 91 05 cpc r25, r1
1038: 21 f0 breq .+8 ; 0x1042
103a: 1e f4 brtc .+6 ; 0x1042
103c: 80 95 com r24
103e: 90 95 com r25
1040: 01 96 adiw r24, 0x01 ; 1
 
00001042 <.atoi_done>:
1042: 08 95 ret
 
00001044 <eeprom_read_byte>:
1044: e1 99 sbic 0x1c, 1 ; 28
1046: fe cf rjmp .-4 ; 0x1044
1048: 9f bb out 0x1f, r25 ; 31
104a: 8e bb out 0x1e, r24 ; 30
104c: e0 9a sbi 0x1c, 0 ; 28
104e: 99 27 eor r25, r25
1050: 8d b3 in r24, 0x1d ; 29
1052: 08 95 ret
 
00001054 <eeprom_read_block>:
1054: 41 15 cp r20, r1
1056: 51 05 cpc r21, r1
1058: 69 f0 breq .+26 ; 0x1074
105a: dc 01 movw r26, r24
 
0000105c <eeprom_read_block_busy>:
105c: e1 99 sbic 0x1c, 1 ; 28
105e: fe cf rjmp .-4 ; 0x105c
 
00001060 <eeprom_read_block_loop>:
1060: 7f bb out 0x1f, r23 ; 31
1062: 6e bb out 0x1e, r22 ; 30
1064: e0 9a sbi 0x1c, 0 ; 28
1066: 6f 5f subi r22, 0xFF ; 255
1068: 7f 4f sbci r23, 0xFF ; 255
106a: 0d b2 in r0, 0x1d ; 29
106c: 0d 92 st X+, r0
106e: 41 50 subi r20, 0x01 ; 1
1070: 50 40 sbci r21, 0x00 ; 0
1072: b1 f7 brne .-20 ; 0x1060
 
00001074 <eeprom_read_block_done>:
1074: 08 95 ret
 
00001076 <eeprom_write_byte>:
1076: e1 99 sbic 0x1c, 1 ; 28
1078: fe cf rjmp .-4 ; 0x1076
107a: 9f bb out 0x1f, r25 ; 31
107c: 8e bb out 0x1e, r24 ; 30
107e: 6d bb out 0x1d, r22 ; 29
1080: 0f b6 in r0, 0x3f ; 63
1082: f8 94 cli
1084: e2 9a sbi 0x1c, 2 ; 28
1086: e1 9a sbi 0x1c, 1 ; 28
1088: 0f be out 0x3f, r0 ; 63
108a: 08 95 ret
 
0000108c <__mulhi_const_10>:
108c: 7a e0 ldi r23, 0x0A ; 10
108e: 97 9f mul r25, r23
1090: 90 2d mov r25, r0
1092: 87 9f mul r24, r23
1094: 80 2d mov r24, r0
1096: 91 0d add r25, r1
1098: 11 24 eor r1, r1
109a: 08 95 ret
 
0000109c <_exit>:
109c: ff cf rjmp .-2 ; 0x109c
/programy/Atmel_C/AVRcam/AVRcam.map
0,0 → 1,585
Archive member included because of file (symbol)
 
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_exit.o)
Main.o (exit)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_copy_data.o)
CamInterface.o (__do_copy_data)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_clear_bss.o)
CamInterface.o (__do_clear_bss)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(atoi.o)
UIMgr.o (atoi)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_rb.o)
UIMgr.o (eeprom_read_byte)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_rblk.o)
CamInterface.o (eeprom_read_block)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_wb.o)
UIMgr.o (eeprom_write_byte)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(mul10.o)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(atoi.o) (__mulhi_const_10)
 
Allocating common symbols
Common symbol size file
 
previousLineBuffer 0xb0 CamInterface.o
UIMgr_rxFifo 0x20 UIMgr.o
currentLineBuffer 0xb0 CamInterface.o
Exec_eventFifo 0x8 Executive.o
CamConfig_txFifo 0x10 CamConfig.o
UIMgr_txFifo 0x40 UIMgr.o
 
Memory Configuration
 
Name Origin Length Attributes
text 0x00000000 0x00002000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
*default* 0x00000000 0xffffffff
 
Linker script and memory map
 
LOAD C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
LOAD CamInterface.o
LOAD Main.o
LOAD Executive.o
LOAD FrameMgr.o
LOAD UIMgr.o
LOAD UartInterface.o
LOAD I2CInterface.o
LOAD CamConfig.o
LOAD Utility.o
LOAD DebugInterface.o
LOAD CamInterfaceAsm.o
Address of section .noinit set to 0x800300
LOAD C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libm.a
LOAD C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a
LOAD C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a
LOAD C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a
 
.hash
*(.hash)
 
.dynsym
*(.dynsym)
 
.dynstr
*(.dynstr)
 
.gnu.version
*(.gnu.version)
 
.gnu.version_d
*(.gnu.version_d)
 
.gnu.version_r
*(.gnu.version_r)
 
.rel.init
*(.rel.init)
 
.rela.init
*(.rela.init)
 
.rel.text
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
 
.rela.text
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
 
.rel.fini
*(.rel.fini)
 
.rela.fini
*(.rela.fini)
 
.rel.rodata
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
 
.rela.rodata
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
 
.rel.data
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
 
.rela.data
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
 
.rel.ctors
*(.rel.ctors)
 
.rela.ctors
*(.rela.ctors)
 
.rel.dtors
*(.rel.dtors)
 
.rela.dtors
*(.rela.dtors)
 
.rel.got
*(.rel.got)
 
.rela.got
*(.rela.got)
 
.rel.bss
*(.rel.bss)
 
.rela.bss
*(.rela.bss)
 
.rel.plt
*(.rel.plt)
 
.rela.plt
*(.rela.plt)
 
.text 0x00000000 0x109e
*(.vectors)
.vectors 0x00000000 0x26 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
0x00000000 __vectors
0x00000026 __ctors_start = .
*(.ctors)
0x00000026 __ctors_end = .
0x00000026 __dtors_start = .
*(.dtors)
0x00000026 __dtors_end = .
*(.progmem.gcc*)
.progmem.gcc_sw_table
0x00000026 0xa2 I2CInterface.o
*(.progmem*)
0x000000c8 . = ALIGN (0x2)
*(.init0)
*(.init1)
*(.init2)
.init2 0x000000c8 0xc C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
*(.init3)
*(.init4)
.init4 0x000000d4 0x16 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_copy_data.o)
0x000000d4 __do_copy_data
.init4 0x000000ea 0x10 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_clear_bss.o)
0x000000ea __do_clear_bss
*(.init5)
*(.init6)
*(.init7)
*(.init8)
*(.init9)
.init9 0x000000fa 0x2 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
*(.text)
.text 0x000000fc 0x2 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
0x000000fc __vector_12
0x000000fc __bad_interrupt
0x000000fc __vector_6
0x000000fc __vector_3
0x000000fc __vector_13
0x000000fc __vector_7
0x000000fc __vector_5
0x000000fc __vector_4
0x000000fc __vector_9
0x000000fc __vector_15
0x000000fc __vector_14
0x000000fc __vector_10
0x000000fc __vector_16
0x000000fc __vector_18
.text 0x000000fe 0x60 CamInterface.o
0x000000fe CamInt_init
0x0000015c CamInt_resetCam
.text 0x0000015e 0x26 Main.o
0x0000015e main
.text 0x00000184 0xf0 Executive.o
0x00000252 Exec_writeEventFifo
0x00000184 Exec_run
.text 0x00000274 0x428 FrameMgr.o
0x000002f8 FrameMgr_acquireFrame
0x0000032e FrameMgr_acquireLine
0x00000282 FrameMgr_dispatchEvent
0x0000050c FrameMgr_processFrame
0x00000274 FrameMgr_init
0x00000392 FrameMgr_processLine
.text 0x0000069c 0x4b0 UIMgr.o
0x00000ac4 UIMgr_flushTxBuffer
0x00000b2a UIMgr_writeTxFifo
0x00000710 UIMgr_processReceivedData
0x0000069c UIMgr_init
0x00000a6e UIMgr_writeBufferToTxFifo
0x00000aa0 UIMgr_txBuffer
0x000006fc UIMgr_transmitPendingData
0x000006d2 UIMgr_dispatchEvent
.text 0x00000b4c 0x78 UartInterface.o
0x00000b4c UartInt_init
0x00000b68 __vector_11
0x00000b60 UartInt_txByte
.text 0x00000bc4 0x1a2 I2CInterface.o
0x00000c38 I2CInt_isI2cBusy
0x00000c04 I2CInt_readData
0x00000c4a __vector_17
0x00000bc4 I2CInt_init
0x00000bcc I2CInt_writeData
.text 0x00000d66 0xe0 CamConfig.o
0x00000d66 CamConfig_init
0x00000dee CamConfig_writeTxFifo
0x00000d92 CamConfig_sendFifoCmds
0x00000d88 CamConfig_setCamReg
.text 0x00000e46 0x76 Utility.o
0x00000e46 Utility_delay
.text 0x00000ebc 0x48 DebugInterface.o
0x00000ebc DebugInt_init
.text 0x00000f04 0xe8 CamInterfaceAsm.o
0x00000fd8 __vector_1
0x00000f98 CamIntAsm_acquireDumpLine
0x00000fea __vector_default
0x00000fda __vector_2
0x00000f92 CamIntAsm_waitForNewDumpFrame
0x00000f04 CamIntAsm_waitForNewTrackingFrame
0x00000f0a CamIntAsm_acquireTrackingLine
0x00000fdc __vector_8
.text 0x00000fec 0x58 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(atoi.o)
0x00000fec atoi
.text 0x00001044 0x10 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_rb.o)
0x00001044 eeprom_read_byte
.text 0x00001054 0x22 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_rblk.o)
0x00001054 eeprom_read_block
.text 0x00001076 0x16 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_wb.o)
0x00001076 eeprom_write_byte
.text 0x0000108c 0x10 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(mul10.o)
0x0000108c __mulhi_const_10
0x0000109c . = ALIGN (0x2)
*(.text.*)
0x0000109c . = ALIGN (0x2)
*(.fini9)
*(.fini8)
*(.fini7)
*(.fini6)
*(.fini5)
*(.fini4)
*(.fini3)
*(.fini2)
*(.fini1)
*(.fini0)
.fini0 0x0000109c 0x2 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_exit.o)
0x0000109e _etext = .
 
.data 0x00800060 0x10 load address 0x0000109e
0x00800060 PROVIDE (__data_start, .)
*(.data)
.data 0x00800060 0x2 FrameMgr.o
.data 0x00800062 0xe UIMgr.o
*(.gnu.linkonce.d*)
0x00800070 . = ALIGN (0x2)
0x00800070 _edata = .
0x00800070 PROVIDE (__data_end, .)
 
.bss 0x00800070 0x274
0x00800070 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x00800070 0x3 Executive.o
0x00800071 Exec_eventFifoTail
0x00800072 fastEventBitmask
0x00800070 Exec_eventFifoHead
.bss 0x00800073 0x45 FrameMgr.o
.bss 0x008000b8 0x4b UIMgr.o
0x008000b9 UIMgr_rxFifoTail
0x008000bb UIMgr_txFifoTail
0x008000ba UIMgr_txFifoHead
0x008000b8 UIMgr_rxFifoHead
.bss 0x00800103 0x7 I2CInterface.o
.bss 0x0080010a 0x2 CamConfig.o
0x0080010a CamConfig_txFifoHead
0x0080010b CamConfig_txFifoTail
*(COMMON)
COMMON 0x0080010c 0x160 CamInterface.o
0x0 (size before relaxing)
0x0080010c previousLineBuffer
0x008001bc currentLineBuffer
COMMON 0x0080026c 0x8 Executive.o
0x0 (size before relaxing)
0x0080026c Exec_eventFifo
COMMON 0x00800274 0x60 UIMgr.o
0x0 (size before relaxing)
0x00800274 UIMgr_rxFifo
0x00800294 UIMgr_txFifo
COMMON 0x008002d4 0x10 CamConfig.o
0x0 (size before relaxing)
0x008002d4 CamConfig_txFifo
0x008002e4 PROVIDE (__bss_end, .)
0x0000109e __data_load_start = LOADADDR (.data)
0x000010ae __data_load_end = (__data_load_start + SIZEOF (.data))
 
.noinit 0x00800300 0x30
0x00800300 PROVIDE (__noinit_start, .)
*(.noinit*)
.noinit 0x00800300 0x30 CamInterface.o
0x00800300 colorMap
0x00800330 PROVIDE (__noinit_end, .)
0x00800330 _end = .
0x00800330 PROVIDE (__heap_start, .)
 
.eeprom 0x00810000 0x0 load address 0x000010ae
*(.eeprom*)
0x00810000 __eeprom_end = .
 
.stab 0x00000000 0x3f30
*(.stab)
.stab 0x00000000 0x51c CamInterface.o
.stab 0x0000051c 0x318 Main.o
0x3fc (size before relaxing)
.stab 0x00000834 0x4bc Executive.o
0x5dc (size before relaxing)
.stab 0x00000cf0 0xce4 FrameMgr.o
0xe1c (size before relaxing)
.stab 0x000019d4 0xe4c UIMgr.o
0x1014 (size before relaxing)
.stab 0x00002820 0x300 UartInterface.o
0x390 (size before relaxing)
.stab 0x00002b20 0x5a0 I2CInterface.o
0x624 (size before relaxing)
.stab 0x000030c0 0x48c CamConfig.o
0x510 (size before relaxing)
.stab 0x0000354c 0x21c Utility.o
0x270 (size before relaxing)
.stab 0x00003768 0x258 DebugInterface.o
0x2c4 (size before relaxing)
.stab 0x000039c0 0x570 CamInterfaceAsm.o
0x57c (size before relaxing)
 
.stabstr 0x00000000 0x181e
*(.stabstr)
.stabstr 0x00000000 0x181e CamInterface.o
0x0 (size before relaxing)
 
.stab.excl
*(.stab.excl)
 
.stab.exclstr
*(.stab.exclstr)
 
.stab.index
*(.stab.index)
 
.stab.indexstr
*(.stab.indexstr)
 
.comment
*(.comment)
 
.debug
*(.debug)
 
.line
*(.line)
 
.debug_srcinfo
*(.debug_srcinfo)
 
.debug_sfnames
*(.debug_sfnames)
 
.debug_aranges
*(.debug_aranges)
 
.debug_pubnames
*(.debug_pubnames)
 
.debug_info
*(.debug_info)
*(.gnu.linkonce.wi.*)
 
.debug_abbrev
*(.debug_abbrev)
 
.debug_line
*(.debug_line)
 
.debug_frame
*(.debug_frame)
 
.debug_str
*(.debug_str)
 
.debug_loc
*(.debug_loc)
 
.debug_macinfo
*(.debug_macinfo)
OUTPUT(AVRcam.elf elf32-avr)
 
Cross Reference Table
 
Symbol File
CamConfig_init CamConfig.o
Main.o
CamConfig_sendFifoCmds CamConfig.o
UIMgr.o
FrameMgr.o
CamConfig_setCamReg CamConfig.o
UIMgr.o
FrameMgr.o
CamConfig_txFifo CamConfig.o
CamConfig_txFifoHead CamConfig.o
CamConfig_txFifoTail CamConfig.o
CamConfig_writeTxFifo CamConfig.o
CamIntAsm_acquireDumpLine CamInterfaceAsm.o
FrameMgr.o
CamIntAsm_acquireTrackingLine CamInterfaceAsm.o
FrameMgr.o
CamIntAsm_waitForNewDumpFrame CamInterfaceAsm.o
CamIntAsm_waitForNewTrackingFrame CamInterfaceAsm.o
CamInt_init CamInterface.o
Main.o
CamInt_resetCam CamInterface.o
UIMgr.o
DebugInt_init DebugInterface.o
Main.o
Exec_eventFifo UartInterface.o
Executive.o
Exec_eventFifoHead Executive.o
UartInterface.o
Exec_eventFifoTail Executive.o
Exec_run Executive.o
Main.o
Exec_writeEventFifo Executive.o
UIMgr.o
FrameMgr.o
FrameMgr_acquireFrame FrameMgr.o
FrameMgr_acquireLine FrameMgr.o
Executive.o
FrameMgr_dispatchEvent FrameMgr.o
Executive.o
FrameMgr_init FrameMgr.o
Main.o
FrameMgr_processFrame FrameMgr.o
FrameMgr_processLine FrameMgr.o
Executive.o
I2CInt_init I2CInterface.o
Main.o
I2CInt_isI2cBusy I2CInterface.o
CamConfig.o
I2CInt_readData I2CInterface.o
I2CInt_writeData I2CInterface.o
CamConfig.o
UIMgr_dispatchEvent UIMgr.o
Executive.o
UIMgr_flushTxBuffer UIMgr.o
UIMgr_init UIMgr.o
Main.o
UIMgr_processReceivedData UIMgr.o
UIMgr_rxFifo UartInterface.o
UIMgr.o
UIMgr_rxFifoHead UIMgr.o
UartInterface.o
UIMgr_rxFifoTail UIMgr.o
UIMgr_transmitPendingData UIMgr.o
Executive.o
UIMgr_txBuffer UIMgr.o
UIMgr_txFifo UIMgr.o
UIMgr_txFifoHead UIMgr.o
UIMgr_txFifoTail UIMgr.o
UIMgr_writeBufferToTxFifo UIMgr.o
UIMgr_writeTxFifo UIMgr.o
FrameMgr.o
UartInt_init UartInterface.o
Main.o
UartInt_txByte UartInterface.o
UIMgr.o
FrameMgr.o
Utility_delay Utility.o
DebugInterface.o
CamConfig.o
UIMgr.o
FrameMgr.o
Main.o
__bad_interrupt C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__bss_end C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_clear_bss.o)
__bss_start C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_clear_bss.o)
__data_end C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_copy_data.o)
__data_load_start C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_copy_data.o)
__data_start C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_copy_data.o)
__do_clear_bss C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_clear_bss.o)
DebugInterface.o
Utility.o
CamConfig.o
I2CInterface.o
UartInterface.o
UIMgr.o
FrameMgr.o
Executive.o
Main.o
CamInterface.o
__do_copy_data C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_copy_data.o)
DebugInterface.o
Utility.o
CamConfig.o
I2CInterface.o
UartInterface.o
UIMgr.o
FrameMgr.o
Executive.o
Main.o
CamInterface.o
__heap_end C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__init C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__mulhi_const_10 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(mul10.o)
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(atoi.o)
__stack C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
Main.o
__vector_1 CamInterfaceAsm.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_10 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_11 UartInterface.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_12 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_13 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_14 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_15 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_16 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_17 I2CInterface.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_18 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_2 CamInterfaceAsm.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_3 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_4 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_5 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_6 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_7 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_8 CamInterfaceAsm.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vector_9 C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
CamInterfaceAsm.o
__vector_default CamInterfaceAsm.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
__vectors C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
_exit C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_exit.o)
atoi C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(atoi.o)
UIMgr.o
colorMap CamInterface.o
UIMgr.o
FrameMgr.o
currentLineBuffer FrameMgr.o
CamInterface.o
eeprom_read_block C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_rblk.o)
CamInterface.o
eeprom_read_byte C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_rb.o)
UIMgr.o
eeprom_write_byte C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\libc.a(ee_wb.o)
UIMgr.o
exit C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\avr4\libgcc.a(_exit.o)
Main.o
fastEventBitmask Executive.o
CamInterfaceAsm.o
FrameMgr.o
main Main.o
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr4\crtm8.o
previousLineBuffer FrameMgr.o
CamInterface.o
/programy/Atmel_C/AVRcam/CamConfig.c
0,0 → 1,192
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/**********************************************************
Module Name: CamConfig.c
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module is responsible for the
high-level configuration activities of the OV6620
camera module. This module interfaces with the
I2CInterface module to perform this configuration.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
11/15/2004 1.2 Added code to un-tri-state the
OV6620's pixel data busses at
startup after four seconds.
This was added in to
allow the user to re-program the
mega8 at startup if needed.
***********************************************************/
 
/* Includes */
#include <avr/io.h>
#include "CamConfig.h"
#include "I2CInterface.h"
#include "CommonDefs.h"
#include "Utility.h"
 
/**********************************************************/
/* Definitions */
/* The length of an I2C command is made up of a register address
plus the actual value of the register */
#define SIZE_OF_I2C_CMD 2
#define MAX_NUM_CONFIG_CMDS 8
#define CAM_CONFIG_TX_FIFO_SIZE MAX_NUM_CONFIG_CMDS
#define CAM_CONFIG_TX_FIFO_MASK CAM_CONFIG_TX_FIFO_SIZE-1
 
/* Local Variables */
 
/* Local Structures and Typedefs */
 
/* Local Function Prototypes */
static i2cCmd_t CamConfig_readTxFifo(void);
 
/* Extern Variables */
i2cCmd_t CamConfig_txFifo[CAM_CONFIG_TX_FIFO_SIZE];
unsigned char CamConfig_txFifoHead=0;
unsigned char CamConfig_txFifoTail=0;
 
/***********************************************************
Function Name: CamConfig_init
Function Description: This function is responsible for
performing the initial configuration of the camera.
Inputs: none
Outputs: none
***********************************************************/
void CamConfig_init(void)
{
CamConfig_setCamReg(0x14,0x20); /* reduce frame size */
CamConfig_setCamReg(0x39,0x40); /* gate PCLK with HREF */
CamConfig_setCamReg(0x12,0x28); /* set RGB mode, with no AWB */
CamConfig_setCamReg(0x28,0x05); /* set color sequencer */
CamConfig_setCamReg(0x13,0x01); /* un-tri-state the Y/UV lines */
/* send the first four cmds in the I2C fifo */
CamConfig_sendFifoCmds();
}
 
 
/***********************************************************
Function Name: CamConfig_setCamReg
Function Description: This function is responsible for
creating an I2C cmd structure and placing it into the
cmd fifo.
Inputs: reg - the register to modify
val - the new value of the register
Outputs: none
***********************************************************/
void CamConfig_setCamReg(unsigned char reg, unsigned char val)
{
i2cCmd_t cmd;
cmd.configReg = reg;
cmd.data = val;
#ifndef SIMULATION
CamConfig_writeTxFifo(cmd);
#endif
}
/***********************************************************
Function Name: CamConfig_sendFifoCmds
Function Description: This function is responsible for
sending the entire contents of the config fifo. This
function won't return until the configuration process
is complete (or an error is encountered).
Inputs: none
Outputs: none
Note: Since this function is written to use the TWI
interrupt in the I2CInterface module, there will be
some busy-waiting here...no big deal, since we end up
having to trash the frame that we are executing this
slave write in anyway (since we can't meet the strict
timing requirements and write i2c at the same time).
***********************************************************/
void CamConfig_sendFifoCmds(void)
{
i2cCmd_t cmd;
while (CamConfig_txFifoHead != CamConfig_txFifoTail)
{
cmd = CamConfig_readTxFifo();
I2CInt_writeData(CAM_ADDRESS,&cmd.configReg,SIZE_OF_I2C_CMD);
Utility_delay(100);
/* wait for the I2C transaction to complete */
while(I2CInt_isI2cBusy() == TRUE);
}
}
 
/***********************************************************
Function Name: CamConfig_writeTxFifo
Function Description: This function is responsible for
adding a new command to the tx fifo. It adjusts all
needed pointers.
Inputs: cmd - the i2cCmd_t to add to the fifo
Outputs: bool_t - indicating if writing to the fifo
causes it to wrap
***********************************************************/
bool_t CamConfig_writeTxFifo(i2cCmd_t cmd)
{
unsigned char tmpHead;
bool_t retVal = TRUE;
CamConfig_txFifo[CamConfig_txFifoHead] = cmd;
/* see if we need to wrap */
tmpHead = (CamConfig_txFifoHead+1) & (CAM_CONFIG_TX_FIFO_MASK);
CamConfig_txFifoHead = tmpHead;
/* check to see if we have filled up the queue */
if (CamConfig_txFifoHead == CamConfig_txFifoTail)
{
/* we wrapped the fifo...return false */
retVal = FALSE;
}
return(retVal);
}
 
/***********************************************************
Function Name: CamConfig_readTxFifo
Function Description: This function is responsible for
reading a cmd out of the tx fifo.
Inputs: none
Outputs: i2cCmd_t - the cmd read from the fifo
***********************************************************/
static i2cCmd_t CamConfig_readTxFifo(void)
{
i2cCmd_t cmd;
unsigned char tmpTail;
/* just return the current tail from the rx fifo */
cmd = CamConfig_txFifo[CamConfig_txFifoTail];
tmpTail = (CamConfig_txFifoTail+1) & (CAM_CONFIG_TX_FIFO_MASK);
CamConfig_txFifoTail = tmpTail;
return(cmd);
}
/programy/Atmel_C/AVRcam/CamConfig.d
0,0 → 1,2
CamConfig.o CamConfig.d : CamConfig.c CamConfig.h I2CInterface.h CommonDefs.h \
Utility.h
/programy/Atmel_C/AVRcam/CamConfig.h
0,0 → 1,65
#ifndef CAMCONFIG_H
#define CAMCONFIG_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: CamConfig.h
Module Date: 04/12/2004
Module Auth: John Orlando
Description: This file provides the external interface
to the CamConfig module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
#include "I2CInterface.h"
/* This is the I2C slave address of the OV6620 module.
NOTE: The actual address of the camera is 0xC0. However,
the TWI interface on the mega8 needs to have the address
shifted one bit to the right, which yields 0x60. The
LSB is used to set whether the operation is read or
write. */
#define CAM_ADDRESS 0x60
extern i2cCmd_t CamConfig_txFifo[];
extern unsigned char CamConfig_txFifoHead;
extern unsigned char CamConfig_txFifoTail;
extern bool_t CamConfig_txComplete;
 
extern void CamConfig_init(void);
extern bool_t CamConfig_writeTxFifo(i2cCmd_t cmd);
extern void CamConfig_setCamReg(unsigned char reg, unsigned char val);
extern void CamConfig_sendFifoCmds(void);
#endif
 
/programy/Atmel_C/AVRcam/CamInterface.S
0,0 → 1,76
; Module Name: CanInterface.S
; Module Date: 04/14/2004
; Module Auth: John O.
;
; Description: This module provides the low-level interface
; to the OV6620 camera hardware. It is responsible for
; acquiring each pixel block (RG,GB), performing the mapping
; into an actual color (orange, purple, etc), run-length
; encoding the data, and storing the info off to the appropriate
; line buffer. This routine is synchronized with the pixel data
; so that no polling of the camera data needs to be done (the
; OV6620 is clocked off of the same crystal source as the mega8,
; thus providing inherent synchronization between the two).
 
#include <avr/io.h>
 
#define PCLK_INTERRUPT_ENABLE_MASK $40
#define PCLK_INTERRUPT_DISABLE_MASK $BF
 
.section .text
 
.global CamInt_waitForNewFrame
.global CamInt_acquireLine
.global SIG_INTERRUPT0
.global SIG_INTERRUPT1
;*****************************************************************
; Function Name: CamInt_waitForNewFrame
; Function Description: This function is responsible for
; going to sleep until a new frame begins (indicated by
; VSYNC transitioning from high to low. This will wake
; the "VSYNC sleep" up and allow it to continue with
; the acquireLine function, where the system waits for
; a "PCLK sleep" that we use to synchronize with the
; data.
; Inputs: none
; Outputs: none
; NOTES: This function doesn't really return...it sorta just
; floats into the acquireLine function after the "VSYNC sleep"
; is awoken.
;*****************************************************************
CamInt_waitForNewFrame:
sleep ; sleep mode already set to sleep idle
 
CamInt_acquireLine:
in r1,_SFR_IO_ADDR(GICR) ;enable the PCLK interrupt
or r1,PCLK_INTERRUPT_ENABLE_MASK
out _SFR_IO_ADDR(GICR),r1
sleep
in r1,_SFR_IO_ADDR(GICR) ;disable the PCLK interrupt
and r1,PCLK_INTERRUPT_DISABLE_MASK
out _SFR_IO_ADDR(GICR),r1
_acquirePixelBlock:
 
 
_exit:
ret
 
 
SIG_INTERRUPT0:
; This will wake us up when VSYNC transitions low...we just want to return
reti
SIG_INTERRUPT1:
; This will wake us up when PCLK transitions low...we just want to return
reti
 
 
.global __vector_default ; Note [10]
__vector_default:
reti
 
.end
/programy/Atmel_C/AVRcam/CamInterface.c
0,0 → 1,236
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: CamInterface.c
Module Date: 04/12/2004
Module Auth: John Orlando
Description: This file is responsible for providing an
interface to the OV6620 camera hardware. This includes
an interface to CamInterface.S for certain low-level,
optimized camera access routines.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
11/15/2004 1.2 ifdef'd out the resetCam routine, since
resetting the cam now causes the OV6620's
clock to not be output (we have to start
it up after each reset with the external
tiny12 processor).
1/16/2005 1.4 Ensure that the TCCR1B register is set so
nothing is clocking timer1 at startup.
***********************************************************/
 
/* Includes */
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <string.h>
#include "CommonDefs.h"
#include "CamInterface.h"
#include "Utility.h"
#include "UIMgr.h"
#include "Executive.h"
#include "UartInterface.h"
 
/* Local Variables */
 
/* Local Structures and Typedefs */
 
/* Definitions */
//#define OUTPUT_INITIAL_COLOR_MAP 1
 
#define FAST_ACQUIRE 1
#define CAM_G_BUS PINB
#define CAM_G_BUS_DIR DDRB
#define CAM_RB_BUS PINC
#define CAM_RB_BUS_DIR DDRC
 
#define CAM_CONTROL_PORT PORTD
#define CAM_CONTROL_PORT_DIR DDRD
#define CAM_RESET_LINE BIT7
#define CAM_PIXEL_CLK_COUNT BIT5
#define CAM_HREF BIT4
#define CAM_PIXEL_CLK_INT BIT3
#define CAM_VSYNC BIT2
 
/* Global Variables */
/* NOTE: This file MUST appear first in the Makefile for these variables to
be placed properly in RAM */
 
/* The colorMap[] table provides the membership lookup table to convert
RGB or YUV pixel values into actual colors. The membership table contains
16 elements for each color channel, concatenated together. The Red (or Y)
value is located in the first 16 bytes, the G (or U) value is located in
the second 16 bytes, and the B (or V) value is located in the last 16 bytes:
 
----------------------------------------------------------------------------------
|red0|red1|red2|...|red15|green0|green1|green2|...|green15|blue0|blue1|...|blue15|
mem:|0x00 0x01 0x02 0x15 0x16 0x17 0x18 0x31 0x32 0x33 0x47 |
---------------------------------------------------------------------------------
Thus, the red lookup is accessed at colorMap+0, the green lookup is accessed
at colorMap+16, and the blue lookup is accessed at colorMap+32. */
unsigned char colorMap[NUM_ELEMENTS_IN_COLOR_MAP] __attribute__ ((section (".noinit")));
 
/* Extern Variables */
/* These two buffers hold the current and previous lines
of pixel data. They are sized to the worst case scenario,
where the color changes between every pixel (unrealistic).
The format of each buffer is for all the even bytes to hold
the run-length, and the odd bytes to hold the color data. */
 
/* In addition, if we are in frameDump mode, we use these buffers
to store the acquired line data...we are actually grabbing ALL of the
pixels in a line (176) instead of the 88 we get normally during tracking.
But since we have enough to hold 88-RLE blocks, we already have the 176
allocated for this... */
unsigned char currentLineBuffer[LENGTH_OF_LINE_BUFFER];
unsigned char previousLineBuffer[LENGTH_OF_LINE_BUFFER];
 
/* Extern Functions */
/* These functions are located in assembly files, and thus
must be externed here so they can be referenced in the source below. */
extern void CamIntAsm_waitForNewTrackingFrame(unsigned char *pBuffer, unsigned char *pMemLookup);
extern void CamIntAsm_waitForNewDumpFrame(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
extern void CamIntAsm_acquireTrackingLine(unsigned char *pBuffer, unsigned char *pMemLookup);
extern void CamIntAsm_acquireDumpLine(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
 
/***********************************************************
Function Name: CamInt_init
Function Description: This function is responsible
for initializing the camera interface. This includes
setting up the i/o ports that are used to read the
camera busses, as well as resetting the camera.
Inputs: none
Outputs: none
***********************************************************/
void CamInt_init(void)
{
#if OUTPUT_INITIAL_COLOR_MAP
unsigned char asciiBuffer[5];
unsigned char i;
#endif
/* set up the mega8 ports that will be interfacing
with the camera */
CAM_CONTROL_PORT_DIR |= (1<<CAM_RESET_LINE); /* cam reset is output */
CAM_CONTROL_PORT_DIR |= 0x80; /* set just the MSB as an output */
CAM_CONTROL_PORT_DIR &= 0xFB; /* make sure bit2 is clear (input) */
CAM_CONTROL_PORT &= 0x7F; /* set reset line low */
CAM_G_BUS_DIR &= 0xF0; /* 4-bit G bus all inputs */
CAM_G_BUS_DIR |= 0xF0; /* disable the pull-up on PB4 and PB5 */
CAM_RB_BUS_DIR &= 0xF0; /* 4-bit RB bus all inputs */
/* ensure that timer1 is disabled to start...eventually, when PCLK needs
to feed timer1 through the external counter, it will be enabled on an
"as needed" basis...*/
TCCR1B &= ~( (1<<CS12)|(1<<CS11)|(1<<CS10) );
/* we'll turn on the interrupt after we assign the initial TCNT value */
/* set up External Interrupt1 to interrupt us on rising edges (HREF)...
this is needed to indicate when the first pixel of each line is about to start, so
we can synch up with it...this interrupt will be disabled once HREF goes high */
MCUCR |= (1<<ISC11) | (1<<ISC10); /* rising edge interrupt */
/* the interrupt will be enabled when we are ready to detect the rising edge of
HREF...its now primed and ready to go */
/* set up External Interrupt0 to interrupt us on rising edges (VSYNC) */
MCUCR |= (1<<ISC01) | (1<<ISC00); /* rising edge interrupt */
GICR |= (1<<INT0); /* interrupt request enabled */
/* set up TimerO to count and be clocked from an external pulse source
(HREF) on falling edges...eventually, we need to enable the interrupt
for this! FIX THIS */
TCCR0 = (1<<CS02)|(1<<CS01)|(0<<CS00);
/* setting up the PCLK counter with Timer1 will be done right after
we start receiving pixels in each line...we sacrifice the first pixel
in each line, but we'll account for it...*/
/* set up the mega8 so that its sleep mode puts it in an IDLE sleep
mode, where it can wake up as fast as possible */
set_sleep_mode(SLEEP_MODE_IDLE);
/* umm....we need to actually enable the sleep mode...*/
MCUCR |= 0x80;
/* initialize the memLookup table */
memset(colorMap,0x00,NUM_ELEMENTS_IN_COLOR_MAP);
/* read the color map out of EEPROM */
eeprom_read_block(colorMap, (unsigned char*)0x01,NUM_ELEMENTS_IN_COLOR_MAP);
 
#if OUTPUT_INITIAL_COLOR_MAP
UIMgr_txBuffer("\r\n",2);
for (i=0; i<NUM_ELEMENTS_IN_COLOR_MAP; i++)
{
memset(asciiBuffer,0x00,5);
itoa(colorMap[i],asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
if (i==15 || i == 31)
{
/* break up the output */
UIMgr_txBuffer("\r\n",2);
}
}
#endif
 
#ifndef NO_CRYSTAL
CamInt_resetCam();
#endif
}
 
/***********************************************************
Function Name: CamInt_resetCam
Function Description: This function is responsible
for resetting the camera. This is accomplished by
toggling the reset line on the OV6620 for ~100 mS.
Inputs: none
Outputs: none
IMPORTANT NOTE: This function has effectively been removed
since resetting the camera now causes the camera to not
output the clock signal. Thus, if we reset the cam, the
AVR has no clock, and thus doesn't run...
***********************************************************/
void CamInt_resetCam(void)
{
 
#if 0
CAM_CONTROL_PORT |= (1<<CAM_RESET_LINE); /* cam reset line high */
Utility_delay(500);
CAM_CONTROL_PORT &= (0<<CAM_RESET_LINE); /* cam reset line low */
Utility_delay(100);
#endif
}
 
 
/programy/Atmel_C/AVRcam/CamInterface.d
0,0 → 1,2
CamInterface.o CamInterface.d : CamInterface.c CommonDefs.h CamInterface.h Utility.h \
UIMgr.h Executive.h Events.h UartInterface.h
/programy/Atmel_C/AVRcam/CamInterface.h
0,0 → 1,82
#ifndef CAMINTERFACE_H
#define CAMINTERFACE_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: CamInterface.h
Module Date: 04/14/2004
Module Auth: John Orlando
Description: This file is responsible for providing the
external interface to the CamInterface module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
#define NUM_PIXELS_IN_A_TRACKED_LINE 88
#define NUM_PIXELS_IN_A_DUMP_LINE 176
#define ACTUAL_NUM_PIXELS_IN_A_LINE 176
#define ACTUAL_NUM_LINES_IN_A_FRAME 144
#define LENGTH_OF_RUN_LENGTH_BLOCK 2
#define LENGTH_OF_LINE_BUFFER NUM_PIXELS_IN_A_DUMP_LINE
 
#define WAIT_FOR_VSYNC_LOW() while( (PIND & 0x04) != 0)
#define WAIT_FOR_VSYNC_HIGH() while( (PIND & 0x04) == 0)
 
#define WAIT_FOR_HREF_LOW() while( (PIND & 0x10) != 0)
#define WAIT_FOR_HREF_HIGH() while( (PIND & 0x10) == 0)
 
#define WAIT_FOR_PCLK_LOW() while( (PIND & 0x20) != 0)
#define WAIT_FOR_PCLK_HIGH() while( (PIND & 0x20) == 0)
 
#define NUM_COLOR_STEPS 16
#define NUM_COLOR_CHANNELS 3
#define NUM_ELEMENTS_IN_COLOR_MAP (NUM_COLOR_STEPS * NUM_COLOR_CHANNELS)
 
#define RED_OFFSET 0
#define GREEN_OFFSET 16
#define BLUE_OFFSET 32
 
extern unsigned char currentLineBuffer[];
extern unsigned char previousLineBuffer[];
extern unsigned char colorMap[];
extern unsigned char frameCount;
/* Extern functions */
extern void CamInt_init(void);
extern void CamInt_resetCam(void);
extern void CamInt_waitForNewDumpFrame(void);
extern void CamInt_waitForNewTrackingFrame(void);
extern void CamInt_acquireTrackingLine(void);
extern void CamInt_acquireDumpLine(void);
#endif
 
/programy/Atmel_C/AVRcam/CamInterface.lst
0,0 → 1,781
GAS LISTING /tmp/ccAE2QZt.s page 1
 
 
1 .file "CamInterface.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/roboti/istrobot/2007/ATmega8/AVRcam/",100,0,2,.Ltext0
11 .stabs "CamInterface.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/interrupt.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
32 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
33 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
34 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
35 .stabs "int8_t:t(5,1)=(0,10)",128,0,116,0
36 .stabs "uint8_t:t(5,2)=(0,11)",128,0,117,0
37 .stabs "int16_t:t(5,3)=(0,1)",128,0,118,0
38 .stabs "uint16_t:t(5,4)=(0,4)",128,0,119,0
39 .stabs "int32_t:t(5,5)=(0,3)",128,0,120,0
40 .stabs "uint32_t:t(5,6)=(0,5)",128,0,121,0
41 .stabs "int64_t:t(5,7)=(0,6)",128,0,122,0
42 .stabs "uint64_t:t(5,8)=(0,7)",128,0,123,0
43 .stabs "intptr_t:t(5,9)=(5,3)",128,0,135,0
44 .stabs "uintptr_t:t(5,10)=(5,4)",128,0,140,0
45 .stabs "int_least8_t:t(5,11)=(5,1)",128,0,152,0
46 .stabs "uint_least8_t:t(5,12)=(5,2)",128,0,157,0
47 .stabs "int_least16_t:t(5,13)=(5,3)",128,0,162,0
48 .stabs "uint_least16_t:t(5,14)=(5,4)",128,0,167,0
49 .stabs "int_least32_t:t(5,15)=(5,5)",128,0,172,0
50 .stabs "uint_least32_t:t(5,16)=(5,6)",128,0,177,0
51 .stabs "int_least64_t:t(5,17)=(5,7)",128,0,182,0
52 .stabs "uint_least64_t:t(5,18)=(5,8)",128,0,187,0
53 .stabs "int_fast8_t:t(5,19)=(5,1)",128,0,200,0
54 .stabs "uint_fast8_t:t(5,20)=(5,2)",128,0,205,0
55 .stabs "int_fast16_t:t(5,21)=(5,3)",128,0,210,0
56 .stabs "uint_fast16_t:t(5,22)=(5,4)",128,0,215,0
57 .stabs "int_fast32_t:t(5,23)=(5,5)",128,0,220,0
GAS LISTING /tmp/ccAE2QZt.s page 2
 
 
58 .stabs "uint_fast32_t:t(5,24)=(5,6)",128,0,225,0
59 .stabs "int_fast64_t:t(5,25)=(5,7)",128,0,230,0
60 .stabs "uint_fast64_t:t(5,26)=(5,8)",128,0,235,0
61 .stabs "intmax_t:t(5,27)=(5,7)",128,0,249,0
62 .stabs "uintmax_t:t(5,28)=(5,8)",128,0,254,0
63 .stabn 162,0,0,0
64 .stabs "int_farptr_t:t(4,1)=(5,5)",128,0,76,0
65 .stabs "uint_farptr_t:t(4,2)=(5,6)",128,0,80,0
66 .stabn 162,0,0,0
67 .stabn 162,0,0,0
68 .stabn 162,0,0,0
69 .stabn 162,0,0,0
70 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h",130,0,0,0
71 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
72 .stabs "size_t:t(7,1)=(0,4)",128,0,214,0
73 .stabn 162,0,0,0
74 .stabn 162,0,0,0
75 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdlib.h",130,0,0,0
76 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
77 .stabs "wchar_t:t(9,1)=(0,1)",128,0,326,0
78 .stabn 162,0,0,0
79 .stabs "div_t:t(8,1)=(8,2)=s4quot:(0,1),0,16;rem:(0,1),16,16;;",128,0,69,0
80 .stabs "ldiv_t:t(8,3)=(8,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;",128,0,75,0
81 .stabs "__compar_fn_t:t(8,5)=(8,6)=*(8,7)=f(0,1)",128,0,78,0
82 .stabn 162,0,0,0
83 .stabs "CommonDefs.h",130,0,0,0
84 .stabs "bool_t:t(10,1)=(0,11)",128,0,56,0
85 .stabn 162,0,0,0
86 .stabs "CamInt_resetCam:F(0,15)",36,0,226,CamInt_resetCam
87 .global CamInt_resetCam
88 .type CamInt_resetCam, @function
89 CamInt_resetCam:
90 .stabd 46,0,0
1:CamInterface.c **** /*
2:CamInterface.c **** Copyright (C) 2004 John Orlando
3:CamInterface.c ****
4:CamInterface.c **** AVRcam: a small real-time image processing engine.
5:CamInterface.c ****
6:CamInterface.c **** This program is free software; you can redistribute it and/or
7:CamInterface.c **** modify it under the terms of the GNU General Public
8:CamInterface.c **** License as published by the Free Software Foundation; either
9:CamInterface.c **** version 2 of the License, or (at your option) any later version.
10:CamInterface.c ****
11:CamInterface.c **** This program is distributed in the hope that it will be useful,
12:CamInterface.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:CamInterface.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:CamInterface.c **** General Public License for more details.
15:CamInterface.c ****
16:CamInterface.c **** You should have received a copy of the GNU General Public
17:CamInterface.c **** License along with this program; if not, write to the Free Software
18:CamInterface.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:CamInterface.c ****
20:CamInterface.c **** For more information on the AVRcam, please contact:
21:CamInterface.c ****
22:CamInterface.c **** john@jrobot.net
23:CamInterface.c ****
24:CamInterface.c **** or go to www.jrobot.net for more details regarding the system.
GAS LISTING /tmp/ccAE2QZt.s page 3
 
 
25:CamInterface.c **** */
26:CamInterface.c **** /***********************************************************
27:CamInterface.c **** Module Name: CamInterface.c
28:CamInterface.c **** Module Date: 04/12/2004
29:CamInterface.c **** Module Auth: John Orlando
30:CamInterface.c ****
31:CamInterface.c **** Description: This file is responsible for providing an
32:CamInterface.c **** interface to the OV6620 camera hardware. This includes
33:CamInterface.c **** an interface to CamInterface.S for certain low-level,
34:CamInterface.c **** optimized camera access routines.
35:CamInterface.c ****
36:CamInterface.c **** Revision History:
37:CamInterface.c **** Date Rel Ver. Notes
38:CamInterface.c **** 4/10/2004 0.1 Module created
39:CamInterface.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
40:CamInterface.c **** contest.
41:CamInterface.c **** 11/15/2004 1.2 ifdef'd out the resetCam routine, since
42:CamInterface.c **** resetting the cam now causes the OV6620's
43:CamInterface.c **** clock to not be output (we have to start
44:CamInterface.c **** it up after each reset with the external
45:CamInterface.c **** tiny12 processor).
46:CamInterface.c **** 1/16/2005 1.4 Ensure that the TCCR1B register is set so
47:CamInterface.c **** nothing is clocking timer1 at startup.
48:CamInterface.c **** ***********************************************************/
49:CamInterface.c ****
50:CamInterface.c **** /* Includes */
51:CamInterface.c **** #include <avr/interrupt.h>
52:CamInterface.c **** #include <avr/signal.h>
53:CamInterface.c **** #include <avr/sleep.h>
54:CamInterface.c **** #include <avr/eeprom.h>
55:CamInterface.c **** #include <stdlib.h>
56:CamInterface.c **** #include <string.h>
57:CamInterface.c **** #include "CommonDefs.h"
58:CamInterface.c **** #include "CamInterface.h"
59:CamInterface.c **** #include "Utility.h"
60:CamInterface.c **** #include "UIMgr.h"
61:CamInterface.c **** #include "Executive.h"
62:CamInterface.c **** #include "UartInterface.h"
63:CamInterface.c ****
64:CamInterface.c **** /* Local Variables */
65:CamInterface.c ****
66:CamInterface.c **** /* Local Structures and Typedefs */
67:CamInterface.c ****
68:CamInterface.c **** /* Definitions */
69:CamInterface.c **** //#define OUTPUT_INITIAL_COLOR_MAP 1
70:CamInterface.c ****
71:CamInterface.c **** #define FAST_ACQUIRE 1
72:CamInterface.c **** #define CAM_G_BUS PINB
73:CamInterface.c **** #define CAM_G_BUS_DIR DDRB
74:CamInterface.c **** #define CAM_RB_BUS PINC
75:CamInterface.c **** #define CAM_RB_BUS_DIR DDRC
76:CamInterface.c ****
77:CamInterface.c **** #define CAM_CONTROL_PORT PORTD
78:CamInterface.c **** #define CAM_CONTROL_PORT_DIR DDRD
79:CamInterface.c **** #define CAM_RESET_LINE BIT7
80:CamInterface.c **** #define CAM_PIXEL_CLK_COUNT BIT5
81:CamInterface.c **** #define CAM_HREF BIT4
GAS LISTING /tmp/ccAE2QZt.s page 4
 
 
82:CamInterface.c **** #define CAM_PIXEL_CLK_INT BIT3
83:CamInterface.c **** #define CAM_VSYNC BIT2
84:CamInterface.c ****
85:CamInterface.c **** /* Global Variables */
86:CamInterface.c **** /* NOTE: This file MUST appear first in the Makefile for these variables to
87:CamInterface.c **** be placed properly in RAM */
88:CamInterface.c ****
89:CamInterface.c **** /* The colorMap[] table provides the membership lookup table to convert
90:CamInterface.c **** RGB or YUV pixel values into actual colors. The membership table contains
91:CamInterface.c **** 16 elements for each color channel, concatenated together. The Red (or Y)
92:CamInterface.c **** value is located in the first 16 bytes, the G (or U) value is located in
93:CamInterface.c **** the second 16 bytes, and the B (or V) value is located in the last 16 bytes:
94:CamInterface.c ****
95:CamInterface.c **** ----------------------------------------------------------------------------------
96:CamInterface.c **** |red0|red1|red2|...|red15|green0|green1|green2|...|green15|blue0|blue1|...|blue15|
97:CamInterface.c **** mem:|0x00 0x01 0x02 0x15 0x16 0x17 0x18 0x31 0x32 0x33 0x47 |
98:CamInterface.c **** ---------------------------------------------------------------------------------
99:CamInterface.c **** Thus, the red lookup is accessed at colorMap+0, the green lookup is accessed
100:CamInterface.c **** at colorMap+16, and the blue lookup is accessed at colorMap+32. */
101:CamInterface.c **** unsigned char colorMap[NUM_ELEMENTS_IN_COLOR_MAP] __attribute__ ((section (".noinit")));
102:CamInterface.c ****
103:CamInterface.c **** /* Extern Variables */
104:CamInterface.c **** /* These two buffers hold the current and previous lines
105:CamInterface.c **** of pixel data. They are sized to the worst case scenario,
106:CamInterface.c **** where the color changes between every pixel (unrealistic).
107:CamInterface.c **** The format of each buffer is for all the even bytes to hold
108:CamInterface.c **** the run-length, and the odd bytes to hold the color data. */
109:CamInterface.c ****
110:CamInterface.c **** /* In addition, if we are in frameDump mode, we use these buffers
111:CamInterface.c **** to store the acquired line data...we are actually grabbing ALL of the
112:CamInterface.c **** pixels in a line (176) instead of the 88 we get normally during tracking.
113:CamInterface.c **** But since we have enough to hold 88-RLE blocks, we already have the 176
114:CamInterface.c **** allocated for this... */
115:CamInterface.c **** unsigned char currentLineBuffer[LENGTH_OF_LINE_BUFFER];
116:CamInterface.c **** unsigned char previousLineBuffer[LENGTH_OF_LINE_BUFFER];
117:CamInterface.c ****
118:CamInterface.c **** /* Extern Functions */
119:CamInterface.c **** /* These functions are located in assembly files, and thus
120:CamInterface.c **** must be externed here so they can be referenced in the source below. */
121:CamInterface.c **** extern void CamIntAsm_waitForNewTrackingFrame(unsigned char *pBuffer, unsigned char *pMemLookup);
122:CamInterface.c **** extern void CamIntAsm_waitForNewDumpFrame(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
123:CamInterface.c **** extern void CamIntAsm_acquireTrackingLine(unsigned char *pBuffer, unsigned char *pMemLookup);
124:CamInterface.c **** extern void CamIntAsm_acquireDumpLine(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
125:CamInterface.c ****
126:CamInterface.c **** /***********************************************************
127:CamInterface.c **** Function Name: CamInt_init
128:CamInterface.c **** Function Description: This function is responsible
129:CamInterface.c **** for initializing the camera interface. This includes
130:CamInterface.c **** setting up the i/o ports that are used to read the
131:CamInterface.c **** camera busses, as well as resetting the camera.
132:CamInterface.c **** Inputs: none
133:CamInterface.c **** Outputs: none
134:CamInterface.c **** ***********************************************************/
135:CamInterface.c **** void CamInt_init(void)
136:CamInterface.c **** {
137:CamInterface.c **** #if OUTPUT_INITIAL_COLOR_MAP
138:CamInterface.c **** unsigned char asciiBuffer[5];
GAS LISTING /tmp/ccAE2QZt.s page 5
 
 
139:CamInterface.c **** unsigned char i;
140:CamInterface.c **** #endif
141:CamInterface.c ****
142:CamInterface.c **** /* set up the mega8 ports that will be interfacing
143:CamInterface.c **** with the camera */
144:CamInterface.c **** CAM_CONTROL_PORT_DIR |= (1<<CAM_RESET_LINE); /* cam reset is output */
145:CamInterface.c **** CAM_CONTROL_PORT_DIR |= 0x80; /* set just the MSB as an output */
146:CamInterface.c **** CAM_CONTROL_PORT_DIR &= 0xFB; /* make sure bit2 is clear (input) */
147:CamInterface.c **** CAM_CONTROL_PORT &= 0x7F; /* set reset line low */
148:CamInterface.c **** CAM_G_BUS_DIR &= 0xF0; /* 4-bit G bus all inputs */
149:CamInterface.c **** CAM_G_BUS_DIR |= 0xF0; /* disable the pull-up on PB4 and PB5 */
150:CamInterface.c **** CAM_RB_BUS_DIR &= 0xF0; /* 4-bit RB bus all inputs */
151:CamInterface.c ****
152:CamInterface.c **** /* ensure that timer1 is disabled to start...eventually, when PCLK needs
153:CamInterface.c **** to feed timer1 through the external counter, it will be enabled on an
154:CamInterface.c **** "as needed" basis...*/
155:CamInterface.c **** TCCR1B &= ~( (1<<CS12)|(1<<CS11)|(1<<CS10) );
156:CamInterface.c ****
157:CamInterface.c **** /* we'll turn on the interrupt after we assign the initial TCNT value */
158:CamInterface.c ****
159:CamInterface.c **** /* set up External Interrupt1 to interrupt us on rising edges (HREF)...
160:CamInterface.c **** this is needed to indicate when the first pixel of each line is about to start, so
161:CamInterface.c **** we can synch up with it...this interrupt will be disabled once HREF goes high */
162:CamInterface.c ****
163:CamInterface.c **** MCUCR |= (1<<ISC11) | (1<<ISC10); /* rising edge interrupt */
164:CamInterface.c **** /* the interrupt will be enabled when we are ready to detect the rising edge of
165:CamInterface.c **** HREF...its now primed and ready to go */
166:CamInterface.c ****
167:CamInterface.c **** /* set up External Interrupt0 to interrupt us on rising edges (VSYNC) */
168:CamInterface.c **** MCUCR |= (1<<ISC01) | (1<<ISC00); /* rising edge interrupt */
169:CamInterface.c **** GICR |= (1<<INT0); /* interrupt request enabled */
170:CamInterface.c ****
171:CamInterface.c **** /* set up TimerO to count and be clocked from an external pulse source
172:CamInterface.c **** (HREF) on falling edges...eventually, we need to enable the interrupt
173:CamInterface.c **** for this! FIX THIS */
174:CamInterface.c **** TCCR0 = (1<<CS02)|(1<<CS01)|(0<<CS00);
175:CamInterface.c ****
176:CamInterface.c **** /* setting up the PCLK counter with Timer1 will be done right after
177:CamInterface.c **** we start receiving pixels in each line...we sacrifice the first pixel
178:CamInterface.c **** in each line, but we'll account for it...*/
179:CamInterface.c ****
180:CamInterface.c **** /* set up the mega8 so that its sleep mode puts it in an IDLE sleep
181:CamInterface.c **** mode, where it can wake up as fast as possible */
182:CamInterface.c **** set_sleep_mode(SLEEP_MODE_IDLE);
183:CamInterface.c **** /* umm....we need to actually enable the sleep mode...*/
184:CamInterface.c **** MCUCR |= 0x80;
185:CamInterface.c ****
186:CamInterface.c **** /* initialize the memLookup table */
187:CamInterface.c **** memset(colorMap,0x00,NUM_ELEMENTS_IN_COLOR_MAP);
188:CamInterface.c ****
189:CamInterface.c **** /* read the color map out of EEPROM */
190:CamInterface.c **** eeprom_read_block(colorMap, (unsigned char*)0x01,NUM_ELEMENTS_IN_COLOR_MAP);
191:CamInterface.c ****
192:CamInterface.c **** #if OUTPUT_INITIAL_COLOR_MAP
193:CamInterface.c **** UIMgr_txBuffer("\r\n",2);
194:CamInterface.c **** for (i=0; i<NUM_ELEMENTS_IN_COLOR_MAP; i++)
195:CamInterface.c **** {
GAS LISTING /tmp/ccAE2QZt.s page 6
 
 
196:CamInterface.c **** memset(asciiBuffer,0x00,5);
197:CamInterface.c **** itoa(colorMap[i],asciiBuffer,10);
198:CamInterface.c **** UIMgr_txBuffer(asciiBuffer,3);
199:CamInterface.c **** UIMgr_txBuffer(" ",1);
200:CamInterface.c **** if (i==15 || i == 31)
201:CamInterface.c **** {
202:CamInterface.c **** /* break up the output */
203:CamInterface.c **** UIMgr_txBuffer("\r\n",2);
204:CamInterface.c **** }
205:CamInterface.c **** }
206:CamInterface.c **** #endif
207:CamInterface.c ****
208:CamInterface.c **** #ifndef NO_CRYSTAL
209:CamInterface.c **** CamInt_resetCam();
210:CamInterface.c **** #endif
211:CamInterface.c **** }
212:CamInterface.c ****
213:CamInterface.c **** /***********************************************************
214:CamInterface.c **** Function Name: CamInt_resetCam
215:CamInterface.c **** Function Description: This function is responsible
216:CamInterface.c **** for resetting the camera. This is accomplished by
217:CamInterface.c **** toggling the reset line on the OV6620 for ~100 mS.
218:CamInterface.c **** Inputs: none
219:CamInterface.c **** Outputs: none
220:CamInterface.c **** IMPORTANT NOTE: This function has effectively been removed
221:CamInterface.c **** since resetting the camera now causes the camera to not
222:CamInterface.c **** output the clock signal. Thus, if we reset the cam, the
223:CamInterface.c **** AVR has no clock, and thus doesn't run...
224:CamInterface.c **** ***********************************************************/
225:CamInterface.c **** void CamInt_resetCam(void)
226:CamInterface.c **** {
91 .stabn 68,0,226,.LM0-CamInt_resetCam
92 .LM0:
93 /* prologue: frame size=0 */
94 /* prologue end (size=0) */
95 /* epilogue: frame size=0 */
96 0000 0895 ret
97 /* epilogue end (size=1) */
98 /* function CamInt_resetCam size 1 (0) */
99 .size CamInt_resetCam, .-CamInt_resetCam
100 .Lscope0:
101 .stabs "",36,0,0,.Lscope0-CamInt_resetCam
102 .stabd 78,0,0
103 .stabs "CamInt_init:F(0,15)",36,0,136,CamInt_init
104 .global CamInt_init
105 .type CamInt_init, @function
106 CamInt_init:
107 .stabd 46,0,0
108 .stabn 68,0,136,.LM1-CamInt_init
109 .LM1:
110 /* prologue: frame size=0 */
111 /* prologue end (size=0) */
112 .stabn 68,0,144,.LM2-CamInt_init
113 .LM2:
114 0002 8F9A sbi 49-0x20,7
115 .stabn 68,0,145,.LM3-CamInt_init
116 .LM3:
GAS LISTING /tmp/ccAE2QZt.s page 7
 
 
117 0004 8F9A sbi 49-0x20,7
118 .stabn 68,0,146,.LM4-CamInt_init
119 .LM4:
120 0006 8A98 cbi 49-0x20,2
121 .stabn 68,0,147,.LM5-CamInt_init
122 .LM5:
123 0008 9798 cbi 50-0x20,7
124 .stabn 68,0,148,.LM6-CamInt_init
125 .LM6:
126 000a 87B3 in r24,55-0x20
127 000c 807F andi r24,lo8(-16)
128 000e 87BB out 55-0x20,r24
129 .stabn 68,0,149,.LM7-CamInt_init
130 .LM7:
131 0010 87B3 in r24,55-0x20
132 0012 806F ori r24,lo8(-16)
133 0014 87BB out 55-0x20,r24
134 .stabn 68,0,150,.LM8-CamInt_init
135 .LM8:
136 0016 84B3 in r24,52-0x20
137 0018 807F andi r24,lo8(-16)
138 001a 84BB out 52-0x20,r24
139 .stabn 68,0,155,.LM9-CamInt_init
140 .LM9:
141 001c 8EB5 in r24,78-0x20
142 001e 887F andi r24,lo8(-8)
143 0020 8EBD out 78-0x20,r24
144 .stabn 68,0,163,.LM10-CamInt_init
145 .LM10:
146 0022 85B7 in r24,85-0x20
147 0024 8C60 ori r24,lo8(12)
148 0026 85BF out 85-0x20,r24
149 .stabn 68,0,168,.LM11-CamInt_init
150 .LM11:
151 0028 85B7 in r24,85-0x20
152 002a 8360 ori r24,lo8(3)
153 002c 85BF out 85-0x20,r24
154 .stabn 68,0,169,.LM12-CamInt_init
155 .LM12:
156 002e 8BB7 in r24,91-0x20
157 0030 8064 ori r24,lo8(64)
158 0032 8BBF out 91-0x20,r24
159 .stabn 68,0,174,.LM13-CamInt_init
160 .LM13:
161 0034 86E0 ldi r24,lo8(6)
162 0036 83BF out 83-0x20,r24
163 .stabn 68,0,182,.LM14-CamInt_init
164 .LM14:
165 0038 85B7 in r24,85-0x20
166 003a 8F78 andi r24,lo8(-113)
167 003c 85BF out 85-0x20,r24
168 .stabn 68,0,184,.LM15-CamInt_init
169 .LM15:
170 003e 85B7 in r24,85-0x20
171 0040 8068 ori r24,lo8(-128)
172 0042 85BF out 85-0x20,r24
173 .stabn 68,0,187,.LM16-CamInt_init
GAS LISTING /tmp/ccAE2QZt.s page 8
 
 
174 .LM16:
175 0044 E0E0 ldi r30,lo8(colorMap)
176 0046 F0E0 ldi r31,hi8(colorMap)
177 0048 80E3 ldi r24,lo8(48)
178 004a DF01 movw r26,r30
179 004c 982F mov r25,r24
180 004e 1D92 st X+,__zero_reg__
181 0050 9A95 dec r25
182 0052 E9F7 brne .-6
183 .LBB6:
184 .LBB7:
185 .LBB8:
186 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h",132,0,0,.Ltext1
187 .Ltext1:
1:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz
2:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Copyright (c) 2005, 2006 Bjoern Haase
3:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** All rights reserved.
4:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
5:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Redistribution and use in source and binary forms, with or without
6:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** modification, are permitted provided that the following conditions are met:
7:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
8:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** * Redistributions of source code must retain the above copyright
9:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** notice, this list of conditions and the following disclaimer.
10:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
11:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** * Redistributions in binary form must reproduce the above copyright
12:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** notice, this list of conditions and the following disclaimer in
13:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** the documentation and/or other materials provided with the
14:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** distribution.
15:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
16:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** * Neither the name of the copyright holders nor the names of
17:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** contributors may be used to endorse or promote products derived
18:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** from this software without specific prior written permission.
19:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
20:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** POSSIBILITY OF SUCH DAMAGE. */
31:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
32:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* $Id: eeprom.h,v 1.17.2.1 2006/02/26 21:51:04 aesok Exp $ */
33:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
34:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /*
35:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom.h
36:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
37:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Contributors:
38:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Created by Marek Michalkiewicz <marekm@linux.org.pl>
39:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word and eeprom_write_block added by Artur Lipowski
40:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** <LAL@pro.onet.pl>
41:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Complete rewrite using the original interface by Bjoern Haase
42:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** <bjoern.haase@de.bosch.com>.
43:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** */
GAS LISTING /tmp/ccAE2QZt.s page 9
 
 
44:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
45:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifndef _EEPROM_H_
46:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _EEPROM_H_ 1
47:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
48:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define __need_size_t
49:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #include <stddef.h>
50:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #include <inttypes.h>
51:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
52:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
53:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifdef __AVR_MEGA__
54:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define XCALL "call"
55:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #else
56:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define XCALL "rcall"
57:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
58:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
59:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #include <avr/io.h>
60:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifndef __EEPROM_REG_LOCATIONS__
61:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def __EEPROM_REG_LOCATIONS__
62:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
63:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** In order to be able to work without a requiring a multilib
64:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** approach for dealing with controllers having the EEPROM registers
65:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** at different positions in memory space, the eeprom functions evaluate
66:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** __EEPROM_REG_LOCATIONS__: It is assumed to be defined by
67:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** the device io header and contains 6 uppercase hex digits encoding the
68:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** addresses of EECR,EEDR and EEAR.
69:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** First two letters: EECR address.
70:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Second two letters: EEDR address.
71:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Last two letters: EEAR address.
72:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** The default 1C1D1E corresponds to the
73:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** register location that is valid for most controllers. The value
74:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** of this define symbol is used for appending it to the base name of the
75:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** assembler functions. */
76:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define __EEPROM_REG_LOCATIONS__ 1C1D1E
77:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
78:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _STR2(EXP) _STR1(EXP)
79:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _STR1(EXP) #EXP
80:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _REG_LOCATION_SUFFIX _STR2(__EEPROM_REG_LOCATIONS__)
81:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
82:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifndef CR_TAB
83:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define CR_TAB "\n\t"
84:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
85:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
86:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
87:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \defgroup avr_eeprom <avr/eeprom.h>: EEPROM handling
88:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \code #include <avr/eeprom.h> \endcode
89:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
90:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** This header file declares the interface to some simple library
91:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** routines suitable for handling the data EEPROM contained in the
92:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** AVR microcontrollers. The implementation uses a simple polled
93:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** mode interface. Applications that require interrupt-controlled
94:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** EEPROM access to ensure that no time will be wasted in spinloops
95:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** will have to deploy their own implementation.
96:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
97:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note All of the read/write functions first make sure the EEPROM
98:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** is ready to be accessed. Since this may cause long delays if a
99:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** write operation is still pending, time-critical applications
100:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** should first poll the EEPROM e. g. using eeprom_is_ready() before
GAS LISTING /tmp/ccAE2QZt.s page 10
 
 
101:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** attempting any actual I/O.
102:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
103:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note This header file declares inline functions that call the
104:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** assembler subroutines directly. This prevents that the compiler
105:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** generates push/pops for the call-clobbered registers. This way
106:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** also a specific calling convention could be used for the eeprom
107:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** routines e.g. by passing values in __tmp_reg__, eeprom addresses in
108:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** X and memory addresses in Z registers. Method is optimized for code
109:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size.
110:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
111:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note Presently supported are two locations of the EEPROM register
112:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** set: 0x1F,0x20,0x21 and 0x1C,0x1D,0x1E
113:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** (see ::__EEPROM_REG_LOCATIONS__).
114:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
115:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note As these functions modify IO registers, they are known to be
116:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** non-reentrant. If any of these functions are used from both,
117:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** standard and interrupt context, the applications must ensure
118:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** proper protection (e.g. by disabling interrupts before accessing
119:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** them).
120:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
121:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** */
122:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
123:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
124:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* forward declarations of the inline functions so that doxygen does
125:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** not get confused by the attribute expression. */
126:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
127:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline uint8_t __attribute__ ((always_inline))
128:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_byte (const uint8_t *addr);
129:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
130:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline uint16_t __attribute__ ((always_inline))
131:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_word (const uint16_t *addr);
132:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
133:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
134:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_block (void *pointer_ram,
135:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** const void *pointer_eeprom,
136:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size_t size);
137:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
138:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
139:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_byte (uint8_t *addr,uint8_t value);
140:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
141:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
142:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word (uint16_t *addr,uint16_t value);
143:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
144:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
145:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_block (const void *pointer_ram,
146:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** void *pointer_eeprom,
147:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size_t size);
148:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
149:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \name avr-libc declarations */
150:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
151:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /*@{*/
152:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
153:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def EEMEM
154:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
155:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Attribute expression causing a variable to be allocated within the .eeprom
156:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** section. */
157:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define EEMEM __attribute__((section(".eeprom")))
GAS LISTING /tmp/ccAE2QZt.s page 11
 
 
158:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
159:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def eeprom_is_ready
160:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
161:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \returns 1 if EEPROM is ready for a new read/write operation, 0 if not. */
162:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
163:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #if defined(__DOXYGEN__)
164:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready()
165:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #elif defined(EEWE)
166:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(EECR, EEWE)
167:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #elif defined(EEPE)
168:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(EECR, EEPE)
169:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #elif defined(DEECR) && defined(EEL)
170:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(DEECR, EEL)
171:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #else
172:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # error "No write enable bit known for this device's EEPROM."
173:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
174:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
175:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def eeprom_busy_wait
176:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
177:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
178:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Loops until the eeprom is no longer busy.
179:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
180:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \returns Nothing. */
181:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
182:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define eeprom_busy_wait() do {} while (!eeprom_is_ready())
183:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
184:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
185:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
186:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Read one byte from EEPROM address \c addr. */
187:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
188:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint8_t
189:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_byte (const uint8_t *addr)
190:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
191:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint8_t result;
192:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile
193:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ( XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
194:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "mov %1,__tmp_reg__"
195:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr),
196:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=r" (result)
197:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : );
198:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** return result;
199:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
200:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
201:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
202:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Read one 16-bit word (little endian) from EEPROM address \c addr. */
203:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint16_t
204:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_word (const uint16_t *addr)
205:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
206:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint16_t result;
207:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
208:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm (
209:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_word_" _REG_LOCATION_SUFFIX CR_TAB
210:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr),
211:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (result)
212:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : );
213:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** return result;
214:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
GAS LISTING /tmp/ccAE2QZt.s page 12
 
 
215:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
216:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
217:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Read a block of \c n bytes from EEPROM address \c pointer_eeprom to
218:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \c pointer_ram. For constant n <= 256 bytes a library function is used.
219:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** For block sizes unknown at compile time or block sizes > 256 an inline
220:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** loop is expanded. */
221:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
222:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** void
223:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_block (void *pointer_ram,
224:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** const void *pointer_eeprom,
225:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size_t n)
226:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
227:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** if (!__builtin_constant_p (n)
228:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** || n > 256)
229:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
230:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* make sure size is a 16 bit variable. */
231:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint16_t size = n;
232:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
233:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
234:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ".%=_start:" CR_TAB
235:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "sbiw %2,1" CR_TAB
236:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "brlt .%=_finished" CR_TAB
237:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
238:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "st z+,__tmp_reg__" CR_TAB
239:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "rjmp .%=_start" CR_TAB
240:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ".%=_finished:"
241:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "=x" (pointer_eeprom),
242:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram),
243:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "+w" (size)
244:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "x" (pointer_eeprom),
245:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "z" (pointer_ram)
246:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "memory");
247:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
248:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** else
249:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
250:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** if (n != 0)
251:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
252:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** if (n == 256)
253:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
254:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
255:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_block_" _REG_LOCATION_SUFFIX
256:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (pointer_eeprom),
257:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram)
258:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "z" (pointer_ram)
259:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "memory");
260:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
261:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** else
262:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
263:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* Needed in order to truncate to 8 bit. */
264:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint8_t len;
265:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** len = (uint8_t) n;
266:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
267:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
188 .stabn 68,0,267,.LM17-CamInt_init
189 .LM17:
190 0054 A1E0 ldi r26,lo8(1)
191 0056 B0E0 ldi r27,hi8(1)
GAS LISTING /tmp/ccAE2QZt.s page 13
 
 
192 /* #APP */
193 0058 182E mov __zero_reg__,r24
194 005a 00D0 rcall __eeprom_read_block_1C1D1E
195 /* #NOAPP */
196 .LBE8:
197 .LBE7:
198 .LBE6:
199 /* epilogue: frame size=0 */
200 005c 0895 ret
201 /* epilogue end (size=1) */
202 /* function CamInt_init size 48 (47) */
203 .size CamInt_init, .-CamInt_init
204 .stabs "pointer_eeprom:r(0,16)=*(0,17)=k(0,15)",64,0,190,26
205 .stabs "pointer_ram:r(0,18)=*(0,15)",64,0,190,30
206 .stabn 192,0,0,.LBB6-CamInt_init
207 .stabn 224,0,0,.LBE6-CamInt_init
208 .Lscope1:
209 .stabs "",36,0,0,.Lscope1-CamInt_init
210 .stabd 78,0,0
211 .comm currentLineBuffer,176,1
212 .comm previousLineBuffer,176,1
213 .global colorMap
214 .section .noinit,"aw",@nobits
215 .type colorMap, @object
216 .size colorMap, 48
217 colorMap:
218 0000 0000 0000 .skip 48,0
218 0000 0000
218 0000 0000
218 0000 0000
218 0000 0000
219 .stabs "currentLineBuffer:G(0,19)=ar(0,20)=r(0,20);0;0177777;;0;175;(0,11)",32,0,115,0
220 .stabs "previousLineBuffer:G(0,19)",32,0,116,0
221 .stabs "colorMap:G(0,21)=ar(0,20);0;47;(0,11)",32,0,101,0
222 .text
223 .stabs "",100,0,0,.Letext0
224 .Letext0:
225 /* File "CamInterface.c": code 49 = 0x0031 ( 47), prologues 0, epilogues 2 */
GAS LISTING /tmp/ccAE2QZt.s page 14
 
 
DEFINED SYMBOLS
*ABS*:00000000 CamInterface.c
/tmp/ccAE2QZt.s:3 *ABS*:0000003f __SREG__
/tmp/ccAE2QZt.s:4 *ABS*:0000003e __SP_H__
/tmp/ccAE2QZt.s:5 *ABS*:0000003d __SP_L__
/tmp/ccAE2QZt.s:6 *ABS*:00000000 __tmp_reg__
/tmp/ccAE2QZt.s:7 *ABS*:00000001 __zero_reg__
/tmp/ccAE2QZt.s:89 .text:00000000 CamInt_resetCam
/tmp/ccAE2QZt.s:106 .text:00000002 CamInt_init
/tmp/ccAE2QZt.s:217 .noinit:00000000 colorMap
*COM*:000000b0 currentLineBuffer
*COM*:000000b0 previousLineBuffer
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
__eeprom_read_block_1C1D1E
/programy/Atmel_C/AVRcam/CamInterfaceAsm.S
0,0 → 1,490
;
; Copyright (C) 2004 John Orlando
;
; AVRcam: a small real-time image processing engine.
 
; This program is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public
; License as published by the Free Software Foundation; either
; version 2 of the License, or (at your option) any later version.
 
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
; General Public License for more details.
 
; You should have received a copy of the GNU General Public
; License along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
; For more information on the AVRcam, please contact:
 
; john@jrobot.net
 
; or go to www.jrobot.net for more details regarding the system.
;**********************************************************************
; Module Name: CanInterfaceAsm.S
; Module Date: 04/14/2004
; Module Auth: John Orlando
;
; Description: This module provides the low-level interface
; to the OV6620 camera hardware. It is responsible for
; acquiring each pixel block (R,G,B), performing the mapping
; into an actual color (orange, purple, etc), run-length
; encoding the data, and storing the info off to the appropriate
; line buffer. This routine is synchronized with the pixel data
; so that no polling of the camera data needs to be done (the
; OV6620 is clocked off of the same crystal source as the mega8,
; thus providing inherent synchronization between the two).
;
; Revision History:
; Date Rel Ver. Notes
; 4/10/2004 0.1 Module created
; 6/30/2004 1.0 Initial release for Circuit Cellar
; contest.
; 1/16/2005 1.4 Fixed issue with the TCCR1B register
; where PCLK was getting routed to the
; timer1 even when it wasn't needed.
; This caused excessive counter overflow
; interrupts, and caused problems. Now,
; the "PCLK" pipe feeds timer1 when needed,
; and is turned off when it isn't needed.
 
#include <avr/io.h>
#include "Events.h"
.extern fastEventBitmask ; This is the flag used to indicate to the rest
; of the system that the line is complete
#define HREF_INTERRUPT_ENABLE_MASK 0x80
#define HREF_INTERRUPT_DISABLE_MASK 0x7F
#define ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0x04
#define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
#define G_PORT _SFR_IO_ADDR(PINC)
#define RB_PORT _SFR_IO_ADDR(PINB)
#define PIXEL_RUN_START_INITIAL 0x50 ; This value causes our pixel counter (TCNT1)
; to overflow after 176 (horizontal) pixels
 
#define RED_MEM_OFFSET 0x00
#define GREEN_MEM_OFFSET 0x10
#define BLUE_MEM_OFFSET 0x20
 
; A pixelBlock is defined as a contiguous group of 4 pixels that are combined
; together to form a specific color. Typically, this is formed by sampling a
; a green value, followed by a red and blue value (since we are dealing
; with Bayer color data). We could optionally sample a second green with
; the red and average the greens, because the eye is more sensitive to
; green, but for speed we don't do this. These three values (RGB) are then
; used as indices into the color membership lookup table (memLookup) to
; determine which color the pixelBlock maps into. The memLookup table is
; manually generated for now (though it will hopefully be modified over
; the serial interface eventually).
;
; Here is a pixel block:
; ...G G G G... (row x)
; ...B R B R... (row x+1)
; | | | |--this is skipped
; | | |--this is skipped
; | |--this is sampled
; |--this is sampled
 
; As pixel blocks are sampled, the red, green, and blue values are
; used to index into their respective color maps. The color maps
; return values that can be logically ANDed together so that a
; particular RGB triplet will result in a single bit being set
; after the AND operation. This single bit indicates which color
; the RGB triplet represents. It is also possible for no bits to
; be set after the AND process, indicating that the RGB triplet
; does not map to any of the colors configured in the color map.
; This isn't quite as fast as a pure RGB lookup table, but
; it then again it doesn't require 2^12 (4-bits for each color
; channel) bytes to store the lookup table. It takes just a few
; more cycles, and only requires 48 bytes of precious RAM (16
; per color channel, since our resolution on each color channel
; is only 4-bits). Not bad....for more information, see:
; http://www.cs.cmu.edu/~trb/papers/wirevision00.pdf for more
; information on this color segmentation technique.
 
; One other note: this code does depend on the colorMap residing
; at a well-defined position in memory; specifically, it mus
; start at a 256-byte boundary so that the lowest byte in the
; map is set to 0x00. Currently, the colorMap is forced to
; start at RAM location 0x300. This could potentially be changed
; by the developer if needed, but offsets would have to be added
; in to the colorMap look-up code below to make it work.
 
 
; These are the registers that will be used throughout this
; module for acquiring each line of pixel data
pixelCount = 16
pixelRunStart = 17
lastColor = 18
tmp1 = 19 ; be sure to not use tmp1 and color simultaneously
tmp2 = 20
color = 19
greenData = 20
blueData = 21
colorMapLow = 22
colorMapHigh = 23
prevLineBuffLow = 22 ; overlaps with memLookupLow (but orthogonal)
prevLineBuffHigh = 23 ; overlaps with memLookupHigh (but orthogonal)
currLineBuffLow = 24
currLineBuffHigh = 25
 
.section .text
 
; These are the global assembly function names that are accessed via other
; C functions
.global CamIntAsm_waitForNewTrackingFrame
.global CamIntAsm_waitForNewDumpFrame
.global CamIntAsm_acquireDumpLine
.global CamIntAsm_acquireTrackingLine
.global SIG_INTERRUPT0
.global SIG_INTERRUPT1
.global SIG_OVERFLOW0
.global SIG_OVERFLOW1
;*****************************************************************
; Function Name: CamIntAsm_waitForNewTrackingFrame
; Function Description: This function is responsible for
; going to sleep until a new frame begins (indicated by
; VSYNC transitioning from low to high. This will wake
; the "VSYNC sleep" up and allow it to continue with
; the acquireLine function, where the system waits for
; an "HREF sleep" that we use to synchronize with the
; data.
; Inputs: r25 - MSB of currentLineBuffer
; r24 - LSB of currentLineBuffer
; r23 - MSB of colorMap
; r22 - LSB of colorMap
; Outputs: none
; NOTES: This function doesn't really return...it sorta just
; floats into the acquireLine function after the "VSYNC sleep"
; is awoken, then begins processing the line data. Once
; 176 pixels are sampled (and the counter overflows), then
; an interrupt will occur, the 'T' bit in the SREG will be
; set, and the function will return.
;*****************************************************************
CamIntAsm_waitForNewTrackingFrame:
sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
cbi _SFR_IO_ADDR(PORTD),PD6
sleep
 
;*****************************************************************
; REMEMBER...everything from here on out is critically timed to be
; synchronized with the flow of pixel data from the camera...
;*****************************************************************
 
CamIntAsm_acquireTrackingLine:
brts _cleanUp
;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
;cbi _SFR_IO_ADDR(PORTD),PD6
in tmp1,_SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
ori tmp1, 0x07 ; feed Timer1
out _SFR_IO_ADDR(TCCR1B),tmp1
; The line is about to start...
ldi pixelCount,0 ; Initialize the RLE stats...
ldi pixelRunStart,PIXEL_RUN_START_INITIAL ; Remember, we always calculate
; the pixel run length as
; TCNT1L - pixelRunStart
ldi lastColor,0x00 ; clear out the last color before we start
mov XH,currLineBuffHigh ; Load the pointer to the current line
mov XL,currLineBuffLow ; buffer into the X pointer regs
mov ZH,colorMapHigh ; Load the pointers to the membership
mov ZL,colorMapLow ; lookup tables (ZL and YL will be overwritten
mov YH,colorMapHigh ; as soon as we start reading data) to Z and Y
in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
ldi tmp2,0xFF ; interrupts) after 176 pixels
out _SFR_IO_ADDR(TCNT1H),tmp2
out _SFR_IO_ADDR(TCNT1L),tmp1
mov YL,colorMapLow
in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
; only use this interrupt to synchronize
; the beginning of the line
ori tmp1, HREF_INTERRUPT_ENABLE_MASK
out _SFR_IO_ADDR(GICR), tmp1
;*******************************************************************************************
; Track Frame handler
;*******************************************************************************************
_trackFrame:
sbi _SFR_IO_ADDR(PORTD),PD6
sleep ; ...And we wait...
; Returning from the interrupt/sleep wakeup will consume
; 14 clock cycles (7 to wakeup from idle sleep, 3 to vector, and 4 to return)
 
; Disable the HREF interrupt
cbi _SFR_IO_ADDR(PORTD),PD6
in tmp1, _SFR_IO_ADDR(GICR)
andi tmp1, HREF_INTERRUPT_DISABLE_MASK
out _SFR_IO_ADDR(GICR), tmp1
; A couple of NOPs are needed here to sync up the pixel data...the number (2)
; of NOPs was determined emperically by trial and error.
nop
nop
_acquirePixelBlock: ; Clock Cycle Count
in ZL,RB_PORT ; sample the red value (PINB) (1)
in YL,G_PORT ; sample the green value (PINC) (1)
andi YL,0x0F ; clear the high nibble (1)
ldd color,Z+RED_MEM_OFFSET ; lookup the red membership (2)
in ZL,RB_PORT ; sample the blue value (PINB) (1)
ldd greenData,Y+GREEN_MEM_OFFSET; lookup the green membership (2)
ldd blueData,Z+BLUE_MEM_OFFSET ; lookup the blue membership (2)
and color,greenData ; mask memberships together (1)
and color,blueData ; to produce the final color (1)
brts _cleanUpTrackingLine ; if some interrupt routine has (1...not set)
; come in and set our T flag in
; SREG, then we need to hop out
; and blow away this frames data (common cleanup)
cp color,lastColor ; check to see if the run continues (1)
breq _acquirePixelBlock ; (2...equal)
; ___________
; 16 clock cycles
; (16 clock cycles = 1 uS = 1 pixelBlock time)
; Toggle the debug line to indicate a color change
sbi _SFR_IO_ADDR(PORTD),PD6
nop
cbi _SFR_IO_ADDR(PORTD),PD6
mov tmp2,pixelRunStart ; get the count value of the
; current pixel run
in pixelCount,_SFR_IO_ADDR(TCNT1L) ; get the current TCNT1 value
mov pixelRunStart,pixelCount ; reload pixelRunStart for the
; next run
sub pixelCount,tmp2 ; pixelCount = TCNT1L - pixelRunStart
st X+,lastColor ; record the color run in the current line buffer
st X+,pixelCount ; with its length
mov lastColor,color ; set lastColor so we can figure out when it changes
nop ; waste one more cycle for a total of 16
rjmp _acquirePixelBlock
; _cleanUpTrackingLine is used to write the last run length block off to the currentLineBuffer so
; that all 176 pixels in the line are accounted for.
_cleanUpTrackingLine:
ldi pixelCount,0xFF ; the length of the last run is ALWAYS 0xFF minus the last
sub pixelCount,pixelRunStart ; pixelRunStart
inc pixelCount ; increment pixelCount since we actually need to account
; for the overflow of TCNT1
st X+,color ; record the color run in the current line buffer
st X,pixelCount
rjmp _cleanUp
_cleanUpDumpLine:
; NOTE: If serial data is received, to interrupt the tracking of a line, we'll
; get a EV_SERIAL_DATA_RECEIVED event, and the T bit set so we will end the
; line's processing...however, the PCLK will keep on ticking for the rest of
; the frame/line, which will cause the TCNT to eventually overflow and
; interrupt us, generating a EV_ACQUIRE_LINE_COMPLETE event. We don't want
; this, so we need to actually turn off the PCLK counting each time we exit
; this loop, and only turn it on when we begin acquiring lines....
; NOT NEEDED FOR NOW...
;in tmp1, _SFR_IO_ADDR(TIMSK) ; disable TIMER1 to stop counting
;andi tmp1, DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses
;out _SFR_IO_ADDR(TIMSK),tmp1
 
_cleanUp:
; Disable the external clocking of the Timer1 counter
in tmp1, _SFR_IO_ADDR(TCCR1B)
andi tmp1, 0xF8
out _SFR_IO_ADDR(TCCR1B),tmp1
; Toggle the debug line to indicate the line is complete
sbi _SFR_IO_ADDR(PORTD),PD6
cbi _SFR_IO_ADDR(PORTD),PD6
clt ; clear out the T bit since we have detected
; the interruption and are exiting to handle it
_exit:
ret
;*****************************************************************
; Function Name: CamIntAsm_waitForNewDumpFrame
; Function Description: This function is responsible for
; going to sleep until a new frame begins (indicated by
; VSYNC transitioning from low to high. This will wake
; the "VSYNC sleep" up and allow it to continue with
; acquiring a line of pixel data to dump out to the UI.
; Inputs: r25 - MSB of currentLineBuffer
; r24 - LSB of currentLineBuffer
; r23 - MSB of prevLineBuffer
; r22 - LSB of prevLineBuffer
; Outputs: none
; NOTES: This function doesn't really return...it sorta just
; floats into the acquireDumpLine function after the "VSYNC sleep"
; is awoken.
;*****************************************************************
CamIntAsm_waitForNewDumpFrame:
sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
cbi _SFR_IO_ADDR(PORTD),PD6
sleep
 
;*****************************************************************
; REMEMBER...everything from here on out is critically timed to be
; synchronized with the flow of pixel data from the camera...
;*****************************************************************
 
CamIntAsm_acquireDumpLine:
brts _cleanUp
;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
;cbi _SFR_IO_ADDR(PORTD),PD6
mov XH,currLineBuffHigh ; Load the pointer to the current line
mov XL,currLineBuffLow ; buffer into the X pointer regs
 
mov YH,prevLineBuffHigh ; Load the pointer to the previous line
mov YL,prevLineBuffLow ; buffer into the Y pointer regs
ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
ldi tmp2,0xFF ; interrupts) after 176 pixels
out _SFR_IO_ADDR(TCNT1H),tmp2
out _SFR_IO_ADDR(TCNT1L),tmp1
in tmp1, _SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
ori tmp1, 0x07 ; feed Timer1
out _SFR_IO_ADDR(TCCR1B),tmp1
nop
in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
; only use this interrupt to synchronize
; the beginning of the line
ori tmp1, HREF_INTERRUPT_ENABLE_MASK
out _SFR_IO_ADDR(GICR), tmp1
;*******************************************************************************************
; Dump Frame handler
;*******************************************************************************************
_dumpFrame:
sbi _SFR_IO_ADDR(PORTD),PD6
sleep ; ...And we wait...
 
cbi _SFR_IO_ADDR(PORTD),PD6
in tmp1, _SFR_IO_ADDR(GICR) ; disable the HREF interrupt
andi tmp1, HREF_INTERRUPT_DISABLE_MASK ; so we don't get interrupted
out _SFR_IO_ADDR(GICR), tmp1 ; while dumping the line
nop ; Remember...if we ever remove the "cbi" instruction above,
; we need to add two more NOPs to cover this
; Ok...the following loop needs to run in 8 clock cycles, so we can get every
; pixel in the line...this shouldn't be a problem, since the PCLK timing was
; reduced by a factor of 2 whenever we go to dump a line (this is to give us
; enough time to do the sampling and storing of the pixel data). In addition,
; it is assumed that we will have to do some minor processing on the data right
; before we send it out, like mask off the top 4-bits of each, and then pack both
; low nibbles into a single byte for transmission...we just don't have time to
; do that here (only 8 instruction cycles :-) )
_sampleDumpPixel:
in tmp1,G_PORT ; sample the G value (1)
in tmp2,RB_PORT ; sample the R/B value (1)
st X+,tmp1 ; store to the currLineBuff and inc ptrs(2)
st Y+,tmp2 ; store to the prevLineBuff and inc ptrs(2)
brtc _sampleDumpPixel ; loop back unless flag is set (2...if not set)
; ___________
; 8 cycles normally
; if we make it here, it means the T flag is set, and we must have been interrupted
; so we need to exit (what if we were interrupted for serial? should we disable it?)
rjmp _cleanUpDumpLine
 
;***********************************************************
; Function Name: <interrupt handler for External Interrupt0>
; Function Description: This function is responsible
; for handling a rising edge on the Ext Interrupt 0. This
; routine simply returns, since we just want to wake up
; whenever the VSYNC transitions (meaning the start of a new
; frame).
; Inputs: none
; Outputs: none
;***********************************************************
SIG_INTERRUPT0:
; This will wake us up when VSYNC transitions high...we just want to return
reti
;***********************************************************
; Function Name: <interrupt handler for External Interrupt1>
; Function Description: This function is responsible
; for handling a falling edge on the Ext Interrupt 1. This
; routine simply returns, since we just want to wake up
; whenever the HREF transitions (meaning the pixels
; are starting after VSYNC transitioned, and we need to
; start acquiring the pixel blocks
; Inputs: none
; Outputs: none
;***********************************************************
SIG_INTERRUPT1:
; This will wake us up when HREF transitions high...we just want to return
reti
;***********************************************************
; Function Name: <interrupt handler for Timer0 overflow>
; Function Description: This function is responsible
; for handling the Timer0 overflow (hooked up to indicate
; when we have reached the number of HREFs required in a
; single frame). We set the T flag in the SREG to
; indicate to the _acquirePixelBlock routine that it needs
; to exit, and then set the appropriate action to take in
; the eventList of the Executive module.
; Inputs: none
; Outputs: none
; Note: Originally, the HREF pulses were also going to
; be counted by a hardware counter, but it didn't end up
; being necessary
;***********************************************************
;SIG_OVERFLOW0:
; set ; set the T bit in SREG
; lds tmp1,eventBitmask
; ori tmp1,EV_ACQUIRE_FRAME_COMPLETE
; sts eventBitmask,tmp1
; reti
;***********************************************************
; Function Name: <interrupt handler for Timer1 overflow>
; Function Description: This function is responsible
; for handling the Timer1 overflow (hooked up to indicate
; when we have reached the end of a line of pixel data,
; since PCLK is hooked up to overflow TCNT1 after 176
; pixels). This routine generates an acquire line complete
; event in the fastEventBitmask, which is streamlined for
; efficiency reasons.
;***********************************************************
SIG_OVERFLOW1:
lds tmp1,fastEventBitmask ; set a flag indicating
ori tmp1,FEV_ACQUIRE_LINE_COMPLETE ; a line is complete
sts fastEventBitmask,tmp1
set ; set the T bit in SREG
;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
;cbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
 
reti
 
; This is the default handler for all interrupts that don't
; have handler routines specified for them.
.global __vector_default
__vector_default:
reti
 
.end
/programy/Atmel_C/AVRcam/CamInterfaceAsm.lst
0,0 → 1,1103
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 1
 
 
1 # 1 "CamInterfaceAsm.S"
2 # 1 "<built-in>"
1 ;
0
0
2 ; Copyright (C) 2004 John Orlando
3 ;
4 ; AVRcam: a small real-time image processing engine.
5
6 ; This program is free software; you can redistribute it and/or
7 ; modify it under the terms of the GNU General Public
8 ; License as published by the Free Software Foundation; either
9 ; version 2 of the License, or (at your option) any later version.
10
11 ; This program is distributed in the hope that it will be useful,
12 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ; General Public License for more details.
15
16 ; You should have received a copy of the GNU General Public
17 ; License along with this program; if not, write to the Free Software
18 ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 ; For more information on the AVRcam, please contact:
21
22 ; john@jrobot.net
23
24 ; or go to www.jrobot.net for more details regarding the system.
25 ;**********************************************************************
26 ; Module Name: CanInterfaceAsm.S
27 ; Module Date: 04/14/2004
28 ; Module Auth: John Orlando
29 ;
30 ; Description: This module provides the low-level interface
31 ; to the OV6620 camera hardware. It is responsible for
32 ; acquiring each pixel block (R,G,B), performing the mapping
33 ; into an actual color (orange, purple, etc), run-length
34 ; encoding the data, and storing the info off to the appropriate
35 ; line buffer. This routine is synchronized with the pixel data
36 ; so that no polling of the camera data needs to be done (the
37 ; OV6620 is clocked off of the same crystal source as the mega8,
38 ; thus providing inherent synchronization between the two).
39 ;
40 ; Revision History:
41 ; Date Rel Ver. Notes
42 ; 4/10/2004 0.1 Module created
43 ; 6/30/2004 1.0 Initial release for Circuit Cellar
44 ; contest.
45 ; 1/16/2005 1.4 Fixed issue with the TCCR1B register
46 ; where PCLK was getting routed to the
47 ; timer1 even when it wasn't needed.
48 ; This caused excessive counter overflow
49 ; interrupts, and caused problems. Now,
50 ; the "PCLK" pipe feeds timer1 when needed,
51 ; and is turned off when it isn't needed.
52
53 #include <avr/io.h>
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 2
 
 
1 /* Copyright (c) 2002,2003 Marek Michalkiewicz, Joerg Wunsch
2 All rights reserved.
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are met:
6
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
12 distribution.
13
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 POSSIBILITY OF SUCH DAMAGE. */
25
26 /* $Id: io.h,v 1.10 2003/02/28 23:03:40 marekm Exp $ */
27
28 /** \defgroup avr_io AVR device-specific IO definitions
29 \code #include <avr/io.h> \endcode
30
31 This header file includes the apropriate IO definitions for the
32 device that has been specified by the <tt>-mmcu=</tt> compiler
33 command-line switch. This is done by diverting to the appropriate
34 file <tt>&lt;avr/io</tt><em>XXXX</em><tt>.h&gt;</tt> which should
35 never be included directly. Some register names common to all
36 AVR devices are defined directly within <tt>&lt;avr/io.h&gt;</tt>,
37 but most of the details come from the respective include file.
38
39 Note that this file always includes
40 \code #include <avr/sfr_defs.h> \endcode
41 See \ref avr_sfr for the details.
42
43 Included are definitions of the IO register set and their
44 respective bit values as specified in the Atmel documentation.
45 Note that Atmel is not very consistent in its naming conventions,
46 so even identical functions sometimes get different names on
47 different devices.
48
49 Also included are the specific names useable for interrupt
50 function definitions as documented
51 \ref avr_signames "here".
52
53 Finally, the following macros are defined:
54
55 - \b RAMEND
56 <br>
57 A constant describing the last on-chip RAM location.
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 3
 
 
58 <br>
59 - \b XRAMEND
60 <br>
61 A constant describing the last possible location in RAM.
62 This is equal to RAMEND for devices that do not allow for
63 external RAM.
64 <br>
65 - \b E2END
66 <br>
67 A constant describing the address of the last EEPROM cell.
68 <br>
69 - \b FLASHEND
70 <br>
71 A constant describing the last byte address in flash ROM.
72 <br>
73 - \b SPM_PAGESIZE
74 <br>
75 For devices with bootloader support, the flash pagesize
76 (in bytes) to be used for the \c SPM instruction. */
77
78 #ifndef _AVR_IO_H_
79 #define _AVR_IO_H_
80
81 #include <avr/sfr_defs.h>
1 /* Copyright (c) 2002, Marek Michalkiewicz <marekm@amelek.gda.pl>
2 All rights reserved.
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are met:
6
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
12 distribution.
13
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 POSSIBILITY OF SUCH DAMAGE. */
25
26 /* avr/sfr_defs.h - macros for accessing AVR special function registers */
27
28 /* $Id: sfr_defs.h,v 1.10 2003/08/11 21:42:13 troth Exp $ */
29
30 #ifndef _AVR_SFR_DEFS_H_
31 #define _AVR_SFR_DEFS_H_ 1
32
33 /** \defgroup avr_sfr_notes Additional notes from <avr/sfr_defs.h>
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 4
 
 
34 \ingroup avr_sfr
35
36 The \c <avr/sfr_defs.h> file is included by all of the \c <avr/ioXXXX.h>
37 files, which use macros defined here to make the special function register
38 definitions look like C variables or simple constants, depending on the
39 <tt>_SFR_ASM_COMPAT</tt> define. Some examples from \c <avr/iom128.h> to
40 show how to define such macros:
41
42 \code
43 #define PORTA _SFR_IO8(0x1b)
44 #define TCNT1 _SFR_IO16(0x2c)
45 #define PORTF _SFR_MEM8(0x61)
46 #define TCNT3 _SFR_MEM16(0x88)
47 \endcode
48
49 If \c _SFR_ASM_COMPAT is not defined, C programs can use names like
50 <tt>PORTA</tt> directly in C expressions (also on the left side of
51 assignment operators) and GCC will do the right thing (use short I/O
52 instructions if possible). The \c __SFR_OFFSET definition is not used in
53 any way in this case.
54
55 Define \c _SFR_ASM_COMPAT as 1 to make these names work as simple constants
56 (addresses of the I/O registers). This is necessary when included in
57 preprocessed assembler (*.S) source files, so it is done automatically if
58 \c __ASSEMBLER__ is defined. By default, all addresses are defined as if
59 they were memory addresses (used in \c lds/sts instructions). To use these
60 addresses in \c in/out instructions, you must subtract 0x20 from them.
61
62 For more backwards compatibility, insert the following at the start of your
63 old assembler source file:
64
65 \code
66 #define __SFR_OFFSET 0
67 \endcode
68
69 This automatically subtracts 0x20 from I/O space addresses, but it's a
70 hack, so it is recommended to change your source: wrap such addresses in
71 macros defined here, as shown below. After this is done, the
72 <tt>__SFR_OFFSET</tt> definition is no longer necessary and can be removed.
73
74 Real example - this code could be used in a boot loader that is portable
75 between devices with \c SPMCR at different addresses.
76
77 \verbatim
78 <avr/iom163.h>: #define SPMCR _SFR_IO8(0x37)
79 <avr/iom128.h>: #define SPMCR _SFR_MEM8(0x68)
80 \endverbatim
81
82 \code
82
83 /*
84 * Registers common to all AVR devices.
85 */
86
87 #if __AVR_ARCH__ != 1
88 /*
89 * AVR architecture 1 has no RAM, thus no stack pointer.
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 5
 
 
90 *
91 * All other archs do have a stack pointer. Some devices have only
92 * less than 256 bytes of possible RAM locations (128 Bytes of SRAM
93 * and no option for external RAM), thus SPH is officially "reserved"
94 * for them. We catch this case below after including the
95 * device-specific ioXXXX.h file, by examining XRAMEND, and
96 * #undef-ining SP and SPH in that case.
97 */
98 /* Stack Pointer */
99 #define SP _SFR_IO16(0x3D)
100 #define SPL _SFR_IO8(0x3D)
101 #define SPH _SFR_IO8(0x3E)
102 #endif /* #if __AVR_ARCH__ != 1 */
103
104 /* Status REGister */
105 #define SREG _SFR_IO8(0x3F)
106
107 /* Status Register - SREG */
108 #define SREG_I 7
109 #define SREG_T 6
110 #define SREG_H 5
111 #define SREG_S 4
112 #define SREG_V 3
113 #define SREG_N 2
114 #define SREG_Z 1
115 #define SREG_C 0
116
117 /* Pointer definition */
118 #if __AVR_ARCH__ != 1
119 /* avr1 has only the Z pointer */
120 #define XL r26
121 #define XH r27
122 #define YL r28
123 #define YH r29
124 #endif /* #if __AVR_ARCH__ != 1 */
125 #define ZL r30
126 #define ZH r31
127
128 /*
129 * Only few devices come without EEPROM. In order to assemble the
130 * EEPROM library components without defining a specific device, we
131 * keep the EEPROM-related definitions here, and catch the devices
132 * without EEPROM (E2END == 0) below. Obviously, the EEPROM library
133 * functions will not work for them. ;-)
134 */
135 /* EEPROM Control Register */
136 #define EECR _SFR_IO8(0x1C)
137
138 /* EEPROM Data Register */
139 #define EEDR _SFR_IO8(0x1D)
140
141 /* EEPROM Address Register */
142 #define EEAR _SFR_IO16(0x1E)
143 #define EEARL _SFR_IO8(0x1E)
144 #define EEARH _SFR_IO8(0x1F)
145
146 /* EEPROM Control Register */
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 6
 
 
147 #define EERIE 3
148 #define EEMWE 2
149 #define EEWE 1
150 #define EERE 0
151
152 #if defined (__AVR_AT94K__)
153 # include <avr/ioat94k.h>
154 #elif defined (__AVR_AT43USB320__)
155 # include <avr/io43u32x.h>
156 #elif defined (__AVR_AT43USB355__)
157 # include <avr/io43u35x.h>
158 #elif defined (__AVR_AT76C711__)
159 # include <avr/io76c711.h>
160 #elif defined (__AVR_AT86RF401__)
161 # include <avr/io86r401.h>
162 #elif defined (__AVR_ATmega128__)
163 # include <avr/iom128.h>
164 #elif defined (__AVR_ATmega64__)
165 # include <avr/iom64.h>
166 #elif defined (__AVR_ATmega103__)
167 # include <avr/iom103.h>
168 #elif defined (__AVR_ATmega32__)
169 # include <avr/iom32.h>
170 #elif defined (__AVR_ATmega323__)
171 # include <avr/iom323.h>
172 #elif defined (__AVR_ATmega16__)
173 # include <avr/iom16.h>
174 #elif defined (__AVR_ATmega161__)
175 # include <avr/iom161.h>
176 #elif defined (__AVR_ATmega162__)
177 # include <avr/iom162.h>
178 #elif defined (__AVR_ATmega163__)
179 # include <avr/iom163.h>
180 #elif defined (__AVR_ATmega169__)
181 # include <avr/iom169.h>
182 #elif defined (__AVR_ATmega8__)
183 # include <avr/iom8.h>
1 /* Copyright (c) 2002, Marek Michalkiewicz
2 All rights reserved.
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are met:
6
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
12 distribution.
13
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 7
 
 
21 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 POSSIBILITY OF SUCH DAMAGE. */
25
26 /* $Id: iom8.h,v 1.8 2003/02/17 09:57:28 marekm Exp $ */
27
28 /* avr/iom8.h - definitions for ATmega8 */
29
30 #ifndef _AVR_IOM8_H_
31 #define _AVR_IOM8_H_ 1
32
33 /* This file should only be included from <avr/io.h>, never directly. */
34
35 #ifndef _AVR_IO_H_
36 # error "Include <avr/io.h> instead of this file."
37 #endif
38
39 #ifndef _AVR_IOXXX_H_
40 # define _AVR_IOXXX_H_ "iom8.h"
41 #else
42 # error "Attempt to include more than one <avr/ioXXX.h> file."
43 #endif
44
45 /* I/O registers */
46
47 /* TWI stands for "Two Wire Interface" or "TWI Was I2C(tm)" */
48 #define TWBR _SFR_IO8(0x00)
49 #define TWSR _SFR_IO8(0x01)
50 #define TWAR _SFR_IO8(0x02)
51 #define TWDR _SFR_IO8(0x03)
52
53 /* ADC */
54 #define ADCW _SFR_IO16(0x04)
55 #ifndef __ASSEMBLER__
56 #define ADC _SFR_IO16(0x04)
57 #endif
58 #define ADCL _SFR_IO8(0x04)
59 #define ADCH _SFR_IO8(0x05)
60 #define ADCSR _SFR_IO8(0x06)
61 #define ADCSRA _SFR_IO8(0x06) /* Changed in 2486H-AVR-09/02 */
62 #define ADMUX _SFR_IO8(0x07)
63
64 /* analog comparator */
65 #define ACSR _SFR_IO8(0x08)
66
67 /* USART */
68 #define UBRRL _SFR_IO8(0x09)
69 #define UCSRB _SFR_IO8(0x0A)
70 #define UCSRA _SFR_IO8(0x0B)
71 #define UDR _SFR_IO8(0x0C)
72
73 /* SPI */
74 #define SPCR _SFR_IO8(0x0D)
75 #define SPSR _SFR_IO8(0x0E)
76 #define SPDR _SFR_IO8(0x0F)
77
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 8
 
 
78 /* Port D */
79 #define PIND _SFR_IO8(0x10)
80 #define DDRD _SFR_IO8(0x11)
81 #define PORTD _SFR_IO8(0x12)
82
83 /* Port C */
84 #define PINC _SFR_IO8(0x13)
85 #define DDRC _SFR_IO8(0x14)
86 #define PORTC _SFR_IO8(0x15)
87
88 /* Port B */
89 #define PINB _SFR_IO8(0x16)
90 #define DDRB _SFR_IO8(0x17)
91 #define PORTB _SFR_IO8(0x18)
92
93 /* 0x1C..0x1F EEPROM */
94
95 #define UCSRC _SFR_IO8(0x20)
96 #define UBRRH _SFR_IO8(0x20)
97
98 #define WDTCR _SFR_IO8(0x21)
99 #define ASSR _SFR_IO8(0x22)
100
101 /* Timer 2 */
102 #define OCR2 _SFR_IO8(0x23)
103 #define TCNT2 _SFR_IO8(0x24)
104 #define TCCR2 _SFR_IO8(0x25)
105
106 /* Timer 1 */
107 #define ICR1 _SFR_IO16(0x26)
108 #define ICR1L _SFR_IO8(0x26)
109 #define ICR1H _SFR_IO8(0x27)
110 #define OCR1B _SFR_IO16(0x28)
111 #define OCR1BL _SFR_IO8(0x28)
112 #define OCR1BH _SFR_IO8(0x29)
113 #define OCR1A _SFR_IO16(0x2A)
114 #define OCR1AL _SFR_IO8(0x2A)
115 #define OCR1AH _SFR_IO8(0x2B)
116 #define TCNT1 _SFR_IO16(0x2C)
117 #define TCNT1L _SFR_IO8(0x2C)
118 #define TCNT1H _SFR_IO8(0x2D)
119 #define TCCR1B _SFR_IO8(0x2E)
120 #define TCCR1A _SFR_IO8(0x2F)
121
122 #define SFIOR _SFR_IO8(0x30)
123
124 #define OSCCAL _SFR_IO8(0x31)
125
126 /* Timer 0 */
127 #define TCNT0 _SFR_IO8(0x32)
128 #define TCCR0 _SFR_IO8(0x33)
129
130 #define MCUCSR _SFR_IO8(0x34)
131 #define MCUCR _SFR_IO8(0x35)
132
133 #define TWCR _SFR_IO8(0x36)
134
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 9
 
 
135 #define SPMCR _SFR_IO8(0x37)
136
137 #define TIFR _SFR_IO8(0x38)
138 #define TIMSK _SFR_IO8(0x39)
139
140 #define GIFR _SFR_IO8(0x3A)
141 #define GIMSK _SFR_IO8(0x3B)
142 #define GICR _SFR_IO8(0x3B) /* Changed in 2486H-AVR-09/02 */
143
144 /* 0x3C reserved (OCR0?) */
145
146 /* 0x3D..0x3E SP */
147
148 /* 0x3F SREG */
149
150 /* Interrupt vectors */
151
152 #define SIG_INTERRUPT0 _VECTOR(1)
153 #define SIG_INTERRUPT1 _VECTOR(2)
154 #define SIG_OUTPUT_COMPARE2 _VECTOR(3)
155 #define SIG_OVERFLOW2 _VECTOR(4)
156 #define SIG_INPUT_CAPTURE1 _VECTOR(5)
157 #define SIG_OUTPUT_COMPARE1A _VECTOR(6)
158 #define SIG_OUTPUT_COMPARE1B _VECTOR(7)
159 #define SIG_OVERFLOW1 _VECTOR(8)
160 #define SIG_OVERFLOW0 _VECTOR(9)
161 #define SIG_SPI _VECTOR(10)
162 #define SIG_UART_RECV _VECTOR(11)
163 #define SIG_UART_DATA _VECTOR(12)
164 #define SIG_UART_TRANS _VECTOR(13)
165 #define SIG_ADC _VECTOR(14)
166 #define SIG_EEPROM_READY _VECTOR(15)
167 #define SIG_COMPARATOR _VECTOR(16)
168 #define SIG_2WIRE_SERIAL _VECTOR(17)
169 #define SIG_SPM_READY _VECTOR(18)
170
171 #define _VECTORS_SIZE 38
172
173 /* Bit numbers */
174
175 /* GIMSK / GICR */
176 #define INT1 7
177 #define INT0 6
178 #define IVSEL 1
179 #define IVCE 0
180
181 /* GIFR */
182 #define INTF1 7
183 #define INTF0 6
184
184 #elif defined (__AVR_ATmega8515__)
54 #include "Events.h"
1 #ifndef EVENTS_H
2 #define EVENTS_H
3
4 /*
5 Copyright (C) 2004 John Orlando
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 10
 
 
6
7 AVRcam: a small real-time image processing engine.
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public
11 License as published by the Free Software Foundation; either
12 version 2 of the License, or (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19 You should have received a copy of the GNU General Public
20 License along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
23 For more information on the AVRcam, please contact:
24
25 john@jrobot.net
26
27 or go to www.jrobot.net for more details regarding the system.
28 */
29 /***********************************************************
30 Module Name: Events.h
31 Module Date: 05/23/2004
32 Module Auth: John Orlando
33
34 Description: This file provides the external interface
35 to the events that can be published/processed in the
36 system. It is specifically by itself (and nothing
37 else should be defined in here) so that both .c and
38 .S (assembly) files can include this file without
39 a problem.
40
41 Revision History:
42 Date Rel Ver. Notes
43 4/10/2004 0.1 Module created
44 6/30/2004 1.0 Initial release for Circuit Cellar
45 contest.
46 *******************************************************/
47
48 /* Definitions */
49 /* Originally, all events were passed in a bitmask...however,
50 an event FIFO was finally used, but the coding of the event
51 definitions were never translated back....doesn't make a
52 difference, but looks a little weird */
53 #define EV_SERIAL_DATA_RECEIVED 0x01
54 #define EV_DUMP_FRAME 0x02
55 #define EV_PROCESS_FRAME_COMPLETE 0x04
55
56 .extern fastEventBitmask ; This is the flag used to indicate to the rest
57 ; of the system that the line is complete
58
59 #define HREF_INTERRUPT_ENABLE_MASK 0x80
60 #define HREF_INTERRUPT_DISABLE_MASK 0x7F
61 #define ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0x04
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 11
 
 
62 #define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
63 #define G_PORT _SFR_IO_ADDR(PINC)
64 #define RB_PORT _SFR_IO_ADDR(PINB)
65 #define PIXEL_RUN_START_INITIAL 0x50 ; This value causes our pixel counter (TCNT1)
66 ; to overflow after 176 (horizontal) pixels
67
68 #define RED_MEM_OFFSET 0x00
69 #define GREEN_MEM_OFFSET 0x10
70 #define BLUE_MEM_OFFSET 0x20
71
72 ; A pixelBlock is defined as a contiguous group of 4 pixels that are combined
73 ; together to form a specific color. Typically, this is formed by sampling a
74 ; a green value, followed by a red and blue value (since we are dealing
75 ; with Bayer color data). We could optionally sample a second green with
76 ; the red and average the greens, because the eye is more sensitive to
77 ; green, but for speed we don't do this. These three values (RGB) are then
78 ; used as indices into the color membership lookup table (memLookup) to
79 ; determine which color the pixelBlock maps into. The memLookup table is
80 ; manually generated for now (though it will hopefully be modified over
81 ; the serial interface eventually).
82 ;
83 ; Here is a pixel block:
84 ; ...G G G G... (row x)
85 ; ...B R B R... (row x+1)
86 ; | | | |--this is skipped
87 ; | | |--this is skipped
88 ; | |--this is sampled
89 ; |--this is sampled
90
91 ; As pixel blocks are sampled, the red, green, and blue values are
92 ; used to index into their respective color maps. The color maps
93 ; return values that can be logically ANDed together so that a
94 ; particular RGB triplet will result in a single bit being set
95 ; after the AND operation. This single bit indicates which color
96 ; the RGB triplet represents. It is also possible for no bits to
97 ; be set after the AND process, indicating that the RGB triplet
98 ; does not map to any of the colors configured in the color map.
99 ; This isn't quite as fast as a pure RGB lookup table, but
100 ; it then again it doesn't require 2^12 (4-bits for each color
101 ; channel) bytes to store the lookup table. It takes just a few
102 ; more cycles, and only requires 48 bytes of precious RAM (16
103 ; per color channel, since our resolution on each color channel
104 ; is only 4-bits). Not bad....for more information, see:
105 ; http://www.cs.cmu.edu/~trb/papers/wirevision00.pdf for more
106 ; information on this color segmentation technique.
107
108 ; One other note: this code does depend on the colorMap residing
109 ; at a well-defined position in memory; specifically, it mus
110 ; start at a 256-byte boundary so that the lowest byte in the
111 ; map is set to 0x00. Currently, the colorMap is forced to
112 ; start at RAM location 0x300. This could potentially be changed
113 ; by the developer if needed, but offsets would have to be added
114 ; in to the colorMap look-up code below to make it work.
115
116
117 ; These are the registers that will be used throughout this
118 ; module for acquiring each line of pixel data
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 12
 
 
119 pixelCount = 16
120 pixelRunStart = 17
121 lastColor = 18
122 tmp1 = 19 ; be sure to not use tmp1 and color simultaneously
123 tmp2 = 20
124 color = 19
125 greenData = 20
126 blueData = 21
127 colorMapLow = 22
128 colorMapHigh = 23
129 prevLineBuffLow = 22 ; overlaps with memLookupLow (but orthogonal)
130 prevLineBuffHigh = 23 ; overlaps with memLookupHigh (but orthogonal)
131 currLineBuffLow = 24
132 currLineBuffHigh = 25
133
134 .section .text
135
136 ; These are the global assembly function names that are accessed via other
137 ; C functions
138 .global CamIntAsm_waitForNewTrackingFrame
139 .global CamIntAsm_waitForNewDumpFrame
140 .global CamIntAsm_acquireDumpLine
141 .global CamIntAsm_acquireTrackingLine
142 .global SIG_INTERRUPT0
143 .global SIG_INTERRUPT1
144 .global SIG_OVERFLOW0
145 .global SIG_OVERFLOW1
146
147 ;*****************************************************************
148 ; Function Name: CamIntAsm_waitForNewTrackingFrame
149 ; Function Description: This function is responsible for
150 ; going to sleep until a new frame begins (indicated by
151 ; VSYNC transitioning from low to high. This will wake
152 ; the "VSYNC sleep" up and allow it to continue with
153 ; the acquireLine function, where the system waits for
154 ; an "HREF sleep" that we use to synchronize with the
155 ; data.
156 ; Inputs: r25 - MSB of currentLineBuffer
157 ; r24 - LSB of currentLineBuffer
158 ; r23 - MSB of colorMap
159 ; r22 - LSB of colorMap
160 ; Outputs: none
161 ; NOTES: This function doesn't really return...it sorta just
162 ; floats into the acquireLine function after the "VSYNC sleep"
163 ; is awoken, then begins processing the line data. Once
164 ; 176 pixels are sampled (and the counter overflows), then
165 ; an interrupt will occur, the 'T' bit in the SREG will be
166 ; set, and the function will return.
167 ;*****************************************************************
168
169 CamIntAsm_waitForNewTrackingFrame:
170:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
171:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
172:CamInterfaceAsm.S **** sleep
173
174 ;*****************************************************************
175 ; REMEMBER...everything from here on out is critically timed to be
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 13
 
 
176 ; synchronized with the flow of pixel data from the camera...
177 ;*****************************************************************
178
179 CamIntAsm_acquireTrackingLine:
180:CamInterfaceAsm.S **** brts _cleanUp
181 ;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
182 ;cbi _SFR_IO_ADDR(PORTD),PD6
183
184:CamInterfaceAsm.S **** in tmp1,_SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
185:CamInterfaceAsm.S **** ori tmp1, 0x07 ; feed Timer1
186:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCCR1B),tmp1
187 ; The line is about to start...
188:CamInterfaceAsm.S **** ldi pixelCount,0 ; Initialize the RLE stats...
189:CamInterfaceAsm.S **** ldi pixelRunStart,PIXEL_RUN_START_INITIAL ; Remember, we always calculate
190 ; the pixel run length as
191 ; TCNT1L - pixelRunStart
192
193:CamInterfaceAsm.S **** ldi lastColor,0x00 ; clear out the last color before we start
194
195:CamInterfaceAsm.S **** mov XH,currLineBuffHigh ; Load the pointer to the current line
196:CamInterfaceAsm.S **** mov XL,currLineBuffLow ; buffer into the X pointer regs
197
198:CamInterfaceAsm.S **** mov ZH,colorMapHigh ; Load the pointers to the membership
199:CamInterfaceAsm.S **** mov ZL,colorMapLow ; lookup tables (ZL and YL will be overwritten
200:CamInterfaceAsm.S **** mov YH,colorMapHigh ; as soon as we start reading data) to Z and Y
201
202:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
203:CamInterfaceAsm.S **** ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
204:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
205
206:CamInterfaceAsm.S **** ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
207:CamInterfaceAsm.S **** ldi tmp2,0xFF ; interrupts) after 176 pixels
208:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1H),tmp2
209:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1L),tmp1
210
211:CamInterfaceAsm.S **** mov YL,colorMapLow
212
213:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
214 ; only use this interrupt to synchronize
215 ; the beginning of the line
216:CamInterfaceAsm.S **** ori tmp1, HREF_INTERRUPT_ENABLE_MASK
217:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1
218
219 ;*******************************************************************************************
220 ; Track Frame handler
221 ;*******************************************************************************************
222
223 _trackFrame:
224:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
225:CamInterfaceAsm.S **** sleep ; ...And we wait...
226
227 ; Returning from the interrupt/sleep wakeup will consume
228 ; 14 clock cycles (7 to wakeup from idle sleep, 3 to vector, and 4 to return)
229
230 ; Disable the HREF interrupt
231:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
232:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR)
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 14
 
 
233:CamInterfaceAsm.S **** andi tmp1, HREF_INTERRUPT_DISABLE_MASK
234:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1
235
236 ; A couple of NOPs are needed here to sync up the pixel data...the number (2)
237 ; of NOPs was determined emperically by trial and error.
238:CamInterfaceAsm.S **** nop
239:CamInterfaceAsm.S **** nop
240 _acquirePixelBlock: ; Clock Cycle Count
241:CamInterfaceAsm.S **** in ZL,RB_PORT ; sample the red value (PINB) (1)
242:CamInterfaceAsm.S **** in YL,G_PORT ; sample the green value (PINC) (1)
243:CamInterfaceAsm.S **** andi YL,0x0F ; clear the high nibble (1)
244:CamInterfaceAsm.S **** ldd color,Z+RED_MEM_OFFSET ; lookup the red membership (2)
245:CamInterfaceAsm.S **** in ZL,RB_PORT ; sample the blue value (PINB) (1)
246:CamInterfaceAsm.S **** ldd greenData,Y+GREEN_MEM_OFFSET; lookup the green membership (2)
247:CamInterfaceAsm.S **** ldd blueData,Z+BLUE_MEM_OFFSET ; lookup the blue membership (2)
248:CamInterfaceAsm.S **** and color,greenData ; mask memberships together (1)
249:CamInterfaceAsm.S **** and color,blueData ; to produce the final color (1)
250:CamInterfaceAsm.S **** brts _cleanUpTrackingLine ; if some interrupt routine has (1...not set)
251 ; come in and set our T flag in
252 ; SREG, then we need to hop out
253 ; and blow away this frames data (common cleanup)
254:CamInterfaceAsm.S **** cp color,lastColor ; check to see if the run continues (1)
255:CamInterfaceAsm.S **** breq _acquirePixelBlock ; (2...equal)
256 ; ___________
257 ; 16 clock cycles
258 ; (16 clock cycles = 1 uS = 1 pixelBlock time)
259
260 ; Toggle the debug line to indicate a color change
261:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
262:CamInterfaceAsm.S **** nop
263:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
264
265:CamInterfaceAsm.S **** mov tmp2,pixelRunStart ; get the count value of the
266 ; current pixel run
267:CamInterfaceAsm.S **** in pixelCount,_SFR_IO_ADDR(TCNT1L) ; get the current TCNT1 value
268:CamInterfaceAsm.S **** mov pixelRunStart,pixelCount ; reload pixelRunStart for the
269 ; next run
270:CamInterfaceAsm.S **** sub pixelCount,tmp2 ; pixelCount = TCNT1L - pixelRunStart
271
272:CamInterfaceAsm.S **** st X+,lastColor ; record the color run in the current line buffer
273:CamInterfaceAsm.S **** st X+,pixelCount ; with its length
274:CamInterfaceAsm.S **** mov lastColor,color ; set lastColor so we can figure out when it changes
275
276:CamInterfaceAsm.S **** nop ; waste one more cycle for a total of 16
277:CamInterfaceAsm.S **** rjmp _acquirePixelBlock
278
279 ; _cleanUpTrackingLine is used to write the last run length block off to the currentLineBuffer so
280 ; that all 176 pixels in the line are accounted for.
281 _cleanUpTrackingLine:
282:CamInterfaceAsm.S **** ldi pixelCount,0xFF ; the length of the last run is ALWAYS 0xFF minus the last
283:CamInterfaceAsm.S **** sub pixelCount,pixelRunStart ; pixelRunStart
284
285:CamInterfaceAsm.S **** inc pixelCount ; increment pixelCount since we actually need to account
286 ; for the overflow of TCNT1
287
288:CamInterfaceAsm.S **** st X+,color ; record the color run in the current line buffer
289:CamInterfaceAsm.S **** st X,pixelCount
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 15
 
 
290:CamInterfaceAsm.S **** rjmp _cleanUp
291
292 _cleanUpDumpLine:
293 ; NOTE: If serial data is received, to interrupt the tracking of a line, we'll
294 ; get a EV_SERIAL_DATA_RECEIVED event, and the T bit set so we will end the
295 ; line's processing...however, the PCLK will keep on ticking for the rest of
296 ; the frame/line, which will cause the TCNT to eventually overflow and
297 ; interrupt us, generating a EV_ACQUIRE_LINE_COMPLETE event. We don't want
298 ; this, so we need to actually turn off the PCLK counting each time we exit
299 ; this loop, and only turn it on when we begin acquiring lines....
300 ; NOT NEEDED FOR NOW...
301 ;in tmp1, _SFR_IO_ADDR(TIMSK) ; disable TIMER1 to stop counting
302 ;andi tmp1, DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses
303 ;out _SFR_IO_ADDR(TIMSK),tmp1
304
305 _cleanUp:
306 ; Disable the external clocking of the Timer1 counter
307:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TCCR1B)
308:CamInterfaceAsm.S **** andi tmp1, 0xF8
309:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCCR1B),tmp1
310
311 ; Toggle the debug line to indicate the line is complete
312:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
313:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
314:CamInterfaceAsm.S **** clt ; clear out the T bit since we have detected
315 ; the interruption and are exiting to handle it
316 _exit:
317:CamInterfaceAsm.S **** ret
318
319 ;*****************************************************************
320 ; Function Name: CamIntAsm_waitForNewDumpFrame
321 ; Function Description: This function is responsible for
322 ; going to sleep until a new frame begins (indicated by
323 ; VSYNC transitioning from low to high. This will wake
324 ; the "VSYNC sleep" up and allow it to continue with
325 ; acquiring a line of pixel data to dump out to the UI.
326 ; Inputs: r25 - MSB of currentLineBuffer
327 ; r24 - LSB of currentLineBuffer
328 ; r23 - MSB of prevLineBuffer
329 ; r22 - LSB of prevLineBuffer
330 ; Outputs: none
331 ; NOTES: This function doesn't really return...it sorta just
332 ; floats into the acquireDumpLine function after the "VSYNC sleep"
333 ; is awoken.
334 ;*****************************************************************
335 CamIntAsm_waitForNewDumpFrame:
336:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
337:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
338:CamInterfaceAsm.S **** sleep
339
340 ;*****************************************************************
341 ; REMEMBER...everything from here on out is critically timed to be
342 ; synchronized with the flow of pixel data from the camera...
343 ;*****************************************************************
344
345 CamIntAsm_acquireDumpLine:
346:CamInterfaceAsm.S **** brts _cleanUp
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 16
 
 
347 ;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
348 ;cbi _SFR_IO_ADDR(PORTD),PD6
349
350:CamInterfaceAsm.S **** mov XH,currLineBuffHigh ; Load the pointer to the current line
351:CamInterfaceAsm.S **** mov XL,currLineBuffLow ; buffer into the X pointer regs
352
353:CamInterfaceAsm.S **** mov YH,prevLineBuffHigh ; Load the pointer to the previous line
354:CamInterfaceAsm.S **** mov YL,prevLineBuffLow ; buffer into the Y pointer regs
355
356:CamInterfaceAsm.S **** ldi tmp1,PIXEL_RUN_START_INITIAL ; set up the TCNT1 to overflow (and
357:CamInterfaceAsm.S **** ldi tmp2,0xFF ; interrupts) after 176 pixels
358:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1H),tmp2
359:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCNT1L),tmp1
360
361:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TCCR1B) ; Enable the PCLK line to actually
362:CamInterfaceAsm.S **** ori tmp1, 0x07 ; feed Timer1
363:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TCCR1B),tmp1
364:CamInterfaceAsm.S **** nop
365
366:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(TIMSK) ; enable TIMER1 to start counting
367:CamInterfaceAsm.S **** ori tmp1, ENABLE_PCLK_TIMER1_OVERFLOW_BITMASK ; external PCLK pulses and interrupt on
368:CamInterfaceAsm.S **** out _SFR_IO_ADDR(TIMSK),tmp1 ; overflow
369
370:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR) ; enable the HREF interrupt...remember, we
371 ; only use this interrupt to synchronize
372 ; the beginning of the line
373:CamInterfaceAsm.S **** ori tmp1, HREF_INTERRUPT_ENABLE_MASK
374:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1
375
376 ;*******************************************************************************************
377 ; Dump Frame handler
378 ;*******************************************************************************************
379
380 _dumpFrame:
381:CamInterfaceAsm.S **** sbi _SFR_IO_ADDR(PORTD),PD6
382:CamInterfaceAsm.S **** sleep ; ...And we wait...
383
384:CamInterfaceAsm.S **** cbi _SFR_IO_ADDR(PORTD),PD6
385:CamInterfaceAsm.S **** in tmp1, _SFR_IO_ADDR(GICR) ; disable the HREF interrupt
386:CamInterfaceAsm.S **** andi tmp1, HREF_INTERRUPT_DISABLE_MASK ; so we don't get interrupted
387:CamInterfaceAsm.S **** out _SFR_IO_ADDR(GICR), tmp1 ; while dumping the line
388
389:CamInterfaceAsm.S **** nop ; Remember...if we ever remove the "cbi" instruction above,
390 ; we need to add two more NOPs to cover this
391
392 ; Ok...the following loop needs to run in 8 clock cycles, so we can get every
393 ; pixel in the line...this shouldn't be a problem, since the PCLK timing was
394 ; reduced by a factor of 2 whenever we go to dump a line (this is to give us
395 ; enough time to do the sampling and storing of the pixel data). In addition,
396 ; it is assumed that we will have to do some minor processing on the data right
397 ; before we send it out, like mask off the top 4-bits of each, and then pack both
398 ; low nibbles into a single byte for transmission...we just don't have time to
399 ; do that here (only 8 instruction cycles :-) )
400 _sampleDumpPixel:
401:CamInterfaceAsm.S **** in tmp1,G_PORT ; sample the G value (1)
402:CamInterfaceAsm.S **** in tmp2,RB_PORT ; sample the R/B value (1)
403:CamInterfaceAsm.S **** st X+,tmp1 ; store to the currLineBuff and inc ptrs(2)
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 17
 
 
404:CamInterfaceAsm.S **** st Y+,tmp2 ; store to the prevLineBuff and inc ptrs(2)
405:CamInterfaceAsm.S **** brtc _sampleDumpPixel ; loop back unless flag is set (2...if not set)
406 ; ___________
407 ; 8 cycles normally
408
409 ; if we make it here, it means the T flag is set, and we must have been interrupted
410 ; so we need to exit (what if we were interrupted for serial? should we disable it?)
411:CamInterfaceAsm.S **** rjmp _cleanUpDumpLine
412
413 ;***********************************************************
414 ; Function Name: <interrupt handler for External Interrupt0>
415 ; Function Description: This function is responsible
416 ; for handling a rising edge on the Ext Interrupt 0. This
417 ; routine simply returns, since we just want to wake up
418 ; whenever the VSYNC transitions (meaning the start of a new
419 ; frame).
420 ; Inputs: none
421 ; Outputs: none
422 ;***********************************************************
423 SIG_INTERRUPT0:
424 ; This will wake us up when VSYNC transitions high...we just want to return
425:CamInterfaceAsm.S **** reti
426
427 ;***********************************************************
428 ; Function Name: <interrupt handler for External Interrupt1>
429 ; Function Description: This function is responsible
430 ; for handling a falling edge on the Ext Interrupt 1. This
431 ; routine simply returns, since we just want to wake up
432 ; whenever the HREF transitions (meaning the pixels
433 ; are starting after VSYNC transitioned, and we need to
434 ; start acquiring the pixel blocks
435 ; Inputs: none
436 ; Outputs: none
437 ;***********************************************************
438 SIG_INTERRUPT1:
439 ; This will wake us up when HREF transitions high...we just want to return
440:CamInterfaceAsm.S **** reti
441
442 ;***********************************************************
443 ; Function Name: <interrupt handler for Timer0 overflow>
444 ; Function Description: This function is responsible
445 ; for handling the Timer0 overflow (hooked up to indicate
446 ; when we have reached the number of HREFs required in a
447 ; single frame). We set the T flag in the SREG to
448 ; indicate to the _acquirePixelBlock routine that it needs
449 ; to exit, and then set the appropriate action to take in
450 ; the eventList of the Executive module.
451 ; Inputs: none
452 ; Outputs: none
453 ; Note: Originally, the HREF pulses were also going to
454 ; be counted by a hardware counter, but it didn't end up
455 ; being necessary
456 ;***********************************************************
457 ;SIG_OVERFLOW0:
458 ; set ; set the T bit in SREG
459 ; lds tmp1,eventBitmask
460 ; ori tmp1,EV_ACQUIRE_FRAME_COMPLETE
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 18
 
 
461 ; sts eventBitmask,tmp1
462 ; reti
463
464 ;***********************************************************
465 ; Function Name: <interrupt handler for Timer1 overflow>
466 ; Function Description: This function is responsible
467 ; for handling the Timer1 overflow (hooked up to indicate
468 ; when we have reached the end of a line of pixel data,
469 ; since PCLK is hooked up to overflow TCNT1 after 176
470 ; pixels). This routine generates an acquire line complete
471 ; event in the fastEventBitmask, which is streamlined for
472 ; efficiency reasons.
473 ;***********************************************************
474 SIG_OVERFLOW1:
475:CamInterfaceAsm.S **** lds tmp1,fastEventBitmask ; set a flag indicating
476:CamInterfaceAsm.S **** ori tmp1,FEV_ACQUIRE_LINE_COMPLETE ; a line is complete
477:CamInterfaceAsm.S **** sts fastEventBitmask,tmp1
478:CamInterfaceAsm.S **** set ; set the T bit in SREG
479 ;sbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
480 ;cbi _SFR_IO_ADDR(PORTD),PD6 ; For testing...
481
482:CamInterfaceAsm.S **** reti
483
484 ; This is the default handler for all interrupts that don't
485 ; have handler routines specified for them.
486 .global __vector_default
487 __vector_default:
488:CamInterfaceAsm.S **** reti
489
490 .end
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccIlaaaa.s page 19
 
 
DEFINED SYMBOLS
*ABS*:00000000 CamInterfaceAsm.S
*ABS*:00000000 Events.h
*ABS*:00000000 CamInterfaceAsm.S
*ABS*:00000000 C:/WinAVR/avr/include/avr/io.h
*ABS*:00000000 C:/WinAVR/avr/include/avr/iom8.h
*ABS*:00000000 C:/WinAVR/avr/include/avr/io.h
*ABS*:00000000 C:/WinAVR/avr/include/avr/sfr_defs.h
*ABS*:00000000 C:/WinAVR/avr/include/avr/io.h
*ABS*:00000000 CamInterfaceAsm.S
*ABS*:00000000 <command line>
*ABS*:00000000 <built-in>
*ABS*:00000000 CamInterfaceAsm.S
*ABS*:00000010 pixelCount
*ABS*:00000011 pixelRunStart
*ABS*:00000012 lastColor
*ABS*:00000013 tmp1
*ABS*:00000014 tmp2
*ABS*:00000013 color
*ABS*:00000014 greenData
*ABS*:00000015 blueData
*ABS*:00000016 colorMapLow
*ABS*:00000017 colorMapHigh
*ABS*:00000016 prevLineBuffLow
*ABS*:00000017 prevLineBuffHigh
*ABS*:00000018 currLineBuffLow
*ABS*:00000019 currLineBuffHigh
CamInterfaceAsm.S:169 .text:00000000 CamIntAsm_waitForNewTrackingFrame
CamInterfaceAsm.S:335 .text:0000008e CamIntAsm_waitForNewDumpFrame
CamInterfaceAsm.S:345 .text:00000094 CamIntAsm_acquireDumpLine
CamInterfaceAsm.S:179 .text:00000006 CamIntAsm_acquireTrackingLine
CamInterfaceAsm.S:423 .text:000000d4 __vector_1
CamInterfaceAsm.S:438 .text:000000d6 __vector_2
CamInterfaceAsm.S:474 .text:000000d8 __vector_8
CamInterfaceAsm.S:305 .text:00000080 _cleanUp
CamInterfaceAsm.S:223 .text:00000034 _trackFrame
CamInterfaceAsm.S:240 .text:00000044 _acquirePixelBlock
CamInterfaceAsm.S:281 .text:00000074 _cleanUpTrackingLine
CamInterfaceAsm.S:292 .text:00000080 _cleanUpDumpLine
CamInterfaceAsm.S:316 .text:0000008c _exit
CamInterfaceAsm.S:380 .text:000000ba _dumpFrame
CamInterfaceAsm.S:400 .text:000000c8 _sampleDumpPixel
CamInterfaceAsm.S:487 .text:000000e6 __vector_default
 
UNDEFINED SYMBOLS
__vector_9
fastEventBitmask
/programy/Atmel_C/AVRcam/CommonDefs.h
0,0 → 1,81
#ifndef COMMONDEFS_H
#define COMMONDEFS_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: CommonDefs.h
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module provides some of the generic
definitions and declarations needed by the AVRcam
system.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
11/15/2004 1.2 Added the NO_CRYSTAL definition
for when the OV6620 is providing
the mega8's clock source.
***********************************************************/
#include <avr/interrupt.h>
/* Defines */
/* FOSC defines the frequency of the crystal connected to
the mega8, supplying the instruction clock cycle */
#define FOSC 16000000
 
/* For defining boolean operations */
typedef unsigned char bool_t;
#define TRUE 1
#define FALSE 0
 
#define BIT0 0
#define BIT1 1
#define BIT2 2
#define BIT3 3
#define BIT4 4
#define BIT5 5
#define BIT6 6
#define BIT7 7
 
#define DISABLE_INTS() cli()
#define ENABLE_INTS() sei()
 
//#define SIMULATION 1
//#define SLOW_FRAMES 1
//#define DEBUG_FRAME_DATA 1
//#define DEBUG_TRACKED_LINE 1
//#define DEBUG_COLOR_MAP 1
#define COMPLETE_COLOR_MAP 1
#define NO_CRYSTAL 1
#endif
 
/programy/Atmel_C/AVRcam/DebugInterface.c
0,0 → 1,89
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: DebugInterface.c
Module Date: 04/15/2004
Module Auth: John Orlando
Description: This module is responsible for providing a
debug interface to the system. Currently, the only
debugging that is available is through the on-board
UART (which is used by the main application as well) in
addition to the LED hooked up at PORTD bit 6.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
/* Includes */
#include "CommonDefs.h"
#include "UartInterface.h"
#include "Utility.h"
 
/* Local Variables */
 
/* Local Structures and Typedefs */
 
/* Extern Variables */
 
/* Definitions */
 
/***********************************************************
Function Name: DebugInt_init
Function Description: This function is responsible for
initializing the debug module. It sets up the debug LED
as well as any other debugging that will be done. The
LED blinks four times, which indicates to the user
that the system is available for re-programming if
necessary. This works because the data lines on the
OV6620 are still tri-stated at this point, but won't
be for long after this function returns.
Inputs: none
Outputs: none
***********************************************************/
void DebugInt_init(void)
{
/* set PortD pin6 for output */
DDRD |= 0x40;
/* turn on LED */
PORTD |= 0x40;
Utility_delay(500);
PORTD &= 0xBF;
Utility_delay(500);
PORTD |= 0x40;
Utility_delay(500);
PORTD &= 0xBF;
Utility_delay(500);
PORTD |= 0x40;
Utility_delay(500);
PORTD &= 0xBF;
Utility_delay(500);
PORTD |= 0x40;
}
 
/programy/Atmel_C/AVRcam/DebugInterface.d
0,0 → 1,0
DebugInterface.o DebugInterface.d : DebugInterface.c CommonDefs.h UartInterface.h Utility.h
/programy/Atmel_C/AVRcam/DebugInterface.h
0,0 → 1,48
#ifndef DEBUGINTERFACE_H
#define DEBUGINTERFACE_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: DebugInterface.h
Module Date: 04/15/2004
Module Auth: John Orlando
Description: This file is responsible for providing the
external interface to the DebugInterface module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
/* Extern Functions */
extern void DebugInt_init(void);
#endif
 
/programy/Atmel_C/AVRcam/DebugInterface.lst
0,0 → 1,251
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s page 1
 
 
1 .file "DebugInterface.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "C:\\WinAVR\\AVRcam_dev_1_3_2/",100,0,0,.Ltext0
11 .stabs "DebugInterface.c",100,0,0,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);0020000000000;0017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0000000000000;0000000177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0000000000000;0037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;",128,0,0,
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0000000000000;0000000177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "complex int:t(0,15)=s4real:(0,1),0,16;imag:(0,1),16,16;;",128,0,0,0
30 .stabs "complex float:t(0,16)=R3;8;0;",128,0,0,0
31 .stabs "complex double:t(0,17)=R3;8;0;",128,0,0,0
32 .stabs "complex long double:t(0,18)=R3;8;0;",128,0,0,0
33 .stabs "__builtin_va_list:t(0,19)=*(0,20)=(0,20)",128,0,0,0
34 .stabs "_Bool:t(0,21)=@s8;-16;",128,0,0,0
35 .stabs "DebugInterface.c",130,0,0,0
36 .stabs "CommonDefs.h",130,0,0,0
37 .stabs "C:/WinAVR/avr/include/avr/interrupt.h",130,0,0,0
38 .stabs "C:/WinAVR/avr/include/avr/io.h",130,0,0,0
39 .stabs "C:/WinAVR/avr/include/avr/sfr_defs.h",130,0,0,0
40 .stabn 162,0,0,0
41 .stabs "C:/WinAVR/avr/include/avr/iom8.h",130,0,0,0
42 .stabn 162,0,0,0
43 .stabn 162,0,0,0
44 .stabn 162,0,0,0
45 .stabs "bool_t:t(2,1)=(0,11)",128,0,56,0
46 .stabn 162,0,0,0
47 .stabs "UartInterface.h",130,0,0,0
48 .stabn 162,0,0,0
49 .stabs "Utility.h",130,0,0,0
50 .stabn 162,0,0,0
51 .stabs "DebugInt_init:F(0,20)",36,0,71,DebugInt_init
52 .global DebugInt_init
53 .type DebugInt_init, @function
54 DebugInt_init:
1:DebugInterface.c **** /*
2:DebugInterface.c **** Copyright (C) 2004 John Orlando
3:DebugInterface.c ****
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s page 2
 
 
4:DebugInterface.c **** AVRcam: a small real-time image processing engine.
5:DebugInterface.c ****
6:DebugInterface.c **** This program is free software; you can redistribute it and/or
7:DebugInterface.c **** modify it under the terms of the GNU General Public
8:DebugInterface.c **** License as published by the Free Software Foundation; either
9:DebugInterface.c **** version 2 of the License, or (at your option) any later version.
10:DebugInterface.c ****
11:DebugInterface.c **** This program is distributed in the hope that it will be useful,
12:DebugInterface.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:DebugInterface.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:DebugInterface.c **** General Public License for more details.
15:DebugInterface.c ****
16:DebugInterface.c **** You should have received a copy of the GNU General Public
17:DebugInterface.c **** License along with this program; if not, write to the Free Software
18:DebugInterface.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:DebugInterface.c ****
20:DebugInterface.c **** For more information on the AVRcam, please contact:
21:DebugInterface.c ****
22:DebugInterface.c **** john@jrobot.net
23:DebugInterface.c ****
24:DebugInterface.c **** or go to www.jrobot.net for more details regarding the system.
25:DebugInterface.c **** */
26:DebugInterface.c **** /***********************************************************
27:DebugInterface.c **** Module Name: DebugInterface.c
28:DebugInterface.c **** Module Date: 04/15/2004
29:DebugInterface.c **** Module Auth: John Orlando
30:DebugInterface.c ****
31:DebugInterface.c **** Description: This module is responsible for providing a
32:DebugInterface.c **** debug interface to the system. Currently, the only
33:DebugInterface.c **** debugging that is available is through the on-board
34:DebugInterface.c **** UART (which is used by the main application as well) in
35:DebugInterface.c **** addition to the LED hooked up at PORTD bit 6.
36:DebugInterface.c ****
37:DebugInterface.c **** Revision History:
38:DebugInterface.c **** Date Rel Ver. Notes
39:DebugInterface.c **** 4/10/2004 0.1 Module created
40:DebugInterface.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
41:DebugInterface.c **** contest.
42:DebugInterface.c **** ***********************************************************/
43:DebugInterface.c ****
44:DebugInterface.c **** /* Includes */
45:DebugInterface.c **** #include "CommonDefs.h"
46:DebugInterface.c **** #include "UartInterface.h"
47:DebugInterface.c **** #include "Utility.h"
48:DebugInterface.c ****
49:DebugInterface.c **** /* Local Variables */
50:DebugInterface.c ****
51:DebugInterface.c **** /* Local Structures and Typedefs */
52:DebugInterface.c ****
53:DebugInterface.c **** /* Extern Variables */
54:DebugInterface.c ****
55:DebugInterface.c **** /* Definitions */
56:DebugInterface.c ****
57:DebugInterface.c **** /***********************************************************
58:DebugInterface.c **** Function Name: DebugInt_init
59:DebugInterface.c **** Function Description: This function is responsible for
60:DebugInterface.c **** initializing the debug module. It sets up the debug LED
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s page 3
 
 
61:DebugInterface.c **** as well as any other debugging that will be done. The
62:DebugInterface.c **** LED blinks four times, which indicates to the user
63:DebugInterface.c **** that the system is available for re-programming if
64:DebugInterface.c **** necessary. This works because the data lines on the
65:DebugInterface.c **** OV6620 are still tri-stated at this point, but won't
66:DebugInterface.c **** be for long after this function returns.
67:DebugInterface.c **** Inputs: none
68:DebugInterface.c **** Outputs: none
69:DebugInterface.c **** ***********************************************************/
70:DebugInterface.c **** void DebugInt_init(void)
71:DebugInterface.c **** {
55 .stabn 68,0,71,.LM1-DebugInt_init
56 .LM1:
57 /* prologue: frame size=0 */
58 0000 1F93 push r17
59 /* prologue end (size=1) */
72:DebugInterface.c **** /* set PortD pin6 for output */
73:DebugInterface.c **** DDRD |= 0x40;
60 .stabn 68,0,73,.LM2-DebugInt_init
61 .LM2:
62 0002 8E9A sbi 49-0x20,6
74:DebugInterface.c **** /* turn on LED */
75:DebugInterface.c **** PORTD |= 0x40;
63 .stabn 68,0,75,.LM3-DebugInt_init
64 .LM3:
65 0004 969A sbi 50-0x20,6
76:DebugInterface.c **** Utility_delay(500);
66 .stabn 68,0,76,.LM4-DebugInt_init
67 .LM4:
68 0006 84EF ldi r24,lo8(500)
69 0008 91E0 ldi r25,hi8(500)
70 000a 00D0 rcall Utility_delay
77:DebugInterface.c **** PORTD &= 0xBF;
71 .stabn 68,0,77,.LM5-DebugInt_init
72 .LM5:
73 000c 1FEB ldi r17,lo8(-65)
74 000e 82B3 in r24,50-0x20
75 0010 8123 and r24,r17
76 0012 82BB out 50-0x20,r24
78:DebugInterface.c **** Utility_delay(500);
77 .stabn 68,0,78,.LM6-DebugInt_init
78 .LM6:
79 0014 84EF ldi r24,lo8(500)
80 0016 91E0 ldi r25,hi8(500)
81 0018 00D0 rcall Utility_delay
79:DebugInterface.c **** PORTD |= 0x40;
82 .stabn 68,0,79,.LM7-DebugInt_init
83 .LM7:
84 001a 969A sbi 50-0x20,6
80:DebugInterface.c **** Utility_delay(500);
85 .stabn 68,0,80,.LM8-DebugInt_init
86 .LM8:
87 001c 84EF ldi r24,lo8(500)
88 001e 91E0 ldi r25,hi8(500)
89 0020 00D0 rcall Utility_delay
81:DebugInterface.c **** PORTD &= 0xBF;
90 .stabn 68,0,81,.LM9-DebugInt_init
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s page 4
 
 
91 .LM9:
92 0022 82B3 in r24,50-0x20
93 0024 8123 and r24,r17
94 0026 82BB out 50-0x20,r24
82:DebugInterface.c **** Utility_delay(500);
95 .stabn 68,0,82,.LM10-DebugInt_init
96 .LM10:
97 0028 84EF ldi r24,lo8(500)
98 002a 91E0 ldi r25,hi8(500)
99 002c 00D0 rcall Utility_delay
83:DebugInterface.c **** PORTD |= 0x40;
100 .stabn 68,0,83,.LM11-DebugInt_init
101 .LM11:
102 002e 969A sbi 50-0x20,6
84:DebugInterface.c **** Utility_delay(500);
103 .stabn 68,0,84,.LM12-DebugInt_init
104 .LM12:
105 0030 84EF ldi r24,lo8(500)
106 0032 91E0 ldi r25,hi8(500)
107 0034 00D0 rcall Utility_delay
85:DebugInterface.c **** PORTD &= 0xBF;
108 .stabn 68,0,85,.LM13-DebugInt_init
109 .LM13:
110 0036 82B3 in r24,50-0x20
111 0038 8123 and r24,r17
112 003a 82BB out 50-0x20,r24
86:DebugInterface.c **** Utility_delay(500);
113 .stabn 68,0,86,.LM14-DebugInt_init
114 .LM14:
115 003c 84EF ldi r24,lo8(500)
116 003e 91E0 ldi r25,hi8(500)
117 0040 00D0 rcall Utility_delay
87:DebugInterface.c **** PORTD |= 0x40;
118 .stabn 68,0,87,.LM15-DebugInt_init
119 .LM15:
120 0042 969A sbi 50-0x20,6
88:DebugInterface.c **** }
121 .stabn 68,0,88,.LM16-DebugInt_init
122 .LM16:
123 /* epilogue: frame size=0 */
124 0044 1F91 pop r17
125 0046 0895 ret
126 /* epilogue end (size=2) */
127 /* function DebugInt_init size 36 (33) */
128 .size DebugInt_init, .-DebugInt_init
129 .Lscope0:
130 .stabs "",36,0,0,.Lscope0-DebugInt_init
131 .text
132 .stabs "",100,0,0,Letext
133 Letext:
134 /* File "DebugInterface.c": code 36 = 0x0024 ( 33), prologues 1, epilogues 2 */
GAS LISTING C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s page 5
 
 
DEFINED SYMBOLS
*ABS*:00000000 DebugInterface.c
*ABS*:0000003f __SREG__
*ABS*:0000003e __SP_H__
*ABS*:0000003d __SP_L__
*ABS*:00000000 __tmp_reg__
*ABS*:00000001 __zero_reg__
C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s:54 .text:00000000 DebugInt_init
C:\DOCUME~1\John\LOCALS~1\Temp/ccm4aaaa.s:133 .text:00000048 Letext
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
Utility_delay
/programy/Atmel_C/AVRcam/Events.h
0,0 → 1,78
#ifndef EVENTS_H
#define EVENTS_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: Events.h
Module Date: 05/23/2004
Module Auth: John Orlando
Description: This file provides the external interface
to the events that can be published/processed in the
system. It is specifically by itself (and nothing
else should be defined in here) so that both .c and
.S (assembly) files can include this file without
a problem.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
*******************************************************/
 
/* Definitions */
/* Originally, all events were passed in a bitmask...however,
an event FIFO was finally used, but the coding of the event
definitions were never translated back....doesn't make a
difference, but looks a little weird */
#define EV_SERIAL_DATA_RECEIVED 0x01
#define EV_DUMP_FRAME 0x02
#define EV_PROCESS_FRAME_COMPLETE 0x04
#define EV_PROCESS_LINE_COMPLETE 0x08
#define EV_ACQUIRE_LINE_COMPLETE 0x10
#define EV_ACQUIRE_FRAME_COMPLETE 0x20
#define EV_CONFIGURE_CAMERA 0x40
#define EV_ENABLE_TRACKING 0x80
#define EV_DISABLE_TRACKING 0x81
#define EV_SERIAL_DATA_PENDING_TX 0x90
#define EV_RED_COLOR_MAP_RECEIVED 0x91
#define EV_BLUE_COLOR_MAP_RECEIVED 0x92
#define EV_GREEN_COLOR_MAP_RECEIVED 0x93
 
/* This is used to pass fast events through the system
so there is a minimum of processing time needed
between lines of tracking data */
#define FEV_ACQUIRE_LINE_COMPLETE 0x01
#define FEV_PROCESS_LINE_COMPLETE 0x02
 
/* This is needed for the event fifo */
#define EXEC_EVENT_FIFO_SIZE 8
#define EXEC_EVENT_FIFO_MASK EXEC_EVENT_FIFO_SIZE-1
 
#endif
 
/programy/Atmel_C/AVRcam/Executive.c
0,0 → 1,219
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: Executive.c
Module Date: 04/12/2004
Module Auth: John Orlando
Description: This file is responsible for implementing a
minimalist event dispatcher. It keeps track of an event
fifo that waits for new events to come in, and dispatches
them to any entities that care about them.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
1/16/2005 1.4 Fixed issue where the interrupts weren't
being turned off when the fastEventBitmask
was being accessed. Also removed redundant
interrupt masking when accessing the
main event fifo. Also fixed issue where
the main event fifo wasn't being checked
for events if an event was pending in
the fast event fifo.
***********************************************************/
 
/* Includes */
#include <stdlib.h>
#include "CommonDefs.h"
#include "Executive.h"
#include "FrameMgr.h"
#include "CamInterface.h"
#include "UIMgr.h"
#include "UartInterface.h"
#include "CamConfig.h"
#include "Utility.h"
 
/* Local Variables */
unsigned char Exec_eventFifo[EXEC_EVENT_FIFO_SIZE];
unsigned char Exec_eventFifoHead=0;
unsigned char Exec_eventFifoTail=0;
 
/* Local Function Definitions */
static unsigned char Exec_readEventFifo(void);
 
/* Local Structures and Typedefs */
 
/* Extern Variables */
/* This bitmask holds events that need to be processed as fast as possible */
unsigned char fastEventBitmask = 0x00;
 
/* Definitions */
#define IS_DATA_IN_EVENT_FIFO() (!(Exec_eventFifoHead == Exec_eventFifoTail))
/***********************************************************
Function Name: Exec_run
Function Description: This function is responsible for
running the main control loop. The control loop is
based on checking both the fast-event bitmask (for high
priority events) and the event FIFO to determine if an
event needs to be handled. The event is then dispatched
to the appropriate handler.
Inputs: none
Outputs: none
***********************************************************/
void Exec_run(void)
{
unsigned char eventGenerated;
while(1)
{
if (fastEventBitmask)
{
/* an event needing fast processing has been received */
/* a received line needs to be processed...this
needs to be processed as quickly as possible */
if (fastEventBitmask & FEV_ACQUIRE_LINE_COMPLETE)
{
DISABLE_INTS();
fastEventBitmask &= ~FEV_ACQUIRE_LINE_COMPLETE;
ENABLE_INTS();
FrameMgr_processLine();
/* also check if serial data needs to be sent
out through UIMgr */
UIMgr_transmitPendingData();
 
/* we can't just call acquire line again here,
since we don't know if we need to acquire another
line or not (it depends on the FrameMgr to figure
this out) */
}
if (fastEventBitmask & FEV_PROCESS_LINE_COMPLETE)
{
DISABLE_INTS();
fastEventBitmask &= ~FEV_PROCESS_LINE_COMPLETE;
ENABLE_INTS();
FrameMgr_acquireLine();
}
}
if (IS_DATA_IN_EVENT_FIFO() == TRUE)
{
eventGenerated = Exec_readEventFifo();
switch(eventGenerated)
{
case (EV_DUMP_FRAME):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_ENABLE_TRACKING):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_DISABLE_TRACKING):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_ACQUIRE_LINE_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
UIMgr_dispatchEvent(eventGenerated);
break;
case (EV_ACQUIRE_FRAME_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_PROCESS_LINE_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_PROCESS_FRAME_COMPLETE):
FrameMgr_dispatchEvent(eventGenerated);
break;
case (EV_SERIAL_DATA_RECEIVED):
UIMgr_dispatchEvent(eventGenerated);
FrameMgr_dispatchEvent(eventGenerated);
break;
 
case (EV_SERIAL_DATA_PENDING_TX):
UIMgr_dispatchEvent(eventGenerated);
break;
default:
break;
}
}
/* toggle the debug line */
 
}
}
 
/***********************************************************
Function Name: Exec_readEventFifo
Function Description: This function is responsible for
reading a single event out of the event fifo.
Inputs: none
Outputs: unsigned char-the data read
***********************************************************/
static unsigned char Exec_readEventFifo(void)
{
unsigned char dataByte, tmpTail;
DISABLE_INTS();
/* just return the current tail from the tx fifo */
dataByte = Exec_eventFifo[Exec_eventFifoTail];
tmpTail = (Exec_eventFifoTail+1) & (EXEC_EVENT_FIFO_MASK);
Exec_eventFifoTail = tmpTail;
ENABLE_INTS();
return(dataByte);
}
 
/***********************************************************
Function Name: Exec_writeEventFifo
Function Description: This function is responsible for
writing a single event to the event fifo and
updating the appropriate pointers.
Inputs: data - the byte to write to the Fifo
Outputs: none
***********************************************************/
void Exec_writeEventFifo(unsigned char event)
{
unsigned char tmpHead;
 
DISABLE_INTS();
Exec_eventFifo[Exec_eventFifoHead] = event;
 
/* now move the head up */
tmpHead = (Exec_eventFifoHead + 1) & (EXEC_EVENT_FIFO_MASK);
Exec_eventFifoHead = tmpHead;
ENABLE_INTS();
}
 
/programy/Atmel_C/AVRcam/Executive.d
0,0 → 1,3
Executive.o Executive.d : Executive.c CommonDefs.h Executive.h Events.h FrameMgr.h \
CamInterface.h UIMgr.h UartInterface.h CamConfig.h I2CInterface.h \
Utility.h
/programy/Atmel_C/AVRcam/Executive.h
0,0 → 1,66
#ifndef EXECUTIVE_H
#define EXECUTIVE_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
 
/***********************************************************
Module Name: Executive.h
Module Date: 04/12/2004
Module Auth: John Orlando
Description: This file provides the external interface
to the Executive module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
*******************************************************/
#include "Events.h"
 
/* Definitions */
 
#define PUBLISH_EVENT(event) Exec_writeEventFifo(event)
#define PUBLISH_FAST_EVENT(event) fastEventBitmask |= event
/* Extern Functions */
extern void Exec_run(void);
extern void Exec_writeEventFifo(unsigned char event);
 
/* Extern Data */
extern unsigned char fastEventBitmask;
extern unsigned char Exec_eventFifo[];
extern unsigned char Exec_eventFifoHead;
extern unsigned char Exec_eventFifoTail;
#endif
 
 
 
 
 
/programy/Atmel_C/AVRcam/Executive.lst
0,0 → 1,637
GAS LISTING /tmp/cceEDT7g.s page 1
 
 
1 .file "Executive.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/roboti/istrobot/2007/ATmega8/AVRcam/",100,0,2,.Ltext0
11 .stabs "Executive.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdlib.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
32 .stabs "size_t:t(2,1)=(0,4)",128,0,214,0
33 .stabs "wchar_t:t(2,2)=(0,1)",128,0,326,0
34 .stabn 162,0,0,0
35 .stabs "div_t:t(1,1)=(1,2)=s4quot:(0,1),0,16;rem:(0,1),16,16;;",128,0,69,0
36 .stabs "ldiv_t:t(1,3)=(1,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;",128,0,75,0
37 .stabs "__compar_fn_t:t(1,5)=(1,6)=*(1,7)=f(0,1)",128,0,78,0
38 .stabn 162,0,0,0
39 .stabs "CommonDefs.h",130,0,0,0
40 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/interrupt.h",130,0,0,0
41 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
42 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
43 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
44 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
45 .stabs "int8_t:t(8,1)=(0,10)",128,0,116,0
46 .stabs "uint8_t:t(8,2)=(0,11)",128,0,117,0
47 .stabs "int16_t:t(8,3)=(0,1)",128,0,118,0
48 .stabs "uint16_t:t(8,4)=(0,4)",128,0,119,0
49 .stabs "int32_t:t(8,5)=(0,3)",128,0,120,0
50 .stabs "uint32_t:t(8,6)=(0,5)",128,0,121,0
51 .stabs "int64_t:t(8,7)=(0,6)",128,0,122,0
52 .stabs "uint64_t:t(8,8)=(0,7)",128,0,123,0
53 .stabs "intptr_t:t(8,9)=(8,3)",128,0,135,0
54 .stabs "uintptr_t:t(8,10)=(8,4)",128,0,140,0
55 .stabs "int_least8_t:t(8,11)=(8,1)",128,0,152,0
56 .stabs "uint_least8_t:t(8,12)=(8,2)",128,0,157,0
57 .stabs "int_least16_t:t(8,13)=(8,3)",128,0,162,0
GAS LISTING /tmp/cceEDT7g.s page 2
 
 
58 .stabs "uint_least16_t:t(8,14)=(8,4)",128,0,167,0
59 .stabs "int_least32_t:t(8,15)=(8,5)",128,0,172,0
60 .stabs "uint_least32_t:t(8,16)=(8,6)",128,0,177,0
61 .stabs "int_least64_t:t(8,17)=(8,7)",128,0,182,0
62 .stabs "uint_least64_t:t(8,18)=(8,8)",128,0,187,0
63 .stabs "int_fast8_t:t(8,19)=(8,1)",128,0,200,0
64 .stabs "uint_fast8_t:t(8,20)=(8,2)",128,0,205,0
65 .stabs "int_fast16_t:t(8,21)=(8,3)",128,0,210,0
66 .stabs "uint_fast16_t:t(8,22)=(8,4)",128,0,215,0
67 .stabs "int_fast32_t:t(8,23)=(8,5)",128,0,220,0
68 .stabs "uint_fast32_t:t(8,24)=(8,6)",128,0,225,0
69 .stabs "int_fast64_t:t(8,25)=(8,7)",128,0,230,0
70 .stabs "uint_fast64_t:t(8,26)=(8,8)",128,0,235,0
71 .stabs "intmax_t:t(8,27)=(8,7)",128,0,249,0
72 .stabs "uintmax_t:t(8,28)=(8,8)",128,0,254,0
73 .stabn 162,0,0,0
74 .stabs "int_farptr_t:t(7,1)=(8,5)",128,0,76,0
75 .stabs "uint_farptr_t:t(7,2)=(8,6)",128,0,80,0
76 .stabn 162,0,0,0
77 .stabn 162,0,0,0
78 .stabn 162,0,0,0
79 .stabn 162,0,0,0
80 .stabs "bool_t:t(3,1)=(0,11)",128,0,56,0
81 .stabn 162,0,0,0
82 .stabs "CamConfig.h",130,0,0,0
83 .stabs "I2CInterface.h",130,0,0,0
84 .stabs "i2cCmd_t:t(10,1)=(10,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
85 .stabn 162,0,0,0
86 .stabn 162,0,0,0
87 .stabs "Exec_writeEventFifo:F(0,15)",36,0,208,Exec_writeEventFifo
88 .stabs "event:P(0,11)",64,0,207,24
89 .global Exec_writeEventFifo
90 .type Exec_writeEventFifo, @function
91 Exec_writeEventFifo:
92 .stabd 46,0,0
1:Executive.c **** /*
2:Executive.c **** Copyright (C) 2004 John Orlando
3:Executive.c ****
4:Executive.c **** AVRcam: a small real-time image processing engine.
5:Executive.c ****
6:Executive.c **** This program is free software; you can redistribute it and/or
7:Executive.c **** modify it under the terms of the GNU General Public
8:Executive.c **** License as published by the Free Software Foundation; either
9:Executive.c **** version 2 of the License, or (at your option) any later version.
10:Executive.c ****
11:Executive.c **** This program is distributed in the hope that it will be useful,
12:Executive.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:Executive.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:Executive.c **** General Public License for more details.
15:Executive.c ****
16:Executive.c **** You should have received a copy of the GNU General Public
17:Executive.c **** License along with this program; if not, write to the Free Software
18:Executive.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:Executive.c ****
20:Executive.c **** For more information on the AVRcam, please contact:
21:Executive.c ****
22:Executive.c **** john@jrobot.net
GAS LISTING /tmp/cceEDT7g.s page 3
 
 
23:Executive.c ****
24:Executive.c **** or go to www.jrobot.net for more details regarding the system.
25:Executive.c **** */
26:Executive.c **** /***********************************************************
27:Executive.c **** Module Name: Executive.c
28:Executive.c **** Module Date: 04/12/2004
29:Executive.c **** Module Auth: John Orlando
30:Executive.c ****
31:Executive.c **** Description: This file is responsible for implementing a
32:Executive.c **** minimalist event dispatcher. It keeps track of an event
33:Executive.c **** fifo that waits for new events to come in, and dispatches
34:Executive.c **** them to any entities that care about them.
35:Executive.c ****
36:Executive.c **** Revision History:
37:Executive.c **** Date Rel Ver. Notes
38:Executive.c **** 4/10/2004 0.1 Module created
39:Executive.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
40:Executive.c **** contest.
41:Executive.c **** 1/16/2005 1.4 Fixed issue where the interrupts weren't
42:Executive.c **** being turned off when the fastEventBitmask
43:Executive.c **** was being accessed. Also removed redundant
44:Executive.c **** interrupt masking when accessing the
45:Executive.c **** main event fifo. Also fixed issue where
46:Executive.c **** the main event fifo wasn't being checked
47:Executive.c **** for events if an event was pending in
48:Executive.c **** the fast event fifo.
49:Executive.c **** ***********************************************************/
50:Executive.c ****
51:Executive.c **** /* Includes */
52:Executive.c **** #include <stdlib.h>
53:Executive.c **** #include "CommonDefs.h"
54:Executive.c **** #include "Executive.h"
55:Executive.c **** #include "FrameMgr.h"
56:Executive.c **** #include "CamInterface.h"
57:Executive.c **** #include "UIMgr.h"
58:Executive.c **** #include "UartInterface.h"
59:Executive.c **** #include "CamConfig.h"
60:Executive.c **** #include "Utility.h"
61:Executive.c ****
62:Executive.c **** /* Local Variables */
63:Executive.c **** unsigned char Exec_eventFifo[EXEC_EVENT_FIFO_SIZE];
64:Executive.c **** unsigned char Exec_eventFifoHead=0;
65:Executive.c **** unsigned char Exec_eventFifoTail=0;
66:Executive.c ****
67:Executive.c **** /* Local Function Definitions */
68:Executive.c **** static unsigned char Exec_readEventFifo(void);
69:Executive.c ****
70:Executive.c **** /* Local Structures and Typedefs */
71:Executive.c ****
72:Executive.c **** /* Extern Variables */
73:Executive.c **** /* This bitmask holds events that need to be processed as fast as possible */
74:Executive.c **** unsigned char fastEventBitmask = 0x00;
75:Executive.c ****
76:Executive.c **** /* Definitions */
77:Executive.c **** #define IS_DATA_IN_EVENT_FIFO() (!(Exec_eventFifoHead == Exec_eventFifoTail))
78:Executive.c **** /***********************************************************
79:Executive.c **** Function Name: Exec_run
GAS LISTING /tmp/cceEDT7g.s page 4
 
 
80:Executive.c **** Function Description: This function is responsible for
81:Executive.c **** running the main control loop. The control loop is
82:Executive.c **** based on checking both the fast-event bitmask (for high
83:Executive.c **** priority events) and the event FIFO to determine if an
84:Executive.c **** event needs to be handled. The event is then dispatched
85:Executive.c **** to the appropriate handler.
86:Executive.c **** Inputs: none
87:Executive.c **** Outputs: none
88:Executive.c **** ***********************************************************/
89:Executive.c **** void Exec_run(void)
90:Executive.c **** {
91:Executive.c **** unsigned char eventGenerated;
92:Executive.c ****
93:Executive.c **** while(1)
94:Executive.c **** {
95:Executive.c **** if (fastEventBitmask)
96:Executive.c **** {
97:Executive.c **** /* an event needing fast processing has been received */
98:Executive.c **** /* a received line needs to be processed...this
99:Executive.c **** needs to be processed as quickly as possible */
100:Executive.c **** if (fastEventBitmask & FEV_ACQUIRE_LINE_COMPLETE)
101:Executive.c **** {
102:Executive.c **** DISABLE_INTS();
103:Executive.c **** fastEventBitmask &= ~FEV_ACQUIRE_LINE_COMPLETE;
104:Executive.c **** ENABLE_INTS();
105:Executive.c **** FrameMgr_processLine();
106:Executive.c ****
107:Executive.c **** /* also check if serial data needs to be sent
108:Executive.c **** out through UIMgr */
109:Executive.c **** UIMgr_transmitPendingData();
110:Executive.c ****
111:Executive.c **** /* we can't just call acquire line again here,
112:Executive.c **** since we don't know if we need to acquire another
113:Executive.c **** line or not (it depends on the FrameMgr to figure
114:Executive.c **** this out) */
115:Executive.c **** }
116:Executive.c **** if (fastEventBitmask & FEV_PROCESS_LINE_COMPLETE)
117:Executive.c **** {
118:Executive.c **** DISABLE_INTS();
119:Executive.c **** fastEventBitmask &= ~FEV_PROCESS_LINE_COMPLETE;
120:Executive.c **** ENABLE_INTS();
121:Executive.c **** FrameMgr_acquireLine();
122:Executive.c **** }
123:Executive.c **** }
124:Executive.c ****
125:Executive.c **** if (IS_DATA_IN_EVENT_FIFO() == TRUE)
126:Executive.c **** {
127:Executive.c **** eventGenerated = Exec_readEventFifo();
128:Executive.c **** switch(eventGenerated)
129:Executive.c **** {
130:Executive.c **** case (EV_DUMP_FRAME):
131:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
132:Executive.c **** break;
133:Executive.c ****
134:Executive.c **** case (EV_ENABLE_TRACKING):
135:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
136:Executive.c **** break;
GAS LISTING /tmp/cceEDT7g.s page 5
 
 
137:Executive.c ****
138:Executive.c **** case (EV_DISABLE_TRACKING):
139:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
140:Executive.c **** break;
141:Executive.c ****
142:Executive.c **** case (EV_ACQUIRE_LINE_COMPLETE):
143:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
144:Executive.c **** UIMgr_dispatchEvent(eventGenerated);
145:Executive.c **** break;
146:Executive.c ****
147:Executive.c **** case (EV_ACQUIRE_FRAME_COMPLETE):
148:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
149:Executive.c **** break;
150:Executive.c ****
151:Executive.c **** case (EV_PROCESS_LINE_COMPLETE):
152:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
153:Executive.c **** break;
154:Executive.c ****
155:Executive.c **** case (EV_PROCESS_FRAME_COMPLETE):
156:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
157:Executive.c **** break;
158:Executive.c ****
159:Executive.c **** case (EV_SERIAL_DATA_RECEIVED):
160:Executive.c **** UIMgr_dispatchEvent(eventGenerated);
161:Executive.c **** FrameMgr_dispatchEvent(eventGenerated);
162:Executive.c **** break;
163:Executive.c ****
164:Executive.c **** case (EV_SERIAL_DATA_PENDING_TX):
165:Executive.c **** UIMgr_dispatchEvent(eventGenerated);
166:Executive.c **** break;
167:Executive.c ****
168:Executive.c **** default:
169:Executive.c **** break;
170:Executive.c **** }
171:Executive.c **** }
172:Executive.c ****
173:Executive.c **** /* toggle the debug line */
174:Executive.c ****
175:Executive.c **** }
176:Executive.c **** }
177:Executive.c ****
178:Executive.c **** /***********************************************************
179:Executive.c **** Function Name: Exec_readEventFifo
180:Executive.c **** Function Description: This function is responsible for
181:Executive.c **** reading a single event out of the event fifo.
182:Executive.c **** Inputs: none
183:Executive.c **** Outputs: unsigned char-the data read
184:Executive.c **** ***********************************************************/
185:Executive.c **** static unsigned char Exec_readEventFifo(void)
186:Executive.c **** {
187:Executive.c **** unsigned char dataByte, tmpTail;
188:Executive.c ****
189:Executive.c **** DISABLE_INTS();
190:Executive.c **** /* just return the current tail from the tx fifo */
191:Executive.c **** dataByte = Exec_eventFifo[Exec_eventFifoTail];
192:Executive.c **** tmpTail = (Exec_eventFifoTail+1) & (EXEC_EVENT_FIFO_MASK);
193:Executive.c **** Exec_eventFifoTail = tmpTail;
GAS LISTING /tmp/cceEDT7g.s page 6
 
 
194:Executive.c **** ENABLE_INTS();
195:Executive.c ****
196:Executive.c **** return(dataByte);
197:Executive.c **** }
198:Executive.c ****
199:Executive.c **** /***********************************************************
200:Executive.c **** Function Name: Exec_writeEventFifo
201:Executive.c **** Function Description: This function is responsible for
202:Executive.c **** writing a single event to the event fifo and
203:Executive.c **** updating the appropriate pointers.
204:Executive.c **** Inputs: data - the byte to write to the Fifo
205:Executive.c **** Outputs: none
206:Executive.c **** ***********************************************************/
207:Executive.c **** void Exec_writeEventFifo(unsigned char event)
208:Executive.c **** {
93 .stabn 68,0,208,.LM0-Exec_writeEventFifo
94 .LM0:
95 /* prologue: frame size=0 */
96 /* prologue end (size=0) */
209:Executive.c **** unsigned char tmpHead;
210:Executive.c ****
211:Executive.c **** DISABLE_INTS();
97 .stabn 68,0,211,.LM1-Exec_writeEventFifo
98 .LM1:
99 /* #APP */
100 0000 F894 cli
212:Executive.c **** Exec_eventFifo[Exec_eventFifoHead] = event;
101 .stabn 68,0,212,.LM2-Exec_writeEventFifo
102 .LM2:
103 /* #NOAPP */
104 0002 9091 0000 lds r25,Exec_eventFifoHead
105 0006 E0E0 ldi r30,lo8(Exec_eventFifo)
106 0008 F0E0 ldi r31,hi8(Exec_eventFifo)
107 000a E90F add r30,r25
108 000c F11D adc r31,__zero_reg__
109 000e 8083 st Z,r24
213:Executive.c ****
214:Executive.c **** /* now move the head up */
215:Executive.c **** tmpHead = (Exec_eventFifoHead + 1) & (EXEC_EVENT_FIFO_MASK);
216:Executive.c **** Exec_eventFifoHead = tmpHead;
110 .stabn 68,0,216,.LM3-Exec_writeEventFifo
111 .LM3:
112 0010 9F5F subi r25,lo8(-(1))
113 0012 9770 andi r25,lo8(7)
114 0014 9093 0000 sts Exec_eventFifoHead,r25
217:Executive.c **** ENABLE_INTS();
115 .stabn 68,0,217,.LM4-Exec_writeEventFifo
116 .LM4:
117 /* #APP */
118 0018 7894 sei
119 /* #NOAPP */
120 /* epilogue: frame size=0 */
121 001a 0895 ret
122 /* epilogue end (size=1) */
123 /* function Exec_writeEventFifo size 16 (15) */
124 .size Exec_writeEventFifo, .-Exec_writeEventFifo
125 .Lscope0:
GAS LISTING /tmp/cceEDT7g.s page 7
 
 
126 .stabs "",36,0,0,.Lscope0-Exec_writeEventFifo
127 .stabd 78,0,0
128 .stabs "Exec_run:F(0,15)",36,0,90,Exec_run
129 .global Exec_run
130 .type Exec_run, @function
131 Exec_run:
132 .stabd 46,0,0
133 .stabn 68,0,90,.LM5-Exec_run
134 .LM5:
135 /* prologue: frame size=0 */
136 /* prologue end (size=0) */
137 .L30:
138 .stabn 68,0,95,.LM6-Exec_run
139 .LM6:
140 001c 8091 0000 lds r24,fastEventBitmask
141 0020 8823 tst r24
142 0022 99F0 breq .L6
143 .stabn 68,0,100,.LM7-Exec_run
144 .LM7:
145 0024 80FF sbrs r24,0
146 0026 07C0 rjmp .L8
147 .stabn 68,0,102,.LM8-Exec_run
148 .LM8:
149 /* #APP */
150 0028 F894 cli
151 .stabn 68,0,103,.LM9-Exec_run
152 .LM9:
153 /* #NOAPP */
154 002a 8E7F andi r24,lo8(-2)
155 002c 8093 0000 sts fastEventBitmask,r24
156 .stabn 68,0,104,.LM10-Exec_run
157 .LM10:
158 /* #APP */
159 0030 7894 sei
160 .stabn 68,0,105,.LM11-Exec_run
161 .LM11:
162 /* #NOAPP */
163 0032 00D0 rcall FrameMgr_processLine
164 .stabn 68,0,109,.LM12-Exec_run
165 .LM12:
166 0034 00D0 rcall UIMgr_transmitPendingData
167 .L8:
168 .stabn 68,0,116,.LM13-Exec_run
169 .LM13:
170 0036 8091 0000 lds r24,fastEventBitmask
171 003a 81FF sbrs r24,1
172 003c 06C0 rjmp .L6
173 .stabn 68,0,118,.LM14-Exec_run
174 .LM14:
175 /* #APP */
176 003e F894 cli
177 .stabn 68,0,119,.LM15-Exec_run
178 .LM15:
179 /* #NOAPP */
180 0040 8D7F andi r24,lo8(-3)
181 0042 8093 0000 sts fastEventBitmask,r24
182 .stabn 68,0,120,.LM16-Exec_run
GAS LISTING /tmp/cceEDT7g.s page 8
 
 
183 .LM16:
184 /* #APP */
185 0046 7894 sei
186 .stabn 68,0,121,.LM17-Exec_run
187 .LM17:
188 /* #NOAPP */
189 0048 00D0 rcall FrameMgr_acquireLine
190 .L6:
191 .stabn 68,0,125,.LM18-Exec_run
192 .LM18:
193 004a 2091 0000 lds r18,Exec_eventFifoTail
194 004e 8091 0000 lds r24,Exec_eventFifoHead
195 0052 8217 cp r24,r18
196 0054 19F3 breq .L30
197 .LBB4:
198 .LBB5:
199 .stabn 68,0,189,.LM19-Exec_run
200 .LM19:
201 /* #APP */
202 0056 F894 cli
203 .stabn 68,0,191,.LM20-Exec_run
204 .LM20:
205 /* #NOAPP */
206 0058 E22F mov r30,r18
207 005a FF27 clr r31
208 005c E050 subi r30,lo8(-(Exec_eventFifo))
209 005e F040 sbci r31,hi8(-(Exec_eventFifo))
210 0060 9081 ld r25,Z
211 .stabn 68,0,193,.LM21-Exec_run
212 .LM21:
213 0062 822F mov r24,r18
214 0064 8F5F subi r24,lo8(-(1))
215 0066 8770 andi r24,lo8(7)
216 0068 8093 0000 sts Exec_eventFifoTail,r24
217 .stabn 68,0,194,.LM22-Exec_run
218 .LM22:
219 /* #APP */
220 006c 7894 sei
221 /* #NOAPP */
222 .LBE5:
223 .LBE4:
224 .stabn 68,0,128,.LM23-Exec_run
225 .LM23:
226 006e 892F mov r24,r25
227 0070 9927 clr r25
228 0072 8031 cpi r24,lo8(16)
229 0074 31F1 breq .L16
230 0076 8131 cpi r24,lo8(17)
231 0078 68F4 brsh .L21
232 007a 8230 cpi r24,lo8(2)
233 007c C9F0 breq .L13
234 007e 8330 cpi r24,lo8(3)
235 0080 18F4 brsh .L22
236 0082 8130 cpi r24,lo8(1)
237 0084 59F6 brne .L30
238 0086 2BC0 rjmp .L12
239 .L22:
GAS LISTING /tmp/cceEDT7g.s page 9
 
 
240 0088 8430 cpi r24,lo8(4)
241 008a 31F1 breq .L14
242 008c 8830 cpi r24,lo8(8)
243 008e 09F0 breq .+2
244 0090 C5CF rjmp .L30
245 0092 1FC0 rjmp .L15
246 .L21:
247 0094 8038 cpi r24,lo8(-128)
248 0096 79F0 breq .L18
249 0098 8138 cpi r24,lo8(-127)
250 009a 20F4 brsh .L23
251 009c 8032 cpi r24,lo8(32)
252 009e 09F0 breq .+2
253 00a0 BDCF rjmp .L30
254 00a2 14C0 rjmp .L17
255 .L23:
256 00a4 8138 cpi r24,lo8(-127)
257 00a6 51F0 breq .L19
258 00a8 8039 cpi r24,lo8(-112)
259 00aa 09F0 breq .+2
260 00ac B7CF rjmp .L30
261 00ae 1CC0 rjmp .L20
262 .L13:
263 .stabn 68,0,131,.LM24-Exec_run
264 .LM24:
265 00b0 82E0 ldi r24,lo8(2)
266 00b2 00D0 rcall FrameMgr_dispatchEvent
267 00b4 B3CF rjmp .L30
268 .L18:
269 .stabn 68,0,135,.LM25-Exec_run
270 .LM25:
271 00b6 80E8 ldi r24,lo8(-128)
272 00b8 00D0 rcall FrameMgr_dispatchEvent
273 00ba B0CF rjmp .L30
274 .L19:
275 .stabn 68,0,139,.LM26-Exec_run
276 .LM26:
277 00bc 81E8 ldi r24,lo8(-127)
278 00be 00D0 rcall FrameMgr_dispatchEvent
279 00c0 ADCF rjmp .L30
280 .L16:
281 .stabn 68,0,143,.LM27-Exec_run
282 .LM27:
283 00c2 80E1 ldi r24,lo8(16)
284 00c4 00D0 rcall FrameMgr_dispatchEvent
285 .stabn 68,0,144,.LM28-Exec_run
286 .LM28:
287 00c6 80E1 ldi r24,lo8(16)
288 00c8 00D0 rcall UIMgr_dispatchEvent
289 00ca A8CF rjmp .L30
290 .L17:
291 .stabn 68,0,148,.LM29-Exec_run
292 .LM29:
293 00cc 80E2 ldi r24,lo8(32)
294 00ce 00D0 rcall FrameMgr_dispatchEvent
295 00d0 A5CF rjmp .L30
296 .L15:
GAS LISTING /tmp/cceEDT7g.s page 10
 
 
297 .stabn 68,0,152,.LM30-Exec_run
298 .LM30:
299 00d2 88E0 ldi r24,lo8(8)
300 00d4 00D0 rcall FrameMgr_dispatchEvent
301 00d6 A2CF rjmp .L30
302 .L14:
303 .stabn 68,0,156,.LM31-Exec_run
304 .LM31:
305 00d8 84E0 ldi r24,lo8(4)
306 00da 00D0 rcall FrameMgr_dispatchEvent
307 00dc 9FCF rjmp .L30
308 .L12:
309 .stabn 68,0,160,.LM32-Exec_run
310 .LM32:
311 00de 81E0 ldi r24,lo8(1)
312 00e0 00D0 rcall UIMgr_dispatchEvent
313 .stabn 68,0,161,.LM33-Exec_run
314 .LM33:
315 00e2 81E0 ldi r24,lo8(1)
316 00e4 00D0 rcall FrameMgr_dispatchEvent
317 00e6 9ACF rjmp .L30
318 .L20:
319 .stabn 68,0,165,.LM34-Exec_run
320 .LM34:
321 00e8 80E9 ldi r24,lo8(-112)
322 00ea 00D0 rcall UIMgr_dispatchEvent
323 00ec 97CF rjmp .L30
324 /* epilogue: frame size=0 */
325 /* epilogue: noreturn */
326 /* epilogue end (size=0) */
327 /* function Exec_run size 111 (111) */
328 .size Exec_run, .-Exec_run
329 .stabs "dataByte:r(0,11)",64,0,187,25
330 .stabn 192,0,0,.LBB5-Exec_run
331 .stabn 224,0,0,.LBE5-Exec_run
332 .Lscope1:
333 .stabs "",36,0,0,.Lscope1-Exec_run
334 .stabd 78,0,0
335 .global Exec_eventFifoHead
336 .global Exec_eventFifoHead
337 .section .bss
338 .type Exec_eventFifoHead, @object
339 .size Exec_eventFifoHead, 1
340 Exec_eventFifoHead:
341 0000 00 .skip 1,0
342 .global Exec_eventFifoTail
343 .global Exec_eventFifoTail
344 .type Exec_eventFifoTail, @object
345 .size Exec_eventFifoTail, 1
346 Exec_eventFifoTail:
347 0001 00 .skip 1,0
348 .global fastEventBitmask
349 .global fastEventBitmask
350 .type fastEventBitmask, @object
351 .size fastEventBitmask, 1
352 fastEventBitmask:
353 0002 00 .skip 1,0
GAS LISTING /tmp/cceEDT7g.s page 11
 
 
354 .comm Exec_eventFifo,8,1
355 .stabs "fastEventBitmask:G(0,11)",32,0,74,0
356 .stabs "Exec_eventFifo:G(0,16)=ar(0,17)=r(0,17);0;0177777;;0;7;(0,11)",32,0,63,0
357 .stabs "Exec_eventFifoHead:G(0,11)",32,0,64,0
358 .stabs "Exec_eventFifoTail:G(0,11)",32,0,65,0
359 .text
360 .stabs "",100,0,0,.Letext0
361 .Letext0:
362 /* File "Executive.c": code 127 = 0x007f ( 126), prologues 0, epilogues 1 */
GAS LISTING /tmp/cceEDT7g.s page 12
 
 
DEFINED SYMBOLS
*ABS*:00000000 Executive.c
/tmp/cceEDT7g.s:3 *ABS*:0000003f __SREG__
/tmp/cceEDT7g.s:4 *ABS*:0000003e __SP_H__
/tmp/cceEDT7g.s:5 *ABS*:0000003d __SP_L__
/tmp/cceEDT7g.s:6 *ABS*:00000000 __tmp_reg__
/tmp/cceEDT7g.s:7 *ABS*:00000001 __zero_reg__
/tmp/cceEDT7g.s:91 .text:00000000 Exec_writeEventFifo
/tmp/cceEDT7g.s:340 .bss:00000000 Exec_eventFifoHead
*COM*:00000008 Exec_eventFifo
/tmp/cceEDT7g.s:131 .text:0000001c Exec_run
/tmp/cceEDT7g.s:352 .bss:00000002 fastEventBitmask
/tmp/cceEDT7g.s:346 .bss:00000001 Exec_eventFifoTail
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
FrameMgr_processLine
UIMgr_transmitPendingData
FrameMgr_acquireLine
FrameMgr_dispatchEvent
UIMgr_dispatchEvent
/programy/Atmel_C/AVRcam/FrameMgr.c
0,0 → 1,792
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/*********************************************************
Module Name: FrameMgr.c
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This modules is responsible for performing
both medium and high level processing on image data.
This is performed at both the line level as well as
the frame level. It controls the main flow of the
system, adhering to all the critical timing
requirements (such as when serial data can be transferred,
etc).
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
11/15/2004 1.2 Updated processLine() function so
it will remove objects less than
a specified length/width (reduces
shot noise)
*********************************************************/
 
/* Includes */
#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include "Executive.h"
#include "UIMgr.h"
#include "FrameMgr.h"
#include "CamInterface.h"
#include "UartInterface.h"
#include "Utility.h"
#include "I2CInterface.h"
#include "CamConfig.h"
#include "CommonDefs.h"
 
/* Local Structures and Typedefs */
enum
{
ST_FrameMgr_idle,
ST_FrameMgr_TrackingFrame,
ST_FrameMgr_DumpingFrame
};
 
typedef unsigned char FrameMgr_State_t;
 
/* Definitions */
/* The most objects that can be tracked at any one time is 8.
This number is determined by the number of bytes that can be
sent out during a frame (one byte per line, 144 lines per frame)
with the number of bytes in a tracked object (7) + some wiggle
room :-) ... I guess this could be increased to around 20 if
we had enough room and cycles to process objects between lines */
#define MAX_TRACKED_OBJECTS 8
 
/* This defines the number of bytes that make up a trackedObject_t
structure... */
#define SIZE_OF_TRACKED_OBJECT 8
 
/* This define is used to turn off the timer overflow interrupt
that is generated when the PCLK overflows TIMER1 */
#define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
 
/* This define is used to determine if a run length is too small
to be concerned with. This helps to reduce the number of false
positives. */
#define MIN_OBJECT_TRACKING_WIDTH 3
 
/* This define is used to determine if an object has enough
height to be considered worth tracking...it is used to reduce
shot noise */
#define MIN_OBJECT_TRACKING_HEIGHT 3
 
/* This define is used to indicate how often the filter routine
that removes objects less than MIN_OBJECT_TRACKING_HEIGHT should
be executed. It is measured in a number of lines (7 nominally). */
#define RUN_OBJECT_FILTER_MASK 0x07
 
/* This enum describes the possible colors that can
be tracked by the system. This can't be represented as
simple color names (red, brown, etc) due to the fact that
the user sets which colors will be associated with which
bits. Remember...after the AND operation of the indexed
color map values executes, either a single bit indicating
the color should be set, or no bits indicating that the
color isn't represented in the color map (notTracked). */
enum
{
notTracked,
color1, /* bit 1 color */
color2, /* bit 2 color */
color3, /* bit 3 color */
color4, /* bit 4 color */
color5, /* bit 5 color */
color6, /* bit 6 color */
color7, /* bit 7 color */
color8 /* bit 8 color */
};
 
typedef unsigned char trackedColor_t;
 
/* This structure defines the info that needs to be
maintained for each trackedObject in the trackingTable */
typedef struct
{
trackedColor_t color;
unsigned char lastLineXStart;
unsigned char lastLineXFinish;
unsigned char x_upperLeft;
unsigned char y_upperLeft;
unsigned char x_lowerRight;
unsigned char y_lowerRight;
unsigned char objectValid; /* used to be a fill byte...now it is
used to determine if the object is valid
or not...it gets invalidated if it is
determined that it is too small, or
that the object is within another object */
} trackedObject_t;
 
/* These defines are used to index into each individual element in the
trackedObject_t structure. This seems to be MUCH more efficient than
accessing the elements in GCC. */
#define COLOR_OFFSET 0
#define LAST_LINE_X_START_OFFSET 1
#define LAST_LINE_X_FINISH_OFFSET 2
#define X_UPPER_LEFT_OFFSET 3
#define Y_UPPER_LEFT_OFFSET 4
#define X_LOWER_RIGHT_OFFSET 5
#define Y_LOWER_RIGHT_OFFSET 6
#define VALID_OBJECT_OFFSET 7
 
/* Local Variables */
/* The trackedObjectTable is used to hold up to eight tracked objects
while they are being acquired. */
static trackedObject_t trackedObjectTable[MAX_TRACKED_OBJECTS];
static trackedObject_t *pCurrentTrackedObjectTable = trackedObjectTable;
static unsigned char lineCount = 0;
static FrameMgr_State_t currentState = ST_FrameMgr_idle;
static unsigned char numCurrTrackedObjects = 0;
static unsigned char numPrevTrackedObjects = 0;
static unsigned char trackedLineCount = 0;
 
/* Local Functions */
static void FrameMgr_findConnectedness(void);
 
/* Extern Functions */
/* These functions are located in assembly files, and thus
must be externed here so they can be referenced in the source below. */
extern void CamIntAsm_waitForNewTrackingFrame(unsigned char *pBuffer, unsigned char *pMemLookup);
extern void CamIntAsm_waitForNewDumpFrame(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
extern void CamIntAsm_acquireTrackingLine(unsigned char *pBuffer, unsigned char *pMemLookup);
extern void CamIntAsm_acquireDumpLine(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
 
/***********************************************************
Function Name: FrameMgr_init
Function Description: This function is responsible
for initializing the FrameMgr. This includes
setting up the various buffers and data needed to
process each frame of image data.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_init(void)
{
memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
}
 
 
/***********************************************************
Function Name: FrameMgr_dispatchEvent
Function Description: This function is responsible for
taking an incoming event and performing the needed
actions with it as pertains to the FrameMgr.
Inputs: event - the generated event
Outputs: none
***********************************************************/
void FrameMgr_dispatchEvent(unsigned char event)
{
switch(event)
{
case EV_DUMP_FRAME:
/* try re-initializing the camera before we start dumping */
CamConfig_setCamReg(0x11,0x01); /* reduce the frame rate for dumping*/
CamConfig_sendFifoCmds();
Utility_delay(1000); /* allow the new frame rate to settle */
lineCount = 0;
currentState = ST_FrameMgr_DumpingFrame;
//CamIntAsm_waitForNewDumpFrame(currentLineBuffer,previousLineBuffer);
FrameMgr_acquireLine();
break;
case EV_ENABLE_TRACKING:
currentState = ST_FrameMgr_TrackingFrame;
FrameMgr_acquireFrame();
break;
case EV_ACQUIRE_FRAME_COMPLETE:
FrameMgr_processFrame();
break;
case EV_PROCESS_FRAME_COMPLETE:
FrameMgr_acquireFrame();
break;
 
case EV_SERIAL_DATA_RECEIVED:
if (currentState != ST_FrameMgr_idle)
{
/* we need to go back to processing line data, since
serial data reception interrupted us....just trash the
frame and act like the frame has been processed, which
will kick off the system to wait for the next line */
PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
}
break;
case EV_DISABLE_TRACKING:
/* tracking needs to be turned off */
currentState = ST_FrameMgr_idle;
break;
}
}
 
/***********************************************************
Function Name: FrameMgr_acquireFrame
Function Description: This function is responsible for
beginning of the acquisition of a new frame of data
from the camera interface. The acquisition of this line
depends on the current state of the FrameMgr.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_acquireFrame(void)
{
if (currentState == ST_FrameMgr_TrackingFrame)
{
trackedLineCount = 0;
numPrevTrackedObjects = numCurrTrackedObjects;
numCurrTrackedObjects = 0;
/* clear out the tracking table, and wait for the new frame
to start */
memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
//CamIntAsm_waitForNewTrackingFrame(currentLineBuffer,colorMap);
WAIT_FOR_VSYNC_HIGH();
CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
}
}
 
/***********************************************************
Function Name: FrameMgr_acquireLine
Function Description: This function is responsible for
acquiring a line of data from the camera interface.
The acquisition of this line depends on the current
state of the FrameMgr.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_acquireLine(void)
{
unsigned char tmpLineCount;
/* clearing out the buffers takes too long...we should
just overwrite the data here without a problem when
we start acquiring...at no point do we check for
a 0x00 value in the current or previous lineBuffers,
so it was a bit excessive :-) */
/* check which state we are in and proceed as needed */
if (currentState == ST_FrameMgr_DumpingFrame)
{
tmpLineCount = lineCount*2;
/* clearing out the line data in dump mode is ok, and actually
is needed, since it is possible for the first dump line in
a frame to come back with the last line captured of the
last capture session...*/
memset(currentLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
memset(previousLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
/* wait for another VSYNC so we know which frame to use
to start looking for a line to receive */
WAIT_FOR_VSYNC_HIGH();
WAIT_FOR_VSYNC_LOW();
/* look at lineCount to determine how many HREFs we should
wait before we start sampling */
while(tmpLineCount != 0)
{
WAIT_FOR_HREF_HIGH();
tmpLineCount--;
WAIT_FOR_HREF_LOW();
}
/* we should now be ready to sample our line...*/
CamIntAsm_acquireDumpLine(currentLineBuffer,previousLineBuffer);
}
else if (currentState == ST_FrameMgr_TrackingFrame)
{
WAIT_FOR_HREF_LOW();
CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
}
}
 
/***********************************************************
Function Name: FrameMgr_processLine
Function Description: This function is responsible for
parsing the received image line and performing either
connected region mapping (if in the Tracking state) or
sending out the raw sampled data (if in the Dumping
state).
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_processLine(void)
{
unsigned char i;
volatile unsigned char dataToSend;
unsigned char *pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
#ifdef DEBUG_TRACKED_LINE
unsigned char *pSendData;
unsigned char asciiBuffer[5];
unsigned char pixelCount = 0;
#endif
if (currentState == ST_FrameMgr_DumpingFrame)
{
/* we want to sit in a tight loop and send the acquired data
sitting in current and previous line buffers out the serial
port...it is sent out the serial port immediately instead
of going into the UIMgr tx fifo because we can't do anything
until its sent out anyway...may as well just get it out now */
/* currentLineBuffer is getting "g" previousLineBuffer is getting "b-r" */
UartInt_txByte(0x0B); /* send the header byte */
UartInt_txByte(lineCount); /* send the line count */
for (i=0; i<NUM_PIXELS_IN_A_DUMP_LINE; i+=2)
{
/* when a dump line is sampled, the upper byte can potentially
have garbage in it...we don't have time to mask it off as we're
sampling, so it is done here before we send it out...we also
combine the samples together so we really are sending up a
sample for line N as well as line N+1 */
dataToSend = currentLineBuffer[i];
dataToSend &= 0x0F;
dataToSend <<= 4;
dataToSend |= (previousLineBuffer[i] & 0x0F);
/* dataToSend should be packed now */
UartInt_txByte(dataToSend);
/* flip the colors around since we are doing all G on Y and BR on UV */
dataToSend = previousLineBuffer[i+1];
dataToSend &= 0x0F;
dataToSend <<= 4;
dataToSend |= (currentLineBuffer[i+1] & 0x0F);
/* dataToSend should be packed now */
UartInt_txByte(dataToSend);
}
UartInt_txByte(0x0F); /* send line end */
/* once all the data is sent, increment out line count by 2 since
we really get 2 lines worth of pixels on each pass */
/* Update...increment only by 1, but only send 72 double-lines */
lineCount++;
/* check to see if we have retrieved all of the needed lines */
if (lineCount >= 72) /* half 144, since we send two lines at a time */
{
/* we're done, so send the dump complete?...nope, just change
states and we should be fine */
lineCount = 0;
currentState = ST_FrameMgr_idle;
/* disable the PCLK counting overflow interrupt */
TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
CamConfig_setCamReg(0x11,0x00); /* reset the frame rate to normal*/
CamConfig_sendFifoCmds();
}
else
{
/* we have more lines to acquire in this frame, so keep on truckin...*/
PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
}
}
else if (currentState == ST_FrameMgr_TrackingFrame)
{
#ifdef DEBUG_TRACKED_LINE
/* send the received line over serial...this should only send
until a pixelCount == 176 */
pSendData = currentLineBuffer;
itoa(trackedLineCount,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
while(pixelCount < ACTUAL_NUM_PIXELS_IN_A_LINE)
{
memset(asciiBuffer,0x00,5);
itoa(*pSendData++,asciiBuffer,10); /* color is first byte */
UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data */
UIMgr_txBuffer(" ",1);
 
pixelCount += *pSendData; /* run-length is second byte */
memset(asciiBuffer,0x00,5);
itoa(*pSendData++,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
}
UIMgr_txBuffer("\n\r",2);
 
trackedLineCount++;
if (trackedLineCount == 144)
{
UIMgr_txBuffer(" FC \n\r",8);
trackedLineCount = 0;
PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
}
else
{
PUBLISH_EVENT(EV_PROCESS_LINE_COMPLETE);
}
#else
/* determine if any of the RLE blocks overlap */
FrameMgr_findConnectedness();
/* we also want to remove any objects that are less than
a minimum height...we already removed portions of the
run-length that are less than MIN_PIXEL_WIDTH in the
findConnectedness() routine...doing it here instead of
a function to speed things up...this may end up slowing down the
frame rate slightly, and can be removed if this isn't needed */
/* run this routine once every 8 lines */
if ( (trackedLineCount & RUN_OBJECT_FILTER_MASK) == RUN_OBJECT_FILTER_MASK)
{
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
{
if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE)
{
/* check to see if the object is already in
our past...i.e., its last */
if ( (*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) -
*(pTrackedObjectData + Y_UPPER_LEFT_OFFSET)) < MIN_OBJECT_TRACKING_HEIGHT)
{
/* the object is less than the minimum height...see if it is adjacent
to the current line we just processed...if so, leave it here...otherwise,
it needs to be invalidated since its too small */
if ( trackedLineCount - *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) > 2)
{
/* invalidate the object */
*(pTrackedObjectData + VALID_OBJECT_OFFSET) = FALSE;
numCurrTrackedObjects--;
}
}
}
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
}
}
trackedLineCount++;
if (trackedLineCount == ACTUAL_NUM_LINES_IN_A_FRAME)
{
/* an entire frame of tracking data has been acquired, so
publish an event letting the system know this fact */
PUBLISH_EVENT(EV_ACQUIRE_FRAME_COMPLETE);
/* disable the PCLK counting overflow interrupt */
TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
trackedLineCount = 0;
}
else
{
PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
}
#endif
}
else
{
/* ...and here? */
}
}
 
/***********************************************************
Function Name: FrameMgr_processFrame
Function Description: This function is responsible for
parsing the completed frame and performing all actions
needed at this level.
Inputs: none
Outputs: none
***********************************************************/
void FrameMgr_processFrame(void)
{
unsigned char i,k,color;
#if DEBUG_FRAME_DATA
unsigned char asciiBuffer[5];
unsigned char j;
#endif
unsigned char *pTableData = (unsigned char *)pCurrentTrackedObjectTable;
unsigned char tmpUpperLeftX,tmpUpperLeftY,tmpLowerRightX,tmpLowerRightY;
#if DEBUG_FRAME_DATA
/* we want to send all of the currently tracked table out
the serial port for debugging */
for (i=0; i<numCurrTrackedObjects; i++)
{
UIMgr_txBuffer("----------\r\n",12);
for (j=0; j<SIZE_OF_TRACKED_OBJECT; j++)
{
memset(asciiBuffer,0x00,5);
itoa(*pTableData++,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data
+ 1 space */
UIMgr_txBuffer("\r\n",2);
}
}
/* finally, send a new line */
UIMgr_txBuffer("\r\n",2);
memset(asciiBuffer,0x00,5);
itoa(numCurrTrackedObjects,asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" PFC\r\n",5);
 
#else
/* we only send tracking packets if there are tracked objects */
if (numCurrTrackedObjects > 0)
{
UIMgr_writeTxFifo(0x0A); /* header byte for a tracking packet */
/* reset the pointer */
pTableData = (unsigned char *)pCurrentTrackedObjectTable;
UIMgr_writeTxFifo(numCurrTrackedObjects); /* num of objects tracked */
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
{
/* we only want to process objects that have their objectValid flag
set to TRUE */
if ( *(pTableData + VALID_OBJECT_OFFSET) == TRUE)
{
/* the object is valid...convert the color from bit position to value...remember,
each bit in the "color" byte corresponds to a color */
k=0;
color = *(pTableData + COLOR_OFFSET);
if (color == 128) k=0;
else if (color == 64) k=1;
else if (color == 32) k=2;
else if (color == 16) k=3;
else if (color == 8) k=4;
else if (color == 4) k=5;
else if (color == 2) k=6;
else if (color == 1) k=7;
tmpUpperLeftX = *(pTableData + X_UPPER_LEFT_OFFSET); /* get the upper left X */
tmpUpperLeftY = *(pTableData + Y_UPPER_LEFT_OFFSET); /* get the upper left Y */
tmpLowerRightX = *(pTableData + X_LOWER_RIGHT_OFFSET); /* get the lower right X */
tmpLowerRightY = *(pTableData + Y_LOWER_RIGHT_OFFSET); /* get the lower right Y */
UIMgr_writeTxFifo(k); /* send the color first */
UIMgr_writeTxFifo(tmpUpperLeftX);
UIMgr_writeTxFifo(tmpUpperLeftY);
UIMgr_writeTxFifo(tmpLowerRightX);
UIMgr_writeTxFifo(tmpLowerRightY);
}
 
/* move our pointer up to the beginning of the next object */
pTableData += SIZE_OF_TRACKED_OBJECT;
}
/* all done...send the end of tracking packets char */
UIMgr_writeTxFifo(0xFF);
}
#endif
 
/* the tracked object table will be cleared out right before we start
to wait for VSYNC to indicate a new frame...so it doesn't need to be
done now */
/* schedule the next action to acquire a new frame */
PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
}
 
/***********************************************************
Function Name: FrameMgr_findConnectedness
Function Description: This function is responsible for
finding the connectedness between two particular run-
length encoded lines of pixel data. It updates the
trackingTable as needed.
Inputs: none
Outputs: none
***********************************************************/
static void FrameMgr_findConnectedness(void)
{
trackedColor_t currColor;
unsigned char *pCurrLineColorInfo = currentLineBuffer;
unsigned char *pTrackedObjectData;
register unsigned char currPixelRunStart=0;
register unsigned char currPixelRunFinish=0;
register unsigned char lastLineXStart=0;
register unsigned char lastLineXFinish=0;
register unsigned char runLength=1;
unsigned char i;
bool_t colorConnected;
do
{
/* grab both the current color and the number of pixels
in the run...remember, pixels start at 1, not 0! */
colorConnected = FALSE;
currColor = *pCurrLineColorInfo++;
currPixelRunStart += runLength;
runLength = *pCurrLineColorInfo++;
currPixelRunFinish += runLength;
/* make sure that the run-length is at least as wide as
the minimum horizontal tracking width, and we care about the color */
if ( (currColor != notTracked) && (runLength > MIN_OBJECT_TRACKING_WIDTH) )
{
/* this run contains a color we care about, so
either it will begin a new tracked object, or it
is connected to a currently tracked object...
compare it with each object in the tracking
table...we can't just look at the numTrackedObjects because
it is entirely possible that the first couple of objects could
be invalid...
 
NOTE: Instead of accessing each element in the trackedObjectTable
through the 'i' index, and then accessing the fields in each structure,
a pointer to each entry is established each time through the loop, followed
by accessing the elements through specified offsets. GCC seems to be
able to optimize this code much better than simply accessing the elements
of each structure in the array the more normal way...*/
pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
{
if ( (currColor == *(pTrackedObjectData + COLOR_OFFSET)) &&
(*(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE) &&
(*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) == trackedLineCount - 1) )
{
/* found a color match and the object is valid...check to see if there is
connectedness */
lastLineXStart = *(pTrackedObjectData + LAST_LINE_X_START_OFFSET);
lastLineXFinish = *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET);
/* Check for the 5 following types of line connectedness:
---------------------
| |
---------------------
-------------------------
| |
------------------------- */
if ( ( (currPixelRunStart >= lastLineXStart) &&
(currPixelRunStart <= lastLineXFinish) ) ||
/* ---------------------
| |
---------------------
-------------------
| |
-------------------
OR
------------------------------
| |
------------------------------
---------
| |
--------- */
( (currPixelRunFinish >= lastLineXStart) &&
(currPixelRunFinish <= lastLineXFinish) ) ||
/* -------------------------------
| |
-------------------------------
-------------------------------
| |
-------------------------------
OR
-------------
| |
-------------
-------------------------------
| |
------------------------------- */
( (currPixelRunStart <= lastLineXStart) &&
(currPixelRunFinish >= lastLineXFinish) ) )
{
/* THERE IS CONNECTEDNESS...update the lastLineXStart and lastLineXFinish
data pointed to by pTrackedObjectData */
*(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart;
*(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish;
/* check if the bounding box needs to be updated */
if (*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) > currPixelRunStart)
{
/* need to update the bounding box for the upper left point to
enclose this new left-most point...we never have to update the
upper left Y point, since each scan line we process moves from
top to bottom */
*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart;
}
 
if ( *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) < currPixelRunFinish)
{
/* need to update the bounding box for the lower right X point to
enclose this new right-most point */
*(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish;
}
/* the lower right 'y' point always gets updated when connectedness is found */
*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount;
/* set a flag indicating that that color run is part of another
object and thus doesn't need to be added as a new entry into the
tracking table */
colorConnected = TRUE;
break;
}
}
/* go to the next object */
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
}
if (colorConnected == FALSE)
{
/* a new entry needs to be made to the tracking table, since we have
a run-length with a color, and it isn't connected to anything...but we
can only do this if there is space left in the trackedObject table */
if (numCurrTrackedObjects < MAX_TRACKED_OBJECTS)
{
/* space is available...add the object...but first we need to find an
invalid object in the object tracking table */
pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
for (i=0; i<MAX_TRACKED_OBJECTS; i++)
{
if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == FALSE) break;
/* if we haven't broken above, then the object must have been valid...
go ahead and move the pointer to the next object to check it */
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
}
/* now that we have a pointer to the tracked object to be updated, update all
the fields */
*(pTrackedObjectData + COLOR_OFFSET) = currColor; /* color */
*(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart; /* lastLineXStart */
*(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish; /* lastLineXFinish */
*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart; /* x_upperLeft */
*(pTrackedObjectData + Y_UPPER_LEFT_OFFSET) = trackedLineCount; /* y_upperLeft */
*(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish; /* x_lowerRight */
*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount; /* y_lowerRight */
*(pTrackedObjectData + VALID_OBJECT_OFFSET) = TRUE; /* objectValid flag */
numCurrTrackedObjects++;
}
}
/* move the pointer to the beginning of the next tracked object */
pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
}
} while(currPixelRunFinish < ACTUAL_NUM_PIXELS_IN_A_LINE);
}
 
/programy/Atmel_C/AVRcam/FrameMgr.d
0,0 → 1,3
FrameMgr.o FrameMgr.d : FrameMgr.c Executive.h Events.h UIMgr.h FrameMgr.h \
CamInterface.h UartInterface.h Utility.h I2CInterface.h CommonDefs.h \
CamConfig.h
/programy/Atmel_C/AVRcam/FrameMgr.h
0,0 → 1,58
#ifndef FRAMEMGR_H
#define FRAMEMGR_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: FrameMgr.h
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module provides the external interface
to the FrameMgr module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
/* Extern Variables */
extern unsigned char testLineCount;
/* External Function Declarations */
extern void FrameMgr_init(void);
extern void FrameMgr_processLine(void);
extern void FrameMgr_processFrame(void);
extern void FrameMgr_acquireLine(void);
extern void FrameMgr_acquireFrame(void);
extern void FrameMgr_dispatchEvent(unsigned char event);
 
#endif
 
/programy/Atmel_C/AVRcam/FrameMgr.lst
0,0 → 1,2036
GAS LISTING /tmp/ccf43P2i.s page 1
 
 
1 .file "FrameMgr.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/roboti/istrobot/2007/ATmega8/AVRcam/",100,0,2,.Ltext0
11 .stabs "FrameMgr.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdlib.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
32 .stabs "size_t:t(2,1)=(0,4)",128,0,214,0
33 .stabs "wchar_t:t(2,2)=(0,1)",128,0,326,0
34 .stabn 162,0,0,0
35 .stabs "div_t:t(1,1)=(1,2)=s4quot:(0,1),0,16;rem:(0,1),16,16;;",128,0,69,0
36 .stabs "ldiv_t:t(1,3)=(1,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;",128,0,75,0
37 .stabs "__compar_fn_t:t(1,5)=(1,6)=*(1,7)=f(0,1)",128,0,78,0
38 .stabn 162,0,0,0
39 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
40 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
41 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
42 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
43 .stabs "int8_t:t(6,1)=(0,10)",128,0,116,0
44 .stabs "uint8_t:t(6,2)=(0,11)",128,0,117,0
45 .stabs "int16_t:t(6,3)=(0,1)",128,0,118,0
46 .stabs "uint16_t:t(6,4)=(0,4)",128,0,119,0
47 .stabs "int32_t:t(6,5)=(0,3)",128,0,120,0
48 .stabs "uint32_t:t(6,6)=(0,5)",128,0,121,0
49 .stabs "int64_t:t(6,7)=(0,6)",128,0,122,0
50 .stabs "uint64_t:t(6,8)=(0,7)",128,0,123,0
51 .stabs "intptr_t:t(6,9)=(6,3)",128,0,135,0
52 .stabs "uintptr_t:t(6,10)=(6,4)",128,0,140,0
53 .stabs "int_least8_t:t(6,11)=(6,1)",128,0,152,0
54 .stabs "uint_least8_t:t(6,12)=(6,2)",128,0,157,0
55 .stabs "int_least16_t:t(6,13)=(6,3)",128,0,162,0
56 .stabs "uint_least16_t:t(6,14)=(6,4)",128,0,167,0
57 .stabs "int_least32_t:t(6,15)=(6,5)",128,0,172,0
GAS LISTING /tmp/ccf43P2i.s page 2
 
 
58 .stabs "uint_least32_t:t(6,16)=(6,6)",128,0,177,0
59 .stabs "int_least64_t:t(6,17)=(6,7)",128,0,182,0
60 .stabs "uint_least64_t:t(6,18)=(6,8)",128,0,187,0
61 .stabs "int_fast8_t:t(6,19)=(6,1)",128,0,200,0
62 .stabs "uint_fast8_t:t(6,20)=(6,2)",128,0,205,0
63 .stabs "int_fast16_t:t(6,21)=(6,3)",128,0,210,0
64 .stabs "uint_fast16_t:t(6,22)=(6,4)",128,0,215,0
65 .stabs "int_fast32_t:t(6,23)=(6,5)",128,0,220,0
66 .stabs "uint_fast32_t:t(6,24)=(6,6)",128,0,225,0
67 .stabs "int_fast64_t:t(6,25)=(6,7)",128,0,230,0
68 .stabs "uint_fast64_t:t(6,26)=(6,8)",128,0,235,0
69 .stabs "intmax_t:t(6,27)=(6,7)",128,0,249,0
70 .stabs "uintmax_t:t(6,28)=(6,8)",128,0,254,0
71 .stabn 162,0,0,0
72 .stabs "int_farptr_t:t(5,1)=(6,5)",128,0,76,0
73 .stabs "uint_farptr_t:t(5,2)=(6,6)",128,0,80,0
74 .stabn 162,0,0,0
75 .stabn 162,0,0,0
76 .stabn 162,0,0,0
77 .stabs "I2CInterface.h",130,0,0,0
78 .stabs "CommonDefs.h",130,0,0,0
79 .stabs "bool_t:t(8,1)=(0,11)",128,0,56,0
80 .stabn 162,0,0,0
81 .stabs "i2cCmd_t:t(7,1)=(7,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
82 .stabn 162,0,0,0
83 .stabs " :T(0,16)=@s8;eST_FrameMgr_idle:0,ST_FrameMgr_TrackingFrame:1,ST_FrameMgr_DumpingFrame:2,;
84 .stabs "FrameMgr_State_t:t(0,17)=(0,11)",128,0,72,0
85 .stabs " :T(0,18)=@s8;enotTracked:0,color1:1,color2:2,color3:3,color4:4,color5:5,color6:6,color7:7
86 .stabs "trackedColor_t:t(0,19)=(0,11)",128,0,127,0
87 .stabs "trackedObject_t:t(0,20)=(0,21)=s8color:(0,19),0,8;lastLineXStart:(0,11),8,8;lastLineXFinis
88 .stabs "FrameMgr_processFrame:F(0,15)",36,0,517,FrameMgr_processFrame
89 .global FrameMgr_processFrame
90 .type FrameMgr_processFrame, @function
91 FrameMgr_processFrame:
92 .stabd 46,0,0
1:FrameMgr.c **** /*
2:FrameMgr.c **** Copyright (C) 2004 John Orlando
3:FrameMgr.c ****
4:FrameMgr.c **** AVRcam: a small real-time image processing engine.
5:FrameMgr.c ****
6:FrameMgr.c **** This program is free software; you can redistribute it and/or
7:FrameMgr.c **** modify it under the terms of the GNU General Public
8:FrameMgr.c **** License as published by the Free Software Foundation; either
9:FrameMgr.c **** version 2 of the License, or (at your option) any later version.
10:FrameMgr.c ****
11:FrameMgr.c **** This program is distributed in the hope that it will be useful,
12:FrameMgr.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:FrameMgr.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:FrameMgr.c **** General Public License for more details.
15:FrameMgr.c ****
16:FrameMgr.c **** You should have received a copy of the GNU General Public
17:FrameMgr.c **** License along with this program; if not, write to the Free Software
18:FrameMgr.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:FrameMgr.c ****
20:FrameMgr.c **** For more information on the AVRcam, please contact:
21:FrameMgr.c ****
22:FrameMgr.c **** john@jrobot.net
GAS LISTING /tmp/ccf43P2i.s page 3
 
 
23:FrameMgr.c ****
24:FrameMgr.c **** or go to www.jrobot.net for more details regarding the system.
25:FrameMgr.c **** */
26:FrameMgr.c **** /*********************************************************
27:FrameMgr.c **** Module Name: FrameMgr.c
28:FrameMgr.c **** Module Date: 04/10/2004
29:FrameMgr.c **** Module Auth: John Orlando
30:FrameMgr.c ****
31:FrameMgr.c **** Description: This modules is responsible for performing
32:FrameMgr.c **** both medium and high level processing on image data.
33:FrameMgr.c **** This is performed at both the line level as well as
34:FrameMgr.c **** the frame level. It controls the main flow of the
35:FrameMgr.c **** system, adhering to all the critical timing
36:FrameMgr.c **** requirements (such as when serial data can be transferred,
37:FrameMgr.c **** etc).
38:FrameMgr.c ****
39:FrameMgr.c **** Revision History:
40:FrameMgr.c **** Date Rel Ver. Notes
41:FrameMgr.c **** 4/10/2004 0.1 Module created
42:FrameMgr.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
43:FrameMgr.c **** contest.
44:FrameMgr.c **** 11/15/2004 1.2 Updated processLine() function so
45:FrameMgr.c **** it will remove objects less than
46:FrameMgr.c **** a specified length/width (reduces
47:FrameMgr.c **** shot noise)
48:FrameMgr.c **** *********************************************************/
49:FrameMgr.c ****
50:FrameMgr.c **** /* Includes */
51:FrameMgr.c **** #include <stdlib.h>
52:FrameMgr.c **** #include <string.h>
53:FrameMgr.c **** #include <avr/io.h>
54:FrameMgr.c **** #include "Executive.h"
55:FrameMgr.c **** #include "UIMgr.h"
56:FrameMgr.c **** #include "FrameMgr.h"
57:FrameMgr.c **** #include "CamInterface.h"
58:FrameMgr.c **** #include "UartInterface.h"
59:FrameMgr.c **** #include "Utility.h"
60:FrameMgr.c **** #include "I2CInterface.h"
61:FrameMgr.c **** #include "CamConfig.h"
62:FrameMgr.c **** #include "CommonDefs.h"
63:FrameMgr.c ****
64:FrameMgr.c **** /* Local Structures and Typedefs */
65:FrameMgr.c **** enum
66:FrameMgr.c **** {
67:FrameMgr.c **** ST_FrameMgr_idle,
68:FrameMgr.c **** ST_FrameMgr_TrackingFrame,
69:FrameMgr.c **** ST_FrameMgr_DumpingFrame
70:FrameMgr.c **** };
71:FrameMgr.c ****
72:FrameMgr.c **** typedef unsigned char FrameMgr_State_t;
73:FrameMgr.c ****
74:FrameMgr.c **** /* Definitions */
75:FrameMgr.c **** /* The most objects that can be tracked at any one time is 8.
76:FrameMgr.c **** This number is determined by the number of bytes that can be
77:FrameMgr.c **** sent out during a frame (one byte per line, 144 lines per frame)
78:FrameMgr.c **** with the number of bytes in a tracked object (7) + some wiggle
79:FrameMgr.c **** room :-) ... I guess this could be increased to around 20 if
GAS LISTING /tmp/ccf43P2i.s page 4
 
 
80:FrameMgr.c **** we had enough room and cycles to process objects between lines */
81:FrameMgr.c **** #define MAX_TRACKED_OBJECTS 8
82:FrameMgr.c ****
83:FrameMgr.c **** /* This defines the number of bytes that make up a trackedObject_t
84:FrameMgr.c **** structure... */
85:FrameMgr.c **** #define SIZE_OF_TRACKED_OBJECT 8
86:FrameMgr.c ****
87:FrameMgr.c **** /* This define is used to turn off the timer overflow interrupt
88:FrameMgr.c **** that is generated when the PCLK overflows TIMER1 */
89:FrameMgr.c **** #define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
90:FrameMgr.c ****
91:FrameMgr.c **** /* This define is used to determine if a run length is too small
92:FrameMgr.c **** to be concerned with. This helps to reduce the number of false
93:FrameMgr.c **** positives. */
94:FrameMgr.c **** #define MIN_OBJECT_TRACKING_WIDTH 3
95:FrameMgr.c ****
96:FrameMgr.c **** /* This define is used to determine if an object has enough
97:FrameMgr.c **** height to be considered worth tracking...it is used to reduce
98:FrameMgr.c **** shot noise */
99:FrameMgr.c **** #define MIN_OBJECT_TRACKING_HEIGHT 3
100:FrameMgr.c ****
101:FrameMgr.c **** /* This define is used to indicate how often the filter routine
102:FrameMgr.c **** that removes objects less than MIN_OBJECT_TRACKING_HEIGHT should
103:FrameMgr.c **** be executed. It is measured in a number of lines (7 nominally). */
104:FrameMgr.c **** #define RUN_OBJECT_FILTER_MASK 0x07
105:FrameMgr.c ****
106:FrameMgr.c **** /* This enum describes the possible colors that can
107:FrameMgr.c **** be tracked by the system. This can't be represented as
108:FrameMgr.c **** simple color names (red, brown, etc) due to the fact that
109:FrameMgr.c **** the user sets which colors will be associated with which
110:FrameMgr.c **** bits. Remember...after the AND operation of the indexed
111:FrameMgr.c **** color map values executes, either a single bit indicating
112:FrameMgr.c **** the color should be set, or no bits indicating that the
113:FrameMgr.c **** color isn't represented in the color map (notTracked). */
114:FrameMgr.c **** enum
115:FrameMgr.c **** {
116:FrameMgr.c **** notTracked,
117:FrameMgr.c **** color1, /* bit 1 color */
118:FrameMgr.c **** color2, /* bit 2 color */
119:FrameMgr.c **** color3, /* bit 3 color */
120:FrameMgr.c **** color4, /* bit 4 color */
121:FrameMgr.c **** color5, /* bit 5 color */
122:FrameMgr.c **** color6, /* bit 6 color */
123:FrameMgr.c **** color7, /* bit 7 color */
124:FrameMgr.c **** color8 /* bit 8 color */
125:FrameMgr.c **** };
126:FrameMgr.c ****
127:FrameMgr.c **** typedef unsigned char trackedColor_t;
128:FrameMgr.c ****
129:FrameMgr.c **** /* This structure defines the info that needs to be
130:FrameMgr.c **** maintained for each trackedObject in the trackingTable */
131:FrameMgr.c **** typedef struct
132:FrameMgr.c **** {
133:FrameMgr.c **** trackedColor_t color;
134:FrameMgr.c **** unsigned char lastLineXStart;
135:FrameMgr.c **** unsigned char lastLineXFinish;
136:FrameMgr.c **** unsigned char x_upperLeft;
GAS LISTING /tmp/ccf43P2i.s page 5
 
 
137:FrameMgr.c **** unsigned char y_upperLeft;
138:FrameMgr.c **** unsigned char x_lowerRight;
139:FrameMgr.c **** unsigned char y_lowerRight;
140:FrameMgr.c **** unsigned char objectValid; /* used to be a fill byte...now it is
141:FrameMgr.c **** used to determine if the object is valid
142:FrameMgr.c **** or not...it gets invalidated if it is
143:FrameMgr.c **** determined that it is too small, or
144:FrameMgr.c **** that the object is within another object */
145:FrameMgr.c **** } trackedObject_t;
146:FrameMgr.c ****
147:FrameMgr.c **** /* These defines are used to index into each individual element in the
148:FrameMgr.c **** trackedObject_t structure. This seems to be MUCH more efficient than
149:FrameMgr.c **** accessing the elements in GCC. */
150:FrameMgr.c **** #define COLOR_OFFSET 0
151:FrameMgr.c **** #define LAST_LINE_X_START_OFFSET 1
152:FrameMgr.c **** #define LAST_LINE_X_FINISH_OFFSET 2
153:FrameMgr.c **** #define X_UPPER_LEFT_OFFSET 3
154:FrameMgr.c **** #define Y_UPPER_LEFT_OFFSET 4
155:FrameMgr.c **** #define X_LOWER_RIGHT_OFFSET 5
156:FrameMgr.c **** #define Y_LOWER_RIGHT_OFFSET 6
157:FrameMgr.c **** #define VALID_OBJECT_OFFSET 7
158:FrameMgr.c ****
159:FrameMgr.c **** /* Local Variables */
160:FrameMgr.c **** /* The trackedObjectTable is used to hold up to eight tracked objects
161:FrameMgr.c **** while they are being acquired. */
162:FrameMgr.c **** static trackedObject_t trackedObjectTable[MAX_TRACKED_OBJECTS];
163:FrameMgr.c **** static trackedObject_t *pCurrentTrackedObjectTable = trackedObjectTable;
164:FrameMgr.c **** static unsigned char lineCount = 0;
165:FrameMgr.c **** static FrameMgr_State_t currentState = ST_FrameMgr_idle;
166:FrameMgr.c **** static unsigned char numCurrTrackedObjects = 0;
167:FrameMgr.c **** static unsigned char numPrevTrackedObjects = 0;
168:FrameMgr.c **** static unsigned char trackedLineCount = 0;
169:FrameMgr.c ****
170:FrameMgr.c **** /* Local Functions */
171:FrameMgr.c **** static void FrameMgr_findConnectedness(void);
172:FrameMgr.c ****
173:FrameMgr.c **** /* Extern Functions */
174:FrameMgr.c **** /* These functions are located in assembly files, and thus
175:FrameMgr.c **** must be externed here so they can be referenced in the source below. */
176:FrameMgr.c **** extern void CamIntAsm_waitForNewTrackingFrame(unsigned char *pBuffer, unsigned char *pMemLookup);
177:FrameMgr.c **** extern void CamIntAsm_waitForNewDumpFrame(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
178:FrameMgr.c **** extern void CamIntAsm_acquireTrackingLine(unsigned char *pBuffer, unsigned char *pMemLookup);
179:FrameMgr.c **** extern void CamIntAsm_acquireDumpLine(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
180:FrameMgr.c ****
181:FrameMgr.c **** /***********************************************************
182:FrameMgr.c **** Function Name: FrameMgr_init
183:FrameMgr.c **** Function Description: This function is responsible
184:FrameMgr.c **** for initializing the FrameMgr. This includes
185:FrameMgr.c **** setting up the various buffers and data needed to
186:FrameMgr.c **** process each frame of image data.
187:FrameMgr.c **** Inputs: none
188:FrameMgr.c **** Outputs: none
189:FrameMgr.c **** ***********************************************************/
190:FrameMgr.c **** void FrameMgr_init(void)
191:FrameMgr.c **** {
192:FrameMgr.c **** memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
193:FrameMgr.c **** }
GAS LISTING /tmp/ccf43P2i.s page 6
 
 
194:FrameMgr.c ****
195:FrameMgr.c ****
196:FrameMgr.c **** /***********************************************************
197:FrameMgr.c **** Function Name: FrameMgr_dispatchEvent
198:FrameMgr.c **** Function Description: This function is responsible for
199:FrameMgr.c **** taking an incoming event and performing the needed
200:FrameMgr.c **** actions with it as pertains to the FrameMgr.
201:FrameMgr.c **** Inputs: event - the generated event
202:FrameMgr.c **** Outputs: none
203:FrameMgr.c **** ***********************************************************/
204:FrameMgr.c **** void FrameMgr_dispatchEvent(unsigned char event)
205:FrameMgr.c **** {
206:FrameMgr.c **** switch(event)
207:FrameMgr.c **** {
208:FrameMgr.c **** case EV_DUMP_FRAME:
209:FrameMgr.c **** /* try re-initializing the camera before we start dumping */
210:FrameMgr.c ****
211:FrameMgr.c **** CamConfig_setCamReg(0x11,0x01); /* reduce the frame rate for dumping*/
212:FrameMgr.c **** CamConfig_sendFifoCmds();
213:FrameMgr.c **** Utility_delay(1000); /* allow the new frame rate to settle */
214:FrameMgr.c **** lineCount = 0;
215:FrameMgr.c **** currentState = ST_FrameMgr_DumpingFrame;
216:FrameMgr.c **** //CamIntAsm_waitForNewDumpFrame(currentLineBuffer,previousLineBuffer);
217:FrameMgr.c **** FrameMgr_acquireLine();
218:FrameMgr.c **** break;
219:FrameMgr.c ****
220:FrameMgr.c **** case EV_ENABLE_TRACKING:
221:FrameMgr.c **** currentState = ST_FrameMgr_TrackingFrame;
222:FrameMgr.c **** FrameMgr_acquireFrame();
223:FrameMgr.c **** break;
224:FrameMgr.c ****
225:FrameMgr.c **** case EV_ACQUIRE_FRAME_COMPLETE:
226:FrameMgr.c **** FrameMgr_processFrame();
227:FrameMgr.c **** break;
228:FrameMgr.c ****
229:FrameMgr.c **** case EV_PROCESS_FRAME_COMPLETE:
230:FrameMgr.c **** FrameMgr_acquireFrame();
231:FrameMgr.c **** break;
232:FrameMgr.c ****
233:FrameMgr.c **** case EV_SERIAL_DATA_RECEIVED:
234:FrameMgr.c **** if (currentState != ST_FrameMgr_idle)
235:FrameMgr.c **** {
236:FrameMgr.c **** /* we need to go back to processing line data, since
237:FrameMgr.c **** serial data reception interrupted us....just trash the
238:FrameMgr.c **** frame and act like the frame has been processed, which
239:FrameMgr.c **** will kick off the system to wait for the next line */
240:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
241:FrameMgr.c **** }
242:FrameMgr.c **** break;
243:FrameMgr.c ****
244:FrameMgr.c **** case EV_DISABLE_TRACKING:
245:FrameMgr.c **** /* tracking needs to be turned off */
246:FrameMgr.c **** currentState = ST_FrameMgr_idle;
247:FrameMgr.c **** break;
248:FrameMgr.c **** }
249:FrameMgr.c **** }
250:FrameMgr.c ****
GAS LISTING /tmp/ccf43P2i.s page 7
 
 
251:FrameMgr.c **** /***********************************************************
252:FrameMgr.c **** Function Name: FrameMgr_acquireFrame
253:FrameMgr.c **** Function Description: This function is responsible for
254:FrameMgr.c **** beginning of the acquisition of a new frame of data
255:FrameMgr.c **** from the camera interface. The acquisition of this line
256:FrameMgr.c **** depends on the current state of the FrameMgr.
257:FrameMgr.c **** Inputs: none
258:FrameMgr.c **** Outputs: none
259:FrameMgr.c **** ***********************************************************/
260:FrameMgr.c **** void FrameMgr_acquireFrame(void)
261:FrameMgr.c **** {
262:FrameMgr.c **** if (currentState == ST_FrameMgr_TrackingFrame)
263:FrameMgr.c **** {
264:FrameMgr.c **** trackedLineCount = 0;
265:FrameMgr.c **** numPrevTrackedObjects = numCurrTrackedObjects;
266:FrameMgr.c **** numCurrTrackedObjects = 0;
267:FrameMgr.c ****
268:FrameMgr.c **** /* clear out the tracking table, and wait for the new frame
269:FrameMgr.c **** to start */
270:FrameMgr.c **** memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
271:FrameMgr.c **** //CamIntAsm_waitForNewTrackingFrame(currentLineBuffer,colorMap);
272:FrameMgr.c **** WAIT_FOR_VSYNC_HIGH();
273:FrameMgr.c **** CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
274:FrameMgr.c **** }
275:FrameMgr.c **** }
276:FrameMgr.c ****
277:FrameMgr.c **** /***********************************************************
278:FrameMgr.c **** Function Name: FrameMgr_acquireLine
279:FrameMgr.c **** Function Description: This function is responsible for
280:FrameMgr.c **** acquiring a line of data from the camera interface.
281:FrameMgr.c **** The acquisition of this line depends on the current
282:FrameMgr.c **** state of the FrameMgr.
283:FrameMgr.c **** Inputs: none
284:FrameMgr.c **** Outputs: none
285:FrameMgr.c **** ***********************************************************/
286:FrameMgr.c **** void FrameMgr_acquireLine(void)
287:FrameMgr.c **** {
288:FrameMgr.c **** unsigned char tmpLineCount;
289:FrameMgr.c ****
290:FrameMgr.c **** /* clearing out the buffers takes too long...we should
291:FrameMgr.c **** just overwrite the data here without a problem when
292:FrameMgr.c **** we start acquiring...at no point do we check for
293:FrameMgr.c **** a 0x00 value in the current or previous lineBuffers,
294:FrameMgr.c **** so it was a bit excessive :-) */
295:FrameMgr.c ****
296:FrameMgr.c **** /* check which state we are in and proceed as needed */
297:FrameMgr.c **** if (currentState == ST_FrameMgr_DumpingFrame)
298:FrameMgr.c **** {
299:FrameMgr.c **** tmpLineCount = lineCount*2;
300:FrameMgr.c ****
301:FrameMgr.c **** /* clearing out the line data in dump mode is ok, and actually
302:FrameMgr.c **** is needed, since it is possible for the first dump line in
303:FrameMgr.c **** a frame to come back with the last line captured of the
304:FrameMgr.c **** last capture session...*/
305:FrameMgr.c **** memset(currentLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
306:FrameMgr.c **** memset(previousLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
307:FrameMgr.c **** /* wait for another VSYNC so we know which frame to use
GAS LISTING /tmp/ccf43P2i.s page 8
 
 
308:FrameMgr.c **** to start looking for a line to receive */
309:FrameMgr.c **** WAIT_FOR_VSYNC_HIGH();
310:FrameMgr.c **** WAIT_FOR_VSYNC_LOW();
311:FrameMgr.c ****
312:FrameMgr.c **** /* look at lineCount to determine how many HREFs we should
313:FrameMgr.c **** wait before we start sampling */
314:FrameMgr.c **** while(tmpLineCount != 0)
315:FrameMgr.c **** {
316:FrameMgr.c **** WAIT_FOR_HREF_HIGH();
317:FrameMgr.c **** tmpLineCount--;
318:FrameMgr.c **** WAIT_FOR_HREF_LOW();
319:FrameMgr.c **** }
320:FrameMgr.c ****
321:FrameMgr.c **** /* we should now be ready to sample our line...*/
322:FrameMgr.c **** CamIntAsm_acquireDumpLine(currentLineBuffer,previousLineBuffer);
323:FrameMgr.c **** }
324:FrameMgr.c **** else if (currentState == ST_FrameMgr_TrackingFrame)
325:FrameMgr.c **** {
326:FrameMgr.c **** WAIT_FOR_HREF_LOW();
327:FrameMgr.c **** CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
328:FrameMgr.c **** }
329:FrameMgr.c **** }
330:FrameMgr.c ****
331:FrameMgr.c **** /***********************************************************
332:FrameMgr.c **** Function Name: FrameMgr_processLine
333:FrameMgr.c **** Function Description: This function is responsible for
334:FrameMgr.c **** parsing the received image line and performing either
335:FrameMgr.c **** connected region mapping (if in the Tracking state) or
336:FrameMgr.c **** sending out the raw sampled data (if in the Dumping
337:FrameMgr.c **** state).
338:FrameMgr.c **** Inputs: none
339:FrameMgr.c **** Outputs: none
340:FrameMgr.c **** ***********************************************************/
341:FrameMgr.c **** void FrameMgr_processLine(void)
342:FrameMgr.c **** {
343:FrameMgr.c **** unsigned char i;
344:FrameMgr.c **** volatile unsigned char dataToSend;
345:FrameMgr.c **** unsigned char *pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
346:FrameMgr.c **** #ifdef DEBUG_TRACKED_LINE
347:FrameMgr.c **** unsigned char *pSendData;
348:FrameMgr.c **** unsigned char asciiBuffer[5];
349:FrameMgr.c **** unsigned char pixelCount = 0;
350:FrameMgr.c **** #endif
351:FrameMgr.c ****
352:FrameMgr.c **** if (currentState == ST_FrameMgr_DumpingFrame)
353:FrameMgr.c **** {
354:FrameMgr.c **** /* we want to sit in a tight loop and send the acquired data
355:FrameMgr.c **** sitting in current and previous line buffers out the serial
356:FrameMgr.c **** port...it is sent out the serial port immediately instead
357:FrameMgr.c **** of going into the UIMgr tx fifo because we can't do anything
358:FrameMgr.c **** until its sent out anyway...may as well just get it out now */
359:FrameMgr.c ****
360:FrameMgr.c **** /* currentLineBuffer is getting "g" previousLineBuffer is getting "b-r" */
361:FrameMgr.c **** UartInt_txByte(0x0B); /* send the header byte */
362:FrameMgr.c **** UartInt_txByte(lineCount); /* send the line count */
363:FrameMgr.c **** for (i=0; i<NUM_PIXELS_IN_A_DUMP_LINE; i+=2)
364:FrameMgr.c **** {
GAS LISTING /tmp/ccf43P2i.s page 9
 
 
365:FrameMgr.c **** /* when a dump line is sampled, the upper byte can potentially
366:FrameMgr.c **** have garbage in it...we don't have time to mask it off as we're
367:FrameMgr.c **** sampling, so it is done here before we send it out...we also
368:FrameMgr.c **** combine the samples together so we really are sending up a
369:FrameMgr.c **** sample for line N as well as line N+1 */
370:FrameMgr.c **** dataToSend = currentLineBuffer[i];
371:FrameMgr.c **** dataToSend &= 0x0F;
372:FrameMgr.c **** dataToSend <<= 4;
373:FrameMgr.c **** dataToSend |= (previousLineBuffer[i] & 0x0F);
374:FrameMgr.c ****
375:FrameMgr.c **** /* dataToSend should be packed now */
376:FrameMgr.c **** UartInt_txByte(dataToSend);
377:FrameMgr.c ****
378:FrameMgr.c **** /* flip the colors around since we are doing all G on Y and BR on UV */
379:FrameMgr.c **** dataToSend = previousLineBuffer[i+1];
380:FrameMgr.c **** dataToSend &= 0x0F;
381:FrameMgr.c **** dataToSend <<= 4;
382:FrameMgr.c **** dataToSend |= (currentLineBuffer[i+1] & 0x0F);
383:FrameMgr.c ****
384:FrameMgr.c **** /* dataToSend should be packed now */
385:FrameMgr.c **** UartInt_txByte(dataToSend);
386:FrameMgr.c **** }
387:FrameMgr.c **** UartInt_txByte(0x0F); /* send line end */
388:FrameMgr.c **** /* once all the data is sent, increment out line count by 2 since
389:FrameMgr.c **** we really get 2 lines worth of pixels on each pass */
390:FrameMgr.c **** /* Update...increment only by 1, but only send 72 double-lines */
391:FrameMgr.c **** lineCount++;
392:FrameMgr.c ****
393:FrameMgr.c **** /* check to see if we have retrieved all of the needed lines */
394:FrameMgr.c **** if (lineCount >= 72) /* half 144, since we send two lines at a time */
395:FrameMgr.c **** {
396:FrameMgr.c **** /* we're done, so send the dump complete?...nope, just change
397:FrameMgr.c **** states and we should be fine */
398:FrameMgr.c **** lineCount = 0;
399:FrameMgr.c **** currentState = ST_FrameMgr_idle;
400:FrameMgr.c ****
401:FrameMgr.c **** /* disable the PCLK counting overflow interrupt */
402:FrameMgr.c **** TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
403:FrameMgr.c ****
404:FrameMgr.c **** CamConfig_setCamReg(0x11,0x00); /* reset the frame rate to normal*/
405:FrameMgr.c **** CamConfig_sendFifoCmds();
406:FrameMgr.c **** }
407:FrameMgr.c **** else
408:FrameMgr.c **** {
409:FrameMgr.c **** /* we have more lines to acquire in this frame, so keep on truckin...*/
410:FrameMgr.c **** PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
411:FrameMgr.c **** }
412:FrameMgr.c **** }
413:FrameMgr.c **** else if (currentState == ST_FrameMgr_TrackingFrame)
414:FrameMgr.c **** {
415:FrameMgr.c **** #ifdef DEBUG_TRACKED_LINE
416:FrameMgr.c **** /* send the received line over serial...this should only send
417:FrameMgr.c **** until a pixelCount == 176 */
418:FrameMgr.c **** pSendData = currentLineBuffer;
419:FrameMgr.c **** itoa(trackedLineCount,asciiBuffer,10);
420:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
421:FrameMgr.c **** UIMgr_txBuffer(" ",1);
GAS LISTING /tmp/ccf43P2i.s page 10
 
 
422:FrameMgr.c **** while(pixelCount < ACTUAL_NUM_PIXELS_IN_A_LINE)
423:FrameMgr.c **** {
424:FrameMgr.c **** memset(asciiBuffer,0x00,5);
425:FrameMgr.c **** itoa(*pSendData++,asciiBuffer,10); /* color is first byte */
426:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data */
427:FrameMgr.c **** UIMgr_txBuffer(" ",1);
428:FrameMgr.c ****
429:FrameMgr.c **** pixelCount += *pSendData; /* run-length is second byte */
430:FrameMgr.c **** memset(asciiBuffer,0x00,5);
431:FrameMgr.c **** itoa(*pSendData++,asciiBuffer,10);
432:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
433:FrameMgr.c **** UIMgr_txBuffer(" ",1);
434:FrameMgr.c **** }
435:FrameMgr.c **** UIMgr_txBuffer("\n\r",2);
436:FrameMgr.c ****
437:FrameMgr.c **** trackedLineCount++;
438:FrameMgr.c **** if (trackedLineCount == 144)
439:FrameMgr.c **** {
440:FrameMgr.c **** UIMgr_txBuffer(" FC \n\r",8);
441:FrameMgr.c **** trackedLineCount = 0;
442:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
443:FrameMgr.c **** }
444:FrameMgr.c **** else
445:FrameMgr.c **** {
446:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_LINE_COMPLETE);
447:FrameMgr.c **** }
448:FrameMgr.c **** #else
449:FrameMgr.c **** /* determine if any of the RLE blocks overlap */
450:FrameMgr.c **** FrameMgr_findConnectedness();
451:FrameMgr.c ****
452:FrameMgr.c **** /* we also want to remove any objects that are less than
453:FrameMgr.c **** a minimum height...we already removed portions of the
454:FrameMgr.c **** run-length that are less than MIN_PIXEL_WIDTH in the
455:FrameMgr.c **** findConnectedness() routine...doing it here instead of
456:FrameMgr.c **** a function to speed things up...this may end up slowing down the
457:FrameMgr.c **** frame rate slightly, and can be removed if this isn't needed */
458:FrameMgr.c ****
459:FrameMgr.c **** /* run this routine once every 8 lines */
460:FrameMgr.c **** if ( (trackedLineCount & RUN_OBJECT_FILTER_MASK) == RUN_OBJECT_FILTER_MASK)
461:FrameMgr.c **** {
462:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
463:FrameMgr.c **** {
464:FrameMgr.c **** if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE)
465:FrameMgr.c **** {
466:FrameMgr.c **** /* check to see if the object is already in
467:FrameMgr.c **** our past...i.e., its last */
468:FrameMgr.c **** if ( (*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) -
469:FrameMgr.c **** *(pTrackedObjectData + Y_UPPER_LEFT_OFFSET)) < MIN_OBJECT_TRACKING_HEIGHT
470:FrameMgr.c **** {
471:FrameMgr.c **** /* the object is less than the minimum height...see if it is adjacent
472:FrameMgr.c **** to the current line we just processed...if so, leave it here...otherwise,
473:FrameMgr.c **** it needs to be invalidated since its too small */
474:FrameMgr.c **** if ( trackedLineCount - *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) > 2)
475:FrameMgr.c **** {
476:FrameMgr.c **** /* invalidate the object */
477:FrameMgr.c **** *(pTrackedObjectData + VALID_OBJECT_OFFSET) = FALSE;
478:FrameMgr.c **** numCurrTrackedObjects--;
GAS LISTING /tmp/ccf43P2i.s page 11
 
 
479:FrameMgr.c **** }
480:FrameMgr.c **** }
481:FrameMgr.c **** }
482:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
483:FrameMgr.c **** }
484:FrameMgr.c **** }
485:FrameMgr.c ****
486:FrameMgr.c **** trackedLineCount++;
487:FrameMgr.c **** if (trackedLineCount == ACTUAL_NUM_LINES_IN_A_FRAME)
488:FrameMgr.c **** {
489:FrameMgr.c **** /* an entire frame of tracking data has been acquired, so
490:FrameMgr.c **** publish an event letting the system know this fact */
491:FrameMgr.c **** PUBLISH_EVENT(EV_ACQUIRE_FRAME_COMPLETE);
492:FrameMgr.c **** /* disable the PCLK counting overflow interrupt */
493:FrameMgr.c **** TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
494:FrameMgr.c **** trackedLineCount = 0;
495:FrameMgr.c **** }
496:FrameMgr.c **** else
497:FrameMgr.c **** {
498:FrameMgr.c **** PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
499:FrameMgr.c **** }
500:FrameMgr.c **** #endif
501:FrameMgr.c **** }
502:FrameMgr.c **** else
503:FrameMgr.c **** {
504:FrameMgr.c **** /* ...and here? */
505:FrameMgr.c **** }
506:FrameMgr.c **** }
507:FrameMgr.c ****
508:FrameMgr.c **** /***********************************************************
509:FrameMgr.c **** Function Name: FrameMgr_processFrame
510:FrameMgr.c **** Function Description: This function is responsible for
511:FrameMgr.c **** parsing the completed frame and performing all actions
512:FrameMgr.c **** needed at this level.
513:FrameMgr.c **** Inputs: none
514:FrameMgr.c **** Outputs: none
515:FrameMgr.c **** ***********************************************************/
516:FrameMgr.c **** void FrameMgr_processFrame(void)
517:FrameMgr.c **** {
93 .stabn 68,0,517,.LM0-FrameMgr_processFrame
94 .LM0:
95 /* prologue: frame size=0 */
96 0000 DF92 push r13
97 0002 EF92 push r14
98 0004 FF92 push r15
99 0006 0F93 push r16
100 0008 1F93 push r17
101 000a CF93 push r28
102 000c DF93 push r29
103 /* prologue end (size=7) */
518:FrameMgr.c **** unsigned char i,k,color;
519:FrameMgr.c **** #if DEBUG_FRAME_DATA
520:FrameMgr.c **** unsigned char asciiBuffer[5];
521:FrameMgr.c **** unsigned char j;
522:FrameMgr.c **** #endif
523:FrameMgr.c **** unsigned char *pTableData = (unsigned char *)pCurrentTrackedObjectTable;
104 .stabn 68,0,523,.LM1-FrameMgr_processFrame
GAS LISTING /tmp/ccf43P2i.s page 12
 
 
105 .LM1:
106 000e 2091 0000 lds r18,pCurrentTrackedObjectTable
107 0012 3091 0000 lds r19,(pCurrentTrackedObjectTable)+1
524:FrameMgr.c **** unsigned char tmpUpperLeftX,tmpUpperLeftY,tmpLowerRightX,tmpLowerRightY;
525:FrameMgr.c ****
526:FrameMgr.c **** #if DEBUG_FRAME_DATA
527:FrameMgr.c **** /* we want to send all of the currently tracked table out
528:FrameMgr.c **** the serial port for debugging */
529:FrameMgr.c **** for (i=0; i<numCurrTrackedObjects; i++)
530:FrameMgr.c **** {
531:FrameMgr.c **** UIMgr_txBuffer("----------\r\n",12);
532:FrameMgr.c **** for (j=0; j<SIZE_OF_TRACKED_OBJECT; j++)
533:FrameMgr.c **** {
534:FrameMgr.c **** memset(asciiBuffer,0x00,5);
535:FrameMgr.c **** itoa(*pTableData++,asciiBuffer,10);
536:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data
537:FrameMgr.c **** + 1 space */
538:FrameMgr.c **** UIMgr_txBuffer("\r\n",2);
539:FrameMgr.c **** }
540:FrameMgr.c **** }
541:FrameMgr.c ****
542:FrameMgr.c **** /* finally, send a new line */
543:FrameMgr.c **** UIMgr_txBuffer("\r\n",2);
544:FrameMgr.c ****
545:FrameMgr.c **** memset(asciiBuffer,0x00,5);
546:FrameMgr.c **** itoa(numCurrTrackedObjects,asciiBuffer,10);
547:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
548:FrameMgr.c **** UIMgr_txBuffer(" PFC\r\n",5);
549:FrameMgr.c ****
550:FrameMgr.c **** #else
551:FrameMgr.c **** /* we only send tracking packets if there are tracked objects */
552:FrameMgr.c ****
553:FrameMgr.c **** if (numCurrTrackedObjects > 0)
108 .stabn 68,0,553,.LM2-FrameMgr_processFrame
109 .LM2:
110 0016 8091 0000 lds r24,numCurrTrackedObjects
111 001a 8823 tst r24
112 001c 09F4 brne .+2
113 001e 3FC0 rjmp .L2
114 .stabn 68,0,523,.LM3-FrameMgr_processFrame
115 .LM3:
116 0020 E901 movw r28,r18
554:FrameMgr.c **** {
555:FrameMgr.c **** UIMgr_writeTxFifo(0x0A); /* header byte for a tracking packet */
117 .stabn 68,0,555,.LM4-FrameMgr_processFrame
118 .LM4:
119 0022 8AE0 ldi r24,lo8(10)
120 0024 00D0 rcall UIMgr_writeTxFifo
556:FrameMgr.c **** /* reset the pointer */
557:FrameMgr.c **** pTableData = (unsigned char *)pCurrentTrackedObjectTable;
558:FrameMgr.c ****
559:FrameMgr.c **** UIMgr_writeTxFifo(numCurrTrackedObjects); /* num of objects tracked */
121 .stabn 68,0,559,.LM5-FrameMgr_processFrame
122 .LM5:
123 0026 8091 0000 lds r24,numCurrTrackedObjects
124 002a 00D0 rcall UIMgr_writeTxFifo
125 002c DD24 clr r13
GAS LISTING /tmp/ccf43P2i.s page 13
 
 
126 .L4:
560:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
561:FrameMgr.c **** {
562:FrameMgr.c **** /* we only want to process objects that have their objectValid flag
563:FrameMgr.c **** set to TRUE */
564:FrameMgr.c **** if ( *(pTableData + VALID_OBJECT_OFFSET) == TRUE)
127 .stabn 68,0,564,.LM6-FrameMgr_processFrame
128 .LM6:
129 002e 8F81 ldd r24,Y+7
130 0030 8130 cpi r24,lo8(1)
131 0032 69F5 brne .L5
565:FrameMgr.c **** {
566:FrameMgr.c **** /* the object is valid...convert the color from bit position to value...remember,
567:FrameMgr.c **** each bit in the "color" byte corresponds to a color */
568:FrameMgr.c **** k=0;
569:FrameMgr.c **** color = *(pTableData + COLOR_OFFSET);
132 .stabn 68,0,569,.LM7-FrameMgr_processFrame
133 .LM7:
134 0034 8881 ld r24,Y
570:FrameMgr.c **** if (color == 128) k=0;
135 .stabn 68,0,570,.LM8-FrameMgr_processFrame
136 .LM8:
137 0036 8038 cpi r24,lo8(-128)
138 0038 E1F0 breq .L7
571:FrameMgr.c **** else if (color == 64) k=1;
139 .stabn 68,0,571,.LM9-FrameMgr_processFrame
140 .LM9:
141 003a 8034 cpi r24,lo8(64)
142 003c 11F4 brne .L9
143 003e 81E0 ldi r24,lo8(1)
144 0040 19C0 rjmp .L11
145 .L9:
572:FrameMgr.c **** else if (color == 32) k=2;
146 .stabn 68,0,572,.LM10-FrameMgr_processFrame
147 .LM10:
148 0042 8032 cpi r24,lo8(32)
149 0044 11F4 brne .L12
150 0046 82E0 ldi r24,lo8(2)
151 0048 15C0 rjmp .L11
152 .L12:
573:FrameMgr.c **** else if (color == 16) k=3;
153 .stabn 68,0,573,.LM11-FrameMgr_processFrame
154 .LM11:
155 004a 8031 cpi r24,lo8(16)
156 004c 11F4 brne .L14
157 004e 83E0 ldi r24,lo8(3)
158 0050 11C0 rjmp .L11
159 .L14:
574:FrameMgr.c **** else if (color == 8) k=4;
160 .stabn 68,0,574,.LM12-FrameMgr_processFrame
161 .LM12:
162 0052 8830 cpi r24,lo8(8)
163 0054 11F4 brne .L16
164 0056 84E0 ldi r24,lo8(4)
165 0058 0DC0 rjmp .L11
166 .L16:
575:FrameMgr.c **** else if (color == 4) k=5;
GAS LISTING /tmp/ccf43P2i.s page 14
 
 
167 .stabn 68,0,575,.LM13-FrameMgr_processFrame
168 .LM13:
169 005a 8430 cpi r24,lo8(4)
170 005c 11F4 brne .L18
171 005e 85E0 ldi r24,lo8(5)
172 0060 09C0 rjmp .L11
173 .L18:
576:FrameMgr.c **** else if (color == 2) k=6;
174 .stabn 68,0,576,.LM14-FrameMgr_processFrame
175 .LM14:
176 0062 8230 cpi r24,lo8(2)
177 0064 11F4 brne .L20
178 0066 86E0 ldi r24,lo8(6)
179 0068 05C0 rjmp .L11
180 .L20:
577:FrameMgr.c **** else if (color == 1) k=7;
181 .stabn 68,0,577,.LM15-FrameMgr_processFrame
182 .LM15:
183 006a 8130 cpi r24,lo8(1)
184 006c 11F4 brne .L7
185 006e 87E0 ldi r24,lo8(7)
186 0070 01C0 rjmp .L11
187 .L7:
188 0072 80E0 ldi r24,lo8(0)
189 .L11:
578:FrameMgr.c ****
579:FrameMgr.c **** tmpUpperLeftX = *(pTableData + X_UPPER_LEFT_OFFSET); /* get the upper left X */
190 .stabn 68,0,579,.LM16-FrameMgr_processFrame
191 .LM16:
192 0074 1B81 ldd r17,Y+3
580:FrameMgr.c **** tmpUpperLeftY = *(pTableData + Y_UPPER_LEFT_OFFSET); /* get the upper left Y */
193 .stabn 68,0,580,.LM17-FrameMgr_processFrame
194 .LM17:
195 0076 0C81 ldd r16,Y+4
581:FrameMgr.c **** tmpLowerRightX = *(pTableData + X_LOWER_RIGHT_OFFSET); /* get the lower right X */
196 .stabn 68,0,581,.LM18-FrameMgr_processFrame
197 .LM18:
198 0078 FD80 ldd r15,Y+5
582:FrameMgr.c **** tmpLowerRightY = *(pTableData + Y_LOWER_RIGHT_OFFSET); /* get the lower right Y */
199 .stabn 68,0,582,.LM19-FrameMgr_processFrame
200 .LM19:
201 007a EE80 ldd r14,Y+6
583:FrameMgr.c ****
584:FrameMgr.c **** UIMgr_writeTxFifo(k); /* send the color first */
202 .stabn 68,0,584,.LM20-FrameMgr_processFrame
203 .LM20:
204 007c 00D0 rcall UIMgr_writeTxFifo
585:FrameMgr.c **** UIMgr_writeTxFifo(tmpUpperLeftX);
205 .stabn 68,0,585,.LM21-FrameMgr_processFrame
206 .LM21:
207 007e 812F mov r24,r17
208 0080 00D0 rcall UIMgr_writeTxFifo
586:FrameMgr.c **** UIMgr_writeTxFifo(tmpUpperLeftY);
209 .stabn 68,0,586,.LM22-FrameMgr_processFrame
210 .LM22:
211 0082 802F mov r24,r16
212 0084 00D0 rcall UIMgr_writeTxFifo
GAS LISTING /tmp/ccf43P2i.s page 15
 
 
587:FrameMgr.c **** UIMgr_writeTxFifo(tmpLowerRightX);
213 .stabn 68,0,587,.LM23-FrameMgr_processFrame
214 .LM23:
215 0086 8F2D mov r24,r15
216 0088 00D0 rcall UIMgr_writeTxFifo
588:FrameMgr.c **** UIMgr_writeTxFifo(tmpLowerRightY);
217 .stabn 68,0,588,.LM24-FrameMgr_processFrame
218 .LM24:
219 008a 8E2D mov r24,r14
220 008c 00D0 rcall UIMgr_writeTxFifo
221 .L5:
222 .stabn 68,0,560,.LM25-FrameMgr_processFrame
223 .LM25:
224 008e D394 inc r13
225 0090 88E0 ldi r24,lo8(8)
226 0092 D816 cp r13,r24
227 0094 11F0 breq .L23
589:FrameMgr.c **** }
590:FrameMgr.c ****
591:FrameMgr.c **** /* move our pointer up to the beginning of the next object */
592:FrameMgr.c **** pTableData += SIZE_OF_TRACKED_OBJECT;
228 .stabn 68,0,592,.LM26-FrameMgr_processFrame
229 .LM26:
230 0096 2896 adiw r28,8
231 0098 CACF rjmp .L4
232 .L23:
593:FrameMgr.c **** }
594:FrameMgr.c ****
595:FrameMgr.c **** /* all done...send the end of tracking packets char */
596:FrameMgr.c **** UIMgr_writeTxFifo(0xFF);
233 .stabn 68,0,596,.LM27-FrameMgr_processFrame
234 .LM27:
235 009a 8FEF ldi r24,lo8(-1)
236 009c 00D0 rcall UIMgr_writeTxFifo
237 .L2:
597:FrameMgr.c **** }
598:FrameMgr.c **** #endif
599:FrameMgr.c ****
600:FrameMgr.c **** /* the tracked object table will be cleared out right before we start
601:FrameMgr.c **** to wait for VSYNC to indicate a new frame...so it doesn't need to be
602:FrameMgr.c **** done now */
603:FrameMgr.c ****
604:FrameMgr.c **** /* schedule the next action to acquire a new frame */
605:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
238 .stabn 68,0,605,.LM28-FrameMgr_processFrame
239 .LM28:
240 009e 84E0 ldi r24,lo8(4)
241 00a0 00D0 rcall Exec_writeEventFifo
242 /* epilogue: frame size=0 */
243 00a2 DF91 pop r29
244 00a4 CF91 pop r28
245 00a6 1F91 pop r17
246 00a8 0F91 pop r16
247 00aa FF90 pop r15
248 00ac EF90 pop r14
249 00ae DF90 pop r13
250 00b0 0895 ret
GAS LISTING /tmp/ccf43P2i.s page 16
 
 
251 /* epilogue end (size=8) */
252 /* function FrameMgr_processFrame size 88 (73) */
253 .size FrameMgr_processFrame, .-FrameMgr_processFrame
254 .stabs "i:r(0,11)",64,0,518,13
255 .stabs "k:r(0,11)",64,0,518,24
256 .stabs "color:r(0,11)",64,0,518,24
257 .stabs "pTableData:r(0,22)=*(0,11)",64,0,523,28
258 .stabs "tmpUpperLeftX:r(0,11)",64,0,524,17
259 .stabs "tmpUpperLeftY:r(0,11)",64,0,524,16
260 .stabs "tmpLowerRightX:r(0,11)",64,0,524,15
261 .stabs "tmpLowerRightY:r(0,11)",64,0,524,14
262 .stabn 192,0,0,FrameMgr_processFrame-FrameMgr_processFrame
263 .stabn 224,0,0,.Lscope0-FrameMgr_processFrame
264 .Lscope0:
265 .stabs "",36,0,0,.Lscope0-FrameMgr_processFrame
266 .stabd 78,0,0
267 .stabs "FrameMgr_processLine:F(0,15)",36,0,342,FrameMgr_processLine
268 .global FrameMgr_processLine
269 .type FrameMgr_processLine, @function
270 FrameMgr_processLine:
271 .stabd 46,0,0
272 .stabn 68,0,342,.LM29-FrameMgr_processLine
273 .LM29:
274 /* prologue: frame size=1 */
275 00b2 2F92 push r2
276 00b4 3F92 push r3
277 00b6 4F92 push r4
278 00b8 5F92 push r5
279 00ba 6F92 push r6
280 00bc 7F92 push r7
281 00be 8F92 push r8
282 00c0 9F92 push r9
283 00c2 AF92 push r10
284 00c4 BF92 push r11
285 00c6 CF92 push r12
286 00c8 DF92 push r13
287 00ca EF92 push r14
288 00cc FF92 push r15
289 00ce 0F93 push r16
290 00d0 1F93 push r17
291 00d2 CF93 push r28
292 00d4 DF93 push r29
293 00d6 CDB7 in r28,__SP_L__
294 00d8 DEB7 in r29,__SP_H__
295 00da 2197 sbiw r28,1
296 00dc 0FB6 in __tmp_reg__,__SREG__
297 00de F894 cli
298 00e0 DEBF out __SP_H__,r29
299 00e2 0FBE out __SREG__,__tmp_reg__
300 00e4 CDBF out __SP_L__,r28
301 /* prologue end (size=26) */
302 .stabn 68,0,345,.LM30-FrameMgr_processLine
303 .LM30:
304 00e6 0091 0000 lds r16,pCurrentTrackedObjectTable
305 00ea 1091 0000 lds r17,(pCurrentTrackedObjectTable)+1
306 .stabn 68,0,352,.LM31-FrameMgr_processLine
307 .LM31:
GAS LISTING /tmp/ccf43P2i.s page 17
 
 
308 00ee 8091 0000 lds r24,currentState
309 00f2 8230 cpi r24,lo8(2)
310 00f4 09F0 breq .+2
311 00f6 6AC0 rjmp .L27
312 .stabn 68,0,361,.LM32-FrameMgr_processLine
313 .LM32:
314 00f8 8BE0 ldi r24,lo8(11)
315 00fa 00D0 rcall UartInt_txByte
316 .stabn 68,0,362,.LM33-FrameMgr_processLine
317 .LM33:
318 00fc 8091 0000 lds r24,lineCount
319 0100 00D0 rcall UartInt_txByte
320 0102 0F2E mov __tmp_reg__,r31
321 0104 F0E0 ldi r31,lo8(currentLineBuffer)
322 0106 CF2E mov r12,r31
323 0108 F0E0 ldi r31,hi8(currentLineBuffer)
324 010a DF2E mov r13,r31
325 010c F02D mov r31,__tmp_reg__
326 010e 00E0 ldi r16,lo8(0)
327 0110 10E0 ldi r17,hi8(0)
328 0112 0F2E mov __tmp_reg__,r31
329 0114 F0E0 ldi r31,lo8(previousLineBuffer)
330 0116 EF2E mov r14,r31
331 0118 F0E0 ldi r31,hi8(previousLineBuffer)
332 011a FF2E mov r15,r31
333 011c F02D mov r31,__tmp_reg__
334 .L29:
335 .stabn 68,0,370,.LM34-FrameMgr_processLine
336 .LM34:
337 011e F601 movw r30,r12
338 0120 8081 ld r24,Z
339 0122 8983 std Y+1,r24
340 .stabn 68,0,371,.LM35-FrameMgr_processLine
341 .LM35:
342 0124 8981 ldd r24,Y+1
343 0126 8F70 andi r24,lo8(15)
344 0128 8983 std Y+1,r24
345 .stabn 68,0,372,.LM36-FrameMgr_processLine
346 .LM36:
347 012a 8981 ldd r24,Y+1
348 012c 8295 swap r24
349 012e 807F andi r24,0xf0
350 0130 8983 std Y+1,r24
351 .stabn 68,0,373,.LM37-FrameMgr_processLine
352 .LM37:
353 0132 9981 ldd r25,Y+1
354 0134 F701 movw r30,r14
355 0136 8081 ld r24,Z
356 0138 8F70 andi r24,lo8(15)
357 013a 892B or r24,r25
358 013c 8983 std Y+1,r24
359 .stabn 68,0,376,.LM38-FrameMgr_processLine
360 .LM38:
361 013e 8981 ldd r24,Y+1
362 0140 00D0 rcall UartInt_txByte
363 .stabn 68,0,379,.LM39-FrameMgr_processLine
364 .LM39:
GAS LISTING /tmp/ccf43P2i.s page 18
 
 
365 0142 D801 movw r26,r16
366 0144 1196 adiw r26,1
367 0146 FD01 movw r30,r26
368 0148 E050 subi r30,lo8(-(previousLineBuffer))
369 014a F040 sbci r31,hi8(-(previousLineBuffer))
370 014c 8081 ld r24,Z
371 014e 8983 std Y+1,r24
372 .stabn 68,0,380,.LM40-FrameMgr_processLine
373 .LM40:
374 0150 8981 ldd r24,Y+1
375 0152 8F70 andi r24,lo8(15)
376 0154 8983 std Y+1,r24
377 .stabn 68,0,381,.LM41-FrameMgr_processLine
378 .LM41:
379 0156 8981 ldd r24,Y+1
380 0158 8295 swap r24
381 015a 807F andi r24,0xf0
382 015c 8983 std Y+1,r24
383 .stabn 68,0,382,.LM42-FrameMgr_processLine
384 .LM42:
385 015e 9981 ldd r25,Y+1
386 0160 A050 subi r26,lo8(-(currentLineBuffer))
387 0162 B040 sbci r27,hi8(-(currentLineBuffer))
388 0164 8C91 ld r24,X
389 0166 8F70 andi r24,lo8(15)
390 0168 892B or r24,r25
391 016a 8983 std Y+1,r24
392 .stabn 68,0,385,.LM43-FrameMgr_processLine
393 .LM43:
394 016c 8981 ldd r24,Y+1
395 016e 00D0 rcall UartInt_txByte
396 0170 82E0 ldi r24,lo8(2)
397 0172 90E0 ldi r25,hi8(2)
398 0174 C80E add r12,r24
399 0176 D91E adc r13,r25
400 0178 0E5F subi r16,lo8(-(2))
401 017a 1F4F sbci r17,hi8(-(2))
402 017c E80E add r14,r24
403 017e F91E adc r15,r25
404 .stabn 68,0,363,.LM44-FrameMgr_processLine
405 .LM44:
406 0180 003B cpi r16,176
407 0182 1105 cpc r17,__zero_reg__
408 0184 61F6 brne .L29
409 .stabn 68,0,387,.LM45-FrameMgr_processLine
410 .LM45:
411 0186 8FE0 ldi r24,lo8(15)
412 0188 00D0 rcall UartInt_txByte
413 .stabn 68,0,391,.LM46-FrameMgr_processLine
414 .LM46:
415 018a 8091 0000 lds r24,lineCount
416 018e 8F5F subi r24,lo8(-(1))
417 0190 8093 0000 sts lineCount,r24
418 .stabn 68,0,394,.LM47-FrameMgr_processLine
419 .LM47:
420 0194 8834 cpi r24,lo8(72)
421 0196 60F0 brlo .L31
GAS LISTING /tmp/ccf43P2i.s page 19
 
 
422 .stabn 68,0,398,.LM48-FrameMgr_processLine
423 .LM48:
424 0198 1092 0000 sts lineCount,__zero_reg__
425 .stabn 68,0,399,.LM49-FrameMgr_processLine
426 .LM49:
427 019c 1092 0000 sts currentState,__zero_reg__
428 .stabn 68,0,402,.LM50-FrameMgr_processLine
429 .LM50:
430 01a0 89B7 in r24,89-0x20
431 01a2 8B7F andi r24,lo8(-5)
432 01a4 89BF out 89-0x20,r24
433 .stabn 68,0,404,.LM51-FrameMgr_processLine
434 .LM51:
435 01a6 60E0 ldi r22,lo8(0)
436 01a8 81E1 ldi r24,lo8(17)
437 01aa 00D0 rcall CamConfig_setCamReg
438 .stabn 68,0,405,.LM52-FrameMgr_processLine
439 .LM52:
440 01ac 00D0 rcall CamConfig_sendFifoCmds
441 01ae C8C0 rjmp .L71
442 .L31:
443 .stabn 68,0,410,.LM53-FrameMgr_processLine
444 .LM53:
445 01b0 8091 0000 lds r24,fastEventBitmask
446 01b4 8260 ori r24,lo8(2)
447 01b6 8093 0000 sts fastEventBitmask,r24
448 01ba C2C0 rjmp .L71
449 .L72:
450 .stabn 68,0,491,.LM54-FrameMgr_processLine
451 .LM54:
452 01bc 80E2 ldi r24,lo8(32)
453 01be 00D0 rcall Exec_writeEventFifo
454 .stabn 68,0,493,.LM55-FrameMgr_processLine
455 .LM55:
456 01c0 89B7 in r24,89-0x20
457 01c2 8B7F andi r24,lo8(-5)
458 01c4 89BF out 89-0x20,r24
459 .stabn 68,0,494,.LM56-FrameMgr_processLine
460 .LM56:
461 01c6 1092 0000 sts trackedLineCount,__zero_reg__
462 01ca BAC0 rjmp .L71
463 .L27:
464 .stabn 68,0,413,.LM57-FrameMgr_processLine
465 .LM57:
466 01cc 8130 cpi r24,lo8(1)
467 01ce 09F0 breq .+2
468 01d0 B7C0 rjmp .L71
469 .LBB4:
470 .LBB5:
606:FrameMgr.c **** }
607:FrameMgr.c ****
608:FrameMgr.c **** /***********************************************************
609:FrameMgr.c **** Function Name: FrameMgr_findConnectedness
610:FrameMgr.c **** Function Description: This function is responsible for
611:FrameMgr.c **** finding the connectedness between two particular run-
612:FrameMgr.c **** length encoded lines of pixel data. It updates the
613:FrameMgr.c **** trackingTable as needed.
GAS LISTING /tmp/ccf43P2i.s page 20
 
 
614:FrameMgr.c **** Inputs: none
615:FrameMgr.c **** Outputs: none
616:FrameMgr.c **** ***********************************************************/
617:FrameMgr.c **** static void FrameMgr_findConnectedness(void)
618:FrameMgr.c **** {
619:FrameMgr.c **** trackedColor_t currColor;
620:FrameMgr.c **** unsigned char *pCurrLineColorInfo = currentLineBuffer;
621:FrameMgr.c **** unsigned char *pTrackedObjectData;
622:FrameMgr.c **** register unsigned char currPixelRunStart=0;
623:FrameMgr.c **** register unsigned char currPixelRunFinish=0;
624:FrameMgr.c **** register unsigned char lastLineXStart=0;
625:FrameMgr.c **** register unsigned char lastLineXFinish=0;
626:FrameMgr.c **** register unsigned char runLength=1;
627:FrameMgr.c **** unsigned char i;
628:FrameMgr.c **** bool_t colorConnected;
629:FrameMgr.c ****
630:FrameMgr.c **** do
631:FrameMgr.c **** {
632:FrameMgr.c **** /* grab both the current color and the number of pixels
633:FrameMgr.c **** in the run...remember, pixels start at 1, not 0! */
634:FrameMgr.c **** colorConnected = FALSE;
635:FrameMgr.c **** currColor = *pCurrLineColorInfo++;
636:FrameMgr.c **** currPixelRunStart += runLength;
637:FrameMgr.c **** runLength = *pCurrLineColorInfo++;
638:FrameMgr.c **** currPixelRunFinish += runLength;
639:FrameMgr.c ****
640:FrameMgr.c **** /* make sure that the run-length is at least as wide as
641:FrameMgr.c **** the minimum horizontal tracking width, and we care about the color */
642:FrameMgr.c ****
643:FrameMgr.c **** if ( (currColor != notTracked) && (runLength > MIN_OBJECT_TRACKING_WIDTH) )
644:FrameMgr.c **** {
645:FrameMgr.c **** /* this run contains a color we care about, so
646:FrameMgr.c **** either it will begin a new tracked object, or it
647:FrameMgr.c **** is connected to a currently tracked object...
648:FrameMgr.c **** compare it with each object in the tracking
649:FrameMgr.c **** table...we can't just look at the numTrackedObjects because
650:FrameMgr.c **** it is entirely possible that the first couple of objects could
651:FrameMgr.c **** be invalid...
652:FrameMgr.c ****
653:FrameMgr.c **** NOTE: Instead of accessing each element in the trackedObjectTable
654:FrameMgr.c **** through the 'i' index, and then accessing the fields in each structure,
655:FrameMgr.c **** a pointer to each entry is established each time through the loop, followed
656:FrameMgr.c **** by accessing the elements through specified offsets. GCC seems to be
657:FrameMgr.c **** able to optimize this code much better than simply accessing the elements
658:FrameMgr.c **** of each structure in the array the more normal way...*/
659:FrameMgr.c ****
660:FrameMgr.c **** pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
661:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
662:FrameMgr.c **** {
663:FrameMgr.c **** if ( (currColor == *(pTrackedObjectData + COLOR_OFFSET)) &&
664:FrameMgr.c **** (*(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE) &&
665:FrameMgr.c **** (*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) == trackedLineCount - 1) )
666:FrameMgr.c **** {
667:FrameMgr.c **** /* found a color match and the object is valid...check to see if there is
668:FrameMgr.c **** connectedness */
669:FrameMgr.c **** lastLineXStart = *(pTrackedObjectData + LAST_LINE_X_START_OFFSET);
670:FrameMgr.c **** lastLineXFinish = *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET);
GAS LISTING /tmp/ccf43P2i.s page 21
 
 
671:FrameMgr.c ****
672:FrameMgr.c **** /* Check for the 5 following types of line connectedness:
673:FrameMgr.c **** ---------------------
674:FrameMgr.c **** | |
675:FrameMgr.c **** ---------------------
676:FrameMgr.c **** -------------------------
677:FrameMgr.c **** | |
678:FrameMgr.c **** ------------------------- */
679:FrameMgr.c **** if ( ( (currPixelRunStart >= lastLineXStart) &&
680:FrameMgr.c **** (currPixelRunStart <= lastLineXFinish) ) ||
681:FrameMgr.c ****
682:FrameMgr.c **** /* ---------------------
683:FrameMgr.c **** | |
684:FrameMgr.c **** ---------------------
685:FrameMgr.c **** -------------------
686:FrameMgr.c **** | |
687:FrameMgr.c **** -------------------
688:FrameMgr.c **** OR
689:FrameMgr.c **** ------------------------------
690:FrameMgr.c **** | |
691:FrameMgr.c **** ------------------------------
692:FrameMgr.c **** ---------
693:FrameMgr.c **** | |
694:FrameMgr.c **** --------- */
695:FrameMgr.c **** ( (currPixelRunFinish >= lastLineXStart) &&
696:FrameMgr.c **** (currPixelRunFinish <= lastLineXFinish) ) ||
697:FrameMgr.c ****
698:FrameMgr.c ****
699:FrameMgr.c **** /* -------------------------------
700:FrameMgr.c **** | |
701:FrameMgr.c **** -------------------------------
702:FrameMgr.c **** -------------------------------
703:FrameMgr.c **** | |
704:FrameMgr.c **** -------------------------------
705:FrameMgr.c **** OR
706:FrameMgr.c **** -------------
707:FrameMgr.c **** | |
708:FrameMgr.c **** -------------
709:FrameMgr.c **** -------------------------------
710:FrameMgr.c **** | |
711:FrameMgr.c **** ------------------------------- */
712:FrameMgr.c **** ( (currPixelRunStart <= lastLineXStart) &&
713:FrameMgr.c **** (currPixelRunFinish >= lastLineXFinish) ) )
714:FrameMgr.c **** {
715:FrameMgr.c **** /* THERE IS CONNECTEDNESS...update the lastLineXStart and lastLineXFinish
716:FrameMgr.c **** data pointed to by pTrackedObjectData */
717:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart;
718:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish;
719:FrameMgr.c ****
720:FrameMgr.c **** /* check if the bounding box needs to be updated */
721:FrameMgr.c **** if (*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) > currPixelRunStart)
722:FrameMgr.c **** {
723:FrameMgr.c **** /* need to update the bounding box for the upper left point to
724:FrameMgr.c **** enclose this new left-most point...we never have to update the
725:FrameMgr.c **** upper left Y point, since each scan line we process moves from
726:FrameMgr.c **** top to bottom */
727:FrameMgr.c **** *(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart;
GAS LISTING /tmp/ccf43P2i.s page 22
 
 
728:FrameMgr.c **** }
729:FrameMgr.c ****
730:FrameMgr.c **** if ( *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) < currPixelRunFinish)
731:FrameMgr.c **** {
732:FrameMgr.c **** /* need to update the bounding box for the lower right X point to
733:FrameMgr.c **** enclose this new right-most point */
734:FrameMgr.c **** *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish;
735:FrameMgr.c **** }
736:FrameMgr.c ****
737:FrameMgr.c **** /* the lower right 'y' point always gets updated when connectedness is found */
738:FrameMgr.c **** *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount;
739:FrameMgr.c ****
740:FrameMgr.c **** /* set a flag indicating that that color run is part of another
741:FrameMgr.c **** object and thus doesn't need to be added as a new entry into the
742:FrameMgr.c **** tracking table */
743:FrameMgr.c **** colorConnected = TRUE;
744:FrameMgr.c **** break;
745:FrameMgr.c **** }
746:FrameMgr.c **** }
747:FrameMgr.c ****
748:FrameMgr.c **** /* go to the next object */
749:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
750:FrameMgr.c **** }
751:FrameMgr.c ****
752:FrameMgr.c **** if (colorConnected == FALSE)
753:FrameMgr.c **** {
754:FrameMgr.c **** /* a new entry needs to be made to the tracking table, since we have
755:FrameMgr.c **** a run-length with a color, and it isn't connected to anything...but we
756:FrameMgr.c **** can only do this if there is space left in the trackedObject table */
757:FrameMgr.c **** if (numCurrTrackedObjects < MAX_TRACKED_OBJECTS)
758:FrameMgr.c **** {
759:FrameMgr.c **** /* space is available...add the object...but first we need to find an
760:FrameMgr.c **** invalid object in the object tracking table */
761:FrameMgr.c **** pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
762:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
763:FrameMgr.c **** {
764:FrameMgr.c **** if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == FALSE) break;
765:FrameMgr.c ****
766:FrameMgr.c **** /* if we haven't broken above, then the object must have been valid...
767:FrameMgr.c **** go ahead and move the pointer to the next object to check it */
768:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
769:FrameMgr.c **** }
770:FrameMgr.c ****
771:FrameMgr.c ****
772:FrameMgr.c **** /* now that we have a pointer to the tracked object to be updated, update all
773:FrameMgr.c **** the fields */
774:FrameMgr.c **** *(pTrackedObjectData + COLOR_OFFSET) = currColor; /* color */
775:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart; /* lastLineXStart */
776:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish; /* lastLineXFinish *
777:FrameMgr.c **** *(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart; /* x_upperLeft */
778:FrameMgr.c **** *(pTrackedObjectData + Y_UPPER_LEFT_OFFSET) = trackedLineCount; /* y_upperLeft */
471 .stabn 68,0,778,.LM58-FrameMgr_processLine
472 .LM58:
473 01d2 F090 0000 lds r15,trackedLineCount
474 .stabn 68,0,663,.LM59-FrameMgr_processLine
475 .LM59:
476 01d6 CF2C mov r12,r15
GAS LISTING /tmp/ccf43P2i.s page 23
 
 
477 01d8 DD24 clr r13
478 01da 3601 movw r6,r12
479 01dc 0894 sec
480 01de 6108 sbc r6,__zero_reg__
481 01e0 7108 sbc r7,__zero_reg__
482 01e2 7091 0000 lds r23,numCurrTrackedObjects
483 01e6 0F2E mov __tmp_reg__,r31
484 01e8 F0E0 ldi r31,lo8(currentLineBuffer)
485 01ea 2F2E mov r2,r31
486 01ec F0E0 ldi r31,hi8(currentLineBuffer)
487 01ee 3F2E mov r3,r31
488 01f0 F02D mov r31,__tmp_reg__
489 01f2 50E0 ldi r21,lo8(0)
490 01f4 40E0 ldi r20,lo8(0)
491 01f6 61E0 ldi r22,lo8(1)
492 01f8 EF2C mov r14,r15
493 01fa E394 inc r14
494 .L35:
495 .stabn 68,0,635,.LM60-FrameMgr_processLine
496 .LM60:
497 01fc F101 movw r30,r2
498 01fe 3081 ld r19,Z
499 .stabn 68,0,636,.LM61-FrameMgr_processLine
500 .LM61:
501 0200 560F add r21,r22
502 .stabn 68,0,637,.LM62-FrameMgr_processLine
503 .LM62:
504 0202 6181 ldd r22,Z+1
505 0204 82E0 ldi r24,lo8(2)
506 0206 90E0 ldi r25,hi8(2)
507 0208 280E add r2,r24
508 020a 391E adc r3,r25
509 .stabn 68,0,638,.LM63-FrameMgr_processLine
510 .LM63:
511 020c 460F add r20,r22
512 .stabn 68,0,643,.LM64-FrameMgr_processLine
513 .LM64:
514 020e 3323 tst r19
515 0210 09F4 brne .+2
516 0212 5CC0 rjmp .L36
517 0214 6430 cpi r22,lo8(4)
518 0216 08F4 brsh .+2
519 0218 59C0 rjmp .L36
520 021a D801 movw r26,r16
521 021c 20E0 ldi r18,lo8(0)
522 .L39:
523 .stabn 68,0,663,.LM65-FrameMgr_processLine
524 .LM65:
525 021e 8C91 ld r24,X
526 0220 3817 cp r19,r24
527 0222 C9F5 brne .L40
528 0224 FD01 movw r30,r26
529 0226 8781 ldd r24,Z+7
530 0228 8130 cpi r24,lo8(1)
531 022a A9F5 brne .L40
532 022c 0F2E mov __tmp_reg__,r31
533 022e F6E0 ldi r31,lo8(6)
GAS LISTING /tmp/ccf43P2i.s page 24
 
 
534 0230 AF2E mov r10,r31
535 0232 BB24 clr r11
536 0234 F02D mov r31,__tmp_reg__
537 0236 AA0E add r10,r26
538 0238 BB1E adc r11,r27
539 023a 8681 ldd r24,Z+6
540 023c 9927 clr r25
541 023e 8615 cp r24,r6
542 0240 9705 cpc r25,r7
543 0242 49F5 brne .L40
544 0244 2D01 movw r4,r26
545 0246 0894 sec
546 0248 411C adc r4,__zero_reg__
547 024a 511C adc r5,__zero_reg__
548 .stabn 68,0,669,.LM66-FrameMgr_processLine
549 .LM66:
550 024c 8181 ldd r24,Z+1
551 024e 8824 clr r8
552 0250 9924 clr r9
553 0252 6894 set
554 0254 81F8 bld r8,1
555 0256 8A0E add r8,r26
556 0258 9B1E adc r9,r27
557 .stabn 68,0,670,.LM67-FrameMgr_processLine
558 .LM67:
559 025a 9281 ldd r25,Z+2
560 .stabn 68,0,679,.LM68-FrameMgr_processLine
561 .LM68:
562 025c 5817 cp r21,r24
563 025e 10F0 brlo .L44
564 0260 9517 cp r25,r21
565 0262 40F4 brsh .L46
566 .L44:
567 0264 4817 cp r20,r24
568 0266 10F0 brlo .L47
569 0268 9417 cp r25,r20
570 026a 20F4 brsh .L46
571 .L47:
572 026c 8517 cp r24,r21
573 026e 98F0 brlo .L40
574 0270 4917 cp r20,r25
575 0272 88F0 brlo .L40
576 .L46:
577 .stabn 68,0,717,.LM69-FrameMgr_processLine
578 .LM69:
579 0274 F201 movw r30,r4
580 0276 5083 st Z,r21
581 .stabn 68,0,718,.LM70-FrameMgr_processLine
582 .LM70:
583 0278 F401 movw r30,r8
584 027a 4083 st Z,r20
585 .stabn 68,0,721,.LM71-FrameMgr_processLine
586 .LM71:
587 027c FD01 movw r30,r26
588 027e 8381 ldd r24,Z+3
589 0280 5817 cp r21,r24
590 0282 08F4 brsh .L50
GAS LISTING /tmp/ccf43P2i.s page 25
 
 
591 .stabn 68,0,727,.LM72-FrameMgr_processLine
592 .LM72:
593 0284 5383 std Z+3,r21
594 .L50:
595 .stabn 68,0,730,.LM73-FrameMgr_processLine
596 .LM73:
597 0286 FD01 movw r30,r26
598 0288 8581 ldd r24,Z+5
599 028a 8417 cp r24,r20
600 028c 08F4 brsh .L52
601 .stabn 68,0,734,.LM74-FrameMgr_processLine
602 .LM74:
603 028e 4583 std Z+5,r20
604 .L52:
605 .stabn 68,0,738,.LM75-FrameMgr_processLine
606 .LM75:
607 0290 F501 movw r30,r10
608 0292 F082 st Z,r15
609 0294 1BC0 rjmp .L36
610 .L40:
611 .stabn 68,0,661,.LM76-FrameMgr_processLine
612 .LM76:
613 0296 2F5F subi r18,lo8(-(1))
614 0298 2830 cpi r18,lo8(8)
615 029a 09F4 brne .+2
616 029c 4DC0 rjmp .L54
617 .stabn 68,0,749,.LM77-FrameMgr_processLine
618 .LM77:
619 029e 1896 adiw r26,8
620 02a0 BECF rjmp .L39
621 .L56:
622 02a2 D801 movw r26,r16
623 02a4 90E0 ldi r25,lo8(0)
624 .L57:
625 .stabn 68,0,764,.LM78-FrameMgr_processLine
626 .LM78:
627 02a6 FD01 movw r30,r26
628 02a8 8781 ldd r24,Z+7
629 02aa 8823 tst r24
630 02ac 21F0 breq .L58
631 .stabn 68,0,768,.LM79-FrameMgr_processLine
632 .LM79:
633 02ae 1896 adiw r26,8
634 .stabn 68,0,762,.LM80-FrameMgr_processLine
635 .LM80:
636 02b0 9F5F subi r25,lo8(-(1))
637 02b2 9830 cpi r25,lo8(8)
638 02b4 C1F7 brne .L57
639 .L58:
640 .stabn 68,0,774,.LM81-FrameMgr_processLine
641 .LM81:
642 02b6 3C93 st X,r19
643 .stabn 68,0,775,.LM82-FrameMgr_processLine
644 .LM82:
645 02b8 FD01 movw r30,r26
646 02ba 5183 std Z+1,r21
647 .stabn 68,0,776,.LM83-FrameMgr_processLine
GAS LISTING /tmp/ccf43P2i.s page 26
 
 
648 .LM83:
649 02bc 4283 std Z+2,r20
650 .stabn 68,0,777,.LM84-FrameMgr_processLine
651 .LM84:
652 02be 5383 std Z+3,r21
653 .stabn 68,0,778,.LM85-FrameMgr_processLine
654 .LM85:
655 02c0 F482 std Z+4,r15
779:FrameMgr.c **** *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish; /* x_lowerRight */
656 .stabn 68,0,779,.LM86-FrameMgr_processLine
657 .LM86:
658 02c2 4583 std Z+5,r20
780:FrameMgr.c **** *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount; /* y_lowerRight */
659 .stabn 68,0,780,.LM87-FrameMgr_processLine
660 .LM87:
661 02c4 F682 std Z+6,r15
781:FrameMgr.c **** *(pTrackedObjectData + VALID_OBJECT_OFFSET) = TRUE; /* o
662 .stabn 68,0,781,.LM88-FrameMgr_processLine
663 .LM88:
664 02c6 81E0 ldi r24,lo8(1)
665 02c8 8783 std Z+7,r24
782:FrameMgr.c ****
783:FrameMgr.c **** numCurrTrackedObjects++;
666 .stabn 68,0,783,.LM89-FrameMgr_processLine
667 .LM89:
668 02ca 7F5F subi r23,lo8(-(1))
669 .L36:
784:FrameMgr.c **** }
785:FrameMgr.c **** }
786:FrameMgr.c ****
787:FrameMgr.c **** /* move the pointer to the beginning of the next tracked object */
788:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
789:FrameMgr.c **** }
790:FrameMgr.c **** } while(currPixelRunFinish < ACTUAL_NUM_PIXELS_IN_A_LINE);
670 .stabn 68,0,790,.LM90-FrameMgr_processLine
671 .LM90:
672 02cc 403B cpi r20,lo8(-80)
673 02ce 08F4 brsh .+2
674 02d0 95CF rjmp .L35
675 02d2 7093 0000 sts numCurrTrackedObjects,r23
676 .LBE5:
677 .LBE4:
678 .stabn 68,0,460,.LM91-FrameMgr_processLine
679 .LM91:
680 02d6 C601 movw r24,r12
681 02d8 8770 andi r24,lo8(7)
682 02da 9070 andi r25,hi8(7)
683 02dc 0797 sbiw r24,7
684 02de 01F5 brne .L61
685 02e0 D801 movw r26,r16
686 02e2 1796 adiw r26,7
687 02e4 40E0 ldi r20,lo8(0)
688 .L63:
689 .stabn 68,0,464,.LM92-FrameMgr_processLine
690 .LM92:
691 02e6 8C91 ld r24,X
692 02e8 8130 cpi r24,lo8(1)
GAS LISTING /tmp/ccf43P2i.s page 27
 
 
693 02ea A1F4 brne .L64
694 02ec FD01 movw r30,r26
695 02ee 3197 sbiw r30,1
696 .stabn 68,0,468,.LM93-FrameMgr_processLine
697 .LM93:
698 02f0 9081 ld r25,Z
699 02f2 FD01 movw r30,r26
700 02f4 3397 sbiw r30,3
701 02f6 8081 ld r24,Z
702 02f8 292F mov r18,r25
703 02fa 3327 clr r19
704 02fc F901 movw r30,r18
705 02fe E81B sub r30,r24
706 0300 F109 sbc r31,__zero_reg__
707 0302 3397 sbiw r30,3
708 0304 3CF4 brge .L64
709 .stabn 68,0,474,.LM94-FrameMgr_processLine
710 .LM94:
711 0306 C601 movw r24,r12
712 0308 821B sub r24,r18
713 030a 930B sbc r25,r19
714 030c 0397 sbiw r24,3
715 030e 14F0 brlt .L64
716 .stabn 68,0,477,.LM95-FrameMgr_processLine
717 .LM95:
718 0310 1C92 st X,__zero_reg__
719 .stabn 68,0,478,.LM96-FrameMgr_processLine
720 .LM96:
721 0312 7150 subi r23,lo8(-(-1))
722 .L64:
723 .stabn 68,0,462,.LM97-FrameMgr_processLine
724 .LM97:
725 0314 4F5F subi r20,lo8(-(1))
726 0316 1896 adiw r26,8
727 0318 4830 cpi r20,lo8(8)
728 031a 29F7 brne .L63
729 031c 7093 0000 sts numCurrTrackedObjects,r23
730 .L61:
731 .stabn 68,0,486,.LM98-FrameMgr_processLine
732 .LM98:
733 0320 E092 0000 sts trackedLineCount,r14
734 .stabn 68,0,487,.LM99-FrameMgr_processLine
735 .LM99:
736 0324 F0E9 ldi r31,lo8(-112)
737 0326 EF16 cp r14,r31
738 0328 09F4 brne .+2
739 032a 48CF rjmp .L72
740 .stabn 68,0,498,.LM100-FrameMgr_processLine
741 .LM100:
742 032c 8091 0000 lds r24,fastEventBitmask
743 0330 8260 ori r24,lo8(2)
744 0332 8093 0000 sts fastEventBitmask,r24
745 0336 04C0 rjmp .L71
746 .L54:
747 .LBB6:
748 .LBB7:
749 .stabn 68,0,757,.LM101-FrameMgr_processLine
GAS LISTING /tmp/ccf43P2i.s page 28
 
 
750 .LM101:
751 0338 7830 cpi r23,lo8(8)
752 033a 08F4 brsh .+2
753 033c B2CF rjmp .L56
754 033e C6CF rjmp .L36
755 .L71:
756 .LBE7:
757 .LBE6:
758 /* epilogue: frame size=1 */
759 0340 2196 adiw r28,1
760 0342 0FB6 in __tmp_reg__,__SREG__
761 0344 F894 cli
762 0346 DEBF out __SP_H__,r29
763 0348 0FBE out __SREG__,__tmp_reg__
764 034a CDBF out __SP_L__,r28
765 034c DF91 pop r29
766 034e CF91 pop r28
767 0350 1F91 pop r17
768 0352 0F91 pop r16
769 0354 FF90 pop r15
770 0356 EF90 pop r14
771 0358 DF90 pop r13
772 035a CF90 pop r12
773 035c BF90 pop r11
774 035e AF90 pop r10
775 0360 9F90 pop r9
776 0362 8F90 pop r8
777 0364 7F90 pop r7
778 0366 6F90 pop r6
779 0368 5F90 pop r5
780 036a 4F90 pop r4
781 036c 3F90 pop r3
782 036e 2F90 pop r2
783 0370 0895 ret
784 /* epilogue end (size=25) */
785 /* function FrameMgr_processLine size 355 (304) */
786 .size FrameMgr_processLine, .-FrameMgr_processLine
787 .stabs "i:r(0,11)",64,0,343,20
788 .stabs "dataToSend:(0,23)=B(0,11)",128,0,344,1
789 .stabs "pTrackedObjectData:r(0,22)",64,0,345,26
790 .stabn 192,0,0,FrameMgr_processLine-FrameMgr_processLine
791 .stabn 224,0,0,.Lscope1-FrameMgr_processLine
792 .Lscope1:
793 .stabs "",36,0,0,.Lscope1-FrameMgr_processLine
794 .stabd 78,0,0
795 .stabs "FrameMgr_init:F(0,15)",36,0,191,FrameMgr_init
796 .global FrameMgr_init
797 .type FrameMgr_init, @function
798 FrameMgr_init:
799 .stabd 46,0,0
800 .stabn 68,0,191,.LM102-FrameMgr_init
801 .LM102:
802 /* prologue: frame size=0 */
803 /* prologue end (size=0) */
804 .stabn 68,0,192,.LM103-FrameMgr_init
805 .LM103:
806 0372 80E4 ldi r24,lo8(64)
GAS LISTING /tmp/ccf43P2i.s page 29
 
 
807 0374 E0E0 ldi r30,lo8(trackedObjectTable)
808 0376 F0E0 ldi r31,hi8(trackedObjectTable)
809 0378 1192 st Z+,__zero_reg__
810 037a 8A95 dec r24
811 037c E9F7 brne .-6
812 /* epilogue: frame size=0 */
813 037e 0895 ret
814 /* epilogue end (size=1) */
815 /* function FrameMgr_init size 7 (6) */
816 .size FrameMgr_init, .-FrameMgr_init
817 .Lscope2:
818 .stabs "",36,0,0,.Lscope2-FrameMgr_init
819 .stabd 78,0,0
820 .stabs "FrameMgr_acquireLine:F(0,15)",36,0,287,FrameMgr_acquireLine
821 .global FrameMgr_acquireLine
822 .type FrameMgr_acquireLine, @function
823 FrameMgr_acquireLine:
824 .stabd 46,0,0
825 .stabn 68,0,287,.LM104-FrameMgr_acquireLine
826 .LM104:
827 /* prologue: frame size=0 */
828 /* prologue end (size=0) */
829 .stabn 68,0,297,.LM105-FrameMgr_acquireLine
830 .LM105:
831 0380 8091 0000 lds r24,currentState
832 0384 8230 cpi r24,lo8(2)
833 0386 49F5 brne .L83
834 .stabn 68,0,299,.LM106-FrameMgr_acquireLine
835 .LM106:
836 0388 8091 0000 lds r24,lineCount
837 038c 282F mov r18,r24
838 038e 220F lsl r18
839 .stabn 68,0,305,.LM107-FrameMgr_acquireLine
840 .LM107:
841 0390 80EB ldi r24,lo8(-80)
842 0392 E0E0 ldi r30,lo8(currentLineBuffer)
843 0394 F0E0 ldi r31,hi8(currentLineBuffer)
844 0396 982F mov r25,r24
845 0398 1192 st Z+,__zero_reg__
846 039a 9A95 dec r25
847 039c E9F7 brne .-6
848 .stabn 68,0,306,.LM108-FrameMgr_acquireLine
849 .LM108:
850 039e E0E0 ldi r30,lo8(previousLineBuffer)
851 03a0 F0E0 ldi r31,hi8(previousLineBuffer)
852 03a2 1192 st Z+,__zero_reg__
853 03a4 8A95 dec r24
854 03a6 E9F7 brne .-6
855 .L85:
856 .stabn 68,0,309,.LM109-FrameMgr_acquireLine
857 .LM109:
858 03a8 829B sbis 48-0x20,2
859 03aa FECF rjmp .L85
860 .L101:
861 .stabn 68,0,310,.LM110-FrameMgr_acquireLine
862 .LM110:
863 03ac 829B sbis 48-0x20,2
GAS LISTING /tmp/ccf43P2i.s page 30
 
 
864 03ae 07C0 rjmp .L110
865 03b0 FDCF rjmp .L101
866 .L88:
867 03b2 90E0 ldi r25,lo8(0)
868 .L114:
869 .stabn 68,0,316,.LM111-FrameMgr_acquireLine
870 .LM111:
871 03b4 849B sbis 48-0x20,4
872 03b6 FECF rjmp .L114
873 .L102:
874 .stabn 68,0,318,.LM112-FrameMgr_acquireLine
875 .LM112:
876 03b8 849B sbis 48-0x20,4
877 03ba 04C0 rjmp .L111
878 03bc FDCF rjmp .L102
879 .L110:
880 .stabn 68,0,314,.LM113-FrameMgr_acquireLine
881 .LM113:
882 03be 2223 tst r18
883 03c0 C1F7 brne .L88
884 03c2 05C0 rjmp .L92
885 .L111:
886 03c4 9150 subi r25,lo8(-(-1))
887 03c6 822F mov r24,r18
888 03c8 8195 neg r24
889 03ca 9817 cp r25,r24
890 03cc 99F7 brne .L114
891 .L92:
892 .stabn 68,0,322,.LM114-FrameMgr_acquireLine
893 .LM114:
894 03ce 60E0 ldi r22,lo8(previousLineBuffer)
895 03d0 70E0 ldi r23,hi8(previousLineBuffer)
896 03d2 80E0 ldi r24,lo8(currentLineBuffer)
897 03d4 90E0 ldi r25,hi8(currentLineBuffer)
898 03d6 00D0 rcall CamIntAsm_acquireDumpLine
899 03d8 0895 ret
900 .L83:
901 .stabn 68,0,324,.LM115-FrameMgr_acquireLine
902 .LM115:
903 03da 8130 cpi r24,lo8(1)
904 03dc 39F4 brne .L96
905 .L103:
906 .stabn 68,0,326,.LM116-FrameMgr_acquireLine
907 .LM116:
908 03de 8499 sbic 48-0x20,4
909 03e0 FECF rjmp .L103
910 .stabn 68,0,327,.LM117-FrameMgr_acquireLine
911 .LM117:
912 03e2 60E0 ldi r22,lo8(colorMap)
913 03e4 70E0 ldi r23,hi8(colorMap)
914 03e6 80E0 ldi r24,lo8(currentLineBuffer)
915 03e8 90E0 ldi r25,hi8(currentLineBuffer)
916 03ea 00D0 rcall CamIntAsm_acquireTrackingLine
917 .L96:
918 03ec 0895 ret
919 /* epilogue: frame size=0 */
920 /* epilogue: noreturn */
GAS LISTING /tmp/ccf43P2i.s page 31
 
 
921 /* epilogue end (size=0) */
922 /* function FrameMgr_acquireLine size 55 (55) */
923 .size FrameMgr_acquireLine, .-FrameMgr_acquireLine
924 .stabs "tmpLineCount:r(0,11)",64,0,288,18
925 .stabn 192,0,0,FrameMgr_acquireLine-FrameMgr_acquireLine
926 .stabn 224,0,0,.Lscope3-FrameMgr_acquireLine
927 .Lscope3:
928 .stabs "",36,0,0,.Lscope3-FrameMgr_acquireLine
929 .stabd 78,0,0
930 .stabs "FrameMgr_acquireFrame:F(0,15)",36,0,261,FrameMgr_acquireFrame
931 .global FrameMgr_acquireFrame
932 .type FrameMgr_acquireFrame, @function
933 FrameMgr_acquireFrame:
934 .stabd 46,0,0
935 .stabn 68,0,261,.LM118-FrameMgr_acquireFrame
936 .LM118:
937 /* prologue: frame size=0 */
938 /* prologue end (size=0) */
939 .stabn 68,0,262,.LM119-FrameMgr_acquireFrame
940 .LM119:
941 03ee 8091 0000 lds r24,currentState
942 03f2 8130 cpi r24,lo8(1)
943 03f4 A9F4 brne .L120
944 .stabn 68,0,264,.LM120-FrameMgr_acquireFrame
945 .LM120:
946 03f6 1092 0000 sts trackedLineCount,__zero_reg__
947 .stabn 68,0,265,.LM121-FrameMgr_acquireFrame
948 .LM121:
949 03fa 8091 0000 lds r24,numCurrTrackedObjects
950 03fe 8093 0000 sts numPrevTrackedObjects,r24
951 .stabn 68,0,266,.LM122-FrameMgr_acquireFrame
952 .LM122:
953 0402 1092 0000 sts numCurrTrackedObjects,__zero_reg__
954 .stabn 68,0,270,.LM123-FrameMgr_acquireFrame
955 .LM123:
956 0406 80E4 ldi r24,lo8(64)
957 0408 E0E0 ldi r30,lo8(trackedObjectTable)
958 040a F0E0 ldi r31,hi8(trackedObjectTable)
959 040c 1192 st Z+,__zero_reg__
960 040e 8A95 dec r24
961 0410 E9F7 brne .-6
962 .L118:
963 .stabn 68,0,272,.LM124-FrameMgr_acquireFrame
964 .LM124:
965 0412 829B sbis 48-0x20,2
966 0414 FECF rjmp .L118
967 .stabn 68,0,273,.LM125-FrameMgr_acquireFrame
968 .LM125:
969 0416 60E0 ldi r22,lo8(colorMap)
970 0418 70E0 ldi r23,hi8(colorMap)
971 041a 80E0 ldi r24,lo8(currentLineBuffer)
972 041c 90E0 ldi r25,hi8(currentLineBuffer)
973 041e 00D0 rcall CamIntAsm_acquireTrackingLine
974 .L120:
975 0420 0895 ret
976 /* epilogue: frame size=0 */
977 /* epilogue: noreturn */
GAS LISTING /tmp/ccf43P2i.s page 32
 
 
978 /* epilogue end (size=0) */
979 /* function FrameMgr_acquireFrame size 26 (26) */
980 .size FrameMgr_acquireFrame, .-FrameMgr_acquireFrame
981 .Lscope4:
982 .stabs "",36,0,0,.Lscope4-FrameMgr_acquireFrame
983 .stabd 78,0,0
984 .stabs "FrameMgr_dispatchEvent:F(0,15)",36,0,205,FrameMgr_dispatchEvent
985 .stabs "event:P(0,11)",64,0,204,24
986 .global FrameMgr_dispatchEvent
987 .type FrameMgr_dispatchEvent, @function
988 FrameMgr_dispatchEvent:
989 .stabd 46,0,0
990 .stabn 68,0,205,.LM126-FrameMgr_dispatchEvent
991 .LM126:
992 /* prologue: frame size=0 */
993 /* prologue end (size=0) */
994 .stabn 68,0,206,.LM127-FrameMgr_dispatchEvent
995 .LM127:
996 0422 8430 cpi r24,lo8(4)
997 0424 19F1 breq .L127
998 .stabn 68,0,206,.LM128-FrameMgr_dispatchEvent
999 .LM128:
1000 0426 8530 cpi r24,lo8(5)
1001 0428 28F4 brsh .L131
1002 042a 8130 cpi r24,lo8(1)
1003 042c 09F1 breq .L125
1004 042e 8230 cpi r24,lo8(2)
1005 0430 41F5 brne .L133
1006 0432 07C0 rjmp .L126
1007 .L131:
1008 0434 8038 cpi r24,lo8(-128)
1009 0436 99F0 breq .L129
1010 0438 8138 cpi r24,lo8(-127)
1011 043a 09F1 breq .L130
1012 043c 8032 cpi r24,lo8(32)
1013 043e 09F5 brne .L133
1014 0440 13C0 rjmp .L128
1015 .L126:
1016 .stabn 68,0,211,.LM129-FrameMgr_dispatchEvent
1017 .LM129:
1018 0442 61E0 ldi r22,lo8(1)
1019 0444 81E1 ldi r24,lo8(17)
1020 0446 00D0 rcall CamConfig_setCamReg
1021 .stabn 68,0,212,.LM130-FrameMgr_dispatchEvent
1022 .LM130:
1023 0448 00D0 rcall CamConfig_sendFifoCmds
1024 .stabn 68,0,213,.LM131-FrameMgr_dispatchEvent
1025 .LM131:
1026 044a 88EE ldi r24,lo8(1000)
1027 044c 93E0 ldi r25,hi8(1000)
1028 044e 00D0 rcall Utility_delay
1029 .stabn 68,0,214,.LM132-FrameMgr_dispatchEvent
1030 .LM132:
1031 0450 1092 0000 sts lineCount,__zero_reg__
1032 .stabn 68,0,215,.LM133-FrameMgr_dispatchEvent
1033 .LM133:
1034 0454 82E0 ldi r24,lo8(2)
GAS LISTING /tmp/ccf43P2i.s page 33
 
 
1035 0456 8093 0000 sts currentState,r24
1036 .stabn 68,0,217,.LM134-FrameMgr_dispatchEvent
1037 .LM134:
1038 045a 92DF rcall FrameMgr_acquireLine
1039 045c 0895 ret
1040 .L129:
1041 .stabn 68,0,221,.LM135-FrameMgr_dispatchEvent
1042 .LM135:
1043 045e 81E0 ldi r24,lo8(1)
1044 0460 8093 0000 sts currentState,r24
1045 .stabn 68,0,222,.LM136-FrameMgr_dispatchEvent
1046 .LM136:
1047 0464 C4DF rcall FrameMgr_acquireFrame
1048 0466 0895 ret
1049 .L128:
1050 .stabn 68,0,226,.LM137-FrameMgr_dispatchEvent
1051 .LM137:
1052 0468 CBDD rcall FrameMgr_processFrame
1053 046a 0895 ret
1054 .L127:
1055 .stabn 68,0,230,.LM138-FrameMgr_dispatchEvent
1056 .LM138:
1057 046c C0DF rcall FrameMgr_acquireFrame
1058 046e 0895 ret
1059 .L125:
1060 .stabn 68,0,234,.LM139-FrameMgr_dispatchEvent
1061 .LM139:
1062 0470 8091 0000 lds r24,currentState
1063 0474 8823 tst r24
1064 0476 29F0 breq .L133
1065 .stabn 68,0,240,.LM140-FrameMgr_dispatchEvent
1066 .LM140:
1067 0478 84E0 ldi r24,lo8(4)
1068 047a 00D0 rcall Exec_writeEventFifo
1069 047c 0895 ret
1070 .L130:
1071 .stabn 68,0,246,.LM141-FrameMgr_dispatchEvent
1072 .LM141:
1073 047e 1092 0000 sts currentState,__zero_reg__
1074 .L133:
1075 0482 0895 ret
1076 /* epilogue: frame size=0 */
1077 /* epilogue: noreturn */
1078 /* epilogue end (size=0) */
1079 /* function FrameMgr_dispatchEvent size 49 (49) */
1080 .size FrameMgr_dispatchEvent, .-FrameMgr_dispatchEvent
1081 .Lscope5:
1082 .stabs "",36,0,0,.Lscope5-FrameMgr_dispatchEvent
1083 .stabd 78,0,0
1084 .data
1085 .type pCurrentTrackedObjectTable, @object
1086 .size pCurrentTrackedObjectTable, 2
1087 pCurrentTrackedObjectTable:
1088 0000 0000 .word trackedObjectTable
1089 .lcomm numCurrTrackedObjects,1
1090 .lcomm currentState,1
1091 .lcomm lineCount,1
GAS LISTING /tmp/ccf43P2i.s page 34
 
 
1092 .lcomm trackedLineCount,1
1093 .lcomm numPrevTrackedObjects,1
1094 .lcomm trackedObjectTable,64
1095 .stabs "trackedObjectTable:S(0,24)=ar(0,25)=r(0,25);0;0177777;;0;7;(0,20)",40,0,162,trackedObjectT
1096 .stabs "pCurrentTrackedObjectTable:S(0,26)=*(0,20)",38,0,163,pCurrentTrackedObjectTable
1097 .stabs "lineCount:S(0,11)",38,0,164,lineCount
1098 .stabs "currentState:S(0,17)",38,0,165,currentState
1099 .stabs "numCurrTrackedObjects:S(0,11)",38,0,166,numCurrTrackedObjects
1100 .stabs "numPrevTrackedObjects:S(0,11)",38,0,167,numPrevTrackedObjects
1101 .stabs "trackedLineCount:S(0,11)",38,0,168,trackedLineCount
1102 .text
1103 .stabs "",100,0,0,.Letext0
1104 .Letext0:
1105 /* File "FrameMgr.c": code 580 = 0x0244 ( 513), prologues 33, epilogues 34 */
GAS LISTING /tmp/ccf43P2i.s page 35
 
 
DEFINED SYMBOLS
*ABS*:00000000 FrameMgr.c
/tmp/ccf43P2i.s:3 *ABS*:0000003f __SREG__
/tmp/ccf43P2i.s:4 *ABS*:0000003e __SP_H__
/tmp/ccf43P2i.s:5 *ABS*:0000003d __SP_L__
/tmp/ccf43P2i.s:6 *ABS*:00000000 __tmp_reg__
/tmp/ccf43P2i.s:7 *ABS*:00000001 __zero_reg__
/tmp/ccf43P2i.s:91 .text:00000000 FrameMgr_processFrame
/tmp/ccf43P2i.s:1087 .data:00000000 pCurrentTrackedObjectTable
.bss:00000000 numCurrTrackedObjects
/tmp/ccf43P2i.s:270 .text:000000b2 FrameMgr_processLine
/tmp/ccf43P2i.s:1089 .bss:00000001 currentState
/tmp/ccf43P2i.s:1090 .bss:00000002 lineCount
/tmp/ccf43P2i.s:1091 .bss:00000003 trackedLineCount
/tmp/ccf43P2i.s:798 .text:00000372 FrameMgr_init
/tmp/ccf43P2i.s:1093 .bss:00000005 trackedObjectTable
/tmp/ccf43P2i.s:823 .text:00000380 FrameMgr_acquireLine
/tmp/ccf43P2i.s:933 .text:000003ee FrameMgr_acquireFrame
/tmp/ccf43P2i.s:1092 .bss:00000004 numPrevTrackedObjects
/tmp/ccf43P2i.s:988 .text:00000422 FrameMgr_dispatchEvent
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
UIMgr_writeTxFifo
Exec_writeEventFifo
UartInt_txByte
currentLineBuffer
previousLineBuffer
CamConfig_setCamReg
CamConfig_sendFifoCmds
fastEventBitmask
CamIntAsm_acquireDumpLine
colorMap
CamIntAsm_acquireTrackingLine
Utility_delay
/programy/Atmel_C/AVRcam/I2CInterface.c
0,0 → 1,294
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: I2CInterface.c
Module Date: 4/10/2004
Module Auth: John Orlando
Description: This module is responsible for providing a
low-level interface to the I2C hardware resident on the
mega8 processor (also known as the Two-Wire Interface,
or TWI). The interface is needed to configure the
needed registers in the OV6620 camera. This interface
is interrupt-driven based on the events that should
occur upon successful writing of an I2C register.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
 
***********************************************************/
 
/* Includes */
#include <avr/io.h>
#include <avr/twi.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include "CamConfig.h"
#include "CommonDefs.h"
 
/* Local Variables */
 
/* These variables are used as storage space for the current
I2C command being sent over the interface. They need to
be volatile since they are dealt with an the TWI ISR */
volatile static unsigned char twi_address;
volatile static unsigned char *twi_data;
volatile static unsigned char twi_ddr;
volatile static unsigned char twi_bytes;
volatile static unsigned char status;
volatile static unsigned char retry_cnt;
 
/* Local Structures and Typedefs */
 
/* Extern Variables */
 
/* Definitions */
/* Bit definitions for the tw_status register */
#define MAX_TWI_RETRIES 2
#define BUSY 7
 
/***********************************************************
Function Name: I2CInt_init
Function Description: This function is responsible
for setting up the registers needed for the TWI
interface
Inputs: none
Outputs: none
***********************************************************/
void I2CInt_init(void)
{
TWSR = 0;
/* init the speed of the I2C interface, running at
100 Kbps */
TWBR = (FOSC / I2C_SPEED - 16)/2;
}
 
/***********************************************************
Function Name: I2CInt_writeData
Function Description: This function is responsible for
initiating the process of writing a sequence of bytes
an I2C slave address. This function will try to write
the data three times before giving up.
Inputs: address: the address of the I2C slave device
data: a pointer to the data to be written
to the slave...for camera interfacing,
the data follows a <register #><data>
format
bytes: the number of bytes to write
Outputs: none
***********************************************************/
void I2CInt_writeData(unsigned char address, unsigned char *data, unsigned char bytes)
{
while(status & (1<<BUSY)); /* Bus is busy wait (or exit with error code) */
while(TWCR & (1<<TWSTO));
/* copy the needed data and state info to our local I2C command structure */
twi_address = address;
twi_data = data;
twi_bytes = bytes;
twi_ddr = TW_WRITE;
 
retry_cnt = 0;
/* Generate start condition, the remainder of the transfer is interrupt driven and
will be performed in the background */
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
status |= (1<<BUSY);
}
 
/***********************************************************
Function Name: I2CInt_readData
Function Description: This funcion is responsible for
reading the specified number of bytes from a slave
device.
Inputs: address: the slave address to read from
data: a pointer to where the data will be stored
bytes: the number of bytes to read
Outputs: none
***********************************************************/
void I2CInt_readData(unsigned char address, unsigned char *data, unsigned char bytes)
{
/* Bus is busy wait (or exit with error code) */
while(status & (1<<BUSY));
 
twi_address = address;
twi_data = data;
twi_bytes = bytes;
twi_ddr = TW_READ;
 
retry_cnt = 0;
/* Generate start condition, the remainder of the transfer is interrupt driven and
will be performed in the background */
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
status |= (1<<BUSY);
}
 
/***********************************************************
Function Name: I2CInt_isI2cBusy
Function Description: This funcion is responsible for
indicating if the I2C bus is currently busy to external
modules.
device.
Inputs: none
Outputs: bool_t - indicating if bus is busy
***********************************************************/
bool_t I2CInt_isI2cBusy(void)
{
bool_t retVal = FALSE;
if ( (status & (1<<BUSY)) != 0)
{
retVal = TRUE;
}
return(retVal);
}
 
/***********************************************************
Function Name: <interrupt handler for I2C>
Function Description: This function is responsible for
implementing the control logic needed to perform a
read or write operation with an I2C slave.
Inputs: none
Outputs: none
***********************************************************/
SIGNAL(SIG_2WIRE_SERIAL)
{
unsigned char TWI_status = TWSR & TW_STATUS_MASK; /* grab just the status bits */
/* the entire I2C handler is state-based...determine
what needs to be done based on TWI_status */
switch(TWI_status)
{
case TW_START: /* Start condition */
case TW_REP_START: /* Repeated start condition */
if(retry_cnt > MAX_TWI_RETRIES)
{
/* generate stop condition if we've reached our retry limit */
TWCR |= (1<<TWINT)|(1<<TWSTO);
status &= ~(1<<BUSY);
return;
}
/* indicate read or write */
TWDR = (twi_address<<1) + twi_ddr;
/* TWSTA must be cleared...also clears TWINT */
TWCR &= ~(1<<TWSTA);
break;
 
case TW_MT_SLA_ACK: /* Slave acknowledged address, */
retry_cnt = 0;
/* tx the data, and increment the data pointer */
TWDR = *twi_data;
twi_data++;
 
/* clear the int to continue */
TWCR |= (1<<TWINT);
break;
 
case TW_MT_SLA_NACK: /* Slave didn't acknowledge address, */
case TW_MR_SLA_NACK:
retry_cnt++;
 
/* retry...*/
TWCR |= (1<<TWINT)|(1<<TWSTA)|(1<<TWSTO);
break;
 
case TW_MT_DATA_ACK: /* Slave Acknowledged data, */
if(--twi_bytes > 0)
{
/* more data to send, so send it */
TWDR = *twi_data;
twi_data++;
TWCR |= (1<<TWINT);
}
else
{
/* generate the stop condition if needed */
TWCR |= (1<<TWSTO)|(1<<TWINT);
status &= ~(1<<BUSY);
}
break;
 
case TW_MT_DATA_NACK: /* Slave didn't acknowledge data */
/* send the stop condition */
TWCR |= (1<<TWINT)|(1<<TWSTO);
status &= ~(1<<BUSY);
break;
 
case TW_MR_SLA_ACK: /* Slave acknowledged address */
if(--twi_bytes > 0)
{
/* if there is more than one byte to read, acknowledge */
TWCR |= (1<<TWEA)|(1<<TWINT);
}
else
{
/* no acknowledge */
TWCR |= (1<<TWINT);
}
break;
 
case TW_MR_DATA_ACK: /* Master acknowledged data */
/* grab the received data */
*twi_data = TWDR;
twi_data++;
if(--twi_bytes > 0)
{
/* get the next data byte and ack */
TWCR |= (1<<TWEA)|(1<<TWINT);
}
else
{
/* clear out the enable acknowledge bit */
TWCR &= ~(1<<TWEA);
}
break;
 
case TW_MR_DATA_NACK: /* Master didn't acknowledge data -> end of read process */
/* read data, and generate the stop condition */
*twi_data = TWDR;
TWCR |= (1<<TWSTO)|(1<<TWINT);
status &= ~(1<<BUSY);
break;
}
}
 
 
 
 
 
 
 
 
 
/programy/Atmel_C/AVRcam/I2CInterface.d
0,0 → 1,0
I2CInterface.o I2CInterface.d : I2CInterface.c CamConfig.h I2CInterface.h CommonDefs.h
/programy/Atmel_C/AVRcam/I2CInterface.h
0,0 → 1,70
#ifndef I2CINTERFACE_H
#define I2CINTERFACE_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: I2CInterface.h
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module provides the external interface
to the I2C hardware available on the mega8. It also
contains defines and declarations for how the I2C
interface will be used in this system.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
#include "CommonDefs.h"
/* Structures and Typedefs */
typedef struct
{
unsigned char configReg;
unsigned char data;
} i2cCmd_t;
/* Defines */
/* The I2C interface will run at 100 KHz (the OV6620 can
support up to 400 KHz, but this hasn't been tested) */
#define I2C_SPEED 100000
 
 
/* External Function Prototypes */
extern void I2CInt_init(void);
extern void I2CInt_writeData(unsigned char address, unsigned char *data, unsigned char bytes);
extern void I2CInt_readData(unsigned char address, unsigned char *data, unsigned char bytes);
extern bool_t I2CInt_isI2cBusy(void);
 
 
 
#endif
 
/programy/Atmel_C/AVRcam/Main.c
0,0 → 1,95
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: Main.c
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module is responsible for providing
the entry point to the code through the "main" function.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
/* Includes */
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include "UIMgr.h"
#include "UartInterface.h"
#include "I2CInterface.h"
#include "CamInterface.h"
#include "DebugInterface.h"
#include "FrameMgr.h"
#include "CommonDefs.h"
#include "CamConfig.h"
#include "Executive.h"
#include "Utility.h"
 
/* Local Structures and Typedefs */
 
/* Extern Variables */
 
/* Definitions */
 
/***********************************************************
Function Name: main
Function Description: This function provides the entry
point into AVRcam application.
Inputs: none
Outputs: int
***********************************************************/
int main(void)
{
/* initialize all of the interface modules */
DebugInt_init();
UartInt_init();
I2CInt_init();
CamInt_init();
/* initialize the remaining modules that will process
data...interrupts need to be on for these */
ENABLE_INTS();
CamConfig_init();
UIMgr_init();
FrameMgr_init();
/* provide a short delay for the camera to stabilize before
we let the executive start up */
Utility_delay(1000);
/* the rest of the application will be under the
control of the Executive. */
Exec_run();
/* this should never be reached */
return(0);
}
 
/programy/Atmel_C/AVRcam/Main.d
0,0 → 1,3
Main.o Main.d : Main.c UIMgr.h UartInterface.h I2CInterface.h CommonDefs.h \
CamInterface.h DebugInterface.h FrameMgr.h CamConfig.h Executive.h \
Events.h Utility.h
/programy/Atmel_C/AVRcam/Main.lst
0,0 → 1,279
GAS LISTING /tmp/ccSepUfa.s page 1
 
 
1 .file "Main.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/roboti/istrobot/2007/ATmega8/AVRcam/",100,0,2,.Ltext0
11 .stabs "Main.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
32 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
33 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
34 .stabs "int8_t:t(4,1)=(0,10)",128,0,116,0
35 .stabs "uint8_t:t(4,2)=(0,11)",128,0,117,0
36 .stabs "int16_t:t(4,3)=(0,1)",128,0,118,0
37 .stabs "uint16_t:t(4,4)=(0,4)",128,0,119,0
38 .stabs "int32_t:t(4,5)=(0,3)",128,0,120,0
39 .stabs "uint32_t:t(4,6)=(0,5)",128,0,121,0
40 .stabs "int64_t:t(4,7)=(0,6)",128,0,122,0
41 .stabs "uint64_t:t(4,8)=(0,7)",128,0,123,0
42 .stabs "intptr_t:t(4,9)=(4,3)",128,0,135,0
43 .stabs "uintptr_t:t(4,10)=(4,4)",128,0,140,0
44 .stabs "int_least8_t:t(4,11)=(4,1)",128,0,152,0
45 .stabs "uint_least8_t:t(4,12)=(4,2)",128,0,157,0
46 .stabs "int_least16_t:t(4,13)=(4,3)",128,0,162,0
47 .stabs "uint_least16_t:t(4,14)=(4,4)",128,0,167,0
48 .stabs "int_least32_t:t(4,15)=(4,5)",128,0,172,0
49 .stabs "uint_least32_t:t(4,16)=(4,6)",128,0,177,0
50 .stabs "int_least64_t:t(4,17)=(4,7)",128,0,182,0
51 .stabs "uint_least64_t:t(4,18)=(4,8)",128,0,187,0
52 .stabs "int_fast8_t:t(4,19)=(4,1)",128,0,200,0
53 .stabs "uint_fast8_t:t(4,20)=(4,2)",128,0,205,0
54 .stabs "int_fast16_t:t(4,21)=(4,3)",128,0,210,0
55 .stabs "uint_fast16_t:t(4,22)=(4,4)",128,0,215,0
56 .stabs "int_fast32_t:t(4,23)=(4,5)",128,0,220,0
57 .stabs "uint_fast32_t:t(4,24)=(4,6)",128,0,225,0
GAS LISTING /tmp/ccSepUfa.s page 2
 
 
58 .stabs "int_fast64_t:t(4,25)=(4,7)",128,0,230,0
59 .stabs "uint_fast64_t:t(4,26)=(4,8)",128,0,235,0
60 .stabs "intmax_t:t(4,27)=(4,7)",128,0,249,0
61 .stabs "uintmax_t:t(4,28)=(4,8)",128,0,254,0
62 .stabn 162,0,0,0
63 .stabs "int_farptr_t:t(3,1)=(4,5)",128,0,76,0
64 .stabs "uint_farptr_t:t(3,2)=(4,6)",128,0,80,0
65 .stabn 162,0,0,0
66 .stabn 162,0,0,0
67 .stabn 162,0,0,0
68 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdlib.h",130,0,0,0
69 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
70 .stabs "size_t:t(6,1)=(0,4)",128,0,214,0
71 .stabs "wchar_t:t(6,2)=(0,1)",128,0,326,0
72 .stabn 162,0,0,0
73 .stabs "div_t:t(5,1)=(5,2)=s4quot:(0,1),0,16;rem:(0,1),16,16;;",128,0,69,0
74 .stabs "ldiv_t:t(5,3)=(5,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;",128,0,75,0
75 .stabs "__compar_fn_t:t(5,5)=(5,6)=*(5,7)=f(0,1)",128,0,78,0
76 .stabn 162,0,0,0
77 .stabs "I2CInterface.h",130,0,0,0
78 .stabs "CommonDefs.h",130,0,0,0
79 .stabs "bool_t:t(8,1)=(0,11)",128,0,56,0
80 .stabn 162,0,0,0
81 .stabs "i2cCmd_t:t(7,1)=(7,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
82 .stabn 162,0,0,0
83 .stabs "main:F(0,1)",36,0,70,main
84 .global main
85 .type main, @function
86 main:
87 .stabd 46,0,0
1:Main.c **** /*
2:Main.c **** Copyright (C) 2004 John Orlando
3:Main.c ****
4:Main.c **** AVRcam: a small real-time image processing engine.
5:Main.c ****
6:Main.c **** This program is free software; you can redistribute it and/or
7:Main.c **** modify it under the terms of the GNU General Public
8:Main.c **** License as published by the Free Software Foundation; either
9:Main.c **** version 2 of the License, or (at your option) any later version.
10:Main.c ****
11:Main.c **** This program is distributed in the hope that it will be useful,
12:Main.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:Main.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:Main.c **** General Public License for more details.
15:Main.c ****
16:Main.c **** You should have received a copy of the GNU General Public
17:Main.c **** License along with this program; if not, write to the Free Software
18:Main.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:Main.c ****
20:Main.c **** For more information on the AVRcam, please contact:
21:Main.c ****
22:Main.c **** john@jrobot.net
23:Main.c ****
24:Main.c **** or go to www.jrobot.net for more details regarding the system.
25:Main.c **** */
26:Main.c **** /***********************************************************
27:Main.c **** Module Name: Main.c
GAS LISTING /tmp/ccSepUfa.s page 3
 
 
28:Main.c **** Module Date: 04/10/2004
29:Main.c **** Module Auth: John Orlando
30:Main.c ****
31:Main.c **** Description: This module is responsible for providing
32:Main.c **** the entry point to the code through the "main" function.
33:Main.c ****
34:Main.c **** Revision History:
35:Main.c **** Date Rel Ver. Notes
36:Main.c **** 4/10/2004 0.1 Module created
37:Main.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
38:Main.c **** contest.
39:Main.c **** ***********************************************************/
40:Main.c ****
41:Main.c **** /* Includes */
42:Main.c **** #include <avr/io.h>
43:Main.c **** #include <stdlib.h>
44:Main.c **** #include <string.h>
45:Main.c **** #include "UIMgr.h"
46:Main.c **** #include "UartInterface.h"
47:Main.c **** #include "I2CInterface.h"
48:Main.c **** #include "CamInterface.h"
49:Main.c **** #include "DebugInterface.h"
50:Main.c **** #include "FrameMgr.h"
51:Main.c **** #include "CommonDefs.h"
52:Main.c **** #include "CamConfig.h"
53:Main.c **** #include "Executive.h"
54:Main.c **** #include "Utility.h"
55:Main.c ****
56:Main.c **** /* Local Structures and Typedefs */
57:Main.c ****
58:Main.c **** /* Extern Variables */
59:Main.c ****
60:Main.c **** /* Definitions */
61:Main.c ****
62:Main.c **** /***********************************************************
63:Main.c **** Function Name: main
64:Main.c **** Function Description: This function provides the entry
65:Main.c **** point into AVRcam application.
66:Main.c **** Inputs: none
67:Main.c **** Outputs: int
68:Main.c **** ***********************************************************/
69:Main.c **** int main(void)
70:Main.c **** {
88 .stabn 68,0,70,.LM0-main
89 .LM0:
90 /* prologue: frame size=0 */
91 0000 C0E0 ldi r28,lo8(__stack - 0)
92 0002 D0E0 ldi r29,hi8(__stack - 0)
93 0004 DEBF out __SP_H__,r29
94 0006 CDBF out __SP_L__,r28
95 /* prologue end (size=4) */
71:Main.c **** /* initialize all of the interface modules */
72:Main.c **** DebugInt_init();
96 .stabn 68,0,72,.LM1-main
97 .LM1:
98 0008 00D0 rcall DebugInt_init
73:Main.c **** UartInt_init();
GAS LISTING /tmp/ccSepUfa.s page 4
 
 
99 .stabn 68,0,73,.LM2-main
100 .LM2:
101 000a 00D0 rcall UartInt_init
74:Main.c **** I2CInt_init();
102 .stabn 68,0,74,.LM3-main
103 .LM3:
104 000c 00D0 rcall I2CInt_init
75:Main.c **** CamInt_init();
105 .stabn 68,0,75,.LM4-main
106 .LM4:
107 000e 00D0 rcall CamInt_init
76:Main.c ****
77:Main.c **** /* initialize the remaining modules that will process
78:Main.c **** data...interrupts need to be on for these */
79:Main.c **** ENABLE_INTS();
108 .stabn 68,0,79,.LM5-main
109 .LM5:
110 /* #APP */
111 0010 7894 sei
80:Main.c **** CamConfig_init();
112 .stabn 68,0,80,.LM6-main
113 .LM6:
114 /* #NOAPP */
115 0012 00D0 rcall CamConfig_init
81:Main.c **** UIMgr_init();
116 .stabn 68,0,81,.LM7-main
117 .LM7:
118 0014 00D0 rcall UIMgr_init
82:Main.c **** FrameMgr_init();
119 .stabn 68,0,82,.LM8-main
120 .LM8:
121 0016 00D0 rcall FrameMgr_init
83:Main.c ****
84:Main.c **** /* provide a short delay for the camera to stabilize before
85:Main.c **** we let the executive start up */
86:Main.c **** Utility_delay(1000);
122 .stabn 68,0,86,.LM9-main
123 .LM9:
124 0018 88EE ldi r24,lo8(1000)
125 001a 93E0 ldi r25,hi8(1000)
126 001c 00D0 rcall Utility_delay
87:Main.c ****
88:Main.c **** /* the rest of the application will be under the
89:Main.c **** control of the Executive. */
90:Main.c **** Exec_run();
127 .stabn 68,0,90,.LM10-main
128 .LM10:
129 001e 00D0 rcall Exec_run
91:Main.c ****
92:Main.c **** /* this should never be reached */
93:Main.c **** return(0);
94:Main.c **** }
130 .stabn 68,0,94,.LM11-main
131 .LM11:
132 0020 80E0 ldi r24,lo8(0)
133 0022 90E0 ldi r25,hi8(0)
134 /* epilogue: frame size=0 */
GAS LISTING /tmp/ccSepUfa.s page 5
 
 
135 0024 00C0 rjmp exit
136 /* epilogue end (size=1) */
137 /* function main size 20 (15) */
138 .size main, .-main
139 .Lscope0:
140 .stabs "",36,0,0,.Lscope0-main
141 .stabd 78,0,0
142 .stabs "",100,0,0,.Letext0
143 .Letext0:
144 /* File "Main.c": code 20 = 0x0014 ( 15), prologues 4, epilogues 1 */
GAS LISTING /tmp/ccSepUfa.s page 6
 
 
DEFINED SYMBOLS
*ABS*:00000000 Main.c
/tmp/ccSepUfa.s:3 *ABS*:0000003f __SREG__
/tmp/ccSepUfa.s:4 *ABS*:0000003e __SP_H__
/tmp/ccSepUfa.s:5 *ABS*:0000003d __SP_L__
/tmp/ccSepUfa.s:6 *ABS*:00000000 __tmp_reg__
/tmp/ccSepUfa.s:7 *ABS*:00000001 __zero_reg__
/tmp/ccSepUfa.s:86 .text:00000000 main
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
__stack
DebugInt_init
UartInt_init
I2CInt_init
CamInt_init
CamConfig_init
UIMgr_init
FrameMgr_init
Utility_delay
Exec_run
exit
/programy/Atmel_C/AVRcam/README.txt
0,0 → 1,62
AVRcam Release 1.4
1/16/2005
 
Whats New in v1.4:
-Greatly improved the issue where the AVRcam would potentially
lock up in particular situations (especially after lots of frame
dumps). This was due to a combination of bugs, which have all been fixed:
-turned off interrupts in certain critical sections that were missed
previously
-only allow PCLK to be piped into timer1 when needed (i.e., when dumping
a line or tracking a frame).
-allowed the main executive to check both the fast event bitmask as well
as the normal event queue on each pass of the main executive
 
I'll be curious to hear if this has completely fixed the issue (I haven't
seen it happen after ~500 frame dumps, but the real test is when
others try it :-). Also note: an input voltage below 6 volts will
cause the system to work sometimes and lock up others. The input voltage
regulator really wants to see a 6V minimum. I had drained
8 AA NiMH batteries down to where they were only providing ~4.8 V at the
input. The system worked for a little while, and then started locking
up. I immediately changed batteries and everything was fine.
 
-Improved how the colorMap gets written to EEPROM. Now, before
each byte in the colorMap is written to EEPROM, a check of the
current value in EEPROM is made to see if the old value matches
the new value. If so, the write is skipped. Also, after a value
is written, it is read back to ensure that it is correct, and
will re-write up to three times if needed.
 
-Moved the UART rx ISR to the UartInterface.c file, instead of having
it in its own UartInterfaceAsm.S file. The ISR is in C now.
 
-Added a revision history to each source file so that people can
see the changes on a per-version basis.
 
 
---Misc Info about AVRcam---
 
* The AVRcam source files were built using the WinAVR distribution
(version 3.3.1 of GCC). I haven't tested other versions of GCC,
but they should compile without too much difficulty. The makefile
used to build the source is included.
 
* Currently, the AVRcam only works at a baud rate of 115.2 kbps. I
am in the process of working on autobaud routines that will set the
baud rate automatically at start up. I'm pretty sure the system
should be able to track 8 objects all the way down to a baud rate
of 38.4 kbps. Check back to www.jrobot.net for more info about the
AVRcam.
 
* Different portions of the code are #ifdef'ed in or out to show
the various debugging that can be turned on in the system. The
debugging mechanisms are typically for dumping additional information
out to a serial terminal for viewing, and are not intended to work
with the AVRcamVIEW PC application. The code, as released, doesn't
have any debugging features turned on.
 
* For more info about the AVRcam, check out http://www.jrobot.net
 
John Orlando
January 16, 2005
/programy/Atmel_C/AVRcam/UIMgr.c
0,0 → 1,664
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: UIMgr.c
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module is responsible for providing
the processing to manage the user interface of the
system. This user interface is provided via the UART.
This module handles the incoming serial commands, and
performs the needed functionality. It is then
responsible for generating any needed response to
the external entity.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
11/15/2004 1.2 Updated version string to 1.2.
1/16/2005 1.4 Added code to write the colorMap
to EEPROM one byte at a time,
ensuring that the EEPROM is only
written when the data is different
than the current value (thus saving
EEPROM writes). Updated version
string to 1.4.
***********************************************************/
 
/* Includes */
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>
#include "CommonDefs.h"
#include "UIMgr.h"
#include "UartInterface.h"
#include "CamConfig.h"
#include "Utility.h"
#include "Executive.h"
#include "CamInterface.h"
 
/* Local Structures and Typedefs */
 
typedef enum
{
getVersionCmd,
pingCmd,
setCameraRegsCmd,
dumpFrameCmd,
enableTrackingCmd,
disableTrackingCmd,
setColorMapCmd,
resetCameraCmd,
noCmd,
invalidCmd
} UIMgr_Cmd_t;
 
typedef enum
{
setRed,
setGreen,
setBlue
} setColorState_t;
 
/* Local Variables */
static unsigned char charCount = 0;
static unsigned char charIndex = 0;
static unsigned char asciiTokenBuffer[MAX_TOKEN_LENGTH+1]; /* +1 to ensure NULL at end */
static unsigned char tokenCount = 0;
static unsigned char tokenBuffer[MAX_TOKEN_COUNT];
static UIMgr_Cmd_t receivedCmd = noCmd;
static unsigned char AVRcamVersion[] = "AVRcam v1.4\r";
 
/* Local Function Declaration */
static unsigned char UIMgr_readRxFifo(void);
static unsigned char UIMgr_readTxFifo(void);
static unsigned char UIMgr_readRxFifo(void);
static void UIMgr_sendNck(void);
static void UIMgr_sendAck(void);
static void UIMgr_convertTokenToCmd(void);
static void UIMgr_convertTokenToValue(void);
static void UIMgr_executeCmd(void);
 
/* Extern Variables */
unsigned char UIMgr_rxFifo[UI_MGR_RX_FIFO_SIZE];
unsigned char UIMgr_rxFifoHead=0;
unsigned char UIMgr_rxFifoTail=0;
 
unsigned char UIMgr_txFifo[UI_MGR_TX_FIFO_SIZE];
unsigned char UIMgr_txFifoHead=0;
unsigned char UIMgr_txFifoTail=0;
 
/* Definitions */
#define IS_DATA_IN_TX_FIFO() (!(UIMgr_txFifoHead == UIMgr_txFifoTail))
#define IS_DATA_IN_RX_FIFO() (!(UIMgr_rxFifoHead == UIMgr_rxFifoTail))
 
/* MAX_EEPROM_WRITE_ATTEMPTS limits the number of writes that can be
done to a particular EEPROM cell, so that it can't possible just
write to the same cell over and over */
#define MAX_EEPROM_WRITE_ATTEMPTS 3
 
/***********************************************************
Function Name: UIMgr_init
Function Description: This function is responsible for
initializing the UIMgr module. It sets up the fifo
used to hold incoming data, etc.
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_init(void)
{
memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH+1);
memset(tokenBuffer,0x00,MAX_TOKEN_COUNT);
memset(UIMgr_txFifo,0x00,UI_MGR_TX_FIFO_SIZE);
memset(UIMgr_rxFifo,0x00,UI_MGR_RX_FIFO_SIZE);
}
 
/***********************************************************
Function Name: UIMgr_dispatchEvent
Function Description: This function is responsible for
processing events that pertain to the UIMgr.
Inputs: event - the generated event
Outputs: none
***********************************************************/
void UIMgr_dispatchEvent(unsigned char event)
{
switch(event)
{
case EV_ACQUIRE_LINE_COMPLETE:
UIMgr_transmitPendingData();
break;
case EV_SERIAL_DATA_RECEIVED:
UIMgr_processReceivedData();
break;
case EV_SERIAL_DATA_PENDING_TX:
UIMgr_flushTxBuffer();
break;
}
}
/***********************************************************
Function Name: UIMgr_transmitPendingData
Function Description: This function is responsible for
transmitting a single byte of data if data is waiting
to be sent. Otherwise, if nothing is waiting, the
function just returns.
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_transmitPendingData(void)
{
if (IS_DATA_IN_TX_FIFO() == TRUE)
{
/* data is waiting...send a single byte */
UartInt_txByte( UIMgr_readTxFifo() );
}
}
/***********************************************************
Function Name: UIMgr_processReceivedData
Function Description: This function is responsible for
parsing any serial data waiting in the rx fifo
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_processReceivedData(void)
{
unsigned char tmpData = 0;
 
/* still need to add a mechanism to handle token counts
that are excessive!!! FIX ME!!! */
while(IS_DATA_IN_RX_FIFO() == TRUE)
{
tmpData = UIMgr_readRxFifo();
if (tmpData == '\r')
{
/* we have reached a token separator */
if (tokenCount == 0)
{
/* convert the command */
UIMgr_convertTokenToCmd();
}
else
{
/* convert a value */
UIMgr_convertTokenToValue();
tokenCount++;
}
/* either way, it is time to try to process the received
token list since we have reached the end of the cmd. */
Utility_delay(100);
if (receivedCmd == invalidCmd ||
receivedCmd == noCmd )
{
UIMgr_sendNck();
PUBLISH_EVENT(EV_SERIAL_DATA_PENDING_TX);
}
else
{
UIMgr_sendAck();
/* publish the serial data pending event, so it
will push the ACK out before we execute the cmd */
PUBLISH_EVENT(EV_SERIAL_DATA_PENDING_TX);
UIMgr_executeCmd();
}
/* reset any necessary data */
tokenCount = 0;
memset(tokenBuffer,0x00,MAX_TOKEN_COUNT);
}
else if (tmpData == ' ') /* space char */
{
/* the end of a token has been reached */
if (tokenCount == 0)
{
UIMgr_convertTokenToCmd();
tokenCount++; /* check this...why is this being incremented here??? This
means we have received a token, with tokenCount == 0, which means it is a
command...why is this contributing to tokenCount?
This might cause the set color map command to include too much data, since
it sets the color map based on tokenCount...CHECK*/
}
else
{
/* check to see if this token is going to push
us over the limit...if so, abort the transaction */
if (tokenCount+1 >= MAX_TOKEN_COUNT)
{
/* we received too many tokens, and
need to NCK this request, since its too
large...reset everything...*/
charCount=0;
charIndex=0;
tokenCount=0;
receivedCmd = invalidCmd;
}
else
{
/* tokenCount is still in range...*/
UIMgr_convertTokenToValue();
tokenCount++;
}
}
}
else if ( (tmpData >= 'A' && tmpData <= 'Z') ||
(tmpData >= '0' && tmpData <= '9') )
{
/* a valid range of token was received */
asciiTokenBuffer[charIndex] = tmpData;
charCount++;
charIndex++;
if (charCount > MAX_TOKEN_LENGTH)
{
/* we have received a token that cannot be handled...
set the received cmd to an invalid cmd, and wait
for the \r to process it */
receivedCmd = invalidCmd;
charIndex = 0; /* ...so we won't overwrite memory */
}
}
else
{
/* an invalid character was received */
receivedCmd = invalidCmd;
}
} /* end while */
asm volatile("clt"::); /* clear out the T flag in case it wasn't
cleared already */
}
 
/***********************************************************
Function Name: UIMgr_executeCmd
Function Description: This function is responsible for
executing whatever cmd is stored in the receivedCmd
object.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_executeCmd(void)
{
unsigned char i,eepromData, num_writes=0;
unsigned char *pData;
unsigned char eeprom_write_succeeded = FALSE;
#if DEBUG_COLOR_MAP
unsigned char asciiBuffer[5];
#endif
 
if (receivedCmd == pingCmd)
{
}
else if (receivedCmd == getVersionCmd)
{
pData = AVRcamVersion;
while(*pData != 0)
{
UIMgr_writeTxFifo(*pData++);
}
}
else if (receivedCmd == resetCameraCmd)
{
CamInt_resetCam();
}
else if (receivedCmd == dumpFrameCmd)
{
/* publish the event that will indicate that
a request has come to dump a frame...this will
be received by the FrameMgr, which will begin
dumping the frame...a short delay is needed
here to keep the Java demo app happy (sometimes
it wouldn't be able to receive the serial data
as quickly as AVRcam can provide it). */
Utility_delay(100);
PUBLISH_EVENT(EV_DUMP_FRAME);
}
else if (receivedCmd == setCameraRegsCmd)
{
/* we need to gather the tokens and
build config cmds to be sent to the camera */
for (i=1; i<tokenCount; i+=2) /* starts at 1 since first token
is the CR cmd */
{
CamConfig_setCamReg(tokenBuffer[i],tokenBuffer[i+1]);
}
CamConfig_sendFifoCmds();
}
else if (receivedCmd == enableTrackingCmd)
{
/* publish the event...again with a short delay */
Utility_delay(100);
PUBLISH_EVENT(EV_ENABLE_TRACKING);
}
else if (receivedCmd == disableTrackingCmd)
{
PUBLISH_EVENT(EV_DISABLE_TRACKING);
}
else if (receivedCmd == setColorMapCmd)
{
/* copy the received tokens into the color map */
for (i=0; i<tokenCount; i++)
{
colorMap[i] = tokenBuffer[i+1];
/* write each colorMap byte to EEPROM, but only those
that changed...this will help reduce wear on the EEPROM */
eepromData = eeprom_read_byte( (unsigned char*)(i+1));
if (eepromData != colorMap[i])
{
/* need to actually perform the write because the
data in eeprom is different than the current colorMap */
eeprom_write_succeeded = FALSE;
while(eeprom_write_succeeded == FALSE && num_writes < MAX_EEPROM_WRITE_ATTEMPTS)
{
eeprom_write_byte((unsigned char*)(i+1),colorMap[i]);
num_writes++;
eepromData = eeprom_read_byte( (unsigned char*)(i+1));
if (eepromData == colorMap[i])
{
eeprom_write_succeeded = TRUE;
}
}
num_writes = 0;
}
}
 
#if DEBUG_COLOR_MAP
/* for debugging...send out the entire color map */
UIMgr_txBuffer("\r\n",2);
for (i=0; i<NUM_ELEMENTS_IN_COLOR_MAP; i++)
{
memset(asciiBuffer,0x00,5);
itoa(colorMap[i],asciiBuffer,10);
UIMgr_txBuffer(asciiBuffer,3);
UIMgr_txBuffer(" ",1);
if (i==15 || i == 31)
{
/* break up the output */
UIMgr_txBuffer("\r\n",2);
}
}
#endif
}
}
 
/***********************************************************
Function Name: UIMgr_convertTokenToValue
Function Description: This function is responsible for
converting a received token to a hex value It will
access the asciiTokenBuffer directly, and store the
result in the appropriate token buffer.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_convertTokenToValue(void)
{
unsigned int newValue;
newValue = atoi(asciiTokenBuffer);
if (newValue > 255)
{
/* the value is too large */
receivedCmd = invalidCmd;
tokenBuffer[tokenCount] = 0xFF; /* to indicate an error */
}
else
{
/* copy the value into the tokenBuffer */
tokenBuffer[tokenCount] = newValue;
}
memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH);
charIndex = 0;
charCount = 0;
}
/***********************************************************
Function Name: UIMgr_convertTokenToCmd
Function Description: This function is responsible for
parsing a received 2-character command. It will
access the asciiTokenBuffer directly.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_convertTokenToCmd(void)
{
if ( (asciiTokenBuffer[0] == 'P') &&
(asciiTokenBuffer[1] == 'G') )
{
/* we got a "ping" command...but we still need to see
if we are going to get the \r */
receivedCmd = pingCmd;
}
else if ( (asciiTokenBuffer[0] == 'G') &&
(asciiTokenBuffer[1] == 'V') )
{
/* we got the "get version" command */
receivedCmd = getVersionCmd;
}
else if ( (asciiTokenBuffer[0] == 'D') &&
(asciiTokenBuffer[1] == 'F') )
{
/* we should go into frame dump mode */
receivedCmd = dumpFrameCmd;
}
else if ( (asciiTokenBuffer[0] == 'C') &&
(asciiTokenBuffer[1] == 'R') )
{
/* the user wants to set registers in the OV6620 */
receivedCmd = setCameraRegsCmd;
}
else if ( (asciiTokenBuffer[0] == 'E') &&
(asciiTokenBuffer[1] == 'T') )
{
/* the user wants to enable tracking */
receivedCmd = enableTrackingCmd;
}
else if ( (asciiTokenBuffer[0] == 'S') &&
(asciiTokenBuffer[1] == 'M') )
{
/* the user wants to set the color map */
receivedCmd = setColorMapCmd;
}
else if ( (asciiTokenBuffer[0] == 'D') &&
(asciiTokenBuffer[1] == 'T') )
{
receivedCmd = disableTrackingCmd;
}
else if ( (asciiTokenBuffer[0] == 'R') &&
(asciiTokenBuffer[1] == 'S') )
{
receivedCmd = resetCameraCmd;
}
else
{
/* don't recognize the cmd */
receivedCmd = invalidCmd;
}
memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH);
charIndex = 0;
charCount = 0;
}
/***********************************************************
Function Name: UIMgr_sendAck
Function Description: This function is responsible for
queuing up an ACK to be sent to the user.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_sendAck(void)
{
UIMgr_writeTxFifo('A');
UIMgr_writeTxFifo('C');
UIMgr_writeTxFifo('K');
UIMgr_writeTxFifo('\r');
}
 
/***********************************************************
Function Name: UIMgr_sendNck
Function Description: This function is responsible for
queueing up an NCK to be sent to the user.
Inputs: none
Outputs: none
***********************************************************/
static void UIMgr_sendNck(void)
{
UIMgr_writeTxFifo('N');
UIMgr_writeTxFifo('C');
UIMgr_writeTxFifo('K');
UIMgr_writeTxFifo('\r');
}
 
 
/***********************************************************
Function Name: UIMgr_writeBufferToTxFifo
Function Description: This function is responsible for
placing "length" bytes into the tx FIFO.
Inputs: pData - a pointer to the data to send
length - the number of bytes to send
Outputs: none
***********************************************************/
void UIMgr_writeBufferToTxFifo(unsigned char *pData, unsigned char length)
{
unsigned char tmpHead;
if (length == 0)
{
return;
}
DISABLE_INTS();
while(length-- != 0)
{
UIMgr_txFifo[UIMgr_txFifoHead] = *pData++;
/* now move the head up */
tmpHead = (UIMgr_txFifoHead + 1) & (UI_MGR_TX_FIFO_MASK);
UIMgr_txFifoHead = tmpHead;
}
ENABLE_INTS();
}
 
/***********************************************************
Function Name: UIMgr_txBuffer
Function Description: This function is responsible for
sending 'length' bytes out using the UartInterface
module.
Inputs: pData - a pointer to the data to send
length - the number of bytes to send
Outputs: none
***********************************************************/
void UIMgr_txBuffer(unsigned char *pData, unsigned char length)
{
while(length-- != 0)
{
UartInt_txByte(*pData++);
}
}
 
/***********************************************************
Function Name: UIMgr_flushTxBuffer
Function Description: This function is responsible for
sending all data currently in the serial tx buffer
to the user.
Inputs: none
Outputs: none
***********************************************************/
void UIMgr_flushTxBuffer(void)
{
while(IS_DATA_IN_TX_FIFO() == TRUE)
{
UartInt_txByte(UIMgr_readTxFifo() );
}
}
 
/***********************************************************
Function Name: UIMgr_readRxFifo
Function Description: This function is responsible for
reading a single byte of data from the rx fifo, and
updating the appropriate pointers.
Inputs: none
Outputs: unsigned char-the data read
***********************************************************/
static unsigned char UIMgr_readRxFifo(void)
{
unsigned char dataByte, tmpTail;
/* just return the current tail from the rx fifo */
DISABLE_INTS();
dataByte = UIMgr_rxFifo[UIMgr_rxFifoTail];
tmpTail = (UIMgr_rxFifoTail+1) & (UI_MGR_RX_FIFO_MASK);
UIMgr_rxFifoTail = tmpTail;
ENABLE_INTS();
return(dataByte);
}
 
/***********************************************************
Function Name: UIMgr_readTxFifo
Function Description: This function is responsible for
reading a single byte of data from the tx fifo, and
updating the appropriate pointers.
Inputs: none
Outputs: unsigned char-the data read
***********************************************************/
static unsigned char UIMgr_readTxFifo(void)
{
unsigned char dataByte, tmpTail;
/* just return the current tail from the tx fifo */
DISABLE_INTS();
dataByte = UIMgr_txFifo[UIMgr_txFifoTail];
tmpTail = (UIMgr_txFifoTail+1) & (UI_MGR_TX_FIFO_MASK);
UIMgr_txFifoTail = tmpTail;
ENABLE_INTS();
return(dataByte);
}
 
/***********************************************************
Function Name: UIMgr_writeTxFifo
Function Description: This function is responsible for
writing a single byte to the TxFifo and
updating the appropriate pointers.
Inputs: data - the byte to write to the Fifo
Outputs: none
***********************************************************/
void UIMgr_writeTxFifo(unsigned char data)
{
unsigned char tmpHead;
 
DISABLE_INTS();
UIMgr_txFifo[UIMgr_txFifoHead] = data;
 
/* now move the head up */
tmpHead = (UIMgr_txFifoHead + 1) & (UI_MGR_TX_FIFO_MASK);
UIMgr_txFifoHead = tmpHead;
ENABLE_INTS();
}
 
/programy/Atmel_C/AVRcam/UIMgr.d
0,0 → 1,2
UIMgr.o UIMgr.d : UIMgr.c CommonDefs.h UIMgr.h UartInterface.h CamConfig.h \
I2CInterface.h Utility.h Executive.h Events.h CamInterface.h
/programy/Atmel_C/AVRcam/UIMgr.h
0,0 → 1,74
#ifndef UIMGR_H
#define UIMGR_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: UIMgr.h
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This file provides the external interface
to the UI Mgr.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
 
/* Defines */
#define UI_MGR_RX_FIFO_SIZE 32
#define UI_MGR_RX_FIFO_MASK UI_MGR_RX_FIFO_SIZE-1
 
#define UI_MGR_TX_FIFO_SIZE 64
#define UI_MGR_TX_FIFO_MASK UI_MGR_TX_FIFO_SIZE-1
 
#define LENGTH_OF_UI_CMD 2
#define UI_MGR_MAX_CMD_LENGTH 32
#define MAX_TOKEN_LENGTH 3 /* needs to hold 0 - 255 in ASCII format */
#define MAX_TOKEN_COUNT 64 /* for setting the color maps */
 
 
/* External Variable Reference */
extern unsigned char UIMgr_rxFifo[];
extern unsigned char UIMgr_rxFifoHead;
extern unsigned char UIMgr_rxFifoTail;
 
/* External Function Declaration */
extern void UIMgr_init(void);
extern void UIMgr_writeBufferToTxFifo(unsigned char *pData, unsigned char length);
extern void UIMgr_txBuffer(unsigned char *pData, unsigned char length);
extern void UIMgr_processReceivedData(void);
extern void UIMgr_transmitPendingData(void);
extern void UIMgr_dispatchEvent(unsigned char event);
extern void UIMgr_flushTxBuffer(void);
extern void UIMgr_writeTxFifo(unsigned char data);
#endif
 
/programy/Atmel_C/AVRcam/UIMgr.lst
0,0 → 1,2363
GAS LISTING /tmp/cc2L16GD.s page 1
 
 
1 .file "UIMgr.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/roboti/istrobot/2007/ATmega8/AVRcam/",100,0,2,.Ltext0
11 .stabs "UIMgr.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
32 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
33 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
34 .stabs "int8_t:t(4,1)=(0,10)",128,0,116,0
35 .stabs "uint8_t:t(4,2)=(0,11)",128,0,117,0
36 .stabs "int16_t:t(4,3)=(0,1)",128,0,118,0
37 .stabs "uint16_t:t(4,4)=(0,4)",128,0,119,0
38 .stabs "int32_t:t(4,5)=(0,3)",128,0,120,0
39 .stabs "uint32_t:t(4,6)=(0,5)",128,0,121,0
40 .stabs "int64_t:t(4,7)=(0,6)",128,0,122,0
41 .stabs "uint64_t:t(4,8)=(0,7)",128,0,123,0
42 .stabs "intptr_t:t(4,9)=(4,3)",128,0,135,0
43 .stabs "uintptr_t:t(4,10)=(4,4)",128,0,140,0
44 .stabs "int_least8_t:t(4,11)=(4,1)",128,0,152,0
45 .stabs "uint_least8_t:t(4,12)=(4,2)",128,0,157,0
46 .stabs "int_least16_t:t(4,13)=(4,3)",128,0,162,0
47 .stabs "uint_least16_t:t(4,14)=(4,4)",128,0,167,0
48 .stabs "int_least32_t:t(4,15)=(4,5)",128,0,172,0
49 .stabs "uint_least32_t:t(4,16)=(4,6)",128,0,177,0
50 .stabs "int_least64_t:t(4,17)=(4,7)",128,0,182,0
51 .stabs "uint_least64_t:t(4,18)=(4,8)",128,0,187,0
52 .stabs "int_fast8_t:t(4,19)=(4,1)",128,0,200,0
53 .stabs "uint_fast8_t:t(4,20)=(4,2)",128,0,205,0
54 .stabs "int_fast16_t:t(4,21)=(4,3)",128,0,210,0
55 .stabs "uint_fast16_t:t(4,22)=(4,4)",128,0,215,0
56 .stabs "int_fast32_t:t(4,23)=(4,5)",128,0,220,0
57 .stabs "uint_fast32_t:t(4,24)=(4,6)",128,0,225,0
GAS LISTING /tmp/cc2L16GD.s page 2
 
 
58 .stabs "int_fast64_t:t(4,25)=(4,7)",128,0,230,0
59 .stabs "uint_fast64_t:t(4,26)=(4,8)",128,0,235,0
60 .stabs "intmax_t:t(4,27)=(4,7)",128,0,249,0
61 .stabs "uintmax_t:t(4,28)=(4,8)",128,0,254,0
62 .stabn 162,0,0,0
63 .stabs "int_farptr_t:t(3,1)=(4,5)",128,0,76,0
64 .stabs "uint_farptr_t:t(3,2)=(4,6)",128,0,80,0
65 .stabn 162,0,0,0
66 .stabn 162,0,0,0
67 .stabn 162,0,0,0
68 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdlib.h",130,0,0,0
69 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
70 .stabs "size_t:t(6,1)=(0,4)",128,0,214,0
71 .stabs "wchar_t:t(6,2)=(0,1)",128,0,326,0
72 .stabn 162,0,0,0
73 .stabs "div_t:t(5,1)=(5,2)=s4quot:(0,1),0,16;rem:(0,1),16,16;;",128,0,69,0
74 .stabs "ldiv_t:t(5,3)=(5,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;",128,0,75,0
75 .stabs "__compar_fn_t:t(5,5)=(5,6)=*(5,7)=f(0,1)",128,0,78,0
76 .stabn 162,0,0,0
77 .stabs "CommonDefs.h",130,0,0,0
78 .stabs "bool_t:t(7,1)=(0,11)",128,0,56,0
79 .stabn 162,0,0,0
80 .stabs "CamConfig.h",130,0,0,0
81 .stabs "I2CInterface.h",130,0,0,0
82 .stabs "i2cCmd_t:t(9,1)=(9,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
83 .stabn 162,0,0,0
84 .stabn 162,0,0,0
85 .stabs " :T(0,16)=@s8;egetVersionCmd:0,pingCmd:1,setCameraRegsCmd:2,dumpFrameCmd:3,enableTrackingC
86 .stabs "UIMgr_Cmd_t:t(0,17)=(0,16)",128,0,81,0
87 .stabs " :T(0,18)=@s8;esetRed:0,setGreen:1,setBlue:2,;",128,0,0,0
88 .stabs "setColorState_t:t(0,19)=(0,18)",128,0,88,0
89 .stabs "UIMgr_writeBufferToTxFifo:F(0,15)",36,0,547,UIMgr_writeBufferToTxFifo
90 .stabs "pData:P(0,20)=*(0,11)",64,0,546,26
91 .stabs "length:P(0,11)",64,0,546,24
92 .global UIMgr_writeBufferToTxFifo
93 .type UIMgr_writeBufferToTxFifo, @function
94 UIMgr_writeBufferToTxFifo:
95 .stabd 46,0,0
1:UIMgr.c **** /*
2:UIMgr.c **** Copyright (C) 2004 John Orlando
3:UIMgr.c ****
4:UIMgr.c **** AVRcam: a small real-time image processing engine.
5:UIMgr.c ****
6:UIMgr.c **** This program is free software; you can redistribute it and/or
7:UIMgr.c **** modify it under the terms of the GNU General Public
8:UIMgr.c **** License as published by the Free Software Foundation; either
9:UIMgr.c **** version 2 of the License, or (at your option) any later version.
10:UIMgr.c ****
11:UIMgr.c **** This program is distributed in the hope that it will be useful,
12:UIMgr.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:UIMgr.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:UIMgr.c **** General Public License for more details.
15:UIMgr.c ****
16:UIMgr.c **** You should have received a copy of the GNU General Public
17:UIMgr.c **** License along with this program; if not, write to the Free Software
18:UIMgr.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:UIMgr.c ****
GAS LISTING /tmp/cc2L16GD.s page 3
 
 
20:UIMgr.c **** For more information on the AVRcam, please contact:
21:UIMgr.c ****
22:UIMgr.c **** john@jrobot.net
23:UIMgr.c ****
24:UIMgr.c **** or go to www.jrobot.net for more details regarding the system.
25:UIMgr.c **** */
26:UIMgr.c **** /***********************************************************
27:UIMgr.c **** Module Name: UIMgr.c
28:UIMgr.c **** Module Date: 04/10/2004
29:UIMgr.c **** Module Auth: John Orlando
30:UIMgr.c ****
31:UIMgr.c **** Description: This module is responsible for providing
32:UIMgr.c **** the processing to manage the user interface of the
33:UIMgr.c **** system. This user interface is provided via the UART.
34:UIMgr.c **** This module handles the incoming serial commands, and
35:UIMgr.c **** performs the needed functionality. It is then
36:UIMgr.c **** responsible for generating any needed response to
37:UIMgr.c **** the external entity.
38:UIMgr.c ****
39:UIMgr.c **** Revision History:
40:UIMgr.c **** Date Rel Ver. Notes
41:UIMgr.c **** 4/10/2004 0.1 Module created
42:UIMgr.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
43:UIMgr.c **** contest.
44:UIMgr.c **** 11/15/2004 1.2 Updated version string to 1.2.
45:UIMgr.c **** 1/16/2005 1.4 Added code to write the colorMap
46:UIMgr.c **** to EEPROM one byte at a time,
47:UIMgr.c **** ensuring that the EEPROM is only
48:UIMgr.c **** written when the data is different
49:UIMgr.c **** than the current value (thus saving
50:UIMgr.c **** EEPROM writes). Updated version
51:UIMgr.c **** string to 1.4.
52:UIMgr.c **** ***********************************************************/
53:UIMgr.c ****
54:UIMgr.c **** /* Includes */
55:UIMgr.c **** #include <avr/io.h>
56:UIMgr.c **** #include <stdlib.h>
57:UIMgr.c **** #include <string.h>
58:UIMgr.c **** #include <avr/eeprom.h>
59:UIMgr.c **** #include "CommonDefs.h"
60:UIMgr.c **** #include "UIMgr.h"
61:UIMgr.c **** #include "UartInterface.h"
62:UIMgr.c **** #include "CamConfig.h"
63:UIMgr.c **** #include "Utility.h"
64:UIMgr.c **** #include "Executive.h"
65:UIMgr.c **** #include "CamInterface.h"
66:UIMgr.c ****
67:UIMgr.c **** /* Local Structures and Typedefs */
68:UIMgr.c ****
69:UIMgr.c **** typedef enum
70:UIMgr.c **** {
71:UIMgr.c **** getVersionCmd,
72:UIMgr.c **** pingCmd,
73:UIMgr.c **** setCameraRegsCmd,
74:UIMgr.c **** dumpFrameCmd,
75:UIMgr.c **** enableTrackingCmd,
76:UIMgr.c **** disableTrackingCmd,
GAS LISTING /tmp/cc2L16GD.s page 4
 
 
77:UIMgr.c **** setColorMapCmd,
78:UIMgr.c **** resetCameraCmd,
79:UIMgr.c **** noCmd,
80:UIMgr.c **** invalidCmd
81:UIMgr.c **** } UIMgr_Cmd_t;
82:UIMgr.c ****
83:UIMgr.c **** typedef enum
84:UIMgr.c **** {
85:UIMgr.c **** setRed,
86:UIMgr.c **** setGreen,
87:UIMgr.c **** setBlue
88:UIMgr.c **** } setColorState_t;
89:UIMgr.c ****
90:UIMgr.c ****
91:UIMgr.c **** /* Local Variables */
92:UIMgr.c **** static unsigned char charCount = 0;
93:UIMgr.c **** static unsigned char charIndex = 0;
94:UIMgr.c **** static unsigned char asciiTokenBuffer[MAX_TOKEN_LENGTH+1]; /* +1 to ensure NULL at end */
95:UIMgr.c **** static unsigned char tokenCount = 0;
96:UIMgr.c **** static unsigned char tokenBuffer[MAX_TOKEN_COUNT];
97:UIMgr.c **** static UIMgr_Cmd_t receivedCmd = noCmd;
98:UIMgr.c **** static unsigned char AVRcamVersion[] = "AVRcam v1.4\r";
99:UIMgr.c ****
100:UIMgr.c **** /* Local Function Declaration */
101:UIMgr.c **** static unsigned char UIMgr_readRxFifo(void);
102:UIMgr.c **** static unsigned char UIMgr_readTxFifo(void);
103:UIMgr.c **** static unsigned char UIMgr_readRxFifo(void);
104:UIMgr.c **** static void UIMgr_sendNck(void);
105:UIMgr.c **** static void UIMgr_sendAck(void);
106:UIMgr.c **** static void UIMgr_convertTokenToCmd(void);
107:UIMgr.c **** static void UIMgr_convertTokenToValue(void);
108:UIMgr.c **** static void UIMgr_executeCmd(void);
109:UIMgr.c ****
110:UIMgr.c **** /* Extern Variables */
111:UIMgr.c **** unsigned char UIMgr_rxFifo[UI_MGR_RX_FIFO_SIZE];
112:UIMgr.c **** unsigned char UIMgr_rxFifoHead=0;
113:UIMgr.c **** unsigned char UIMgr_rxFifoTail=0;
114:UIMgr.c ****
115:UIMgr.c **** unsigned char UIMgr_txFifo[UI_MGR_TX_FIFO_SIZE];
116:UIMgr.c **** unsigned char UIMgr_txFifoHead=0;
117:UIMgr.c **** unsigned char UIMgr_txFifoTail=0;
118:UIMgr.c ****
119:UIMgr.c **** /* Definitions */
120:UIMgr.c **** #define IS_DATA_IN_TX_FIFO() (!(UIMgr_txFifoHead == UIMgr_txFifoTail))
121:UIMgr.c **** #define IS_DATA_IN_RX_FIFO() (!(UIMgr_rxFifoHead == UIMgr_rxFifoTail))
122:UIMgr.c ****
123:UIMgr.c **** /* MAX_EEPROM_WRITE_ATTEMPTS limits the number of writes that can be
124:UIMgr.c **** done to a particular EEPROM cell, so that it can't possible just
125:UIMgr.c **** write to the same cell over and over */
126:UIMgr.c **** #define MAX_EEPROM_WRITE_ATTEMPTS 3
127:UIMgr.c ****
128:UIMgr.c **** /***********************************************************
129:UIMgr.c **** Function Name: UIMgr_init
130:UIMgr.c **** Function Description: This function is responsible for
131:UIMgr.c **** initializing the UIMgr module. It sets up the fifo
132:UIMgr.c **** used to hold incoming data, etc.
133:UIMgr.c **** Inputs: none
GAS LISTING /tmp/cc2L16GD.s page 5
 
 
134:UIMgr.c **** Outputs: none
135:UIMgr.c **** ***********************************************************/
136:UIMgr.c **** void UIMgr_init(void)
137:UIMgr.c **** {
138:UIMgr.c **** memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH+1);
139:UIMgr.c **** memset(tokenBuffer,0x00,MAX_TOKEN_COUNT);
140:UIMgr.c **** memset(UIMgr_txFifo,0x00,UI_MGR_TX_FIFO_SIZE);
141:UIMgr.c **** memset(UIMgr_rxFifo,0x00,UI_MGR_RX_FIFO_SIZE);
142:UIMgr.c **** }
143:UIMgr.c ****
144:UIMgr.c **** /***********************************************************
145:UIMgr.c **** Function Name: UIMgr_dispatchEvent
146:UIMgr.c **** Function Description: This function is responsible for
147:UIMgr.c **** processing events that pertain to the UIMgr.
148:UIMgr.c **** Inputs: event - the generated event
149:UIMgr.c **** Outputs: none
150:UIMgr.c **** ***********************************************************/
151:UIMgr.c **** void UIMgr_dispatchEvent(unsigned char event)
152:UIMgr.c **** {
153:UIMgr.c **** switch(event)
154:UIMgr.c **** {
155:UIMgr.c **** case EV_ACQUIRE_LINE_COMPLETE:
156:UIMgr.c **** UIMgr_transmitPendingData();
157:UIMgr.c **** break;
158:UIMgr.c ****
159:UIMgr.c **** case EV_SERIAL_DATA_RECEIVED:
160:UIMgr.c **** UIMgr_processReceivedData();
161:UIMgr.c **** break;
162:UIMgr.c ****
163:UIMgr.c **** case EV_SERIAL_DATA_PENDING_TX:
164:UIMgr.c **** UIMgr_flushTxBuffer();
165:UIMgr.c **** break;
166:UIMgr.c **** }
167:UIMgr.c **** }
168:UIMgr.c **** /***********************************************************
169:UIMgr.c **** Function Name: UIMgr_transmitPendingData
170:UIMgr.c **** Function Description: This function is responsible for
171:UIMgr.c **** transmitting a single byte of data if data is waiting
172:UIMgr.c **** to be sent. Otherwise, if nothing is waiting, the
173:UIMgr.c **** function just returns.
174:UIMgr.c **** Inputs: none
175:UIMgr.c **** Outputs: none
176:UIMgr.c **** ***********************************************************/
177:UIMgr.c **** void UIMgr_transmitPendingData(void)
178:UIMgr.c **** {
179:UIMgr.c **** if (IS_DATA_IN_TX_FIFO() == TRUE)
180:UIMgr.c **** {
181:UIMgr.c **** /* data is waiting...send a single byte */
182:UIMgr.c **** UartInt_txByte( UIMgr_readTxFifo() );
183:UIMgr.c **** }
184:UIMgr.c **** }
185:UIMgr.c **** /***********************************************************
186:UIMgr.c **** Function Name: UIMgr_processReceivedData
187:UIMgr.c **** Function Description: This function is responsible for
188:UIMgr.c **** parsing any serial data waiting in the rx fifo
189:UIMgr.c **** Inputs: none
190:UIMgr.c **** Outputs: none
GAS LISTING /tmp/cc2L16GD.s page 6
 
 
191:UIMgr.c **** ***********************************************************/
192:UIMgr.c **** void UIMgr_processReceivedData(void)
193:UIMgr.c **** {
194:UIMgr.c **** unsigned char tmpData = 0;
195:UIMgr.c ****
196:UIMgr.c **** /* still need to add a mechanism to handle token counts
197:UIMgr.c **** that are excessive!!! FIX ME!!! */
198:UIMgr.c ****
199:UIMgr.c **** while(IS_DATA_IN_RX_FIFO() == TRUE)
200:UIMgr.c **** {
201:UIMgr.c **** tmpData = UIMgr_readRxFifo();
202:UIMgr.c **** if (tmpData == '\r')
203:UIMgr.c **** {
204:UIMgr.c **** /* we have reached a token separator */
205:UIMgr.c **** if (tokenCount == 0)
206:UIMgr.c **** {
207:UIMgr.c **** /* convert the command */
208:UIMgr.c **** UIMgr_convertTokenToCmd();
209:UIMgr.c **** }
210:UIMgr.c **** else
211:UIMgr.c **** {
212:UIMgr.c **** /* convert a value */
213:UIMgr.c **** UIMgr_convertTokenToValue();
214:UIMgr.c **** tokenCount++;
215:UIMgr.c **** }
216:UIMgr.c **** /* either way, it is time to try to process the received
217:UIMgr.c **** token list since we have reached the end of the cmd. */
218:UIMgr.c **** Utility_delay(100);
219:UIMgr.c **** if (receivedCmd == invalidCmd ||
220:UIMgr.c **** receivedCmd == noCmd )
221:UIMgr.c **** {
222:UIMgr.c **** UIMgr_sendNck();
223:UIMgr.c **** PUBLISH_EVENT(EV_SERIAL_DATA_PENDING_TX);
224:UIMgr.c **** }
225:UIMgr.c **** else
226:UIMgr.c **** {
227:UIMgr.c **** UIMgr_sendAck();
228:UIMgr.c **** /* publish the serial data pending event, so it
229:UIMgr.c **** will push the ACK out before we execute the cmd */
230:UIMgr.c **** PUBLISH_EVENT(EV_SERIAL_DATA_PENDING_TX);
231:UIMgr.c **** UIMgr_executeCmd();
232:UIMgr.c **** }
233:UIMgr.c ****
234:UIMgr.c **** /* reset any necessary data */
235:UIMgr.c **** tokenCount = 0;
236:UIMgr.c **** memset(tokenBuffer,0x00,MAX_TOKEN_COUNT);
237:UIMgr.c **** }
238:UIMgr.c **** else if (tmpData == ' ') /* space char */
239:UIMgr.c **** {
240:UIMgr.c **** /* the end of a token has been reached */
241:UIMgr.c **** if (tokenCount == 0)
242:UIMgr.c **** {
243:UIMgr.c **** UIMgr_convertTokenToCmd();
244:UIMgr.c **** tokenCount++; /* check this...why is this being incremented here??? This
245:UIMgr.c **** means we have received a token, with tokenCount == 0, which means it is a
246:UIMgr.c **** command...why is this contributing to tokenCount?
247:UIMgr.c **** This might cause the set color map command to include too much data, since
GAS LISTING /tmp/cc2L16GD.s page 7
 
 
248:UIMgr.c **** it sets the color map based on tokenCount...CHECK*/
249:UIMgr.c **** }
250:UIMgr.c **** else
251:UIMgr.c **** {
252:UIMgr.c **** /* check to see if this token is going to push
253:UIMgr.c **** us over the limit...if so, abort the transaction */
254:UIMgr.c **** if (tokenCount+1 >= MAX_TOKEN_COUNT)
255:UIMgr.c **** {
256:UIMgr.c **** /* we received too many tokens, and
257:UIMgr.c **** need to NCK this request, since its too
258:UIMgr.c **** large...reset everything...*/
259:UIMgr.c **** charCount=0;
260:UIMgr.c **** charIndex=0;
261:UIMgr.c **** tokenCount=0;
262:UIMgr.c **** receivedCmd = invalidCmd;
263:UIMgr.c **** }
264:UIMgr.c **** else
265:UIMgr.c **** {
266:UIMgr.c **** /* tokenCount is still in range...*/
267:UIMgr.c **** UIMgr_convertTokenToValue();
268:UIMgr.c **** tokenCount++;
269:UIMgr.c **** }
270:UIMgr.c **** }
271:UIMgr.c **** }
272:UIMgr.c **** else if ( (tmpData >= 'A' && tmpData <= 'Z') ||
273:UIMgr.c **** (tmpData >= '0' && tmpData <= '9') )
274:UIMgr.c **** {
275:UIMgr.c **** /* a valid range of token was received */
276:UIMgr.c **** asciiTokenBuffer[charIndex] = tmpData;
277:UIMgr.c **** charCount++;
278:UIMgr.c **** charIndex++;
279:UIMgr.c **** if (charCount > MAX_TOKEN_LENGTH)
280:UIMgr.c **** {
281:UIMgr.c **** /* we have received a token that cannot be handled...
282:UIMgr.c **** set the received cmd to an invalid cmd, and wait
283:UIMgr.c **** for the \r to process it */
284:UIMgr.c **** receivedCmd = invalidCmd;
285:UIMgr.c **** charIndex = 0; /* ...so we won't overwrite memory */
286:UIMgr.c **** }
287:UIMgr.c **** }
288:UIMgr.c **** else
289:UIMgr.c **** {
290:UIMgr.c **** /* an invalid character was received */
291:UIMgr.c **** receivedCmd = invalidCmd;
292:UIMgr.c **** }
293:UIMgr.c **** } /* end while */
294:UIMgr.c ****
295:UIMgr.c **** asm volatile("clt"::); /* clear out the T flag in case it wasn't
296:UIMgr.c **** cleared already */
297:UIMgr.c **** }
298:UIMgr.c ****
299:UIMgr.c **** /***********************************************************
300:UIMgr.c **** Function Name: UIMgr_executeCmd
301:UIMgr.c **** Function Description: This function is responsible for
302:UIMgr.c **** executing whatever cmd is stored in the receivedCmd
303:UIMgr.c **** object.
304:UIMgr.c **** Inputs: none
GAS LISTING /tmp/cc2L16GD.s page 8
 
 
305:UIMgr.c **** Outputs: none
306:UIMgr.c **** ***********************************************************/
307:UIMgr.c **** static void UIMgr_executeCmd(void)
308:UIMgr.c **** {
309:UIMgr.c **** unsigned char i,eepromData, num_writes=0;
310:UIMgr.c **** unsigned char *pData;
311:UIMgr.c **** unsigned char eeprom_write_succeeded = FALSE;
312:UIMgr.c **** #if DEBUG_COLOR_MAP
313:UIMgr.c **** unsigned char asciiBuffer[5];
314:UIMgr.c **** #endif
315:UIMgr.c ****
316:UIMgr.c **** if (receivedCmd == pingCmd)
317:UIMgr.c **** {
318:UIMgr.c **** }
319:UIMgr.c **** else if (receivedCmd == getVersionCmd)
320:UIMgr.c **** {
321:UIMgr.c **** pData = AVRcamVersion;
322:UIMgr.c **** while(*pData != 0)
323:UIMgr.c **** {
324:UIMgr.c **** UIMgr_writeTxFifo(*pData++);
325:UIMgr.c **** }
326:UIMgr.c **** }
327:UIMgr.c **** else if (receivedCmd == resetCameraCmd)
328:UIMgr.c **** {
329:UIMgr.c **** CamInt_resetCam();
330:UIMgr.c **** }
331:UIMgr.c **** else if (receivedCmd == dumpFrameCmd)
332:UIMgr.c **** {
333:UIMgr.c **** /* publish the event that will indicate that
334:UIMgr.c **** a request has come to dump a frame...this will
335:UIMgr.c **** be received by the FrameMgr, which will begin
336:UIMgr.c **** dumping the frame...a short delay is needed
337:UIMgr.c **** here to keep the Java demo app happy (sometimes
338:UIMgr.c **** it wouldn't be able to receive the serial data
339:UIMgr.c **** as quickly as AVRcam can provide it). */
340:UIMgr.c **** Utility_delay(100);
341:UIMgr.c **** PUBLISH_EVENT(EV_DUMP_FRAME);
342:UIMgr.c **** }
343:UIMgr.c **** else if (receivedCmd == setCameraRegsCmd)
344:UIMgr.c **** {
345:UIMgr.c **** /* we need to gather the tokens and
346:UIMgr.c **** build config cmds to be sent to the camera */
347:UIMgr.c **** for (i=1; i<tokenCount; i+=2) /* starts at 1 since first token
348:UIMgr.c **** is the CR cmd */
349:UIMgr.c **** {
350:UIMgr.c **** CamConfig_setCamReg(tokenBuffer[i],tokenBuffer[i+1]);
351:UIMgr.c **** }
352:UIMgr.c **** CamConfig_sendFifoCmds();
353:UIMgr.c **** }
354:UIMgr.c **** else if (receivedCmd == enableTrackingCmd)
355:UIMgr.c **** {
356:UIMgr.c **** /* publish the event...again with a short delay */
357:UIMgr.c **** Utility_delay(100);
358:UIMgr.c **** PUBLISH_EVENT(EV_ENABLE_TRACKING);
359:UIMgr.c **** }
360:UIMgr.c **** else if (receivedCmd == disableTrackingCmd)
361:UIMgr.c **** {
GAS LISTING /tmp/cc2L16GD.s page 9
 
 
362:UIMgr.c **** PUBLISH_EVENT(EV_DISABLE_TRACKING);
363:UIMgr.c **** }
364:UIMgr.c **** else if (receivedCmd == setColorMapCmd)
365:UIMgr.c **** {
366:UIMgr.c **** /* copy the received tokens into the color map */
367:UIMgr.c **** for (i=0; i<tokenCount; i++)
368:UIMgr.c **** {
369:UIMgr.c **** colorMap[i] = tokenBuffer[i+1];
370:UIMgr.c ****
371:UIMgr.c **** /* write each colorMap byte to EEPROM, but only those
372:UIMgr.c **** that changed...this will help reduce wear on the EEPROM */
373:UIMgr.c **** eepromData = eeprom_read_byte( (unsigned char*)(i+1));
374:UIMgr.c **** if (eepromData != colorMap[i])
375:UIMgr.c **** {
376:UIMgr.c **** /* need to actually perform the write because the
377:UIMgr.c **** data in eeprom is different than the current colorMap */
378:UIMgr.c **** eeprom_write_succeeded = FALSE;
379:UIMgr.c **** while(eeprom_write_succeeded == FALSE && num_writes < MAX_EEPROM_WRITE_ATTEMPTS)
380:UIMgr.c **** {
381:UIMgr.c **** eeprom_write_byte((unsigned char*)(i+1),colorMap[i]);
382:UIMgr.c **** num_writes++;
383:UIMgr.c **** eepromData = eeprom_read_byte( (unsigned char*)(i+1));
384:UIMgr.c **** if (eepromData == colorMap[i])
385:UIMgr.c **** {
386:UIMgr.c **** eeprom_write_succeeded = TRUE;
387:UIMgr.c **** }
388:UIMgr.c **** }
389:UIMgr.c **** num_writes = 0;
390:UIMgr.c **** }
391:UIMgr.c **** }
392:UIMgr.c ****
393:UIMgr.c **** #if DEBUG_COLOR_MAP
394:UIMgr.c **** /* for debugging...send out the entire color map */
395:UIMgr.c **** UIMgr_txBuffer("\r\n",2);
396:UIMgr.c **** for (i=0; i<NUM_ELEMENTS_IN_COLOR_MAP; i++)
397:UIMgr.c **** {
398:UIMgr.c **** memset(asciiBuffer,0x00,5);
399:UIMgr.c **** itoa(colorMap[i],asciiBuffer,10);
400:UIMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
401:UIMgr.c **** UIMgr_txBuffer(" ",1);
402:UIMgr.c **** if (i==15 || i == 31)
403:UIMgr.c **** {
404:UIMgr.c **** /* break up the output */
405:UIMgr.c **** UIMgr_txBuffer("\r\n",2);
406:UIMgr.c **** }
407:UIMgr.c **** }
408:UIMgr.c **** #endif
409:UIMgr.c **** }
410:UIMgr.c **** }
411:UIMgr.c ****
412:UIMgr.c **** /***********************************************************
413:UIMgr.c **** Function Name: UIMgr_convertTokenToValue
414:UIMgr.c **** Function Description: This function is responsible for
415:UIMgr.c **** converting a received token to a hex value It will
416:UIMgr.c **** access the asciiTokenBuffer directly, and store the
417:UIMgr.c **** result in the appropriate token buffer.
418:UIMgr.c **** Inputs: none
GAS LISTING /tmp/cc2L16GD.s page 10
 
 
419:UIMgr.c **** Outputs: none
420:UIMgr.c **** ***********************************************************/
421:UIMgr.c **** static void UIMgr_convertTokenToValue(void)
422:UIMgr.c **** {
423:UIMgr.c **** unsigned int newValue;
424:UIMgr.c ****
425:UIMgr.c **** newValue = atoi(asciiTokenBuffer);
426:UIMgr.c **** if (newValue > 255)
427:UIMgr.c **** {
428:UIMgr.c **** /* the value is too large */
429:UIMgr.c **** receivedCmd = invalidCmd;
430:UIMgr.c **** tokenBuffer[tokenCount] = 0xFF; /* to indicate an error */
431:UIMgr.c **** }
432:UIMgr.c **** else
433:UIMgr.c **** {
434:UIMgr.c **** /* copy the value into the tokenBuffer */
435:UIMgr.c **** tokenBuffer[tokenCount] = newValue;
436:UIMgr.c **** }
437:UIMgr.c **** memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH);
438:UIMgr.c **** charIndex = 0;
439:UIMgr.c **** charCount = 0;
440:UIMgr.c **** }
441:UIMgr.c **** /***********************************************************
442:UIMgr.c **** Function Name: UIMgr_convertTokenToCmd
443:UIMgr.c **** Function Description: This function is responsible for
444:UIMgr.c **** parsing a received 2-character command. It will
445:UIMgr.c **** access the asciiTokenBuffer directly.
446:UIMgr.c **** Inputs: none
447:UIMgr.c **** Outputs: none
448:UIMgr.c **** ***********************************************************/
449:UIMgr.c **** static void UIMgr_convertTokenToCmd(void)
450:UIMgr.c **** {
451:UIMgr.c **** if ( (asciiTokenBuffer[0] == 'P') &&
452:UIMgr.c **** (asciiTokenBuffer[1] == 'G') )
453:UIMgr.c **** {
454:UIMgr.c **** /* we got a "ping" command...but we still need to see
455:UIMgr.c **** if we are going to get the \r */
456:UIMgr.c **** receivedCmd = pingCmd;
457:UIMgr.c **** }
458:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'G') &&
459:UIMgr.c **** (asciiTokenBuffer[1] == 'V') )
460:UIMgr.c **** {
461:UIMgr.c **** /* we got the "get version" command */
462:UIMgr.c **** receivedCmd = getVersionCmd;
463:UIMgr.c **** }
464:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'D') &&
465:UIMgr.c **** (asciiTokenBuffer[1] == 'F') )
466:UIMgr.c **** {
467:UIMgr.c **** /* we should go into frame dump mode */
468:UIMgr.c **** receivedCmd = dumpFrameCmd;
469:UIMgr.c **** }
470:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'C') &&
471:UIMgr.c **** (asciiTokenBuffer[1] == 'R') )
472:UIMgr.c **** {
473:UIMgr.c **** /* the user wants to set registers in the OV6620 */
474:UIMgr.c **** receivedCmd = setCameraRegsCmd;
475:UIMgr.c **** }
GAS LISTING /tmp/cc2L16GD.s page 11
 
 
476:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'E') &&
477:UIMgr.c **** (asciiTokenBuffer[1] == 'T') )
478:UIMgr.c **** {
479:UIMgr.c **** /* the user wants to enable tracking */
480:UIMgr.c **** receivedCmd = enableTrackingCmd;
481:UIMgr.c **** }
482:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'S') &&
483:UIMgr.c **** (asciiTokenBuffer[1] == 'M') )
484:UIMgr.c **** {
485:UIMgr.c **** /* the user wants to set the color map */
486:UIMgr.c **** receivedCmd = setColorMapCmd;
487:UIMgr.c **** }
488:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'D') &&
489:UIMgr.c **** (asciiTokenBuffer[1] == 'T') )
490:UIMgr.c **** {
491:UIMgr.c **** receivedCmd = disableTrackingCmd;
492:UIMgr.c **** }
493:UIMgr.c **** else if ( (asciiTokenBuffer[0] == 'R') &&
494:UIMgr.c **** (asciiTokenBuffer[1] == 'S') )
495:UIMgr.c **** {
496:UIMgr.c **** receivedCmd = resetCameraCmd;
497:UIMgr.c **** }
498:UIMgr.c **** else
499:UIMgr.c **** {
500:UIMgr.c **** /* don't recognize the cmd */
501:UIMgr.c **** receivedCmd = invalidCmd;
502:UIMgr.c **** }
503:UIMgr.c **** memset(asciiTokenBuffer,0x00,MAX_TOKEN_LENGTH);
504:UIMgr.c **** charIndex = 0;
505:UIMgr.c **** charCount = 0;
506:UIMgr.c **** }
507:UIMgr.c **** /***********************************************************
508:UIMgr.c **** Function Name: UIMgr_sendAck
509:UIMgr.c **** Function Description: This function is responsible for
510:UIMgr.c **** queuing up an ACK to be sent to the user.
511:UIMgr.c **** Inputs: none
512:UIMgr.c **** Outputs: none
513:UIMgr.c **** ***********************************************************/
514:UIMgr.c **** static void UIMgr_sendAck(void)
515:UIMgr.c **** {
516:UIMgr.c **** UIMgr_writeTxFifo('A');
517:UIMgr.c **** UIMgr_writeTxFifo('C');
518:UIMgr.c **** UIMgr_writeTxFifo('K');
519:UIMgr.c **** UIMgr_writeTxFifo('\r');
520:UIMgr.c **** }
521:UIMgr.c ****
522:UIMgr.c **** /***********************************************************
523:UIMgr.c **** Function Name: UIMgr_sendNck
524:UIMgr.c **** Function Description: This function is responsible for
525:UIMgr.c **** queueing up an NCK to be sent to the user.
526:UIMgr.c **** Inputs: none
527:UIMgr.c **** Outputs: none
528:UIMgr.c **** ***********************************************************/
529:UIMgr.c **** static void UIMgr_sendNck(void)
530:UIMgr.c **** {
531:UIMgr.c **** UIMgr_writeTxFifo('N');
532:UIMgr.c **** UIMgr_writeTxFifo('C');
GAS LISTING /tmp/cc2L16GD.s page 12
 
 
533:UIMgr.c **** UIMgr_writeTxFifo('K');
534:UIMgr.c **** UIMgr_writeTxFifo('\r');
535:UIMgr.c **** }
536:UIMgr.c ****
537:UIMgr.c ****
538:UIMgr.c **** /***********************************************************
539:UIMgr.c **** Function Name: UIMgr_writeBufferToTxFifo
540:UIMgr.c **** Function Description: This function is responsible for
541:UIMgr.c **** placing "length" bytes into the tx FIFO.
542:UIMgr.c **** Inputs: pData - a pointer to the data to send
543:UIMgr.c **** length - the number of bytes to send
544:UIMgr.c **** Outputs: none
545:UIMgr.c **** ***********************************************************/
546:UIMgr.c **** void UIMgr_writeBufferToTxFifo(unsigned char *pData, unsigned char length)
547:UIMgr.c **** {
96 .stabn 68,0,547,.LM0-UIMgr_writeBufferToTxFifo
97 .LM0:
98 /* prologue: frame size=0 */
99 /* prologue end (size=0) */
100 0000 DC01 movw r26,r24
101 0002 862F mov r24,r22
548:UIMgr.c **** unsigned char tmpHead;
549:UIMgr.c **** if (length == 0)
102 .stabn 68,0,549,.LM1-UIMgr_writeBufferToTxFifo
103 .LM1:
104 0004 6623 tst r22
105 0006 C9F0 breq .L7
550:UIMgr.c **** {
551:UIMgr.c **** return;
552:UIMgr.c **** }
553:UIMgr.c ****
554:UIMgr.c **** DISABLE_INTS();
106 .stabn 68,0,554,.LM2-UIMgr_writeBufferToTxFifo
107 .LM2:
108 /* #APP */
109 0008 F894 cli
555:UIMgr.c **** while(length-- != 0)
110 .stabn 68,0,555,.LM3-UIMgr_writeBufferToTxFifo
111 .LM3:
112 /* #NOAPP */
113 000a 6150 subi r22,lo8(-(-1))
114 000c 6F3F cpi r22,lo8(-1)
115 000e A1F0 breq .L4
116 0010 262F mov r18,r22
117 0012 40E0 ldi r20,lo8(UIMgr_txFifo)
118 0014 50E0 ldi r21,hi8(UIMgr_txFifo)
119 0016 861B sub r24,r22
120 0018 682F mov r22,r24
121 001a 6250 subi r22,lo8(-(-2))
122 .L6:
556:UIMgr.c **** {
557:UIMgr.c **** UIMgr_txFifo[UIMgr_txFifoHead] = *pData++;
123 .stabn 68,0,557,.LM4-UIMgr_writeBufferToTxFifo
124 .LM4:
125 001c 8091 0000 lds r24,UIMgr_txFifoHead
126 0020 FA01 movw r30,r20
127 0022 E80F add r30,r24
GAS LISTING /tmp/cc2L16GD.s page 13
 
 
128 0024 F11D adc r31,__zero_reg__
129 0026 9D91 ld r25,X+
130 0028 9083 st Z,r25
558:UIMgr.c ****
559:UIMgr.c **** /* now move the head up */
560:UIMgr.c **** tmpHead = (UIMgr_txFifoHead + 1) & (UI_MGR_TX_FIFO_MASK);
561:UIMgr.c **** UIMgr_txFifoHead = tmpHead;
131 .stabn 68,0,561,.LM5-UIMgr_writeBufferToTxFifo
132 .LM5:
133 002a 8F5F subi r24,lo8(-(1))
134 002c 8F73 andi r24,lo8(63)
135 002e 8093 0000 sts UIMgr_txFifoHead,r24
136 .stabn 68,0,555,.LM6-UIMgr_writeBufferToTxFifo
137 .LM6:
138 0032 2150 subi r18,lo8(-(-1))
139 0034 6217 cp r22,r18
140 0036 91F7 brne .L6
141 .L4:
562:UIMgr.c **** }
563:UIMgr.c **** ENABLE_INTS();
142 .stabn 68,0,563,.LM7-UIMgr_writeBufferToTxFifo
143 .LM7:
144 /* #APP */
145 0038 7894 sei
146 /* #NOAPP */
147 .L7:
148 003a 0895 ret
149 /* epilogue: frame size=0 */
150 /* epilogue: noreturn */
151 /* epilogue end (size=0) */
152 /* function UIMgr_writeBufferToTxFifo size 32 (32) */
153 .size UIMgr_writeBufferToTxFifo, .-UIMgr_writeBufferToTxFifo
154 .Lscope0:
155 .stabs "",36,0,0,.Lscope0-UIMgr_writeBufferToTxFifo
156 .stabd 78,0,0
157 .stabs "UIMgr_readTxFifo:f(0,11)",36,0,630,UIMgr_readTxFifo
158 .type UIMgr_readTxFifo, @function
159 UIMgr_readTxFifo:
160 .stabd 46,0,0
564:UIMgr.c **** }
565:UIMgr.c ****
566:UIMgr.c **** /***********************************************************
567:UIMgr.c **** Function Name: UIMgr_txBuffer
568:UIMgr.c **** Function Description: This function is responsible for
569:UIMgr.c **** sending 'length' bytes out using the UartInterface
570:UIMgr.c **** module.
571:UIMgr.c **** Inputs: pData - a pointer to the data to send
572:UIMgr.c **** length - the number of bytes to send
573:UIMgr.c **** Outputs: none
574:UIMgr.c **** ***********************************************************/
575:UIMgr.c **** void UIMgr_txBuffer(unsigned char *pData, unsigned char length)
576:UIMgr.c **** {
577:UIMgr.c **** while(length-- != 0)
578:UIMgr.c **** {
579:UIMgr.c **** UartInt_txByte(*pData++);
580:UIMgr.c **** }
581:UIMgr.c **** }
GAS LISTING /tmp/cc2L16GD.s page 14
 
 
582:UIMgr.c ****
583:UIMgr.c **** /***********************************************************
584:UIMgr.c **** Function Name: UIMgr_flushTxBuffer
585:UIMgr.c **** Function Description: This function is responsible for
586:UIMgr.c **** sending all data currently in the serial tx buffer
587:UIMgr.c **** to the user.
588:UIMgr.c **** Inputs: none
589:UIMgr.c **** Outputs: none
590:UIMgr.c **** ***********************************************************/
591:UIMgr.c **** void UIMgr_flushTxBuffer(void)
592:UIMgr.c **** {
593:UIMgr.c **** while(IS_DATA_IN_TX_FIFO() == TRUE)
594:UIMgr.c **** {
595:UIMgr.c **** UartInt_txByte(UIMgr_readTxFifo() );
596:UIMgr.c **** }
597:UIMgr.c **** }
598:UIMgr.c ****
599:UIMgr.c **** /***********************************************************
600:UIMgr.c **** Function Name: UIMgr_readRxFifo
601:UIMgr.c **** Function Description: This function is responsible for
602:UIMgr.c **** reading a single byte of data from the rx fifo, and
603:UIMgr.c **** updating the appropriate pointers.
604:UIMgr.c **** Inputs: none
605:UIMgr.c **** Outputs: unsigned char-the data read
606:UIMgr.c **** ***********************************************************/
607:UIMgr.c **** static unsigned char UIMgr_readRxFifo(void)
608:UIMgr.c **** {
609:UIMgr.c **** unsigned char dataByte, tmpTail;
610:UIMgr.c ****
611:UIMgr.c **** /* just return the current tail from the rx fifo */
612:UIMgr.c **** DISABLE_INTS();
613:UIMgr.c **** dataByte = UIMgr_rxFifo[UIMgr_rxFifoTail];
614:UIMgr.c **** tmpTail = (UIMgr_rxFifoTail+1) & (UI_MGR_RX_FIFO_MASK);
615:UIMgr.c **** UIMgr_rxFifoTail = tmpTail;
616:UIMgr.c **** ENABLE_INTS();
617:UIMgr.c ****
618:UIMgr.c **** return(dataByte);
619:UIMgr.c **** }
620:UIMgr.c ****
621:UIMgr.c **** /***********************************************************
622:UIMgr.c **** Function Name: UIMgr_readTxFifo
623:UIMgr.c **** Function Description: This function is responsible for
624:UIMgr.c **** reading a single byte of data from the tx fifo, and
625:UIMgr.c **** updating the appropriate pointers.
626:UIMgr.c **** Inputs: none
627:UIMgr.c **** Outputs: unsigned char-the data read
628:UIMgr.c **** ***********************************************************/
629:UIMgr.c **** static unsigned char UIMgr_readTxFifo(void)
630:UIMgr.c **** {
161 .stabn 68,0,630,.LM8-UIMgr_readTxFifo
162 .LM8:
163 /* prologue: frame size=0 */
164 /* prologue end (size=0) */
631:UIMgr.c **** unsigned char dataByte, tmpTail;
632:UIMgr.c ****
633:UIMgr.c **** /* just return the current tail from the tx fifo */
634:UIMgr.c **** DISABLE_INTS();
GAS LISTING /tmp/cc2L16GD.s page 15
 
 
165 .stabn 68,0,634,.LM9-UIMgr_readTxFifo
166 .LM9:
167 /* #APP */
168 003c F894 cli
635:UIMgr.c **** dataByte = UIMgr_txFifo[UIMgr_txFifoTail];
169 .stabn 68,0,635,.LM10-UIMgr_readTxFifo
170 .LM10:
171 /* #NOAPP */
172 003e 9091 0000 lds r25,UIMgr_txFifoTail
173 0042 E0E0 ldi r30,lo8(UIMgr_txFifo)
174 0044 F0E0 ldi r31,hi8(UIMgr_txFifo)
175 0046 E90F add r30,r25
176 0048 F11D adc r31,__zero_reg__
177 004a 8081 ld r24,Z
636:UIMgr.c **** tmpTail = (UIMgr_txFifoTail+1) & (UI_MGR_TX_FIFO_MASK);
637:UIMgr.c **** UIMgr_txFifoTail = tmpTail;
178 .stabn 68,0,637,.LM11-UIMgr_readTxFifo
179 .LM11:
180 004c 9F5F subi r25,lo8(-(1))
181 004e 9F73 andi r25,lo8(63)
182 0050 9093 0000 sts UIMgr_txFifoTail,r25
638:UIMgr.c **** ENABLE_INTS();
183 .stabn 68,0,638,.LM12-UIMgr_readTxFifo
184 .LM12:
185 /* #APP */
186 0054 7894 sei
639:UIMgr.c ****
640:UIMgr.c **** return(dataByte);
641:UIMgr.c **** }
187 .stabn 68,0,641,.LM13-UIMgr_readTxFifo
188 .LM13:
189 /* #NOAPP */
190 0056 9927 clr r25
191 /* epilogue: frame size=0 */
192 0058 0895 ret
193 /* epilogue end (size=1) */
194 /* function UIMgr_readTxFifo size 17 (16) */
195 .size UIMgr_readTxFifo, .-UIMgr_readTxFifo
196 .stabs "dataByte:r(0,11)",64,0,631,24
197 .stabn 192,0,0,UIMgr_readTxFifo-UIMgr_readTxFifo
198 .stabn 224,0,0,.Lscope1-UIMgr_readTxFifo
199 .Lscope1:
200 .stabs "",36,0,0,.Lscope1-UIMgr_readTxFifo
201 .stabd 78,0,0
202 .stabs "UIMgr_writeTxFifo:F(0,15)",36,0,652,UIMgr_writeTxFifo
203 .stabs "data:P(0,11)",64,0,651,24
204 .global UIMgr_writeTxFifo
205 .type UIMgr_writeTxFifo, @function
206 UIMgr_writeTxFifo:
207 .stabd 46,0,0
642:UIMgr.c ****
643:UIMgr.c **** /***********************************************************
644:UIMgr.c **** Function Name: UIMgr_writeTxFifo
645:UIMgr.c **** Function Description: This function is responsible for
646:UIMgr.c **** writing a single byte to the TxFifo and
647:UIMgr.c **** updating the appropriate pointers.
648:UIMgr.c **** Inputs: data - the byte to write to the Fifo
GAS LISTING /tmp/cc2L16GD.s page 16
 
 
649:UIMgr.c **** Outputs: none
650:UIMgr.c **** ***********************************************************/
651:UIMgr.c **** void UIMgr_writeTxFifo(unsigned char data)
652:UIMgr.c **** {
208 .stabn 68,0,652,.LM14-UIMgr_writeTxFifo
209 .LM14:
210 /* prologue: frame size=0 */
211 /* prologue end (size=0) */
653:UIMgr.c **** unsigned char tmpHead;
654:UIMgr.c ****
655:UIMgr.c **** DISABLE_INTS();
212 .stabn 68,0,655,.LM15-UIMgr_writeTxFifo
213 .LM15:
214 /* #APP */
215 005a F894 cli
656:UIMgr.c **** UIMgr_txFifo[UIMgr_txFifoHead] = data;
216 .stabn 68,0,656,.LM16-UIMgr_writeTxFifo
217 .LM16:
218 /* #NOAPP */
219 005c 9091 0000 lds r25,UIMgr_txFifoHead
220 0060 E0E0 ldi r30,lo8(UIMgr_txFifo)
221 0062 F0E0 ldi r31,hi8(UIMgr_txFifo)
222 0064 E90F add r30,r25
223 0066 F11D adc r31,__zero_reg__
224 0068 8083 st Z,r24
657:UIMgr.c ****
658:UIMgr.c **** /* now move the head up */
659:UIMgr.c **** tmpHead = (UIMgr_txFifoHead + 1) & (UI_MGR_TX_FIFO_MASK);
660:UIMgr.c **** UIMgr_txFifoHead = tmpHead;
225 .stabn 68,0,660,.LM17-UIMgr_writeTxFifo
226 .LM17:
227 006a 9F5F subi r25,lo8(-(1))
228 006c 9F73 andi r25,lo8(63)
229 006e 9093 0000 sts UIMgr_txFifoHead,r25
661:UIMgr.c **** ENABLE_INTS();
230 .stabn 68,0,661,.LM18-UIMgr_writeTxFifo
231 .LM18:
232 /* #APP */
233 0072 7894 sei
234 /* #NOAPP */
235 /* epilogue: frame size=0 */
236 0074 0895 ret
237 /* epilogue end (size=1) */
238 /* function UIMgr_writeTxFifo size 16 (15) */
239 .size UIMgr_writeTxFifo, .-UIMgr_writeTxFifo
240 .Lscope2:
241 .stabs "",36,0,0,.Lscope2-UIMgr_writeTxFifo
242 .stabd 78,0,0
243 .stabs "UIMgr_flushTxBuffer:F(0,15)",36,0,592,UIMgr_flushTxBuffer
244 .global UIMgr_flushTxBuffer
245 .type UIMgr_flushTxBuffer, @function
246 UIMgr_flushTxBuffer:
247 .stabd 46,0,0
248 .stabn 68,0,592,.LM19-UIMgr_flushTxBuffer
249 .LM19:
250 /* prologue: frame size=0 */
251 /* prologue end (size=0) */
GAS LISTING /tmp/cc2L16GD.s page 17
 
 
252 .stabn 68,0,593,.LM20-UIMgr_flushTxBuffer
253 .LM20:
254 0076 9091 0000 lds r25,UIMgr_txFifoHead
255 007a 8091 0000 lds r24,UIMgr_txFifoTail
256 007e 9817 cp r25,r24
257 0080 41F0 breq .L16
258 .L17:
259 .stabn 68,0,595,.LM21-UIMgr_flushTxBuffer
260 .LM21:
261 0082 DCDF rcall UIMgr_readTxFifo
262 0084 00D0 rcall UartInt_txByte
263 .stabn 68,0,593,.LM22-UIMgr_flushTxBuffer
264 .LM22:
265 0086 9091 0000 lds r25,UIMgr_txFifoHead
266 008a 8091 0000 lds r24,UIMgr_txFifoTail
267 008e 9817 cp r25,r24
268 0090 C1F7 brne .L17
269 .L16:
270 0092 0895 ret
271 /* epilogue: frame size=0 */
272 /* epilogue: noreturn */
273 /* epilogue end (size=0) */
274 /* function UIMgr_flushTxBuffer size 15 (15) */
275 .size UIMgr_flushTxBuffer, .-UIMgr_flushTxBuffer
276 .Lscope3:
277 .stabs "",36,0,0,.Lscope3-UIMgr_flushTxBuffer
278 .stabd 78,0,0
279 .stabs "UIMgr_txBuffer:F(0,15)",36,0,576,UIMgr_txBuffer
280 .stabs "pData:P(0,20)",64,0,575,28
281 .stabs "length:P(0,11)",64,0,575,24
282 .global UIMgr_txBuffer
283 .type UIMgr_txBuffer, @function
284 UIMgr_txBuffer:
285 .stabd 46,0,0
286 .stabn 68,0,576,.LM23-UIMgr_txBuffer
287 .LM23:
288 /* prologue: frame size=0 */
289 0094 0F93 push r16
290 0096 1F93 push r17
291 0098 CF93 push r28
292 009a DF93 push r29
293 /* prologue end (size=4) */
294 009c EC01 movw r28,r24
295 009e 862F mov r24,r22
296 .stabn 68,0,577,.LM24-UIMgr_txBuffer
297 .LM24:
298 00a0 6150 subi r22,lo8(-(-1))
299 00a2 6F3F cpi r22,lo8(-1)
300 00a4 49F0 breq .L23
301 .stabn 68,0,577,.LM25-UIMgr_txBuffer
302 .LM25:
303 00a6 162F mov r17,r22
304 00a8 861B sub r24,r22
305 00aa 082F mov r16,r24
306 00ac 0250 subi r16,lo8(-(-2))
307 .L22:
308 .stabn 68,0,579,.LM26-UIMgr_txBuffer
GAS LISTING /tmp/cc2L16GD.s page 18
 
 
309 .LM26:
310 00ae 8991 ld r24,Y+
311 00b0 00D0 rcall UartInt_txByte
312 .stabn 68,0,577,.LM27-UIMgr_txBuffer
313 .LM27:
314 00b2 1150 subi r17,lo8(-(-1))
315 00b4 0117 cp r16,r17
316 00b6 D9F7 brne .L22
317 .L23:
318 /* epilogue: frame size=0 */
319 00b8 DF91 pop r29
320 00ba CF91 pop r28
321 00bc 1F91 pop r17
322 00be 0F91 pop r16
323 00c0 0895 ret
324 /* epilogue end (size=5) */
325 /* function UIMgr_txBuffer size 23 (14) */
326 .size UIMgr_txBuffer, .-UIMgr_txBuffer
327 .Lscope4:
328 .stabs "",36,0,0,.Lscope4-UIMgr_txBuffer
329 .stabd 78,0,0
330 .stabs "UIMgr_transmitPendingData:F(0,15)",36,0,178,UIMgr_transmitPendingData
331 .global UIMgr_transmitPendingData
332 .type UIMgr_transmitPendingData, @function
333 UIMgr_transmitPendingData:
334 .stabd 46,0,0
335 .stabn 68,0,178,.LM28-UIMgr_transmitPendingData
336 .LM28:
337 /* prologue: frame size=0 */
338 /* prologue end (size=0) */
339 .stabn 68,0,179,.LM29-UIMgr_transmitPendingData
340 .LM29:
341 00c2 9091 0000 lds r25,UIMgr_txFifoHead
342 00c6 8091 0000 lds r24,UIMgr_txFifoTail
343 00ca 9817 cp r25,r24
344 00cc 11F0 breq .L28
345 .stabn 68,0,182,.LM30-UIMgr_transmitPendingData
346 .LM30:
347 00ce B6DF rcall UIMgr_readTxFifo
348 00d0 00D0 rcall UartInt_txByte
349 .L28:
350 00d2 0895 ret
351 /* epilogue: frame size=0 */
352 /* epilogue: noreturn */
353 /* epilogue end (size=0) */
354 /* function UIMgr_transmitPendingData size 9 (9) */
355 .size UIMgr_transmitPendingData, .-UIMgr_transmitPendingData
356 .Lscope5:
357 .stabs "",36,0,0,.Lscope5-UIMgr_transmitPendingData
358 .stabd 78,0,0
359 .stabs "UIMgr_convertTokenToCmd:f(0,15)",36,0,450,UIMgr_convertTokenToCmd
360 .type UIMgr_convertTokenToCmd, @function
361 UIMgr_convertTokenToCmd:
362 .stabd 46,0,0
363 .stabn 68,0,450,.LM31-UIMgr_convertTokenToCmd
364 .LM31:
365 /* prologue: frame size=0 */
GAS LISTING /tmp/cc2L16GD.s page 19
 
 
366 /* prologue end (size=0) */
367 .stabn 68,0,451,.LM32-UIMgr_convertTokenToCmd
368 .LM32:
369 00d4 9091 0000 lds r25,asciiTokenBuffer
370 00d8 9035 cpi r25,lo8(80)
371 00da 41F4 brne .L30
372 .stabn 68,0,451,.LM33-UIMgr_convertTokenToCmd
373 .LM33:
374 00dc 8091 0000 lds r24,asciiTokenBuffer+1
375 00e0 8734 cpi r24,lo8(71)
376 00e2 09F5 brne .L32
377 .stabn 68,0,456,.LM34-UIMgr_convertTokenToCmd
378 .LM34:
379 00e4 81E0 ldi r24,lo8(1)
380 00e6 8093 0000 sts receivedCmd,r24
381 00ea 48C0 rjmp .L34
382 .L30:
383 .stabn 68,0,458,.LM35-UIMgr_convertTokenToCmd
384 .LM35:
385 00ec 9734 cpi r25,lo8(71)
386 00ee 39F4 brne .L35
387 00f0 8091 0000 lds r24,asciiTokenBuffer+1
388 00f4 8635 cpi r24,lo8(86)
389 00f6 09F5 brne .L37
390 .stabn 68,0,462,.LM36-UIMgr_convertTokenToCmd
391 .LM36:
392 00f8 1092 0000 sts receivedCmd,__zero_reg__
393 00fc 3FC0 rjmp .L34
394 .L35:
395 .stabn 68,0,464,.LM37-UIMgr_convertTokenToCmd
396 .LM37:
397 00fe 9434 cpi r25,lo8(68)
398 0100 41F4 brne .L39
399 0102 8091 0000 lds r24,asciiTokenBuffer+1
400 0106 8634 cpi r24,lo8(70)
401 0108 11F5 brne .L41
402 .stabn 68,0,468,.LM38-UIMgr_convertTokenToCmd
403 .LM38:
404 010a 83E0 ldi r24,lo8(3)
405 010c 8093 0000 sts receivedCmd,r24
406 0110 35C0 rjmp .L34
407 .L39:
408 .stabn 68,0,470,.LM39-UIMgr_convertTokenToCmd
409 .LM39:
410 0112 9334 cpi r25,lo8(67)
411 0114 41F4 brne .L32
412 0116 8091 0000 lds r24,asciiTokenBuffer+1
413 011a 8235 cpi r24,lo8(82)
414 011c 11F5 brne .L44
415 .stabn 68,0,474,.LM40-UIMgr_convertTokenToCmd
416 .LM40:
417 011e 82E0 ldi r24,lo8(2)
418 0120 8093 0000 sts receivedCmd,r24
419 0124 2BC0 rjmp .L34
420 .L32:
421 .stabn 68,0,476,.LM41-UIMgr_convertTokenToCmd
422 .LM41:
GAS LISTING /tmp/cc2L16GD.s page 20
 
 
423 0126 9534 cpi r25,lo8(69)
424 0128 41F4 brne .L37
425 012a 8091 0000 lds r24,asciiTokenBuffer+1
426 012e 8435 cpi r24,lo8(84)
427 0130 11F5 brne .L47
428 .stabn 68,0,480,.LM42-UIMgr_convertTokenToCmd
429 .LM42:
430 0132 84E0 ldi r24,lo8(4)
431 0134 8093 0000 sts receivedCmd,r24
432 0138 21C0 rjmp .L34
433 .L37:
434 .stabn 68,0,482,.LM43-UIMgr_convertTokenToCmd
435 .LM43:
436 013a 9335 cpi r25,lo8(83)
437 013c 41F4 brne .L41
438 013e 8091 0000 lds r24,asciiTokenBuffer+1
439 0142 8D34 cpi r24,lo8(77)
440 0144 C1F4 brne .L47
441 .stabn 68,0,486,.LM44-UIMgr_convertTokenToCmd
442 .LM44:
443 0146 86E0 ldi r24,lo8(6)
444 0148 8093 0000 sts receivedCmd,r24
445 014c 17C0 rjmp .L34
446 .L41:
447 .stabn 68,0,488,.LM45-UIMgr_convertTokenToCmd
448 .LM45:
449 014e 9434 cpi r25,lo8(68)
450 0150 41F4 brne .L44
451 0152 8091 0000 lds r24,asciiTokenBuffer+1
452 0156 8435 cpi r24,lo8(84)
453 0158 71F4 brne .L47
454 .stabn 68,0,491,.LM46-UIMgr_convertTokenToCmd
455 .LM46:
456 015a 85E0 ldi r24,lo8(5)
457 015c 8093 0000 sts receivedCmd,r24
458 0160 0DC0 rjmp .L34
459 .L44:
460 .stabn 68,0,493,.LM47-UIMgr_convertTokenToCmd
461 .LM47:
462 0162 9235 cpi r25,lo8(82)
463 0164 41F4 brne .L47
464 0166 8091 0000 lds r24,asciiTokenBuffer+1
465 016a 8335 cpi r24,lo8(83)
466 016c 21F4 brne .L47
467 .stabn 68,0,496,.LM48-UIMgr_convertTokenToCmd
468 .LM48:
469 016e 87E0 ldi r24,lo8(7)
470 0170 8093 0000 sts receivedCmd,r24
471 0174 03C0 rjmp .L34
472 .L47:
473 .stabn 68,0,501,.LM49-UIMgr_convertTokenToCmd
474 .LM49:
475 0176 89E0 ldi r24,lo8(9)
476 0178 8093 0000 sts receivedCmd,r24
477 .L34:
478 .stabn 68,0,503,.LM50-UIMgr_convertTokenToCmd
479 .LM50:
GAS LISTING /tmp/cc2L16GD.s page 21
 
 
480 017c 83E0 ldi r24,lo8(3)
481 017e E0E0 ldi r30,lo8(asciiTokenBuffer)
482 0180 F0E0 ldi r31,hi8(asciiTokenBuffer)
483 0182 1192 st Z+,__zero_reg__
484 0184 8A95 dec r24
485 0186 E9F7 brne .-6
486 .stabn 68,0,504,.LM51-UIMgr_convertTokenToCmd
487 .LM51:
488 0188 1092 0000 sts charIndex,__zero_reg__
489 .stabn 68,0,505,.LM52-UIMgr_convertTokenToCmd
490 .LM52:
491 018c 1092 0000 sts charCount,__zero_reg__
492 /* epilogue: frame size=0 */
493 0190 0895 ret
494 /* epilogue end (size=1) */
495 /* function UIMgr_convertTokenToCmd size 95 (94) */
496 .size UIMgr_convertTokenToCmd, .-UIMgr_convertTokenToCmd
497 .Lscope6:
498 .stabs "",36,0,0,.Lscope6-UIMgr_convertTokenToCmd
499 .stabd 78,0,0
500 .stabs "UIMgr_init:F(0,15)",36,0,137,UIMgr_init
501 .global UIMgr_init
502 .type UIMgr_init, @function
503 UIMgr_init:
504 .stabd 46,0,0
505 .stabn 68,0,137,.LM53-UIMgr_init
506 .LM53:
507 /* prologue: frame size=0 */
508 /* prologue end (size=0) */
509 .stabn 68,0,138,.LM54-UIMgr_init
510 .LM54:
511 0192 1092 0000 sts asciiTokenBuffer,__zero_reg__
512 0196 1092 0000 sts (asciiTokenBuffer)+1,__zero_reg__
513 019a 1092 0000 sts (asciiTokenBuffer)+2,__zero_reg__
514 019e 1092 0000 sts (asciiTokenBuffer)+3,__zero_reg__
515 .stabn 68,0,139,.LM55-UIMgr_init
516 .LM55:
517 01a2 80E4 ldi r24,lo8(64)
518 01a4 E0E0 ldi r30,lo8(tokenBuffer)
519 01a6 F0E0 ldi r31,hi8(tokenBuffer)
520 01a8 982F mov r25,r24
521 01aa 1192 st Z+,__zero_reg__
522 01ac 9A95 dec r25
523 01ae E9F7 brne .-6
524 .stabn 68,0,140,.LM56-UIMgr_init
525 .LM56:
526 01b0 E0E0 ldi r30,lo8(UIMgr_txFifo)
527 01b2 F0E0 ldi r31,hi8(UIMgr_txFifo)
528 01b4 1192 st Z+,__zero_reg__
529 01b6 8A95 dec r24
530 01b8 E9F7 brne .-6
531 .stabn 68,0,141,.LM57-UIMgr_init
532 .LM57:
533 01ba 80E2 ldi r24,lo8(32)
534 01bc E0E0 ldi r30,lo8(UIMgr_rxFifo)
535 01be F0E0 ldi r31,hi8(UIMgr_rxFifo)
536 01c0 1192 st Z+,__zero_reg__
GAS LISTING /tmp/cc2L16GD.s page 22
 
 
537 01c2 8A95 dec r24
538 01c4 E9F7 brne .-6
539 /* epilogue: frame size=0 */
540 01c6 0895 ret
541 /* epilogue end (size=1) */
542 /* function UIMgr_init size 27 (26) */
543 .size UIMgr_init, .-UIMgr_init
544 .Lscope7:
545 .stabs "",36,0,0,.Lscope7-UIMgr_init
546 .stabd 78,0,0
547 .stabs "UIMgr_convertTokenToValue:f(0,15)",36,0,422,UIMgr_convertTokenToValue
548 .type UIMgr_convertTokenToValue, @function
549 UIMgr_convertTokenToValue:
550 .stabd 46,0,0
551 .stabn 68,0,422,.LM58-UIMgr_convertTokenToValue
552 .LM58:
553 /* prologue: frame size=0 */
554 /* prologue end (size=0) */
555 .stabn 68,0,425,.LM59-UIMgr_convertTokenToValue
556 .LM59:
557 01c8 80E0 ldi r24,lo8(asciiTokenBuffer)
558 01ca 90E0 ldi r25,hi8(asciiTokenBuffer)
559 01cc 00D0 rcall atoi
560 01ce 9C01 movw r18,r24
561 .stabn 68,0,426,.LM60-UIMgr_convertTokenToValue
562 .LM60:
563 01d0 8F3F cpi r24,255
564 01d2 9105 cpc r25,__zero_reg__
565 01d4 69F0 breq .L59
566 01d6 60F0 brlo .L59
567 .stabn 68,0,429,.LM61-UIMgr_convertTokenToValue
568 .LM61:
569 01d8 89E0 ldi r24,lo8(9)
570 01da 8093 0000 sts receivedCmd,r24
571 .stabn 68,0,430,.LM62-UIMgr_convertTokenToValue
572 .LM62:
573 01de 8091 0000 lds r24,tokenCount
574 01e2 E0E0 ldi r30,lo8(tokenBuffer)
575 01e4 F0E0 ldi r31,hi8(tokenBuffer)
576 01e6 E80F add r30,r24
577 01e8 F11D adc r31,__zero_reg__
578 01ea 8FEF ldi r24,lo8(-1)
579 01ec 8083 st Z,r24
580 01ee 07C0 rjmp .L61
581 .L59:
582 .stabn 68,0,435,.LM63-UIMgr_convertTokenToValue
583 .LM63:
584 01f0 8091 0000 lds r24,tokenCount
585 01f4 E0E0 ldi r30,lo8(tokenBuffer)
586 01f6 F0E0 ldi r31,hi8(tokenBuffer)
587 01f8 E80F add r30,r24
588 01fa F11D adc r31,__zero_reg__
589 01fc 2083 st Z,r18
590 .L61:
591 .stabn 68,0,437,.LM64-UIMgr_convertTokenToValue
592 .LM64:
593 01fe 83E0 ldi r24,lo8(3)
GAS LISTING /tmp/cc2L16GD.s page 23
 
 
594 0200 E0E0 ldi r30,lo8(asciiTokenBuffer)
595 0202 F0E0 ldi r31,hi8(asciiTokenBuffer)
596 0204 1192 st Z+,__zero_reg__
597 0206 8A95 dec r24
598 0208 E9F7 brne .-6
599 .stabn 68,0,438,.LM65-UIMgr_convertTokenToValue
600 .LM65:
601 020a 1092 0000 sts charIndex,__zero_reg__
602 .stabn 68,0,439,.LM66-UIMgr_convertTokenToValue
603 .LM66:
604 020e 1092 0000 sts charCount,__zero_reg__
605 /* epilogue: frame size=0 */
606 0212 0895 ret
607 /* epilogue end (size=1) */
608 /* function UIMgr_convertTokenToValue size 38 (37) */
609 .size UIMgr_convertTokenToValue, .-UIMgr_convertTokenToValue
610 .stabs "newValue:r(0,4)",64,0,423,18
611 .stabn 192,0,0,UIMgr_convertTokenToValue-UIMgr_convertTokenToValue
612 .stabn 224,0,0,.Lscope8-UIMgr_convertTokenToValue
613 .Lscope8:
614 .stabs "",36,0,0,.Lscope8-UIMgr_convertTokenToValue
615 .stabd 78,0,0
616 .stabs "UIMgr_processReceivedData:F(0,15)",36,0,193,UIMgr_processReceivedData
617 .global UIMgr_processReceivedData
618 .type UIMgr_processReceivedData, @function
619 UIMgr_processReceivedData:
620 .stabd 46,0,0
621 .stabn 68,0,193,.LM67-UIMgr_processReceivedData
622 .LM67:
623 /* prologue: frame size=0 */
624 0214 FF92 push r15
625 0216 0F93 push r16
626 0218 1F93 push r17
627 021a CF93 push r28
628 021c DF93 push r29
629 /* prologue end (size=5) */
630 021e 0F2E mov __tmp_reg__,r31
631 0220 F9E0 ldi r31,lo8(9)
632 0222 FF2E mov r15,r31
633 0224 F02D mov r31,__tmp_reg__
634 0226 FFC0 rjmp .L119
635 .L65:
636 .LBB22:
637 .LBB23:
638 .stabn 68,0,612,.LM68-UIMgr_processReceivedData
639 .LM68:
640 /* #APP */
641 0228 F894 cli
642 .stabn 68,0,613,.LM69-UIMgr_processReceivedData
643 .LM69:
644 /* #NOAPP */
645 022a E22F mov r30,r18
646 022c FF27 clr r31
647 022e E050 subi r30,lo8(-(UIMgr_rxFifo))
648 0230 F040 sbci r31,hi8(-(UIMgr_rxFifo))
649 0232 9081 ld r25,Z
650 .stabn 68,0,615,.LM70-UIMgr_processReceivedData
GAS LISTING /tmp/cc2L16GD.s page 24
 
 
651 .LM70:
652 0234 822F mov r24,r18
653 0236 8F5F subi r24,lo8(-(1))
654 0238 8F71 andi r24,lo8(31)
655 023a 8093 0000 sts UIMgr_rxFifoTail,r24
656 .stabn 68,0,616,.LM71-UIMgr_processReceivedData
657 .LM71:
658 /* #APP */
659 023e 7894 sei
660 /* #NOAPP */
661 .LBE23:
662 .LBE22:
663 .stabn 68,0,202,.LM72-UIMgr_processReceivedData
664 .LM72:
665 0240 9D30 cpi r25,lo8(13)
666 0242 09F0 breq .+2
667 0244 B1C0 rjmp .L66
668 .stabn 68,0,205,.LM73-UIMgr_processReceivedData
669 .LM73:
670 0246 8091 0000 lds r24,tokenCount
671 024a 8823 tst r24
672 024c 11F4 brne .L68
673 .stabn 68,0,208,.LM74-UIMgr_processReceivedData
674 .LM74:
675 024e 42DF rcall UIMgr_convertTokenToCmd
676 0250 06C0 rjmp .L70
677 .L68:
678 .stabn 68,0,213,.LM75-UIMgr_processReceivedData
679 .LM75:
680 0252 BADF rcall UIMgr_convertTokenToValue
681 .stabn 68,0,214,.LM76-UIMgr_processReceivedData
682 .LM76:
683 0254 8091 0000 lds r24,tokenCount
684 0258 8F5F subi r24,lo8(-(1))
685 025a 8093 0000 sts tokenCount,r24
686 .L70:
687 .stabn 68,0,218,.LM77-UIMgr_processReceivedData
688 .LM77:
689 025e 84E6 ldi r24,lo8(100)
690 0260 90E0 ldi r25,hi8(100)
691 0262 00D0 rcall Utility_delay
692 .stabn 68,0,219,.LM78-UIMgr_processReceivedData
693 .LM78:
694 0264 8091 0000 lds r24,receivedCmd
695 0268 8850 subi r24,lo8(-(-8))
696 026a 8230 cpi r24,lo8(2)
697 026c 58F4 brsh .L71
698 .LBB24:
699 .LBB25:
700 .stabn 68,0,531,.LM79-UIMgr_processReceivedData
701 .LM79:
702 026e 8EE4 ldi r24,lo8(78)
703 0270 F4DE rcall UIMgr_writeTxFifo
704 .stabn 68,0,532,.LM80-UIMgr_processReceivedData
705 .LM80:
706 0272 83E4 ldi r24,lo8(67)
707 0274 F2DE rcall UIMgr_writeTxFifo
GAS LISTING /tmp/cc2L16GD.s page 25
 
 
708 .stabn 68,0,533,.LM81-UIMgr_processReceivedData
709 .LM81:
710 0276 8BE4 ldi r24,lo8(75)
711 0278 F0DE rcall UIMgr_writeTxFifo
712 .stabn 68,0,534,.LM82-UIMgr_processReceivedData
713 .LM82:
714 027a 8DE0 ldi r24,lo8(13)
715 027c EEDE rcall UIMgr_writeTxFifo
716 .LBE25:
717 .LBE24:
718 .stabn 68,0,223,.LM83-UIMgr_processReceivedData
719 .LM83:
720 027e 80E9 ldi r24,lo8(-112)
721 0280 00D0 rcall Exec_writeEventFifo
722 0282 89C0 rjmp .L73
723 .L71:
724 .LBB26:
725 .LBB27:
726 .stabn 68,0,516,.LM84-UIMgr_processReceivedData
727 .LM84:
728 0284 81E4 ldi r24,lo8(65)
729 0286 E9DE rcall UIMgr_writeTxFifo
730 .stabn 68,0,517,.LM85-UIMgr_processReceivedData
731 .LM85:
732 0288 83E4 ldi r24,lo8(67)
733 028a E7DE rcall UIMgr_writeTxFifo
734 .stabn 68,0,518,.LM86-UIMgr_processReceivedData
735 .LM86:
736 028c 8BE4 ldi r24,lo8(75)
737 028e E5DE rcall UIMgr_writeTxFifo
738 .stabn 68,0,519,.LM87-UIMgr_processReceivedData
739 .LM87:
740 0290 8DE0 ldi r24,lo8(13)
741 0292 E3DE rcall UIMgr_writeTxFifo
742 .LBE27:
743 .LBE26:
744 .stabn 68,0,230,.LM88-UIMgr_processReceivedData
745 .LM88:
746 0294 80E9 ldi r24,lo8(-112)
747 0296 00D0 rcall Exec_writeEventFifo
748 .LBB28:
749 .LBB29:
750 .stabn 68,0,316,.LM89-UIMgr_processReceivedData
751 .LM89:
752 0298 8091 0000 lds r24,receivedCmd
753 029c 8130 cpi r24,lo8(1)
754 029e 09F4 brne .+2
755 02a0 7AC0 rjmp .L73
756 .stabn 68,0,319,.LM90-UIMgr_processReceivedData
757 .LM90:
758 02a2 8823 tst r24
759 02a4 71F4 brne .L75
760 .stabn 68,0,322,.LM91-UIMgr_processReceivedData
761 .LM91:
762 02a6 8091 0000 lds r24,AVRcamVersion
763 02aa 8823 tst r24
764 02ac 09F4 brne .+2
GAS LISTING /tmp/cc2L16GD.s page 26
 
 
765 02ae 73C0 rjmp .L73
766 02b0 C0E0 ldi r28,lo8(AVRcamVersion)
767 02b2 D0E0 ldi r29,hi8(AVRcamVersion)
768 .L78:
769 .stabn 68,0,324,.LM92-UIMgr_processReceivedData
770 .LM92:
771 02b4 2196 adiw r28,1
772 02b6 D1DE rcall UIMgr_writeTxFifo
773 .stabn 68,0,322,.LM93-UIMgr_processReceivedData
774 .LM93:
775 02b8 8881 ld r24,Y
776 02ba 8823 tst r24
777 02bc 09F4 brne .+2
778 02be 6BC0 rjmp .L73
779 02c0 F9CF rjmp .L78
780 .L75:
781 .stabn 68,0,327,.LM94-UIMgr_processReceivedData
782 .LM94:
783 02c2 8730 cpi r24,lo8(7)
784 02c4 11F4 brne .L79
785 .stabn 68,0,329,.LM95-UIMgr_processReceivedData
786 .LM95:
787 02c6 00D0 rcall CamInt_resetCam
788 02c8 66C0 rjmp .L73
789 .L79:
790 .stabn 68,0,331,.LM96-UIMgr_processReceivedData
791 .LM96:
792 02ca 8330 cpi r24,lo8(3)
793 02cc 31F4 brne .L81
794 .stabn 68,0,340,.LM97-UIMgr_processReceivedData
795 .LM97:
796 02ce 84E6 ldi r24,lo8(100)
797 02d0 90E0 ldi r25,hi8(100)
798 02d2 00D0 rcall Utility_delay
799 .stabn 68,0,341,.LM98-UIMgr_processReceivedData
800 .LM98:
801 02d4 82E0 ldi r24,lo8(2)
802 02d6 00D0 rcall Exec_writeEventFifo
803 02d8 5EC0 rjmp .L73
804 .L81:
805 .stabn 68,0,343,.LM99-UIMgr_processReceivedData
806 .LM99:
807 02da 8230 cpi r24,lo8(2)
808 02dc 99F4 brne .L83
809 .stabn 68,0,347,.LM100-UIMgr_processReceivedData
810 .LM100:
811 02de 8091 0000 lds r24,tokenCount
812 02e2 8230 cpi r24,lo8(2)
813 02e4 68F0 brlo .L85
814 02e6 11E0 ldi r17,lo8(1)
815 .L87:
816 .stabn 68,0,350,.LM101-UIMgr_processReceivedData
817 .LM101:
818 02e8 E12F mov r30,r17
819 02ea FF27 clr r31
820 02ec E050 subi r30,lo8(-(tokenBuffer))
821 02ee F040 sbci r31,hi8(-(tokenBuffer))
GAS LISTING /tmp/cc2L16GD.s page 27
 
 
822 02f0 6181 ldd r22,Z+1
823 02f2 8081 ld r24,Z
824 02f4 00D0 rcall CamConfig_setCamReg
825 .stabn 68,0,347,.LM102-UIMgr_processReceivedData
826 .LM102:
827 02f6 1E5F subi r17,lo8(-(2))
828 02f8 8091 0000 lds r24,tokenCount
829 02fc 1817 cp r17,r24
830 02fe A0F3 brlo .L87
831 .L85:
832 .stabn 68,0,352,.LM103-UIMgr_processReceivedData
833 .LM103:
834 0300 00D0 rcall CamConfig_sendFifoCmds
835 0302 49C0 rjmp .L73
836 .L83:
837 .stabn 68,0,354,.LM104-UIMgr_processReceivedData
838 .LM104:
839 0304 8430 cpi r24,lo8(4)
840 0306 31F4 brne .L88
841 .stabn 68,0,357,.LM105-UIMgr_processReceivedData
842 .LM105:
843 0308 84E6 ldi r24,lo8(100)
844 030a 90E0 ldi r25,hi8(100)
845 030c 00D0 rcall Utility_delay
846 .stabn 68,0,358,.LM106-UIMgr_processReceivedData
847 .LM106:
848 030e 80E8 ldi r24,lo8(-128)
849 0310 00D0 rcall Exec_writeEventFifo
850 0312 41C0 rjmp .L73
851 .L88:
852 .stabn 68,0,360,.LM107-UIMgr_processReceivedData
853 .LM107:
854 0314 8530 cpi r24,lo8(5)
855 0316 19F4 brne .L90
856 .stabn 68,0,362,.LM108-UIMgr_processReceivedData
857 .LM108:
858 0318 81E8 ldi r24,lo8(-127)
859 031a 00D0 rcall Exec_writeEventFifo
860 031c 3CC0 rjmp .L73
861 .L90:
862 .stabn 68,0,364,.LM109-UIMgr_processReceivedData
863 .LM109:
864 031e 8630 cpi r24,lo8(6)
865 0320 09F0 breq .+2
866 0322 39C0 rjmp .L73
867 .stabn 68,0,367,.LM110-UIMgr_processReceivedData
868 .LM110:
869 0324 8091 0000 lds r24,tokenCount
870 0328 8823 tst r24
871 032a 09F4 brne .+2
872 032c 34C0 rjmp .L73
873 032e 40E0 ldi r20,lo8(0)
874 0330 00E0 ldi r16,lo8(tokenBuffer)
875 0332 10E0 ldi r17,hi8(tokenBuffer)
876 0334 60E0 ldi r22,lo8(colorMap)
877 0336 70E0 ldi r23,hi8(colorMap)
878 .L94:
GAS LISTING /tmp/cc2L16GD.s page 28
 
 
879 .stabn 68,0,369,.LM111-UIMgr_processReceivedData
880 .LM111:
881 0338 842F mov r24,r20
882 033a 9927 clr r25
883 033c 9C01 movw r18,r24
884 033e 2F5F subi r18,lo8(-(1))
885 0340 3F4F sbci r19,hi8(-(1))
886 0342 F901 movw r30,r18
887 0344 E00F add r30,r16
888 0346 F11F adc r31,r17
889 0348 E081 ld r30,Z
890 034a EC01 movw r28,r24
891 034c C60F add r28,r22
892 034e D71F adc r29,r23
893 0350 E883 st Y,r30
894 .LBB30:
895 .LBB31:
896 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h",132,0,0,.Ltext1
897 .Ltext1:
1:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz
2:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Copyright (c) 2005, 2006 Bjoern Haase
3:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** All rights reserved.
4:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
5:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Redistribution and use in source and binary forms, with or without
6:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** modification, are permitted provided that the following conditions are met:
7:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
8:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** * Redistributions of source code must retain the above copyright
9:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** notice, this list of conditions and the following disclaimer.
10:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
11:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** * Redistributions in binary form must reproduce the above copyright
12:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** notice, this list of conditions and the following disclaimer in
13:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** the documentation and/or other materials provided with the
14:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** distribution.
15:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
16:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** * Neither the name of the copyright holders nor the names of
17:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** contributors may be used to endorse or promote products derived
18:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** from this software without specific prior written permission.
19:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
20:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** POSSIBILITY OF SUCH DAMAGE. */
31:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
32:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* $Id: eeprom.h,v 1.17.2.1 2006/02/26 21:51:04 aesok Exp $ */
33:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
34:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /*
35:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom.h
36:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
37:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Contributors:
38:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Created by Marek Michalkiewicz <marekm@linux.org.pl>
GAS LISTING /tmp/cc2L16GD.s page 29
 
 
39:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word and eeprom_write_block added by Artur Lipowski
40:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** <LAL@pro.onet.pl>
41:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Complete rewrite using the original interface by Bjoern Haase
42:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** <bjoern.haase@de.bosch.com>.
43:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** */
44:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
45:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifndef _EEPROM_H_
46:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _EEPROM_H_ 1
47:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
48:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define __need_size_t
49:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #include <stddef.h>
50:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #include <inttypes.h>
51:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
52:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
53:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifdef __AVR_MEGA__
54:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define XCALL "call"
55:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #else
56:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define XCALL "rcall"
57:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
58:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
59:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #include <avr/io.h>
60:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifndef __EEPROM_REG_LOCATIONS__
61:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def __EEPROM_REG_LOCATIONS__
62:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
63:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** In order to be able to work without a requiring a multilib
64:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** approach for dealing with controllers having the EEPROM registers
65:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** at different positions in memory space, the eeprom functions evaluate
66:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** __EEPROM_REG_LOCATIONS__: It is assumed to be defined by
67:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** the device io header and contains 6 uppercase hex digits encoding the
68:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** addresses of EECR,EEDR and EEAR.
69:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** First two letters: EECR address.
70:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Second two letters: EEDR address.
71:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Last two letters: EEAR address.
72:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** The default 1C1D1E corresponds to the
73:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** register location that is valid for most controllers. The value
74:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** of this define symbol is used for appending it to the base name of the
75:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** assembler functions. */
76:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define __EEPROM_REG_LOCATIONS__ 1C1D1E
77:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
78:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _STR2(EXP) _STR1(EXP)
79:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _STR1(EXP) #EXP
80:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define _REG_LOCATION_SUFFIX _STR2(__EEPROM_REG_LOCATIONS__)
81:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
82:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #ifndef CR_TAB
83:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define CR_TAB "\n\t"
84:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
85:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
86:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
87:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \defgroup avr_eeprom <avr/eeprom.h>: EEPROM handling
88:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \code #include <avr/eeprom.h> \endcode
89:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
90:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** This header file declares the interface to some simple library
91:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** routines suitable for handling the data EEPROM contained in the
92:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** AVR microcontrollers. The implementation uses a simple polled
93:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** mode interface. Applications that require interrupt-controlled
94:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** EEPROM access to ensure that no time will be wasted in spinloops
95:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** will have to deploy their own implementation.
GAS LISTING /tmp/cc2L16GD.s page 30
 
 
96:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
97:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note All of the read/write functions first make sure the EEPROM
98:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** is ready to be accessed. Since this may cause long delays if a
99:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** write operation is still pending, time-critical applications
100:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** should first poll the EEPROM e. g. using eeprom_is_ready() before
101:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** attempting any actual I/O.
102:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
103:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note This header file declares inline functions that call the
104:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** assembler subroutines directly. This prevents that the compiler
105:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** generates push/pops for the call-clobbered registers. This way
106:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** also a specific calling convention could be used for the eeprom
107:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** routines e.g. by passing values in __tmp_reg__, eeprom addresses in
108:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** X and memory addresses in Z registers. Method is optimized for code
109:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size.
110:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
111:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note Presently supported are two locations of the EEPROM register
112:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** set: 0x1F,0x20,0x21 and 0x1C,0x1D,0x1E
113:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** (see ::__EEPROM_REG_LOCATIONS__).
114:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
115:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \note As these functions modify IO registers, they are known to be
116:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** non-reentrant. If any of these functions are used from both,
117:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** standard and interrupt context, the applications must ensure
118:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** proper protection (e.g. by disabling interrupts before accessing
119:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** them).
120:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
121:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** */
122:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
123:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
124:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* forward declarations of the inline functions so that doxygen does
125:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** not get confused by the attribute expression. */
126:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
127:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline uint8_t __attribute__ ((always_inline))
128:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_byte (const uint8_t *addr);
129:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
130:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline uint16_t __attribute__ ((always_inline))
131:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_word (const uint16_t *addr);
132:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
133:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
134:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_block (void *pointer_ram,
135:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** const void *pointer_eeprom,
136:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size_t size);
137:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
138:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
139:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_byte (uint8_t *addr,uint8_t value);
140:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
141:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
142:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word (uint16_t *addr,uint16_t value);
143:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
144:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline))
145:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_block (const void *pointer_ram,
146:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** void *pointer_eeprom,
147:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size_t size);
148:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
149:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \name avr-libc declarations */
150:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
151:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /*@{*/
152:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
GAS LISTING /tmp/cc2L16GD.s page 31
 
 
153:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def EEMEM
154:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
155:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Attribute expression causing a variable to be allocated within the .eeprom
156:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** section. */
157:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define EEMEM __attribute__((section(".eeprom")))
158:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
159:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def eeprom_is_ready
160:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
161:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \returns 1 if EEPROM is ready for a new read/write operation, 0 if not. */
162:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
163:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #if defined(__DOXYGEN__)
164:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready()
165:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #elif defined(EEWE)
166:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(EECR, EEWE)
167:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #elif defined(EEPE)
168:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(EECR, EEPE)
169:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #elif defined(DEECR) && defined(EEL)
170:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(DEECR, EEL)
171:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #else
172:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** # error "No write enable bit known for this device's EEPROM."
173:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #endif
174:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
175:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \def eeprom_busy_wait
176:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom
177:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
178:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Loops until the eeprom is no longer busy.
179:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
180:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \returns Nothing. */
181:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
182:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** #define eeprom_busy_wait() do {} while (!eeprom_is_ready())
183:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
184:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
185:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
186:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Read one byte from EEPROM address \c addr. */
187:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
188:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint8_t
189:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_byte (const uint8_t *addr)
190:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
191:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint8_t result;
192:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile
898 .stabn 68,0,192,.LM112-UIMgr_processReceivedData
899 .LM112:
900 0352 D901 movw r26,r18
901 /* #APP */
902 0354 00D0 rcall __eeprom_read_byte_1C1D1E
903 0356 802D mov r24,__tmp_reg__
904 /* #NOAPP */
905 .LBE31:
906 .LBE30:
907 .stabs "UIMgr.c",132,0,0,.Ltext2
908 .Ltext2:
909 .stabn 68,0,374,.LM113-UIMgr_processReceivedData
910 .LM113:
911 0358 E817 cp r30,r24
912 035a C1F0 breq .L95
913 .LBB32:
914 .LBB33:
GAS LISTING /tmp/cc2L16GD.s page 32
 
 
915 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h",132,0,0,.Ltext3
916 .Ltext3:
193:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ( XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
194:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "mov %1,__tmp_reg__"
195:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr),
196:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=r" (result)
197:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : );
198:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** return result;
199:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
200:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
201:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
202:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Read one 16-bit word (little endian) from EEPROM address \c addr. */
203:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint16_t
204:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_word (const uint16_t *addr)
205:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
206:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint16_t result;
207:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
208:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm (
209:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_word_" _REG_LOCATION_SUFFIX CR_TAB
210:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr),
211:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (result)
212:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : );
213:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** return result;
214:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
215:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
216:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
217:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Read a block of \c n bytes from EEPROM address \c pointer_eeprom to
218:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** \c pointer_ram. For constant n <= 256 bytes a library function is used.
219:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** For block sizes unknown at compile time or block sizes > 256 an inline
220:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** loop is expanded. */
221:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
222:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** void
223:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_block (void *pointer_ram,
224:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** const void *pointer_eeprom,
225:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** size_t n)
226:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
227:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** if (!__builtin_constant_p (n)
228:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** || n > 256)
229:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
230:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* make sure size is a 16 bit variable. */
231:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint16_t size = n;
232:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
233:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
234:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ".%=_start:" CR_TAB
235:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "sbiw %2,1" CR_TAB
236:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "brlt .%=_finished" CR_TAB
237:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
238:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "st z+,__tmp_reg__" CR_TAB
239:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "rjmp .%=_start" CR_TAB
240:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** ".%=_finished:"
241:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "=x" (pointer_eeprom),
242:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram),
243:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "+w" (size)
244:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "x" (pointer_eeprom),
245:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "z" (pointer_ram)
246:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "memory");
247:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
GAS LISTING /tmp/cc2L16GD.s page 33
 
 
248:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** else
249:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
250:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** if (n != 0)
251:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
252:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** if (n == 256)
253:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
254:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
255:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_block_" _REG_LOCATION_SUFFIX
256:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (pointer_eeprom),
257:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram)
258:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "z" (pointer_ram)
259:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "memory");
260:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
261:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** else
262:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
263:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /* Needed in order to truncate to 8 bit. */
264:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** uint8_t len;
265:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** len = (uint8_t) n;
266:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
267:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
268:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "mov __zero_reg__,%2" CR_TAB
269:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_block_" _REG_LOCATION_SUFFIX
270:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "+x" (pointer_eeprom),
271:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram)
272:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "r" (len),
273:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** "z" (pointer_ram)
274:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** : "memory");
275:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
276:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
277:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
278:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** }
279:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
280:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom
281:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** Write a byte \c value to EEPROM address \c addr. */
282:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h ****
283:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** void
284:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_byte (uint8_t *addr,uint8_t value)
285:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** {
286:/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h **** asm volatile (
917 .stabn 68,0,286,.LM114-UIMgr_processReceivedData
918 .LM114:
919 035c D901 movw r26,r18
920 /* #APP */
921 035e 0E2E mov __tmp_reg__,r30
922 0360 00D0 rcall __eeprom_write_byte_1C1D1E
923 /* #NOAPP */
924 .LBE33:
925 .LBE32:
926 .LBB34:
927 .LBB35:
928 .stabn 68,0,192,.LM115-UIMgr_processReceivedData
929 .LM115:
930 0362 D901 movw r26,r18
931 /* #APP */
932 0364 00D0 rcall __eeprom_read_byte_1C1D1E
933 0366 802D mov r24,__tmp_reg__
934 /* #NOAPP */
GAS LISTING /tmp/cc2L16GD.s page 34
 
 
935 .LBE35:
936 .LBE34:
937 .stabs "UIMgr.c",132,0,0,.Ltext4
938 .Ltext4:
939 .stabn 68,0,384,.LM116-UIMgr_processReceivedData
940 .LM116:
941 0368 9881 ld r25,Y
942 036a 9817 cp r25,r24
943 036c 79F0 breq .L95
944 .LBB36:
945 .LBB37:
946 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h",132,0,0,.Ltext5
947 .Ltext5:
948 .stabn 68,0,286,.LM117-UIMgr_processReceivedData
949 .LM117:
950 036e D901 movw r26,r18
951 /* #APP */
952 0370 092E mov __tmp_reg__,r25
953 0372 00D0 rcall __eeprom_write_byte_1C1D1E
954 /* #NOAPP */
955 .LBE37:
956 .LBE36:
957 .LBB38:
958 .LBB39:
959 .stabn 68,0,192,.LM118-UIMgr_processReceivedData
960 .LM118:
961 0374 D901 movw r26,r18
962 /* #APP */
963 0376 00D0 rcall __eeprom_read_byte_1C1D1E
964 0378 802D mov r24,__tmp_reg__
965 /* #NOAPP */
966 .LBE39:
967 .LBE38:
968 .stabs "UIMgr.c",132,0,0,.Ltext6
969 .Ltext6:
970 .stabn 68,0,384,.LM119-UIMgr_processReceivedData
971 .LM119:
972 037a 9881 ld r25,Y
973 037c 9817 cp r25,r24
974 037e 31F0 breq .L95
975 .LBB40:
976 .LBB41:
977 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/eeprom.h",132,0,0,.Ltext7
978 .Ltext7:
979 .stabn 68,0,286,.LM120-UIMgr_processReceivedData
980 .LM120:
981 0380 D901 movw r26,r18
982 /* #APP */
983 0382 092E mov __tmp_reg__,r25
984 0384 00D0 rcall __eeprom_write_byte_1C1D1E
985 /* #NOAPP */
986 .LBE41:
987 .LBE40:
988 .LBB42:
989 .LBB43:
990 .stabn 68,0,192,.LM121-UIMgr_processReceivedData
991 .LM121:
GAS LISTING /tmp/cc2L16GD.s page 35
 
 
992 0386 D901 movw r26,r18
993 /* #APP */
994 0388 00D0 rcall __eeprom_read_byte_1C1D1E
995 038a 802D mov r24,__tmp_reg__
996 /* #NOAPP */
997 .L95:
998 .LBE43:
999 .LBE42:
1000 .stabs "UIMgr.c",132,0,0,.Ltext8
1001 .Ltext8:
1002 .stabn 68,0,367,.LM122-UIMgr_processReceivedData
1003 .LM122:
1004 038c 4F5F subi r20,lo8(-(1))
1005 038e 8091 0000 lds r24,tokenCount
1006 0392 4817 cp r20,r24
1007 0394 88F2 brlo .L94
1008 .L73:
1009 .LBE29:
1010 .LBE28:
1011 .stabn 68,0,235,.LM123-UIMgr_processReceivedData
1012 .LM123:
1013 0396 1092 0000 sts tokenCount,__zero_reg__
1014 .stabn 68,0,236,.LM124-UIMgr_processReceivedData
1015 .LM124:
1016 039a 80E4 ldi r24,lo8(64)
1017 039c E0E0 ldi r30,lo8(tokenBuffer)
1018 039e F0E0 ldi r31,hi8(tokenBuffer)
1019 03a0 1192 st Z+,__zero_reg__
1020 03a2 8A95 dec r24
1021 03a4 E9F7 brne .-6
1022 03a6 3FC0 rjmp .L119
1023 .L66:
1024 .stabn 68,0,238,.LM125-UIMgr_processReceivedData
1025 .LM125:
1026 03a8 9032 cpi r25,lo8(32)
1027 03aa F1F4 brne .L99
1028 .stabn 68,0,241,.LM126-UIMgr_processReceivedData
1029 .LM126:
1030 03ac 8091 0000 lds r24,tokenCount
1031 03b0 8823 tst r24
1032 03b2 39F4 brne .L101
1033 .stabn 68,0,243,.LM127-UIMgr_processReceivedData
1034 .LM127:
1035 03b4 8FDE rcall UIMgr_convertTokenToCmd
1036 .stabn 68,0,244,.LM128-UIMgr_processReceivedData
1037 .LM128:
1038 03b6 8091 0000 lds r24,tokenCount
1039 03ba 8F5F subi r24,lo8(-(1))
1040 03bc 8093 0000 sts tokenCount,r24
1041 03c0 32C0 rjmp .L119
1042 .L101:
1043 .stabn 68,0,254,.LM129-UIMgr_processReceivedData
1044 .LM129:
1045 03c2 9927 clr r25
1046 03c4 CF97 sbiw r24,63
1047 03c6 4CF0 brlt .L103
1048 .stabn 68,0,259,.LM130-UIMgr_processReceivedData
GAS LISTING /tmp/cc2L16GD.s page 36
 
 
1049 .LM130:
1050 03c8 1092 0000 sts charCount,__zero_reg__
1051 .stabn 68,0,260,.LM131-UIMgr_processReceivedData
1052 .LM131:
1053 03cc 1092 0000 sts charIndex,__zero_reg__
1054 .stabn 68,0,261,.LM132-UIMgr_processReceivedData
1055 .LM132:
1056 03d0 1092 0000 sts tokenCount,__zero_reg__
1057 .stabn 68,0,262,.LM133-UIMgr_processReceivedData
1058 .LM133:
1059 03d4 F092 0000 sts receivedCmd,r15
1060 03d8 26C0 rjmp .L119
1061 .L103:
1062 .stabn 68,0,267,.LM134-UIMgr_processReceivedData
1063 .LM134:
1064 03da F6DE rcall UIMgr_convertTokenToValue
1065 .stabn 68,0,268,.LM135-UIMgr_processReceivedData
1066 .LM135:
1067 03dc 8091 0000 lds r24,tokenCount
1068 03e0 8F5F subi r24,lo8(-(1))
1069 03e2 8093 0000 sts tokenCount,r24
1070 03e6 1FC0 rjmp .L119
1071 .L99:
1072 .stabn 68,0,272,.LM136-UIMgr_processReceivedData
1073 .LM136:
1074 03e8 892F mov r24,r25
1075 03ea 8154 subi r24,lo8(-(-65))
1076 03ec 8A31 cpi r24,lo8(26)
1077 03ee 18F0 brlo .L105
1078 03f0 8F5E subi r24,lo8(-(17))
1079 03f2 8A30 cpi r24,lo8(10)
1080 03f4 B0F4 brsh .L107
1081 .L105:
1082 .stabn 68,0,276,.LM137-UIMgr_processReceivedData
1083 .LM137:
1084 03f6 8091 0000 lds r24,charIndex
1085 03fa E82F mov r30,r24
1086 03fc FF27 clr r31
1087 03fe E050 subi r30,lo8(-(asciiTokenBuffer))
1088 0400 F040 sbci r31,hi8(-(asciiTokenBuffer))
1089 0402 9083 st Z,r25
1090 .stabn 68,0,277,.LM138-UIMgr_processReceivedData
1091 .LM138:
1092 0404 9091 0000 lds r25,charCount
1093 0408 9F5F subi r25,lo8(-(1))
1094 040a 9093 0000 sts charCount,r25
1095 .stabn 68,0,278,.LM139-UIMgr_processReceivedData
1096 .LM139:
1097 040e 8F5F subi r24,lo8(-(1))
1098 0410 8093 0000 sts charIndex,r24
1099 .stabn 68,0,279,.LM140-UIMgr_processReceivedData
1100 .LM140:
1101 0414 9430 cpi r25,lo8(4)
1102 0416 38F0 brlo .L119
1103 .stabn 68,0,284,.LM141-UIMgr_processReceivedData
1104 .LM141:
1105 0418 F092 0000 sts receivedCmd,r15
GAS LISTING /tmp/cc2L16GD.s page 37
 
 
1106 .stabn 68,0,285,.LM142-UIMgr_processReceivedData
1107 .LM142:
1108 041c 1092 0000 sts charIndex,__zero_reg__
1109 0420 02C0 rjmp .L119
1110 .L107:
1111 .stabn 68,0,291,.LM143-UIMgr_processReceivedData
1112 .LM143:
1113 0422 F092 0000 sts receivedCmd,r15
1114 .L119:
1115 .stabn 68,0,199,.LM144-UIMgr_processReceivedData
1116 .LM144:
1117 0426 2091 0000 lds r18,UIMgr_rxFifoTail
1118 042a 8091 0000 lds r24,UIMgr_rxFifoHead
1119 042e 8217 cp r24,r18
1120 0430 09F0 breq .+2
1121 0432 FACE rjmp .L65
1122 .stabn 68,0,295,.LM145-UIMgr_processReceivedData
1123 .LM145:
1124 /* #APP */
1125 0434 E894 clt
1126 /* #NOAPP */
1127 /* epilogue: frame size=0 */
1128 0436 DF91 pop r29
1129 0438 CF91 pop r28
1130 043a 1F91 pop r17
1131 043c 0F91 pop r16
1132 043e FF90 pop r15
1133 0440 0895 ret
1134 /* epilogue end (size=6) */
1135 /* function UIMgr_processReceivedData size 297 (286) */
1136 .size UIMgr_processReceivedData, .-UIMgr_processReceivedData
1137 .stabs "tmpData:r(0,11)",64,0,194,25
1138 .stabn 192,0,0,UIMgr_processReceivedData-UIMgr_processReceivedData
1139 .stabs "dataByte:r(0,11)",64,0,609,25
1140 .stabn 192,0,0,.LBB23-UIMgr_processReceivedData
1141 .stabn 224,0,0,.LBE23-UIMgr_processReceivedData
1142 .stabn 224,0,0,.Lscope9-UIMgr_processReceivedData
1143 .Lscope9:
1144 .stabs "",36,0,0,.Lscope9-UIMgr_processReceivedData
1145 .stabd 78,0,0
1146 .stabs "UIMgr_dispatchEvent:F(0,15)",36,0,152,UIMgr_dispatchEvent
1147 .stabs "event:P(0,11)",64,0,151,24
1148 .global UIMgr_dispatchEvent
1149 .type UIMgr_dispatchEvent, @function
1150 UIMgr_dispatchEvent:
1151 .stabd 46,0,0
1152 .stabn 68,0,152,.LM146-UIMgr_dispatchEvent
1153 .LM146:
1154 /* prologue: frame size=0 */
1155 /* prologue end (size=0) */
1156 .stabn 68,0,153,.LM147-UIMgr_dispatchEvent
1157 .LM147:
1158 0442 8031 cpi r24,lo8(16)
1159 0444 29F0 breq .L123
1160 .stabn 68,0,153,.LM148-UIMgr_dispatchEvent
1161 .LM148:
1162 0446 8039 cpi r24,lo8(-112)
GAS LISTING /tmp/cc2L16GD.s page 38
 
 
1163 0448 39F0 breq .L124
1164 044a 8130 cpi r24,lo8(1)
1165 044c 31F4 brne .L125
1166 044e 02C0 rjmp .L122
1167 .L123:
1168 .stabn 68,0,156,.LM149-UIMgr_dispatchEvent
1169 .LM149:
1170 0450 38DE rcall UIMgr_transmitPendingData
1171 0452 0895 ret
1172 .L122:
1173 .stabn 68,0,160,.LM150-UIMgr_dispatchEvent
1174 .LM150:
1175 0454 DFDE rcall UIMgr_processReceivedData
1176 0456 0895 ret
1177 .L124:
1178 .stabn 68,0,164,.LM151-UIMgr_dispatchEvent
1179 .LM151:
1180 0458 0EDE rcall UIMgr_flushTxBuffer
1181 .L125:
1182 045a 0895 ret
1183 /* epilogue: frame size=0 */
1184 /* epilogue: noreturn */
1185 /* epilogue end (size=0) */
1186 /* function UIMgr_dispatchEvent size 13 (13) */
1187 .size UIMgr_dispatchEvent, .-UIMgr_dispatchEvent
1188 .Lscope10:
1189 .stabs "",36,0,0,.Lscope10-UIMgr_dispatchEvent
1190 .stabd 78,0,0
1191 .global UIMgr_rxFifoHead
1192 .global UIMgr_rxFifoHead
1193 .section .bss
1194 .type UIMgr_rxFifoHead, @object
1195 .size UIMgr_rxFifoHead, 1
1196 UIMgr_rxFifoHead:
1197 0000 00 .skip 1,0
1198 .global UIMgr_rxFifoTail
1199 .global UIMgr_rxFifoTail
1200 .type UIMgr_rxFifoTail, @object
1201 .size UIMgr_rxFifoTail, 1
1202 UIMgr_rxFifoTail:
1203 0001 00 .skip 1,0
1204 .global UIMgr_txFifoHead
1205 .global UIMgr_txFifoHead
1206 .type UIMgr_txFifoHead, @object
1207 .size UIMgr_txFifoHead, 1
1208 UIMgr_txFifoHead:
1209 0002 00 .skip 1,0
1210 .global UIMgr_txFifoTail
1211 .global UIMgr_txFifoTail
1212 .type UIMgr_txFifoTail, @object
1213 .size UIMgr_txFifoTail, 1
1214 UIMgr_txFifoTail:
1215 0003 00 .skip 1,0
1216 .lcomm tokenCount,1
1217 .data
1218 .type receivedCmd, @object
1219 .size receivedCmd, 1
GAS LISTING /tmp/cc2L16GD.s page 39
 
 
1220 receivedCmd:
1221 0000 08 .byte 8
1222 .lcomm charCount,1
1223 .lcomm charIndex,1
1224 .type AVRcamVersion, @object
1225 .size AVRcamVersion, 13
1226 AVRcamVersion:
1227 0001 4156 5263 .string "AVRcam v1.4\r"
1227 616D 2076
1227 312E 340D
1227 00
1228 .lcomm asciiTokenBuffer,4
1229 .lcomm tokenBuffer,64
1230 .comm UIMgr_rxFifo,32,1
1231 .comm UIMgr_txFifo,64,1
1232 .stabs "charCount:S(0,11)",38,0,92,charCount
1233 .stabs "charIndex:S(0,11)",38,0,93,charIndex
1234 .stabs "asciiTokenBuffer:S(0,21)=ar(0,22)=r(0,22);0;0177777;;0;3;(0,11)",40,0,94,asciiTokenBuffer
1235 .stabs "tokenCount:S(0,11)",38,0,95,tokenCount
1236 .stabs "tokenBuffer:S(0,23)=ar(0,22);0;63;(0,11)",40,0,96,tokenBuffer
1237 .stabs "receivedCmd:S(0,17)",38,0,97,receivedCmd
1238 .stabs "AVRcamVersion:S(0,24)=ar(0,22);0;12;(0,11)",38,0,98,AVRcamVersion
1239 .stabs "UIMgr_rxFifo:G(0,25)=ar(0,22);0;31;(0,11)",32,0,111,0
1240 .stabs "UIMgr_rxFifoHead:G(0,11)",32,0,112,0
1241 .stabs "UIMgr_rxFifoTail:G(0,11)",32,0,113,0
1242 .stabs "UIMgr_txFifo:G(0,23)",32,0,115,0
1243 .stabs "UIMgr_txFifoHead:G(0,11)",32,0,116,0
1244 .stabs "UIMgr_txFifoTail:G(0,11)",32,0,117,0
1245 .text
1246 .stabs "",100,0,0,.Letext0
1247 .Letext0:
1248 /* File "UIMgr.c": code 582 = 0x0246 ( 557), prologues 9, epilogues 16 */
GAS LISTING /tmp/cc2L16GD.s page 40
 
 
DEFINED SYMBOLS
*ABS*:00000000 UIMgr.c
/tmp/cc2L16GD.s:3 *ABS*:0000003f __SREG__
/tmp/cc2L16GD.s:4 *ABS*:0000003e __SP_H__
/tmp/cc2L16GD.s:5 *ABS*:0000003d __SP_L__
/tmp/cc2L16GD.s:6 *ABS*:00000000 __tmp_reg__
/tmp/cc2L16GD.s:7 *ABS*:00000001 __zero_reg__
/tmp/cc2L16GD.s:94 .text:00000000 UIMgr_writeBufferToTxFifo
*COM*:00000040 UIMgr_txFifo
/tmp/cc2L16GD.s:1208 .bss:00000002 UIMgr_txFifoHead
/tmp/cc2L16GD.s:159 .text:0000003c UIMgr_readTxFifo
/tmp/cc2L16GD.s:1214 .bss:00000003 UIMgr_txFifoTail
/tmp/cc2L16GD.s:206 .text:0000005a UIMgr_writeTxFifo
/tmp/cc2L16GD.s:246 .text:00000076 UIMgr_flushTxBuffer
/tmp/cc2L16GD.s:284 .text:00000094 UIMgr_txBuffer
/tmp/cc2L16GD.s:333 .text:000000c2 UIMgr_transmitPendingData
/tmp/cc2L16GD.s:361 .text:000000d4 UIMgr_convertTokenToCmd
/tmp/cc2L16GD.s:1223 .bss:00000007 asciiTokenBuffer
/tmp/cc2L16GD.s:1220 .data:00000000 receivedCmd
/tmp/cc2L16GD.s:1222 .bss:00000006 charIndex
/tmp/cc2L16GD.s:1216 .bss:00000005 charCount
/tmp/cc2L16GD.s:503 .text:00000192 UIMgr_init
/tmp/cc2L16GD.s:1228 .bss:0000000b tokenBuffer
*COM*:00000020 UIMgr_rxFifo
/tmp/cc2L16GD.s:549 .text:000001c8 UIMgr_convertTokenToValue
.bss:00000004 tokenCount
/tmp/cc2L16GD.s:619 .text:00000214 UIMgr_processReceivedData
/tmp/cc2L16GD.s:1202 .bss:00000001 UIMgr_rxFifoTail
/tmp/cc2L16GD.s:1226 .data:00000001 AVRcamVersion
/tmp/cc2L16GD.s:1196 .bss:00000000 UIMgr_rxFifoHead
/tmp/cc2L16GD.s:1150 .text:00000442 UIMgr_dispatchEvent
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
UartInt_txByte
atoi
Utility_delay
Exec_writeEventFifo
CamInt_resetCam
CamConfig_setCamReg
CamConfig_sendFifoCmds
colorMap
__eeprom_read_byte_1C1D1E
__eeprom_write_byte_1C1D1E
/programy/Atmel_C/AVRcam/UartInterface.c
0,0 → 1,157
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: UartInterface.c
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This module is responsible for providing an
interface to the UART hardware available on the mega8.
This interface is an interrupt-driven interface.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
11/15/2004 1.2 Updated UART baud rate regs so that
it runs at 115.2 kbps when the input
crystal is at 17.7 MHz (which is the
speed of the OV6620's crystal).
1/16/2005 1.4 Moved the serial received ISR to
this file, instead of having it
in its own UartInterfaceAsm.S file
written in assembly.
***********************************************************/
 
/* Includes */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "CommonDefs.h"
#include "UartInterface.h"
#include "UIMgr.h"
#include "Executive.h"
 
/* Local Variables */
 
/* Local Structures and Typedefs */
 
/* Extern Variables */
 
/* Definitions */
 
/***********************************************************
Function Name: UartInt_init
Function Description: This function is responsible for
initializing the UART interface on the mega8. This
interface is set to communicate at 115.2 Kbps, with an
8N1 protocol.
Inputs: none
Outputs: none
***********************************************************/
void UartInt_init(void)
{
/* set up the baud rate registers so the UART will operate
at 115.2 Kbps */
UBRRH = 0x00;
 
#ifdef NO_CRYSTAL
UBRRL = 18; /* 18 for double clocking at 115.2 kbps */
#else
UBRRL = 0x08; /* for 16 MHz crystal at 115.2 kbps */
#endif
/* enable the tx and rx capabilities of the UART...as well
as the receive complete interrupt */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* set up the control registers so the UART works at 8N1 */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
#ifdef NO_CRYSTAL
/* set the baud rate to use the double-speed */
UCSRA = (1<<U2X);
#endif
}
 
/***********************************************************
Function Name: UartInt_txByte
Function Description: This function is responsible for
transmitting a single byte on the uart.
Inputs: txByte - the byte to send
Outputs: none
NOTES: When the TX UDRE (data register empty) is set, there
is puposefully no interrupt...thus, to send a string of
data out, the calling routine needs to hold up the entire
application while this takes place (or just send one
byte at a time at strtegically timed intervals, like
the stats data is sent out :-)
***********************************************************/
void UartInt_txByte(unsigned char txByte)
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = txByte;
}
 
/***********************************************************
Function Name: SIG_UART_RECV ISR
Function Description: This function is responsible for
handling the interrupt caused when a data byte is
received by the UART.
Inputs: none
Outputs: none
NOTES: This function was originally written in assembly,
but moved over to C when the setting of the "T" bit at
the end of the routine was no longer necessary (this
theoretically allowed the AVRcam to respond to serial
bytes in the middle of tracking or dumping a frame.
But it wasn't really needed, and understanding the C
is easier :-)
***********************************************************/
SIGNAL(SIG_UART_RECV)
{
unsigned char tmpHead;
/* read the data byte, put it in the serial queue, and
post the event */
UIMgr_rxFifo[UIMgr_rxFifoHead] = UDR;
 
/* now move the head up */
tmpHead = (UIMgr_rxFifoHead + 1) & (UI_MGR_RX_FIFO_MASK);
UIMgr_rxFifoHead = tmpHead;
/* write the serial received event to the event fifo */
Exec_eventFifo[Exec_eventFifoHead] = EV_SERIAL_DATA_RECEIVED;
 
/* now move the head up */
tmpHead = (Exec_eventFifoHead + 1) & (EXEC_EVENT_FIFO_MASK);
Exec_eventFifoHead = tmpHead;
}
 
/programy/Atmel_C/AVRcam/UartInterface.d
0,0 → 1,2
UartInterface.o UartInterface.d : UartInterface.c CommonDefs.h UartInterface.h UIMgr.h \
Executive.h Events.h
/programy/Atmel_C/AVRcam/UartInterface.h
0,0 → 1,52
#ifndef UARTINTERFACE_H
#define UARTINTERFACE_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: UartInterface.h
Module Date: 04/10/2004
Module Auth: John Orlando
Description: This modules provides the external interface
to the UartInterface module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
/* extern variables */
extern unsigned char serialReceivedFlag;
 
/* External Function Prototypes */
extern void UartInt_init(void);
extern void UartInt_txByte(unsigned char txByte);
#endif
 
/programy/Atmel_C/AVRcam/UartInterface.lst
0,0 → 1,394
GAS LISTING /tmp/ccGIWzET.s page 1
 
 
1 .file "UartInterface.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/roboti/istrobot/2007/ATmega8/AVRcam/",100,0,2,.Ltext0
11 .stabs "UartInterface.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
32 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
33 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
34 .stabs "int8_t:t(4,1)=(0,10)",128,0,116,0
35 .stabs "uint8_t:t(4,2)=(0,11)",128,0,117,0
36 .stabs "int16_t:t(4,3)=(0,1)",128,0,118,0
37 .stabs "uint16_t:t(4,4)=(0,4)",128,0,119,0
38 .stabs "int32_t:t(4,5)=(0,3)",128,0,120,0
39 .stabs "uint32_t:t(4,6)=(0,5)",128,0,121,0
40 .stabs "int64_t:t(4,7)=(0,6)",128,0,122,0
41 .stabs "uint64_t:t(4,8)=(0,7)",128,0,123,0
42 .stabs "intptr_t:t(4,9)=(4,3)",128,0,135,0
43 .stabs "uintptr_t:t(4,10)=(4,4)",128,0,140,0
44 .stabs "int_least8_t:t(4,11)=(4,1)",128,0,152,0
45 .stabs "uint_least8_t:t(4,12)=(4,2)",128,0,157,0
46 .stabs "int_least16_t:t(4,13)=(4,3)",128,0,162,0
47 .stabs "uint_least16_t:t(4,14)=(4,4)",128,0,167,0
48 .stabs "int_least32_t:t(4,15)=(4,5)",128,0,172,0
49 .stabs "uint_least32_t:t(4,16)=(4,6)",128,0,177,0
50 .stabs "int_least64_t:t(4,17)=(4,7)",128,0,182,0
51 .stabs "uint_least64_t:t(4,18)=(4,8)",128,0,187,0
52 .stabs "int_fast8_t:t(4,19)=(4,1)",128,0,200,0
53 .stabs "uint_fast8_t:t(4,20)=(4,2)",128,0,205,0
54 .stabs "int_fast16_t:t(4,21)=(4,3)",128,0,210,0
55 .stabs "uint_fast16_t:t(4,22)=(4,4)",128,0,215,0
56 .stabs "int_fast32_t:t(4,23)=(4,5)",128,0,220,0
57 .stabs "uint_fast32_t:t(4,24)=(4,6)",128,0,225,0
GAS LISTING /tmp/ccGIWzET.s page 2
 
 
58 .stabs "int_fast64_t:t(4,25)=(4,7)",128,0,230,0
59 .stabs "uint_fast64_t:t(4,26)=(4,8)",128,0,235,0
60 .stabs "intmax_t:t(4,27)=(4,7)",128,0,249,0
61 .stabs "uintmax_t:t(4,28)=(4,8)",128,0,254,0
62 .stabn 162,0,0,0
63 .stabs "int_farptr_t:t(3,1)=(4,5)",128,0,76,0
64 .stabs "uint_farptr_t:t(3,2)=(4,6)",128,0,80,0
65 .stabn 162,0,0,0
66 .stabn 162,0,0,0
67 .stabn 162,0,0,0
68 .stabs "CommonDefs.h",130,0,0,0
69 .stabs "bool_t:t(5,1)=(0,11)",128,0,56,0
70 .stabn 162,0,0,0
71 .stabs "UartInt_init:F(0,15)",36,0,77,UartInt_init
72 .global UartInt_init
73 .type UartInt_init, @function
74 UartInt_init:
75 .stabd 46,0,0
1:UartInterface.c **** /*
2:UartInterface.c **** Copyright (C) 2004 John Orlando
3:UartInterface.c ****
4:UartInterface.c **** AVRcam: a small real-time image processing engine.
5:UartInterface.c ****
6:UartInterface.c **** This program is free software; you can redistribute it and/or
7:UartInterface.c **** modify it under the terms of the GNU General Public
8:UartInterface.c **** License as published by the Free Software Foundation; either
9:UartInterface.c **** version 2 of the License, or (at your option) any later version.
10:UartInterface.c ****
11:UartInterface.c **** This program is distributed in the hope that it will be useful,
12:UartInterface.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:UartInterface.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:UartInterface.c **** General Public License for more details.
15:UartInterface.c ****
16:UartInterface.c **** You should have received a copy of the GNU General Public
17:UartInterface.c **** License along with this program; if not, write to the Free Software
18:UartInterface.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:UartInterface.c ****
20:UartInterface.c **** For more information on the AVRcam, please contact:
21:UartInterface.c ****
22:UartInterface.c **** john@jrobot.net
23:UartInterface.c ****
24:UartInterface.c **** or go to www.jrobot.net for more details regarding the system.
25:UartInterface.c **** */
26:UartInterface.c **** /***********************************************************
27:UartInterface.c **** Module Name: UartInterface.c
28:UartInterface.c **** Module Date: 04/10/2004
29:UartInterface.c **** Module Auth: John Orlando
30:UartInterface.c ****
31:UartInterface.c **** Description: This module is responsible for providing an
32:UartInterface.c **** interface to the UART hardware available on the mega8.
33:UartInterface.c **** This interface is an interrupt-driven interface.
34:UartInterface.c ****
35:UartInterface.c **** Revision History:
36:UartInterface.c **** Date Rel Ver. Notes
37:UartInterface.c **** 4/10/2004 0.1 Module created
38:UartInterface.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
39:UartInterface.c **** contest.
GAS LISTING /tmp/ccGIWzET.s page 3
 
 
40:UartInterface.c **** 11/15/2004 1.2 Updated UART baud rate regs so that
41:UartInterface.c **** it runs at 115.2 kbps when the input
42:UartInterface.c **** crystal is at 17.7 MHz (which is the
43:UartInterface.c **** speed of the OV6620's crystal).
44:UartInterface.c **** 1/16/2005 1.4 Moved the serial received ISR to
45:UartInterface.c **** this file, instead of having it
46:UartInterface.c **** in its own UartInterfaceAsm.S file
47:UartInterface.c **** written in assembly.
48:UartInterface.c **** ***********************************************************/
49:UartInterface.c ****
50:UartInterface.c **** /* Includes */
51:UartInterface.c **** #include <avr/io.h>
52:UartInterface.c **** #include <avr/interrupt.h>
53:UartInterface.c **** #include <avr/signal.h>
54:UartInterface.c **** #include "CommonDefs.h"
55:UartInterface.c **** #include "UartInterface.h"
56:UartInterface.c **** #include "UIMgr.h"
57:UartInterface.c **** #include "Executive.h"
58:UartInterface.c ****
59:UartInterface.c **** /* Local Variables */
60:UartInterface.c ****
61:UartInterface.c **** /* Local Structures and Typedefs */
62:UartInterface.c ****
63:UartInterface.c **** /* Extern Variables */
64:UartInterface.c ****
65:UartInterface.c **** /* Definitions */
66:UartInterface.c ****
67:UartInterface.c **** /***********************************************************
68:UartInterface.c **** Function Name: UartInt_init
69:UartInterface.c **** Function Description: This function is responsible for
70:UartInterface.c **** initializing the UART interface on the mega8. This
71:UartInterface.c **** interface is set to communicate at 115.2 Kbps, with an
72:UartInterface.c **** 8N1 protocol.
73:UartInterface.c **** Inputs: none
74:UartInterface.c **** Outputs: none
75:UartInterface.c **** ***********************************************************/
76:UartInterface.c **** void UartInt_init(void)
77:UartInterface.c **** {
76 .stabn 68,0,77,.LM0-UartInt_init
77 .LM0:
78 /* prologue: frame size=0 */
79 /* prologue end (size=0) */
78:UartInterface.c **** /* set up the baud rate registers so the UART will operate
79:UartInterface.c **** at 115.2 Kbps */
80:UartInterface.c **** UBRRH = 0x00;
80 .stabn 68,0,80,.LM1-UartInt_init
81 .LM1:
82 0000 10BC out 64-0x20,__zero_reg__
81:UartInterface.c ****
82:UartInterface.c **** #ifdef NO_CRYSTAL
83:UartInterface.c **** UBRRL = 18; /* 18 for double clocking at 115.2 kbps */
83 .stabn 68,0,83,.LM2-UartInt_init
84 .LM2:
85 0002 82E1 ldi r24,lo8(18)
86 0004 89B9 out 41-0x20,r24
84:UartInterface.c **** #else
85:UartInterface.c **** UBRRL = 0x08; /* for 16 MHz crystal at 115.2 kbps */
GAS LISTING /tmp/ccGIWzET.s page 4
 
 
86:UartInterface.c **** #endif
87:UartInterface.c ****
88:UartInterface.c **** /* enable the tx and rx capabilities of the UART...as well
89:UartInterface.c **** as the receive complete interrupt */
90:UartInterface.c **** UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
87 .stabn 68,0,90,.LM3-UartInt_init
88 .LM3:
89 0006 88E9 ldi r24,lo8(-104)
90 0008 8AB9 out 42-0x20,r24
91:UartInterface.c ****
92:UartInterface.c **** /* set up the control registers so the UART works at 8N1 */
93:UartInterface.c **** UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
91 .stabn 68,0,93,.LM4-UartInt_init
92 .LM4:
93 000a 86E8 ldi r24,lo8(-122)
94 000c 80BD out 64-0x20,r24
94:UartInterface.c ****
95:UartInterface.c **** #ifdef NO_CRYSTAL
96:UartInterface.c **** /* set the baud rate to use the double-speed */
97:UartInterface.c **** UCSRA = (1<<U2X);
95 .stabn 68,0,97,.LM5-UartInt_init
96 .LM5:
97 000e 82E0 ldi r24,lo8(2)
98 0010 8BB9 out 43-0x20,r24
99 /* epilogue: frame size=0 */
100 0012 0895 ret
101 /* epilogue end (size=1) */
102 /* function UartInt_init size 10 (9) */
103 .size UartInt_init, .-UartInt_init
104 .Lscope0:
105 .stabs "",36,0,0,.Lscope0-UartInt_init
106 .stabd 78,0,0
107 .stabs "UartInt_txByte:F(0,15)",36,0,116,UartInt_txByte
108 .stabs "txByte:P(0,11)",64,0,115,24
109 .global UartInt_txByte
110 .type UartInt_txByte, @function
111 UartInt_txByte:
112 .stabd 46,0,0
98:UartInterface.c **** #endif
99:UartInterface.c ****
100:UartInterface.c **** }
101:UartInterface.c ****
102:UartInterface.c **** /***********************************************************
103:UartInterface.c **** Function Name: UartInt_txByte
104:UartInterface.c **** Function Description: This function is responsible for
105:UartInterface.c **** transmitting a single byte on the uart.
106:UartInterface.c **** Inputs: txByte - the byte to send
107:UartInterface.c **** Outputs: none
108:UartInterface.c **** NOTES: When the TX UDRE (data register empty) is set, there
109:UartInterface.c **** is puposefully no interrupt...thus, to send a string of
110:UartInterface.c **** data out, the calling routine needs to hold up the entire
111:UartInterface.c **** application while this takes place (or just send one
112:UartInterface.c **** byte at a time at strtegically timed intervals, like
113:UartInterface.c **** the stats data is sent out :-)
114:UartInterface.c **** ***********************************************************/
115:UartInterface.c **** void UartInt_txByte(unsigned char txByte)
116:UartInterface.c **** {
GAS LISTING /tmp/ccGIWzET.s page 5
 
 
113 .stabn 68,0,116,.LM6-UartInt_txByte
114 .LM6:
115 /* prologue: frame size=0 */
116 /* prologue end (size=0) */
117 .L5:
117:UartInterface.c **** /* Wait for empty transmit buffer */
118:UartInterface.c **** while ( !( UCSRA & (1<<UDRE)) );
118 .stabn 68,0,118,.LM7-UartInt_txByte
119 .LM7:
120 0014 5D9B sbis 43-0x20,5
121 0016 FECF rjmp .L5
119:UartInterface.c **** /* Put data into buffer, sends the data */
120:UartInterface.c **** UDR = txByte;
122 .stabn 68,0,120,.LM8-UartInt_txByte
123 .LM8:
124 0018 8CB9 out 44-0x20,r24
125 /* epilogue: frame size=0 */
126 001a 0895 ret
127 /* epilogue end (size=1) */
128 /* function UartInt_txByte size 4 (3) */
129 .size UartInt_txByte, .-UartInt_txByte
130 .Lscope1:
131 .stabs "",36,0,0,.Lscope1-UartInt_txByte
132 .stabd 78,0,0
133 .stabs "__vector_11:F(0,15)",36,0,139,__vector_11
134 .global __vector_11
135 .type __vector_11, @function
136 __vector_11:
137 .stabd 46,0,0
121:UartInterface.c **** }
122:UartInterface.c ****
123:UartInterface.c **** /***********************************************************
124:UartInterface.c **** Function Name: SIG_UART_RECV ISR
125:UartInterface.c **** Function Description: This function is responsible for
126:UartInterface.c **** handling the interrupt caused when a data byte is
127:UartInterface.c **** received by the UART.
128:UartInterface.c **** Inputs: none
129:UartInterface.c **** Outputs: none
130:UartInterface.c **** NOTES: This function was originally written in assembly,
131:UartInterface.c **** but moved over to C when the setting of the "T" bit at
132:UartInterface.c **** the end of the routine was no longer necessary (this
133:UartInterface.c **** theoretically allowed the AVRcam to respond to serial
134:UartInterface.c **** bytes in the middle of tracking or dumping a frame.
135:UartInterface.c **** But it wasn't really needed, and understanding the C
136:UartInterface.c **** is easier :-)
137:UartInterface.c **** ***********************************************************/
138:UartInterface.c **** SIGNAL(SIG_UART_RECV)
139:UartInterface.c **** {
138 .stabn 68,0,139,.LM9-__vector_11
139 .LM9:
140 /* prologue: frame size=0 */
141 001c 1F92 push __zero_reg__
142 001e 0F92 push __tmp_reg__
143 0020 0FB6 in __tmp_reg__,__SREG__
144 0022 0F92 push __tmp_reg__
145 0024 1124 clr __zero_reg__
146 0026 8F93 push r24
GAS LISTING /tmp/ccGIWzET.s page 6
 
 
147 0028 9F93 push r25
148 002a EF93 push r30
149 002c FF93 push r31
150 /* prologue end (size=9) */
140:UartInterface.c **** unsigned char tmpHead;
141:UartInterface.c **** /* read the data byte, put it in the serial queue, and
142:UartInterface.c **** post the event */
143:UartInterface.c ****
144:UartInterface.c **** UIMgr_rxFifo[UIMgr_rxFifoHead] = UDR;
151 .stabn 68,0,144,.LM10-__vector_11
152 .LM10:
153 002e 8091 0000 lds r24,UIMgr_rxFifoHead
154 0032 9CB1 in r25,44-0x20
155 0034 E0E0 ldi r30,lo8(UIMgr_rxFifo)
156 0036 F0E0 ldi r31,hi8(UIMgr_rxFifo)
157 0038 E80F add r30,r24
158 003a F11D adc r31,__zero_reg__
159 003c 9083 st Z,r25
145:UartInterface.c ****
146:UartInterface.c **** /* now move the head up */
147:UartInterface.c **** tmpHead = (UIMgr_rxFifoHead + 1) & (UI_MGR_RX_FIFO_MASK);
148:UartInterface.c **** UIMgr_rxFifoHead = tmpHead;
160 .stabn 68,0,148,.LM11-__vector_11
161 .LM11:
162 003e 8F5F subi r24,lo8(-(1))
163 0040 8F71 andi r24,lo8(31)
164 0042 8093 0000 sts UIMgr_rxFifoHead,r24
149:UartInterface.c ****
150:UartInterface.c **** /* write the serial received event to the event fifo */
151:UartInterface.c **** Exec_eventFifo[Exec_eventFifoHead] = EV_SERIAL_DATA_RECEIVED;
165 .stabn 68,0,151,.LM12-__vector_11
166 .LM12:
167 0046 8091 0000 lds r24,Exec_eventFifoHead
168 004a E0E0 ldi r30,lo8(Exec_eventFifo)
169 004c F0E0 ldi r31,hi8(Exec_eventFifo)
170 004e E80F add r30,r24
171 0050 F11D adc r31,__zero_reg__
172 0052 91E0 ldi r25,lo8(1)
173 0054 9083 st Z,r25
152:UartInterface.c ****
153:UartInterface.c **** /* now move the head up */
154:UartInterface.c **** tmpHead = (Exec_eventFifoHead + 1) & (EXEC_EVENT_FIFO_MASK);
155:UartInterface.c **** Exec_eventFifoHead = tmpHead;
174 .stabn 68,0,155,.LM13-__vector_11
175 .LM13:
176 0056 8F5F subi r24,lo8(-(1))
177 0058 8770 andi r24,lo8(7)
178 005a 8093 0000 sts Exec_eventFifoHead,r24
179 /* epilogue: frame size=0 */
180 005e FF91 pop r31
181 0060 EF91 pop r30
182 0062 9F91 pop r25
183 0064 8F91 pop r24
184 0066 0F90 pop __tmp_reg__
185 0068 0FBE out __SREG__,__tmp_reg__
186 006a 0F90 pop __tmp_reg__
187 006c 1F90 pop __zero_reg__
GAS LISTING /tmp/ccGIWzET.s page 7
 
 
188 006e 1895 reti
189 /* epilogue end (size=9) */
190 /* function __vector_11 size 42 (24) */
191 .size __vector_11, .-__vector_11
192 .Lscope2:
193 .stabs "",36,0,0,.Lscope2-__vector_11
194 .stabd 78,0,0
195 .stabs "",100,0,0,.Letext0
196 .Letext0:
197 /* File "UartInterface.c": code 56 = 0x0038 ( 36), prologues 9, epilogues 11 */
GAS LISTING /tmp/ccGIWzET.s page 8
 
 
DEFINED SYMBOLS
*ABS*:00000000 UartInterface.c
/tmp/ccGIWzET.s:3 *ABS*:0000003f __SREG__
/tmp/ccGIWzET.s:4 *ABS*:0000003e __SP_H__
/tmp/ccGIWzET.s:5 *ABS*:0000003d __SP_L__
/tmp/ccGIWzET.s:6 *ABS*:00000000 __tmp_reg__
/tmp/ccGIWzET.s:7 *ABS*:00000001 __zero_reg__
/tmp/ccGIWzET.s:74 .text:00000000 UartInt_init
/tmp/ccGIWzET.s:111 .text:00000014 UartInt_txByte
/tmp/ccGIWzET.s:136 .text:0000001c __vector_11
 
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
UIMgr_rxFifoHead
UIMgr_rxFifo
Exec_eventFifoHead
Exec_eventFifo
/programy/Atmel_C/AVRcam/Utility.c
0,0 → 1,78
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: Utility.c
Module Date: 04/13/2004
Module Auth: John Orlando
Description: This module provides a basic set of
general purpose utilities that can be used by any
module needing them.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
 
/* Includes */
#include "CommonDefs.h"
 
/* Local Variables */
 
/* Local Structures and Typedefs */
 
/* Extern Variables */
 
/* Definitions */
 
/***********************************************************
Function Name: Utility_delay
Function Description: This function provides a busy-wait
delay for a specified number of milliseconds.
Inputs: numMs - the number of milliseconds to delay
Outputs: none
NOTES: The delay_loop_1 and delay_loop_2 functions found
in avr/delay.h provide accurate 3 and 4 cycle delay loops
if needed...this isn't really a millisecond, so DON'T
depend on it for exact timing...
***********************************************************/
void Utility_delay(unsigned short numMs)
{
volatile unsigned short i=0,j=0;
#ifndef SIMULATION
for (i=0; i<numMs; i++)
{
for (j=0; j<1000; j++)
{
asm volatile("nop"::);
}
}
#endif
}
 
 
/programy/Atmel_C/AVRcam/Utility.d
0,0 → 1,0
Utility.o Utility.d : Utility.c CommonDefs.h
/programy/Atmel_C/AVRcam/Utility.h
0,0 → 1,48
#ifndef UTILITY_H
#define UTILITY_H
 
/*
Copyright (C) 2004 John Orlando
AVRcam: a small real-time image processing engine.
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
For more information on the AVRcam, please contact:
 
john@jrobot.net
 
or go to www.jrobot.net for more details regarding the system.
*/
/***********************************************************
Module Name: Utility.h
Module Date: 04/13/2004
Module Auth: John Orlando
Description: This file provides the external interface
to the Utility module.
Revision History:
Date Rel Ver. Notes
4/10/2004 0.1 Module created
6/30/2004 1.0 Initial release for Circuit Cellar
contest.
***********************************************************/
/* Extern Functions */
extern void Utility_delay(unsigned short numMs);
#endif
 
/programy/Atmel_C/AVRcam/makefile
0,0 → 1,362
# WinAVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al.
# Released to the Public Domain
# Please read the make user manual!
#
# Retrofitted for the AVRcam project by John Orlando 6/30/2004
#
#
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
#
# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
# 4.07 or greater).
#
# make program = Download the hex file to the device, using avrdude. Please
# customize the avrdude settings below first!
#
# make filename.s = Just compile filename.c into the assembler code only
#
# To rebuild project do "make clean" then "make all".
#
# Revision History:
# Date Rel Ver. Notes
# 4/10/2004 0.1 Module created
# 6/30/2004 1.0 Initial release for Circuit Cellar
# contest.
# 1/15/2005 1.4 Removed the UartInterfaceAsm file from
# file list, since the routine in that
# file was added to UartInterface.c.
 
 
# MCU name
MCU = atmega8
 
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
 
# Target file name (without extension).
TARGET = AVRcam
 
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = 1
 
 
# List C source files here. (C dependencies are automatically generated.)
#SRC = $(TARGET).c
 
# If there is more than one source file, append them above, or adjust and
# uncomment the following:
# NOTE: The order of the files here is important...CamInterface.c MUST be
# the first file, due to the declaration of an array that needs to be
# located at the very beginning of the .noinit section in on-board RAM.
SRC = CamInterface.c Main.c Executive.c FrameMgr.c UIMgr.c UartInterface.c I2CInterface.c CamConfig.c Utility.c DebugInterface.c
 
 
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = CamInterfaceAsm.S
 
 
 
# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-ahlms=$(<:.c=.lst)
 
 
 
# Optional assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-ahlms=$(<:.S=.lst),-gstabs
 
 
 
# Optional linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref,--section-start=.noinit=0x800300
#LDFLAGS = -Wl,-Map=$(TARGET).map,--cref,--section-start=.john=0x800200
 
 
 
# Additional libraries
#
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
#
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
#
# -lm = math library
LDFLAGS += -lm
 
 
 
 
# Programming support using avrdude. Settings and variables.
 
# Programming hardware: avrisp stk500 avr910 pavr stk200 pony-stk200
# dt006 bascom alf
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = dapa
 
 
#AVRDUDE_PORT = com1 # programmer connected to serial device
AVRDUDE_PORT = /dev/parport0 # programmer connected to parallel port
 
AVRDUDE_ERASE = -e
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
 
 
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE += -y
#
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_FLAGS += -V
#
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_FLAGS += -v -v
 
 
 
 
# ---------------------------------------------------------------------------
 
# Define directories, if needed.
DIRAVR = c:/winavr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib
 
 
# Define programs and commands.
SHELL = sh
 
CC = avr-gcc
 
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
 
 
# Programming support using avrdude.
AVRDUDE = avrdude
 
 
REMOVE = rm -f
COPY = cp
 
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
 
FINISH = echo Errors: none
BEGIN = echo -------- begin --------
END = echo -------- end --------
 
 
 
 
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
 
# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
 
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
 
 
 
# Default target.
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss coff sizeafter finished end
 
 
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@$(BEGIN)
 
finished:
@$(FINISH)
 
end:
@$(END)
 
 
# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE);fi
 
sizeafter:
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE);fi
 
 
 
# Display compiler version information.
gccversion :
$(CC) --version
 
 
 
 
# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
 
 
coff: $(TARGET).elf
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
 
 
extcoff: $(TARGET).elf
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
 
 
 
 
# Program the device. The magic trickery below examines the .eep hex
# file whether the size is > 0, and if so, reprograms the EEPROM as
# well. Just delete these lines if you don't want this feature (like
# on the ATmegas with the EESAVE fuse bit set).
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_ERASE)
$(AVRDUDE) $(AVRDUDE_FLAGS) -i $(TARGET).hex
@$(SIZE) --target=$(FORMAT) $(TARGET).eep | while read line; \
do \
set -- $$line; \
if [ "x$$1" != "x0" ] ; then continue; fi; \
if [ "$$2" -ne 0 ] ; then \
echo $(AVRDUDE) $(AVRDUDE_FLAGS) -m eeprom -i $(TARGET).eep; \
$(AVRDUDE) $(AVRDUDE_FLAGS) -m eeprom -i $(TARGET).eep; \
break; \
fi; \
done
 
 
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
 
%.eep: %.elf
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
 
# Create extended listing file from ELF output file.
%.lss: %.elf
$(OBJDUMP) -h -S $< > $@
 
 
 
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
 
 
# Compile: create object files from C source files.
%.o : %.c
$(CC) -c $(ALL_CFLAGS) $< -o $@
 
 
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
 
 
# Assemble: create object files from assembler source files.
%.o : %.S
$(CC) -c $(ALL_ASFLAGS) $< -o $@
 
 
 
 
 
 
# Target: clean project.
clean: begin clean_list finished end
 
clean_list :
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
 
 
# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@
 
 
# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)
 
 
 
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
clean clean_list program