/IR-TX-BL/trunk/V0.03/Doku/IR-Ctrl_Schaltplan.GIF |
---|
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 |
/IR-TX-BL/trunk/V0.03/Doku/IR-Ctrl_Schaltplan_mitT1.GIF |
---|
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 |
/IR-TX-BL/trunk/V0.03/Doku/IR-Tx_V0_03.hex |
---|
0,0 → 1,116 |
:1000000012C02CC02BC02AC029C03FC027C026C0A8 |
:1000100026C0B1C023C022C021C020C01FC01EC046 |
:100020001DC0BDC11BC011241FBECFE5D4E0DEBF83 |
:10003000CDBF10E0A0E6B0E0E2E1F7E002C005903D |
:100040000D92A836B107D9F710E0A8E6B0E001C0DC |
:100050001D92AD37B107E1F71BD15AC3D1CF1F9223 |
:100060000F920FB60F9211248F93809169008F5FCA |
:100070008093690080916C008F5F80936C008F91FA |
:100080000F900FBE0F901F9018951F920F920FB6F2 |
:100090000F9211242F933F934F938F939F930EB4FE |
:1000A00006FE0CC08EB58F7B8EBD1092690086B5A2 |
:1000B00097B5909371008093700049C08EB58064AD |
:1000C0008EBD26B537B58091690080917000909102 |
:1000D0007100281B390B30936F0020936E00C9010B |
:1000E000895592408750974090F588E0253338072E |
:1000F00018F084E398E005C02458334030F484E8D5 |
:1001000093E090936F0080936E0020916000309197 |
:100110006100C90143E0880F991F4A95E1F7821BEE |
:10012000930B20916E0030916F00820F931F23E09C |
:10013000969587952A95E1F790936F0080936E00CE |
:10014000909361008093600081E0809368009F91AC |
:100150008F914F913F912F910F900FBE0F901F9055 |
:10016000189589E085BD8CE683BD85E083BF89B79E |
:100170008E7F89BF08951F920F920FB60F921124A0 |
:100180002F938F939F9320916A002230B1F02330F8 |
:1001900020F4213009F04EC006C02330E9F02430AD |
:1001A00009F048C034C085B5806185BD82E0809388 |
:1001B0006A0010926D008AE90BC085B58F7E85BDFF |
:1001C00083E080936A0080916B0086FD03C088EF16 |
:1001D00082BF35C088EEFCCF85B5806185BD88EFD4 |
:1001E00082BF80916B00880F80936B0080916D00BF |
:1001F0008F5F80936D00873020F482E080936A00E7 |
:100200001EC084E080936A0010926D0018C085B50E |
:100210008F7E85BD8CE382BF90916D00943118F480 |
:1002200020936A0003C085E080936A009F5F9093EB |
:100230006D0005C089B78E7F89BF10926A009F91BB |
:100240008F912F910F900FBE0F901F901895982FA0 |
:1002500080916A008823E1F781E080936A0090939F |
:100260006B0088B718BE89B7816089BF08951FBC2D |
:1002700082EC8EBD89B7846289BF089529B789B79A |
:100280008F7D89BF809160009091610029BF0895A2 |
:1002900088E084BB15BA80E881BB12BA8EE087BBC8 |
:1002A00018BA1FBC82EC8EBD89B7846289BF72D038 |
:1002B00058DF789480916800813009F041C0109235 |
:1002C000680089B799B79F7D99BF209160003091F0 |
:1002D000610089BF275D364084F081E4B8DFAB9AC6 |
:1002E00089B799B79F7D99BF2091600030916100D7 |
:1002F00089BF23573640A4F7AB9889B799B79F7D3C |
:1003000099BF209160003091610089BF225E344026 |
:10031000BCF4979A80E49BDF10926C0004C080913B |
:100320006C00803160F489B799B79F7D99BF2091A7 |
:1003300060003091610089BF2654354084F397985E |
:1003400080917200803419F4979A81DF9798809198 |
:100350007200813409F0AECF939A79DF9398AACFD7 |
:100360001F93182F8A3011F48DE0FADF5D9BFECFCA |
:100370001CB980E090E01F910895599A88E18AB9EC |
:1003800086E880BD89E189B960E070E080EB91E0AA |
:100390003ED0089582E682B985EC86BF08951F920B |
:1003A0000F920FB60F9211248F939F9381B19927CB |
:1003B000887F90708038910599F08138910534F4E8 |
:1003C0000097C9F080369105C9F40FC0883B9105AC |
:1003D00059F0883F910561F0883A910579F404C09D |
:1003E00083B18093720001C013B886B7806807C0DC |
:1003F00086B7806986BF86B7806986BF85EC86BF71 |
:100400009F918F910F900FBE0F901F901895EF92B4 |
:10041000FF920F931F93CF93DF938C017B01892B66 |
:1004200011F4672BC9F16EE070E081E090E03BD001 |
:10043000FC01009789F1DC0180E88383E114F10479 |
:1004400071F0F386E28681E8838380917300909156 |
:100450007400892B21F4F0937400E093730001156C |
:100460001105E1F011870087838182608383809189 |
:10047000750090917600892B89F4F0937600E093D3 |
:1004800075008091770090917800892B39F4F09372 |
:100490007800E093770002C0A0E0B0E0CD01E6E094 |
:1004A000CDB7DEB726C10F931F93CF93DF93869FFF |
:1004B0008001879F100D969F100D1124C8010DD04B |
:1004C000EC01009721F0A80160E070E0FFD0CE01C0 |
:1004D000DF91CF911F910F910895CF93DF93AC01DE |
:1004E000029710F442E050E0A0917B00B0917C00B4 |
:1004F000FD01C0E0D0E020E030E020C080819181AB |
:100500008417950769F482819381209719F09B8362 |
:100510008A8304C090937C0080937B00CF0132C01B |
:100520004817590738F42115310519F08217930738 |
:1005300008F49C01EF010280F381E02D3097F1F681 |
:100540002115310589F1C901841B950B049708F425 |
:10055000A901E0E0F0E026C08D919C9111978217EF |
:100560009307E9F44817590779F4ED018A819B81D3 |
:10057000309719F09383828304C090937C0080931A |
:100580007B00CD01029649C0841B950BFD01E80F4D |
:10059000F91F4193519302978D939C933AC0FD01AB |
:1005A000A281B3811097C1F68091790090917A0071 |
:1005B000892B41F4809164009091650090937A00BA |
:1005C00080937900209166003091670021153105F4 |
:1005D00041F42DB73EB78091620090916300281BD3 |
:1005E000390BE0917900F0917A002E1B3F0B241714 |
:1005F000350788F0CA0102962817390760F0CF0145 |
:10060000840F951F029690937A008093790041930E |
:100610005193CF0102C080E090E0DF91CF91089527 |
:10062000CF93DF93009709F44EC0EC0122971B8211 |
:100630001A82A0917B00B0917C00109711F140E0EC |
:1006400050E001C0DC01AC17BD0700F1BB83AA83F9 |
:10065000FE0121913191E20FF31FEA17FB0771F4BC |
:100660002E5F3F4F8D919C911197820F931F99831D |
:100670008883FD01828193819B838A834115510583 |
:1006800059F4D0937C00C0937B001DC0FD01828192 |
:100690009381AD010097B1F6FA01D383C283219112 |
:1006A0003191E20FF31FEC17FD0769F42E5F3F4F06 |
:1006B00088819981820F931FFA01918380838A81B7 |
:1006C0009B8193838283DF91CF910895DC0101C0E8 |
:1006D0006D9341505040E0F708952A883988488842 |
:1006E0005F846E847D848C849B84AA84B984C8844E |
:1006F000DF80EE80FD800C811B81AA81B981CE0F45 |
:10070000D11D0FB6F894DEBF0FBECDBFED01089529 |
:02071000FFCF19 |
:08071200DC0520007D00000061 |
:00000001FF |
/IR-TX-BL/trunk/V0.03/Doku/README.TXT |
---|
0,0 → 1,77 |
Readme zur "PPM2PentaxIR" (geändert 2.12.2007) |
Auslösen und Zoomen von Pentax Fotokameres per IR, gesteuert durch Servoausgang (PPM) |
Hardwarebasis für die Entwicklung ist eine unbestückte Holger BL-CTRL V1.0 Platinen. |
Auf dieser Platinen wurden lediglich folgende Bauteile bestückt. |
(Bauteilwerte wie bei original BL Bestückung beibehalten) |
IC1 ATMEGA8 - A |
R3 100 |
R10 18K |
R26 4K7 |
R27 1K |
R33 1K |
R32 10 |
C3 100n |
C7 100n |
C11 100n |
C12 10uF/16V |
LED1 LED0805 Grün |
LED2 LED0805 Rot |
Es läst sich natürlich LED1 und LED2 sowie die zugehörigen Vorwiderstände (R27 und R33) einsparen falls man diese eh nicht verwenden möchte, |
zumal Sie eher für Debugzwecke eingesetzt wurden. |
Das PPM Signal (vom Servoausgang) muss an das PPM Pad der BL Platine (Pin12 ATMEGA) |
Masse kann praktisch an einen beliebigen Massepunkt an der BL Platinen. Die Versorgungsspannung geht bei mir einfach direkt an das Ausgangspad |
des nicht vorhanden Spannungsreglers (IC2) bzw. an den Anschlusspunkt welcher auf der BL Paltine mit 5V versehen ist. |
Da kein Spannungsregler verwendet wird ist strickt darauf zu achten, das keine zu hohen Spannungen für die Versorgung verwendet werden, |
die üblichen 4,5 bis 5,x Volt eines Empfänger Ausgangs kann der Amtel gut ab. Besser wäre es natürlich einen Spannungsregler zu verwenden, |
dann aber statt des 5V Reglers einen 3.3 Volt Typ. Hier sollte dann jedoch der RC Oscilator des Atmegas geprüft werden, da zu erwarten ist |
das die Frequenz nicht mehr besonders gut stimmt (tut sie 5V wohl auch nicht) |
Die IR Diode (ich habe fast beliebige Typen ausprobiert welche ich im Bestand hatte) wird an Masse und an das Basispad des nicht bestückten T1 angeschlossen. |
Hierbei dient R3 nun als Vorwiderstand für die LED, deshalb ist R3 auch der einzige Widerstand welcher gegenüber der original BL Bestückung vom Wert her |
geändert ist. |
Wichtig: |
Beim Programieren des ATMegas muß auf die richtigen Fusesettings geachtet werden, der Controller muß mit internem 8Mhz Osc laufen. |
Ich habe zum setzen der Fusebits PonyPorg verwendet. |
Das Programieren des Controller läuft bei mir mit AVRdude unter "Programmers Notepad" aus der WinAVR Installation. |
Wird das mitgelieferte "makefile" verwendet so ist dort als Programmer "PonySer auf Com1" ausgewähl, so das man mit einem Sercon Interface direkt |
aus WinAvr das Programm auf den ATMega progen kann. (geht nur per echter Seriel Schnittstelle, kein USB zu RS232 Wandler) |
Die Bedienung ist derzeit relativ einfach. Bei Mittelstellung des Kanals (Knüppel Mittel) passiert nichts, wird der Kanal nun in die eine Richtung |
gesteuert so wird eine neue Zoomstufe eingestellt (drei Zoomstuffen gibt es bei der Pentax per IR Steuerung), wird der Kanal in |
die andere Richtung gesteuert, so wird ein Bild ausgelöst. |
Schaltpunkte sind derzeit fix bei ca. nach oben 1750us und 1250us nach unten jeweils mit einer Hysterese von 100us. |
Eine normale Graupneranlage gibt üblicherweise bei Kanal Mittelstellung etwas 1500us aus, mit einem Hub in beide Richtungen von ca. 600us |
(bei 100% Servoweg), also 1100us bis 1900us. Somit liegen die Schaltpunkte etwa auf halbem Weg. |
Anzumerken ist jedoch, das der Interne RC Oscilator des ATMEGA8 ohne spezielle Kalibrierung nicht besonders genau ist und somit doch ganz |
schöne Abweichungen auftretten können. Hiermit verschieben sich dann natürlich auch die Schaltpunkte nach oben oder unten. |
Es befindet sich sicher noch die ein oder andere Stelle im Code welche man besser machen oder eleganter lösen könnte. |
Das ganze ist mein erstes Atmel AVR Project und dann auch noch in C , ich bin eigentlich ein eingefleischter |
PIC Assembler Fritze :-) also verzeiht mir den Programmierstiel zumal das ganze innerhalb eines Tages fertig wurde. |
Wenn jemand gerne andere IR Codes ausgeben lassen möchte und genau weis wie diese ausehen, bzw. ich dies rausfinden kann so bin ich auch gerne |
bereits das zu implementieren. |
Viel Spaß beim nachbauen und verbessern. |
Walter Meyer |
30.11.2007 |
freakware GmbH division south |
/IR-TX-BL/trunk/V0.03/Doku/fuses.JPG |
---|
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 |
/IR-TX-BL/trunk/V0.03/IR-Tx.pnproj |
---|
0,0 → 1,0 |
<Project name="IR-Tx"><File path="main.c"></File><File path="main.h"></File><File path="uart.h"></File><File path="uart.c"></File><File path="twislave.c"></File><File path="twislave.h"></File></Project> |
/IR-TX-BL/trunk/V0.03/IR-Tx.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="IR-Tx" x="true"></e></ViewState></pd> |
/IR-TX-BL/trunk/V0.03/IR-Tx.pnws |
---|
0,0 → 1,0 |
<Workspace><File path="c:\mikrokopter\projects\ir-tx-bl\trunk\v0.03\main.c"></File><Project path="c:\mikrokopter\projects\ir-tx-bl\trunk\v0.03\ir-tx.pnproj"></Project></Workspace> |
/IR-TX-BL/trunk/V0.03/IR-Tx_V0_03.hex |
---|
0,0 → 1,116 |
:1000000012C02CC02BC02AC029C03FC027C026C0A8 |
:1000100026C0B1C023C022C021C020C01FC01EC046 |
:100020001DC0BDC11BC011241FBECFE5D4E0DEBF83 |
:10003000CDBF10E0A0E6B0E0E2E1F7E002C005903D |
:100040000D92A836B107D9F710E0A8E6B0E001C0DC |
:100050001D92AD37B107E1F71BD15AC3D1CF1F9223 |
:100060000F920FB60F9211248F93809169008F5FCA |
:100070008093690080916C008F5F80936C008F91FA |
:100080000F900FBE0F901F9018951F920F920FB6F2 |
:100090000F9211242F933F934F938F939F930EB4FE |
:1000A00006FE0CC08EB58F7B8EBD1092690086B5A2 |
:1000B00097B5909371008093700049C08EB58064AD |
:1000C0008EBD26B537B58091690080917000909102 |
:1000D0007100281B390B30936F0020936E00C9010B |
:1000E000895592408750974090F588E0253338072E |
:1000F00018F084E398E005C02458334030F484E8D5 |
:1001000093E090936F0080936E0020916000309197 |
:100110006100C90143E0880F991F4A95E1F7821BEE |
:10012000930B20916E0030916F00820F931F23E09C |
:10013000969587952A95E1F790936F0080936E00CE |
:10014000909361008093600081E0809368009F91AC |
:100150008F914F913F912F910F900FBE0F901F9055 |
:10016000189589E085BD8CE683BD85E083BF89B79E |
:100170008E7F89BF08951F920F920FB60F921124A0 |
:100180002F938F939F9320916A002230B1F02330F8 |
:1001900020F4213009F04EC006C02330E9F02430AD |
:1001A00009F048C034C085B5806185BD82E0809388 |
:1001B0006A0010926D008AE90BC085B58F7E85BDFF |
:1001C00083E080936A0080916B0086FD03C088EF16 |
:1001D00082BF35C088EEFCCF85B5806185BD88EFD4 |
:1001E00082BF80916B00880F80936B0080916D00BF |
:1001F0008F5F80936D00873020F482E080936A00E7 |
:100200001EC084E080936A0010926D0018C085B50E |
:100210008F7E85BD8CE382BF90916D00943118F480 |
:1002200020936A0003C085E080936A009F5F9093EB |
:100230006D0005C089B78E7F89BF10926A009F91BB |
:100240008F912F910F900FBE0F901F901895982FA0 |
:1002500080916A008823E1F781E080936A0090939F |
:100260006B0088B718BE89B7816089BF08951FBC2D |
:1002700082EC8EBD89B7846289BF089529B789B79A |
:100280008F7D89BF809160009091610029BF0895A2 |
:1002900088E084BB15BA80E881BB12BA8EE087BBC8 |
:1002A00018BA1FBC82EC8EBD89B7846289BF72D038 |
:1002B00058DF789480916800813009F041C0109235 |
:1002C000680089B799B79F7D99BF209160003091F0 |
:1002D000610089BF275D364084F081E4B8DFAB9AC6 |
:1002E00089B799B79F7D99BF2091600030916100D7 |
:1002F00089BF23573640A4F7AB9889B799B79F7D3C |
:1003000099BF209160003091610089BF225E344026 |
:10031000BCF4979A80E49BDF10926C0004C080913B |
:100320006C00803160F489B799B79F7D99BF2091A7 |
:1003300060003091610089BF2654354084F397985E |
:1003400080917200803419F4979A81DF9798809198 |
:100350007200813409F0AECF939A79DF9398AACFD7 |
:100360001F93182F8A3011F48DE0FADF5D9BFECFCA |
:100370001CB980E090E01F910895599A88E18AB9EC |
:1003800086E880BD89E189B960E070E080EB91E0AA |
:100390003ED0089582E682B985EC86BF08951F920B |
:1003A0000F920FB60F9211248F939F9381B19927CB |
:1003B000887F90708038910599F08138910534F4E8 |
:1003C0000097C9F080369105C9F40FC0883B9105AC |
:1003D00059F0883F910561F0883A910579F404C09D |
:1003E00083B18093720001C013B886B7806807C0DC |
:1003F00086B7806986BF86B7806986BF85EC86BF71 |
:100400009F918F910F900FBE0F901F901895EF92B4 |
:10041000FF920F931F93CF93DF938C017B01892B66 |
:1004200011F4672BC9F16EE070E081E090E03BD001 |
:10043000FC01009789F1DC0180E88383E114F10479 |
:1004400071F0F386E28681E8838380917300909156 |
:100450007400892B21F4F0937400E093730001156C |
:100460001105E1F011870087838182608383809189 |
:10047000750090917600892B89F4F0937600E093D3 |
:1004800075008091770090917800892B39F4F09372 |
:100490007800E093770002C0A0E0B0E0CD01E6E094 |
:1004A000CDB7DEB726C10F931F93CF93DF93869FFF |
:1004B0008001879F100D969F100D1124C8010DD04B |
:1004C000EC01009721F0A80160E070E0FFD0CE01C0 |
:1004D000DF91CF911F910F910895CF93DF93AC01DE |
:1004E000029710F442E050E0A0917B00B0917C00B4 |
:1004F000FD01C0E0D0E020E030E020C080819181AB |
:100500008417950769F482819381209719F09B8362 |
:100510008A8304C090937C0080937B00CF0132C01B |
:100520004817590738F42115310519F08217930738 |
:1005300008F49C01EF010280F381E02D3097F1F681 |
:100540002115310589F1C901841B950B049708F425 |
:10055000A901E0E0F0E026C08D919C9111978217EF |
:100560009307E9F44817590779F4ED018A819B81D3 |
:10057000309719F09383828304C090937C0080931A |
:100580007B00CD01029649C0841B950BFD01E80F4D |
:10059000F91F4193519302978D939C933AC0FD01AB |
:1005A000A281B3811097C1F68091790090917A0071 |
:1005B000892B41F4809164009091650090937A00BA |
:1005C00080937900209166003091670021153105F4 |
:1005D00041F42DB73EB78091620090916300281BD3 |
:1005E000390BE0917900F0917A002E1B3F0B241714 |
:1005F000350788F0CA0102962817390760F0CF0145 |
:10060000840F951F029690937A008093790041930E |
:100610005193CF0102C080E090E0DF91CF91089527 |
:10062000CF93DF93009709F44EC0EC0122971B8211 |
:100630001A82A0917B00B0917C00109711F140E0EC |
:1006400050E001C0DC01AC17BD0700F1BB83AA83F9 |
:10065000FE0121913191E20FF31FEA17FB0771F4BC |
:100660002E5F3F4F8D919C911197820F931F99831D |
:100670008883FD01828193819B838A834115510583 |
:1006800059F4D0937C00C0937B001DC0FD01828192 |
:100690009381AD010097B1F6FA01D383C283219112 |
:1006A0003191E20FF31FEC17FD0769F42E5F3F4F06 |
:1006B00088819981820F931FFA01918380838A81B7 |
:1006C0009B8193838283DF91CF910895DC0101C0E8 |
:1006D0006D9341505040E0F708952A883988488842 |
:1006E0005F846E847D848C849B84AA84B984C8844E |
:1006F000DF80EE80FD800C811B81AA81B981CE0F45 |
:10070000D11D0FB6F894DEBF0FBECDBFED01089529 |
:02071000FFCF19 |
:08071200DC0520007D00000061 |
:00000001FF |
/IR-TX-BL/trunk/V0.03/main.c |
---|
0,0 → 1,245 |
//############################################################################ |
// - PPM2PentaxIR Main |
// - ATMEGA8 mit 8MHz |
// - Nur für den privaten Gebrauch |
// - Keine Garantie auf Fehlerfreiheit |
// - Kommerzielle Nutzung nur mit meiner Zustimmung |
// - walter Meyer @ www.freakware.de |
// - 30.11.2007 |
// - Make sure Fuses are programmed for internal 8 MHz RC Oscilator |
//############################################################################*/ |
#include "main.h" |
#include "uart.h" |
#include "twislave.h" |
volatile unsigned int ppm_signal = 1500; |
volatile unsigned char ppm_new = 0; |
volatile unsigned char TMR1OvF = 0; |
volatile unsigned char IRstate = 0; |
volatile unsigned char IRdat = 0; |
volatile unsigned char TMR65ms = 0; |
SIGNAL(SIG_OVERFLOW1) |
{ |
TMR1OvF++; |
TMR65ms++; |
} |
SIGNAL(SIG_INPUT_CAPTURE1) |
{ |
static unsigned int pos_ICR; |
static unsigned int ppm; |
if ((TCCR1B & (1<<ICES1)) != 0) //rising edge |
{ |
TCCR1B &= ~(1<<ICES1); //set falling egde |
TMR1OvF = 0; |
pos_ICR = ICR1; |
} |
else //falling edge |
{ |
TCCR1B |= (1<<ICES1); //set rising egde |
ppm = (ICR1 - pos_ICR + (int) TMR1OvF * 65536); |
if ((ppm > 600) && (ppm < 2400)) |
{ |
if (ppm > 2100) ppm = 2100; |
if (ppm < 900) ppm = 900; |
ppm = (ppm_signal * 7 + ppm) / 8; |
ppm_signal = ppm; |
ppm_new = 1; |
} |
} |
} |
/*##############################################################################*/ |
void StartIRModulation(void) |
{ |
//Timer1 Config for generation the 38Khz IR Modulation |
TCCR2 = (0<<FOC2)|(0<<WGM20)|(0<<COM21)|(0<<COM20)| |
(1<<WGM21) |(0<<CS22) |(0<<CS21) |(1<<CS20); |
OCR2 = 108; //~38Khz @ 8Mhz |
//Timer 0 Config for getting right timing for IR Pattern |
TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00); // clk(@8MHz) / 1024 = 128us / clk (resolution) |
TIMSK &= ~(1<<TOIE0); // |
} |
SIGNAL(SIG_OVERFLOW0) |
{ |
static unsigned char IRbit; |
switch (IRstate) |
{ |
case 1: |
TCCR2 setbit (1<<COM20); |
IRstate = 2; |
IRbit = 0; |
TCNT0 = 255 - (13000 / 128); |
break; |
case 2: |
TCCR2 clrbit (1<<COM20); |
IRstate = 3; |
if ((IRdat & 0x40) == 0) TCNT0 = 255 - (1000 / 128); |
else TCNT0 = 255 - (3000 / 128); |
break; |
case 3: |
TCCR2 setbit (1<<COM20); |
TCNT0 = 255 - (1000 / 128); |
IRdat = IRdat << 1; |
IRbit++; |
if (IRbit < 7) IRstate = 2; |
else |
{ |
IRstate = 4; |
IRbit = 0; |
} |
break; |
case 4: |
TCCR2 clrbit (1<<COM20); |
TCNT0 = 255 - (25000 / 128); |
if (IRbit < 20) IRstate = 4; |
else IRstate = 5; |
IRbit++; |
break; |
default: |
TIMSK &= ~(1<<TOIE0); |
IRstate = 0; |
break; |
} |
} |
/*##############################################################################*/ |
void SendIRSignal(unsigned char txbyte) |
{ |
while (IRstate != 0) {} //IR already in action ?, if so, wait |
IRstate = 1; //initial State |
IRdat = txbyte; //copy IR Data |
TIFR &= TOV0; //set TMR0 Int Flag |
TIMSK setbit (1<<TOIE0); //Enable TMR0 Int |
} |
/*##############################################################################*/ |
void StartPPM(void) |
{ |
//global timer1 Config |
TCCR1A = (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)| |
(0<<FOC1A) |(0<<FOC1B) |(0<<WGM10) |(0<<WGM11); |
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(0<<WGM13)| |
(0<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10); //ICP_POS_FLANKE |
// interrupts |
TIMSK |= (1<<TICIE1)|(1<<TOIE1); //ICP_INT_ENABLE and TIMER1_INT_ENABLE |
} |
int GetPPM(void) |
{ |
//this routines seems to be nesseccary, as reading a 16 bit value |
//on a 8 bit machine is not atomic, so if an interrupt apears between reading |
//low and high byte of the 16 bit value a wrong result is possible |
unsigned char intmask; |
unsigned int ppm_temp; |
intmask = TIMSK; //backup interupt enable bits |
TIMSK &= ~(1<<TICIE1); //disable ppm interrupt |
ppm_temp = ppm_signal; |
TIMSK = intmask; //restore interupt enable bits |
return(ppm_temp); //return ppm_signal |
} |
/*##############################################################################*/ |
// MAIN |
/*##############################################################################*/ |
int main (void) |
{ |
DDRC = (1<<ledred); |
PORTC = 0x00; |
DDRD = (1<<ledgreen); |
PORTD = 0x00; |
DDRB = (1<<1)|(1<<2)|(1<<3); |
PORTB = 0x00; |
//StartUART(); |
StartPPM(); |
StartI2C(); |
StartIRModulation(); |
sei(); |
while (1) |
{ |
//printf("%d ",ppm_signal); |
if (ppm_new == 1) |
{ |
ppm_new = 0; |
if (GetPPM() > 1750) |
{ |
SendIRSignal(ZOOM); |
PORTC |= (1<<ledred); |
while (GetPPM() > 1650) {} |
PORTC &= ~(1<<ledred); |
} |
if (GetPPM() < 1250) |
{ |
PORTD |= (1<<ledgreen); |
SendIRSignal(TRIGGER); |
TMR65ms = 0; //reset 65ms Timer |
while (GetPPM() < 1350) |
{ |
if (TMR65ms > 15 * 1) break; //about 1 sec. repeat time |
} |
PORTD &= ~(1<<ledgreen); |
} |
} |
if (I2C_IN == TRIGGER) |
{ |
PORTD |= (1<<ledgreen); |
SendIRSignal(TRIGGER); |
PORTD &= ~(1<<ledgreen); |
} |
if (I2C_IN == ZOOM) |
{ |
PORTD |= (1<<ledred); |
SendIRSignal(ZOOM); |
PORTD &= ~(1<<ledred); |
} |
} |
} |
/IR-TX-BL/trunk/V0.03/main.h |
---|
0,0 → 1,31 |
#ifndef _MAIN_H |
#define _MAIN_H |
#define SYSCLK 8000000L |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#define setbit |= |
#define clrbit &=~ |
#define invbit ^= |
#define ledred 3 //on Port C |
#define ledgreen 7 //on Port D |
#define correction -60 |
#define ZOOM 0x41 |
#define TRIGGER 0x40 |
#endif //_MAIN_H |
/IR-TX-BL/trunk/V0.03/makefile |
---|
0,0 → 1,387 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega8 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 03 |
#------------------------------------------------------------------- |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
TARGET = IR-Tx_V$(HAUPT_VERSION)_$(NEBEN_VERSION) |
# 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 = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c twislave.c |
########################################################################################################## |
# If there is more than one source file, append them above, or modify and |
# uncomment the following: |
#SRC += foo.c bar.c |
# You can also wrap lines by appending a backslash to the end of the line: |
#SRC += baz.c \ |
#xyzzy.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 = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# 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,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) |
ifeq ($(AVR_CTRL_PLATINE), 1) |
CFLAGS += -DAVR_CTRL_PLATINE=$(AVR_CTRL_PLATINE) |
endif |
# 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,-adhlns=$(<:.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 |
# 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: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
AVRDUDE_PROGRAMMER = ponyser |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
AVRDUDE_PORT = com1 |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
AVRDUDE_FLAGS = -F -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 -E noreset |
# 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 |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# 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 $(TARGET).sym 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: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; 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 |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(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 |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(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 |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(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 |
/IR-TX-BL/trunk/V0.03/twislave.c |
---|
0,0 → 1,62 |
//############################################################################ |
// - PPM2PentaxIR Uart for Debug only |
// - ATMEGA8 mit 8MHz |
// - Nur für den privaten Gebrauch |
// - Keine Garantie auf Fehlerfreiheit |
// - Kommerzielle Nutzung nur mit meiner Zustimmung |
// - walter Meyer @ www.freakware.de |
//############################################################################*/ |
#include <avr/io.h> |
#include <util/twi.h> |
#include "main.h" |
#include "twislave.h" |
unsigned char I2C_IN; |
//############################################################################ |
//I2C (TWI) Interface Init |
void StartI2C(void) |
//############################################################################ |
{ |
TWAR = 0x62; //I2C client address |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
//############################################################################ |
//ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet |
//sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann. |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (TWSR & 0xF8) |
{ |
case SR_SLA_ACK: |
TWCR |= (1<<TWINT); |
return; |
case SR_PREV_ACK: //receive |
I2C_IN = TWDR; |
TWCR |= (1<<TWINT); |
return; |
case SW_SLA_ACK: //send 0x00 |
TWDR = 0x00; |
TWCR |= (1<<TWINT); |
return; |
case SW_DATA_ACK: //send 0x00 |
TWDR = 0x00; |
TWCR |= (1<<TWINT); |
return; |
case TWI_BUS_ERR_2: //bus error / reset bus |
TWCR |=(1<<TWSTO) | (1<<TWINT); |
case TWI_BUS_ERR_1: //bus error / reset bus |
TWCR |=(1<<TWSTO) | (1<<TWINT); |
} |
TWCR =(1<<TWEA) | (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // TWI Reset |
} |
/IR-TX-BL/trunk/V0.03/twislave.h |
---|
0,0 → 1,31 |
#ifndef _TWI_SLAVE_H_ |
#define _TWI_SLAVE_H_ |
extern unsigned char I2C_IN; |
extern void StartI2C(void); |
#define TWI_BUS_ERR_1 0x00 |
#define TWI_BUS_ERR_2 0xF8 |
// Status Slave RX Mode |
#define SR_SLA_ACK 0x60 |
#define SR_LOST_ACK 0x68 |
#define SR_GEN_CALL_ACK 0x70 |
#define GEN_LOST_ACK 0x78 |
#define SR_PREV_ACK 0x80 |
#define SR_PREV_NACK 0x88 |
#define GEN_PREV_ACK 0x90 |
#define GEN_PREV_NACK 0x98 |
#define STOP_CONDITION 0xA0 |
#define REPEATED_START 0xA0 |
// Status Slave TX mode |
#define SW_SLA_ACK 0xA8 |
#define SW_LOST_ACK 0xB0 |
#define SW_DATA_ACK 0xB8 |
#define SW_DATA_NACK 0xC0 |
#define SW_LAST_ACK 0xC8 |
#endif |
/IR-TX-BL/trunk/V0.03/uart.c |
---|
0,0 → 1,38 |
//############################################################################ |
// - PPM2PentaxIR Uart for Debug only |
// - ATMEGA8 mit 8MHz |
// - Nur für den privaten Gebrauch |
// - Keine Garantie auf Fehlerfreiheit |
// - Kommerzielle Nutzung nur mit meiner Zustimmung |
// - walter Meyer @ www.freakware.de |
//############################################################################*/ |
#include "main.h" |
#include "uart.h" |
void StartUART(void) |
{ |
// UART Double Speed (U2X) |
UCSRA |= (1<<U2X); |
/* Enable receiver and transmitter, no RX Int, no TX Int */ |
UCSRB = (1<<RXEN)|(1<<TXEN); // (1<<RXCIE)|(1<<TXCIE) |
/* Set frame format: 8data, 1stop bit */ |
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); |
//Teiler wird gesetzt |
UBRRL= (SYSCLK / (BAUD_RATE * 8L) -1 ); |
//öffnet einen Kanal für printf (STDOUT) |
fdevopen (uart_putchar, NULL); |
} |
int uart_putchar (char c) |
{ |
if (c == '\n') uart_putchar('\r'); |
loop_until_bit_is_set(UCSRA, UDRE); |
UDR = c; |
return (0); |
} |
/IR-TX-BL/trunk/V0.03/uart.h |
---|
0,0 → 1,11 |
#ifndef _UART_H |
#define _UART_H |
extern void StartUART (void); |
extern int uart_putchar (char c); |
#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#endif //_UART_H |