/C-OSD/trunk/C-OSD.aps |
---|
1,0 → 0,0 |
<AVRStudio><MANAGEMENT><ProjectName>C-OSD</ProjectName><Created>24-Mar-2009 01:26:47</Created><LastEdit>13-May-2009 23:50:20</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>24-Mar-2009 01:26:47</Created><Version>4</Version><Build>4, 16, 0, 626</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\C-OSD.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>G:\Eigene Dateien\C-Projects\C-OSD\trunk\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega162.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>max7456_software_spi.c</SOURCEFILE><SOURCEFILE>usart1.c</SOURCEFILE><SOURCEFILE>characters.c</SOURCEFILE><SOURCEFILE>osd_helpers.c</SOURCEFILE><SOURCEFILE>osd_ncmode_default.c</SOURCEFILE><SOURCEFILE>osd_fcmode_default.c</SOURCEFILE><HEADERFILE>mk-data-structs.h</HEADERFILE><HEADERFILE>max7456_software_spi.h</HEADERFILE><HEADERFILE>usart1.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>osd_helpers.h</HEADERFILE><OTHERFILE>default\C-OSD.lss</OTHERFILE><OTHERFILE>default\C-OSD.map</OTHERFILE><OTHERFILE>default\Makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>default\Makefile</EXTERNALMAKEFILE><PART>atmega162</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>C-OSD.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>D:\WinAVR-20070525\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>D:\WinAVR-20070525\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="1" orderaddress="1" ordergroup="1"/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>257</Status></File00000><File00001><FileId>00001</FileId><FileName>mk-data-structs.h</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>max7456_software_spi.h</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>max7456_software_spi.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>usart1.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>usart1.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>characters.c</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>main.h</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>osd_helpers.c</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>osd_helpers.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>osd_ncmode_default.c</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>osd_fcmode_default.c</FileName><Status>1</Status></File00011></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
<AVRStudio><MANAGEMENT><ProjectName>C-OSD</ProjectName><Created>24-Mar-2009 01:26:47</Created><LastEdit>19-May-2009 21:25:46</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>24-Mar-2009 01:26:47</Created><Version>4</Version><Build>4, 16, 0, 626</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\C-OSD.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>G:\Eigene Dateien\C-Projects\C-OSD\trunk\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega162.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>max7456_software_spi.c</SOURCEFILE><SOURCEFILE>usart1.c</SOURCEFILE><SOURCEFILE>characters.c</SOURCEFILE><SOURCEFILE>osd_helpers.c</SOURCEFILE><SOURCEFILE>osd_ncmode_default.c</SOURCEFILE><SOURCEFILE>osd_fcmode_default.c</SOURCEFILE><SOURCEFILE>config.c</SOURCEFILE><SOURCEFILE>spi.c</SOURCEFILE><SOURCEFILE>buttons.c</SOURCEFILE><HEADERFILE>mk-data-structs.h</HEADERFILE><HEADERFILE>max7456_software_spi.h</HEADERFILE><HEADERFILE>usart1.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>osd_helpers.h</HEADERFILE><HEADERFILE>config.h</HEADERFILE><HEADERFILE>spi.h</HEADERFILE><HEADERFILE>buttons.h</HEADERFILE><OTHERFILE>default\C-OSD.lss</OTHERFILE><OTHERFILE>default\C-OSD.map</OTHERFILE><OTHERFILE>default\Makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>default\Makefile</EXTERNALMAKEFILE><PART>atmega162</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>C-OSD.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>D:\WinAVR-20070525\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>D:\WinAVR-20070525\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="0" orderaddress="1" ordergroup="0"/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>257</Status></File00000><File00001><FileId>00001</FileId><FileName>mk-data-structs.h</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>max7456_software_spi.h</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>max7456_software_spi.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>usart1.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>usart1.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>characters.c</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>main.h</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>osd_helpers.c</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>osd_helpers.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>osd_ncmode_default.c</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>osd_fcmode_default.c</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>config.c</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>config.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>spi.c</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>spi.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>buttons.c</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>buttons.h</FileName><Status>1</Status></File00017></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/C-OSD/trunk/CHANGE.LOG |
---|
18,6 → 18,11 |
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * |
****************************************************************************/ |
20090519-2245 |
*mah corrected |
+config gets saved now (menu item!) |
*source moved a bit |
20090519-0115 |
+mah currently wasted |
*some small changes |
/C-OSD/trunk/buttons.c |
---|
0,0 → 1,42 |
/**************************************************************************** |
* Copyright (C) 2009 by Claas Anders "CaScAdE" Rathje * |
* admiralcascade@gmail.com * |
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ * |
* * |
* 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. * |
* * |
* 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. * |
****************************************************************************/ |
#include <avr/io.h> |
#include <util/delay.h> |
#include "main.h" |
/* ########################################################################## |
* debounce buttons |
* ##########################################################################*/ |
int s1_pressed() { |
if (S1_PRESSED) { |
_delay_ms(25); |
if (S1_PRESSED) return 1; |
} |
return 0; |
} |
int s2_pressed() { |
if (S2_PRESSED) { |
_delay_ms(25); |
if (S2_PRESSED) return 1; |
} |
return 0; |
} |
/C-OSD/trunk/buttons.h |
---|
0,0 → 1,25 |
/**************************************************************************** |
* Copyright (C) 2009 by Claas Anders "CaScAdE" Rathje * |
* admiralcascade@gmail.com * |
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ * |
* * |
* 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. * |
* * |
* 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. * |
****************************************************************************/ |
/* ########################################################################## |
* debounce buttons |
* ##########################################################################*/ |
int s1_pressed(); |
int s2_pressed(); |
/C-OSD/trunk/c-osd.aws |
---|
1,0 → 0,0 |
<AVRWorkspace><IOSettings><CurrentRegisters><USART1><register register="UBRR1L" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UCSR1B" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UCSR1A" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UDR" group="USART1" display="1" locked="0"/></USART1><CPU><register register="OSCCAL" group="CPU" display="1" locked="0"/></CPU><JTAG><register register="OCDR" group="JTAG" display="1" locked="0"/></JTAG><PORTE><register register="PINE" group="PORTE" display="1" locked="0"/></PORTE><PORTE><register register="DDRE" group="PORTE" display="1" locked="0"/></PORTE><PORTE><register register="PORTE" group="PORTE" display="1" locked="0"/></PORTE><ANALOG_COMPARATOR><register register="ACSR" group="ANALOG_COMPARATOR" display="1" locked="0"/></ANALOG_COMPARATOR><USART0><register register="UBRR0L" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UCSR0B" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UCSR0A" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UDR0" group="USART0" display="1" locked="0"/></USART0><SPI><register register="SPCR" group="SPI" display="1" locked="0"/></SPI><SPI><register register="SPSR" group="SPI" display="1" locked="0"/></SPI><SPI><register register="SPDR" group="SPI" display="1" locked="0"/></SPI><PORTD><register register="PIND" group="PORTD" display="1" locked="0"/></PORTD><PORTD><register register="DDRD" group="PORTD" display="1" locked="0"/></PORTD><PORTD><register register="PORTD" group="PORTD" display="1" locked="0"/></PORTD><PORTC><register register="PINC" group="PORTC" display="1" locked="0"/></PORTC><PORTC><register register="DDRC" group="PORTC" display="1" locked="0"/></PORTC><PORTC><register register="PORTC" group="PORTC" display="1" locked="0"/></PORTC><PORTB><register register="PINB" group="PORTB" display="1" locked="0"/></PORTB><PORTB><register register="DDRB" group="PORTB" display="1" locked="0"/></PORTB><PORTB><register register="PORTB" group="PORTB" display="1" locked="0"/></PORTB><PORTA><register register="PINA" group="PORTA" display="1" locked="0"/></PORTA><PORTA><register register="DDRA" group="PORTA" display="1" locked="0"/></PORTA><PORTA><register register="PORTA" group="PORTA" display="1" locked="0"/></PORTA><EEPROM><register register="EECR" group="EEPROM" display="1" locked="0"/></EEPROM><EEPROM><register register="EEDR" group="EEPROM" display="1" locked="0"/></EEPROM><EEPROM><register register="EEAR" group="EEPROM" display="1" locked="0"/></EEPROM><USART0><register register="UBRR0H" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UCSR0C" group="USART0" display="1" locked="0"/></USART0><WATCHDOG><register register="WDTCR" group="WATCHDOG" display="1" locked="0"/></WATCHDOG><TIMER_COUNTER_2><register register="OCR2" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_2><register register="TCNT2" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_1><register register="ICR1" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_2><register register="ASSR" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_2><register register="TCCR2" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_1><register register="OCR1B" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="OCR1A" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="TCNT1" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="TCCR1B" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="TCCR1A" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><CPU><register register="SFIOR" group="CPU" display="1" locked="0"/></CPU><TIMER_COUNTER_0><register register="OCR0" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_0><register register="TCNT0" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_0><register register="TCCR0" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><CPU><register register="MCUCSR" group="CPU" display="1" locked="0"/></CPU><JTAG><register register="MCUCSR" group="JTAG" display="1" locked="0"/></JTAG><CPU><register register="MCUCR" group="CPU" display="1" locked="0"/></CPU><EXTERNAL_INTERRUPT><register register="MCUCR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><CPU><register register="EMCUCR" group="CPU" display="1" locked="0"/></CPU><EXTERNAL_INTERRUPT><register register="EMCUCR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><BOOT_LOAD><register register="SPMCR" group="BOOT_LOAD" display="1" locked="0"/></BOOT_LOAD><TIMER_COUNTER_0><register register="TIFR" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_1><register register="TIFR" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_2><register register="TIFR" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_0><register register="TIMSK" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_1><register register="TIMSK" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_2><register register="TIMSK" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><EXTERNAL_INTERRUPT><register register="GIFR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><EXTERNAL_INTERRUPT><register register="GICR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><USART1><register register="UBRR1H" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UCSR1C" group="USART1" display="1" locked="0"/></USART1><CPU><register register="SP" group="CPU" display="1" locked="0"/></CPU><CPU><register register="SREG" group="CPU" display="1" locked="0"/></CPU><CPU><register register="CLKPR" group="CPU" display="1" locked="0"/></CPU><EXTERNAL_INTERRUPT><register register="PCMSK0" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><EXTERNAL_INTERRUPT><register register="PCMSK1" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><TIMER_COUNTER_3><register register="ETIFR" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="ETIMSK" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="ICR3" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="OCR3B" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="OCR3A" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="TCNT3" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="TCCR3B" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="TCCR3A" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3></CurrentRegisters></IOSettings><part name="ATMEGA162"/><Files><File00000 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\main.c" Position="658 101 1730 856" LineCol="311 37" State="Maximized"/><File00001 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\mk-data-structs.h" Position="684 146 1251 650" LineCol="66 0" State="Maximized"/><File00002 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\max7456_software_spi.h" Position="706 168 1273 672" LineCol="122 0" State="Maximized"/><File00003 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\max7456_software_spi.c" Position="728 190 1295 694" LineCol="0 0" State="Maximized"/><File00004 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\usart1.c" Position="750 212 1317 716" LineCol="22 0" State="Maximized"/><File00005 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\usart1.h" Position="772 234 1339 738" LineCol="28 31" State="Maximized"/><File00006 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\characters.c" Position="794 256 1361 760" LineCol="820 0" State="Maximized"/><File00007 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\main.h" Position="816 278 1383 782" LineCol="26 0" State="Maximized"/><File00008 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_helpers.c" Position="838 300 1405 804" LineCol="20 0" State="Maximized"/><File00009 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_helpers.h" Position="860 322 1427 826" LineCol="25 0" State="Maximized"/><File00010 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_ncmode_default.c" Position="882 344 1704 830" LineCol="1 7" State="Maximized"/><File00011 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_fcmode_default.c" Position="662 124 1484 610" LineCol="20 0" State="Maximized"/></Files></AVRWorkspace> |
<AVRWorkspace><IOSettings><CurrentRegisters><USART1><register register="UBRR1L" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UCSR1B" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UCSR1A" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UDR" group="USART1" display="1" locked="0"/></USART1><CPU><register register="OSCCAL" group="CPU" display="1" locked="0"/></CPU><JTAG><register register="OCDR" group="JTAG" display="1" locked="0"/></JTAG><PORTE><register register="PINE" group="PORTE" display="1" locked="0"/></PORTE><PORTE><register register="DDRE" group="PORTE" display="1" locked="0"/></PORTE><PORTE><register register="PORTE" group="PORTE" display="1" locked="0"/></PORTE><ANALOG_COMPARATOR><register register="ACSR" group="ANALOG_COMPARATOR" display="1" locked="0"/></ANALOG_COMPARATOR><USART0><register register="UBRR0L" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UCSR0B" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UCSR0A" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UDR0" group="USART0" display="1" locked="0"/></USART0><SPI><register register="SPCR" group="SPI" display="1" locked="0"/></SPI><SPI><register register="SPSR" group="SPI" display="1" locked="0"/></SPI><SPI><register register="SPDR" group="SPI" display="1" locked="0"/></SPI><PORTD><register register="PIND" group="PORTD" display="1" locked="0"/></PORTD><PORTD><register register="DDRD" group="PORTD" display="1" locked="0"/></PORTD><PORTD><register register="PORTD" group="PORTD" display="1" locked="0"/></PORTD><PORTC><register register="PINC" group="PORTC" display="1" locked="0"/></PORTC><PORTC><register register="DDRC" group="PORTC" display="1" locked="0"/></PORTC><PORTC><register register="PORTC" group="PORTC" display="1" locked="0"/></PORTC><PORTB><register register="PINB" group="PORTB" display="1" locked="0"/></PORTB><PORTB><register register="DDRB" group="PORTB" display="1" locked="0"/></PORTB><PORTB><register register="PORTB" group="PORTB" display="1" locked="0"/></PORTB><PORTA><register register="PINA" group="PORTA" display="1" locked="0"/></PORTA><PORTA><register register="DDRA" group="PORTA" display="1" locked="0"/></PORTA><PORTA><register register="PORTA" group="PORTA" display="1" locked="0"/></PORTA><EEPROM><register register="EECR" group="EEPROM" display="1" locked="0"/></EEPROM><EEPROM><register register="EEDR" group="EEPROM" display="1" locked="0"/></EEPROM><EEPROM><register register="EEAR" group="EEPROM" display="1" locked="0"/></EEPROM><USART0><register register="UBRR0H" group="USART0" display="1" locked="0"/></USART0><USART0><register register="UCSR0C" group="USART0" display="1" locked="0"/></USART0><WATCHDOG><register register="WDTCR" group="WATCHDOG" display="1" locked="0"/></WATCHDOG><TIMER_COUNTER_2><register register="OCR2" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_2><register register="TCNT2" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_1><register register="ICR1" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_2><register register="ASSR" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_2><register register="TCCR2" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_1><register register="OCR1B" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="OCR1A" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="TCNT1" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="TCCR1B" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_1><register register="TCCR1A" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><CPU><register register="SFIOR" group="CPU" display="1" locked="0"/></CPU><TIMER_COUNTER_0><register register="OCR0" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_0><register register="TCNT0" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_0><register register="TCCR0" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><CPU><register register="MCUCSR" group="CPU" display="1" locked="0"/></CPU><JTAG><register register="MCUCSR" group="JTAG" display="1" locked="0"/></JTAG><CPU><register register="MCUCR" group="CPU" display="1" locked="0"/></CPU><EXTERNAL_INTERRUPT><register register="MCUCR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><CPU><register register="EMCUCR" group="CPU" display="1" locked="0"/></CPU><EXTERNAL_INTERRUPT><register register="EMCUCR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><BOOT_LOAD><register register="SPMCR" group="BOOT_LOAD" display="1" locked="0"/></BOOT_LOAD><TIMER_COUNTER_0><register register="TIFR" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_1><register register="TIFR" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_2><register register="TIFR" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><TIMER_COUNTER_0><register register="TIMSK" group="TIMER_COUNTER_0" display="1" locked="0"/></TIMER_COUNTER_0><TIMER_COUNTER_1><register register="TIMSK" group="TIMER_COUNTER_1" display="1" locked="0"/></TIMER_COUNTER_1><TIMER_COUNTER_2><register register="TIMSK" group="TIMER_COUNTER_2" display="1" locked="0"/></TIMER_COUNTER_2><EXTERNAL_INTERRUPT><register register="GIFR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><EXTERNAL_INTERRUPT><register register="GICR" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><USART1><register register="UBRR1H" group="USART1" display="1" locked="0"/></USART1><USART1><register register="UCSR1C" group="USART1" display="1" locked="0"/></USART1><CPU><register register="SP" group="CPU" display="1" locked="0"/></CPU><CPU><register register="SREG" group="CPU" display="1" locked="0"/></CPU><CPU><register register="CLKPR" group="CPU" display="1" locked="0"/></CPU><EXTERNAL_INTERRUPT><register register="PCMSK0" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><EXTERNAL_INTERRUPT><register register="PCMSK1" group="EXTERNAL_INTERRUPT" display="1" locked="0"/></EXTERNAL_INTERRUPT><TIMER_COUNTER_3><register register="ETIFR" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="ETIMSK" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="ICR3" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="OCR3B" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="OCR3A" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="TCNT3" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="TCCR3B" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3><TIMER_COUNTER_3><register register="TCCR3A" group="TIMER_COUNTER_3" display="1" locked="0"/></TIMER_COUNTER_3></CurrentRegisters></IOSettings><part name="ATMEGA162"/><Files><File00000 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\main.c" Position="753 171 1579 708" LineCol="61 0" State="Maximized"/><File00001 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\mk-data-structs.h" Position="775 193 1593 700" LineCol="0 0" State="Maximized"/><File00002 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\max7456_software_spi.h" Position="797 215 1615 722" LineCol="0 0" State="Maximized"/><File00003 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\max7456_software_spi.c" Position="819 237 1637 744" LineCol="6 0" State="Maximized"/><File00004 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\usart1.c" Position="841 259 1659 766" LineCol="11 0" State="Maximized"/><File00005 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\usart1.h" Position="863 281 1681 788" LineCol="16 0" State="Maximized"/><File00006 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\characters.c" Position="885 303 1703 810" LineCol="23 0" State="Maximized"/><File00007 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\main.h" Position="907 325 1725 832" LineCol="42 0" State="Maximized"/><File00008 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_helpers.c" Position="929 347 1747 854" LineCol="6 0" State="Maximized"/><File00009 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_helpers.h" Position="951 369 1769 876" LineCol="0 0" State="Maximized"/><File00010 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_ncmode_default.c" Position="749 148 1821 928" LineCol="180 38" State="Maximized"/><File00011 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\osd_fcmode_default.c" Position="995 413 1813 920" LineCol="11 0" State="Maximized"/><File00012 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\config.c" Position="753 171 1571 678" LineCol="110 0" State="Maximized"/><File00013 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\config.h" Position="775 193 1593 700" LineCol="21 0" State="Maximized"/><File00014 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\spi.c" Position="797 215 1615 722" LineCol="31 0" State="Maximized"/><File00015 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\spi.h" Position="819 237 1637 744" LineCol="27 0" State="Maximized"/><File00016 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\buttons.c" Position="841 259 1659 766" LineCol="22 0" State="Maximized"/><File00017 Name="G:\Eigene Dateien\C-Projects\C-OSD\trunk\buttons.h" Position="863 281 1681 788" LineCol="11 0" State="Maximized"/></Files></AVRWorkspace> |
/C-OSD/trunk/config.c |
---|
0,0 → 1,290 |
/**************************************************************************** |
* Copyright (C) 2009 by Claas Anders "CaScAdE" Rathje * |
* admiralcascade@gmail.com * |
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ * |
* * |
* 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. * |
* * |
* 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. * |
****************************************************************************/ |
#include <avr/io.h> |
#include <avr/eeprom.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <util/delay.h> |
#include "max7456_software_spi.h" |
#include "config.h" |
#include "main.h" |
#include "buttons.h" |
#include "usart1.h" |
#if !(ALLCHARSDEBUG|(WRITECHARS != -1)) |
// store more fixed strings in progmen |
char ON[] PROGMEM = "ON "; |
char OFF[] PROGMEM = "OFF"; |
uint8_t EEMEM ee_checkbyte1 = CHECKBYTE1; |
uint8_t EEMEM ee_checkbyte2 = CHECKBYTE2; |
uint16_t EEMEM ee_cal_ampere = 512; |
uint8_t EEMEM ee_sensor = 50; |
uint8_t EEMEM ee_COSD_FLAGS; |
// store init strings in progmem |
char init_0[] PROGMEM = "C-OSD Initialisation"; |
char init_1[] PROGMEM = "FC only Mode"; |
char init_2[] PROGMEM = "NaviCtrl Mode"; |
char init_3[] PROGMEM = "Guessing Number of Cells"; |
char init_4[] PROGMEM = "Number of Cells:"; |
char init_5[] PROGMEM = "Warn Voltage :"; |
char init_6[] PROGMEM = "Max Voltage :"; |
char* init_point[] PROGMEM = {init_0, init_1, init_2, init_3, init_4, init_5, init_6}; |
char ee_message0[] PROGMEM = "Loading Data from EEPROM"; |
char ee_message1[] PROGMEM = "No saved Data in EEPROM"; |
char* ee_msg[] PROGMEM = {ee_message0, ee_message1}; |
// menu strings to progmem |
char menu_item0[] PROGMEM = "Full HUD"; |
char menu_item1[] PROGMEM = "Art.Horizon in HUD"; |
char menu_item2[] PROGMEM = "Big Vario bar"; |
char menu_item3[] PROGMEM = "Statistics"; |
char menu_item4[] PROGMEM = "Warnings"; // TODO: do it! |
char menu_item5[] PROGMEM = "Reset uptime"; |
char menu_item6[] PROGMEM = "Request OSD-data"; |
char menu_item7[] PROGMEM = "Disable Debug-data"; |
char menu_item8[] PROGMEM = "Save config"; |
char menu_item9[] PROGMEM = "EXIT"; |
char* menu[] = {menu_item0, menu_item1, menu_item2, menu_item3, menu_item4, |
menu_item5, menu_item6, menu_item7, menu_item8, menu_item9}; |
/** |
* read data saved in eeprom |
*/ |
void get_eeprom() { |
if (eeprom_read_byte(&ee_checkbyte1) == CHECKBYTE1 && eeprom_read_byte(&ee_checkbyte2) == CHECKBYTE2) { |
write_ascii_string_pgm(2, 9, ee_msg[0]); // Loading data |
COSD_FLAGS = eeprom_read_byte(&ee_COSD_FLAGS); |
} else { |
write_ascii_string_pgm(2, 9, ee_msg[1]); // No data found |
} |
} |
/** |
* save data to eeprom |
*/ |
void save_eeprom() { |
eeprom_write_byte(&ee_checkbyte1, CHECKBYTE1); |
eeprom_write_byte(&ee_checkbyte2, CHECKBYTE2); |
eeprom_write_byte(&ee_COSD_FLAGS, COSD_FLAGS); |
} |
/** |
* auto config some stuff on startup, currently only battery cells |
* TODO: this is testing stuff, strings should go progmem and so on... |
*/ |
void init_cosd(uint8_t UBat) { |
clear(); |
write_ascii_string_pgm(2, 1, init_point[0]); // C-OSD Initialisation |
//write_ascii_string(2, 1, "C-OSD Initialisation"); |
#if FCONLY |
write_ascii_string_pgm(2, 2, init_point[1]); // FC only mode |
//write_ascii_string(2, 2, "FC only Mode"); |
#else |
write_ascii_string_pgm(2, 2, init_point[2]); // NaviCtrl Mode |
//write_ascii_string(2, 2, "NaviCtrl Mode"); |
#endif |
write_ascii_string(2, 3, BUILDDATE); |
uint8_t cellnum = 0; |
if (CELL_NUM == -1) { |
write_ascii_string_pgm(2, 4, init_point[3]); // Guessing Number of Cells |
//write_ascii_string(2, 6, "Guessing Number of Cells"); |
do { |
cellnum++; |
} while (UBat > ((cellnum * CELL_VOLT_MAX) + 23)); |
} else { |
cellnum = CELL_NUM; |
} |
min_voltage = cellnum * CELL_VOLT_MIN; |
max_voltage = cellnum * CELL_VOLT_MAX; |
write_ascii_string_pgm(2, 5, init_point[4]); // Number of Cells |
//write_ascii_string(2, 5, "Number of Cells:"); |
write_ndigit_number_u(21, 5, cellnum, 1, 0); |
write_ascii_string_pgm(2, 6, init_point[5]); // Warn Voltage |
//write_ascii_string(2, 6, "Warn Voltage :"); |
write_ndigit_number_s_10th(20, 6, min_voltage, 100, 0); |
write_ascii_string_pgm(2, 7, init_point[6]); // Max Voltage |
//write_ascii_string(2, 7, "Max Voltage :"); |
write_ndigit_number_s_10th(20, 7, max_voltage, 100, 0); |
get_eeprom(); |
_delay_ms(200); |
clear(); |
// update flags to paint display again because of clear |
COSD_FLAGS2 &= ~COSD_ICONS_WRITTEN; |
} |
/* ########################################################################## |
* A simple config menu for the flags |
* ##########################################################################*/ |
/** |
* helper function for menu updating |
*/ |
void config_menu_drawings(uint8_t chosen) { |
// clear prevoius _cursor_ |
write_ascii_string(3, (chosen + 3) % 9, " "); |
// draw current _cursor_ |
write_ascii_string(3, chosen + 3, ">"); |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
write_ascii_string_pgm(23, 3, ON); |
} else { |
write_ascii_string_pgm(23, 3, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
write_ascii_string_pgm(23, 4, ON); |
} else { |
write_ascii_string_pgm(23, 4, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_BIGVARIO) { |
write_ascii_string_pgm(23, 5, ON); |
} else { |
write_ascii_string_pgm(23, 5, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_STATS) { |
write_ascii_string_pgm(23, 6, ON); |
} else { |
write_ascii_string_pgm(23, 6, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_WARNINGS) { |
write_ascii_string_pgm(23, 7, ON); |
} else { |
write_ascii_string_pgm(23, 7, OFF); |
} |
} |
/** |
* some sort of clicking response in the menu |
*/ |
void config_menu_doclick(uint8_t chosen, char** menu) { |
write_ascii_string(4, chosen + 3, "DONE "); |
_delay_ms(500); |
write_ascii_string_pgm(4, chosen + 3, menu[chosen]); |
} |
/** |
* a simple config menu tryout |
*/ |
void config_menu(void) { |
// disable interrupts (makes the menu more smoothely) |
cli(); |
// clear screen |
clear(); |
uint8_t inmenu = 1; |
uint8_t chosen = 0; |
write_ascii_string(6, 2, "C-OSD Config Menu"); |
// wait a bit before doing stuff so user has chance to release button |
_delay_ms(250); |
write_ascii_string_pgm(4, 3, menu[0]); |
write_ascii_string_pgm(4, 4, menu[1]); |
write_ascii_string_pgm(4, 5, menu[2]); |
write_ascii_string_pgm(4, 6, menu[3]); |
write_ascii_string_pgm(4, 7, menu[4]); |
write_ascii_string_pgm(4, 8, menu[5]); |
write_ascii_string_pgm(4, 9, menu[6]); |
write_ascii_string_pgm(4, 10, menu[7]); |
write_ascii_string_pgm(4, 11, menu[8]); |
write_ascii_string_pgm(4, 12, menu[9]); |
config_menu_drawings(chosen); |
while (inmenu) { |
if (s2_pressed()) { |
write_ascii_string(3, chosen + 3, " "); |
chosen = (chosen + 1) % 10; |
write_ascii_string(3, chosen + 3, ">"); |
_delay_ms(500); |
} else if (s1_pressed()) { |
switch (chosen) { |
case 0: // full HUD |
COSD_FLAGS ^= COSD_FLAG_HUD; |
config_menu_drawings(chosen); |
break; |
case 1: // art horizon |
COSD_FLAGS ^= COSD_FLAG_ARTHORIZON; |
config_menu_drawings(chosen); |
break; |
case 2: // big vario |
COSD_FLAGS ^= COSD_FLAG_BIGVARIO; |
config_menu_drawings(chosen); |
break; |
case 3: // statistics |
COSD_FLAGS ^= COSD_FLAG_STATS; |
config_menu_drawings(chosen); |
break; |
case 4: // warnings |
COSD_FLAGS ^= COSD_FLAG_WARNINGS; |
config_menu_drawings(chosen); |
break; |
case 5: // reset uptime |
uptime = 0; |
config_menu_doclick(chosen, menu); |
break; |
case 6: // re-request OSD data |
#if FCONLY |
// request data ever 100ms from FC; |
usart1_request_mk_data(0, 'd', 100); |
#else |
// request OSD Data from NC every 100ms |
usart1_request_mk_data(1, 'o', 100); |
// and disable debug... |
usart1_request_mk_data(0, 'd', 0); |
#endif |
config_menu_doclick(chosen, menu); |
break; |
case 7: // disable debug data |
// disable sending of debug data |
// may result in smoother ddata display |
usart1_request_mk_data(0, 'd', 0); |
config_menu_doclick(chosen, menu); |
break; |
case 8: // save |
save_eeprom(); |
config_menu_doclick(chosen, menu); |
break; |
case 9: // exit |
inmenu = 0; |
break; |
} |
_delay_ms(250); |
} |
} |
// clear screen up again |
clear(); |
// update flags to paint display again if needed |
COSD_FLAGS2 &= ~COSD_ICONS_WRITTEN; |
// enable interrupts again |
sei(); |
} |
#endif |
/C-OSD/trunk/config.h |
---|
0,0 → 1,33 |
/**************************************************************************** |
* Copyright (C) 2009 by Claas Anders "CaScAdE" Rathje * |
* admiralcascade@gmail.com * |
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ * |
* * |
* 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. * |
* * |
* 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. * |
****************************************************************************/ |
#define CHECKBYTE1 23 |
#define CHECKBYTE2 23 |
extern uint8_t COSD_FLAGS, COSD_FLAGS2; |
extern uint8_t min_voltage; |
extern uint8_t max_voltage; |
extern volatile uint16_t uptime; |
void init_cosd(uint8_t); |
void config_menu(void); |
/C-OSD/trunk/default/Makefile |
---|
35,7 → 35,7 |
## Objects that must be built in order to link |
OBJECTS = main.o usart1.o max7456_software_spi.o osd_helpers.o |
OBJECTS = main.o usart1.o max7456_software_spi.o osd_helpers.o config.o spi.o buttons.o |
## Objects explicitly added by the user |
LINKONLYOBJECTS = |
56,6 → 56,15 |
osd_helpers.o: ../osd_helpers.c |
$(CC) $(INCLUDES) $(CFLAGS) -c $< |
config.o: ../config.c |
$(CC) $(INCLUDES) $(CFLAGS) -c $< |
spi.o: ../spi.c |
$(CC) $(INCLUDES) $(CFLAGS) -c $< |
buttons.o: ../buttons.c |
$(CC) $(INCLUDES) $(CFLAGS) -c $< |
##Link |
$(TARGET): $(OBJECTS) |
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET) |
/C-OSD/trunk/main.c |
---|
19,7 → 19,7 |
* * |
* * |
* Credits to: * |
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project * |
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN * |
* Gregor "killagreg" Stobrawa for making the MK code readable * |
* Klaus "akku" Buettner for the hardware * |
* Manuel "KeyOz" Schrape for explaining the MK protocol to me * |
33,6 → 33,9 |
#include "max7456_software_spi.h" |
#include "usart1.h" |
#include "osd_helpers.h" |
#include "config.h" |
#include "spi.h" |
#include "buttons.h" |
/* TODO: |
* - verifiy correctness of values |
76,10 → 79,6 |
char* stats_item_pointers[] PROGMEM = {stats_item_0, stats_item_1, stats_item_2, |
stats_item_3, stats_item_4, stats_item_5, stats_item_6, stats_item_7}; |
// store more fixed strings in progmen |
char ON[] PROGMEM = "ON "; |
char OFF[] PROGMEM = "OFF"; |
#endif // ends !(ALLCHARSDEBUG|(WRITECHARS != -1)) |
// general PAL|NTSC distingiusch stuff |
91,28 → 90,9 |
uint8_t max_voltage = 0; |
// Flags |
uint8_t COSD_FLAGS = 0, COSD_FLAGS2; |
uint8_t COSD_FLAGS = 0, COSD_FLAGS2 = 0; |
/* ########################################################################## |
* debounce buttons |
* ##########################################################################*/ |
int s1_pressed() { |
if (S1_PRESSED) { |
_delay_ms(25); |
if (S1_PRESSED) return 1; |
} |
return 0; |
} |
int s2_pressed() { |
if (S2_PRESSED) { |
_delay_ms(25); |
if (S2_PRESSED) return 1; |
} |
return 0; |
} |
/* ########################################################################## |
* Interrupt handler |
* ##########################################################################*/ |
129,74 → 109,7 |
* timer stuff |
* ##########################################################################*/ |
/* ########################################################################## |
* STROM TEST |
* ##########################################################################*/ |
#define INT0_HIGH PORTD |= (1 << PD2); |
#define INT0_LOW PORTD &= ~(1 << PD2); |
void SpiMasterInit(void) { |
volatile char IOReg; |
// set PB4(/SS), PB5(MOSI), PB7(SCK) as output |
DDRB = (1 << PB4) | (1 << PB5) | (1 << PB7); |
PORTB |= (1 << PB4); // pullup SS |
// enable SPI Interrupt and SPI in Master Mode with SCK = CK/128 |
SPCR = (1 << SPIE) | (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1); |
IOReg = SPSR; // clear SPIF bit in SPSR |
IOReg = SPDR; |
//sei(); // we do it later |
} |
volatile size_t icnt = 0; |
volatile unsigned char * iptr; |
volatile unsigned char spi_cmd_buffer[8]; |
volatile uint8_t spi_ready = 1; |
int16_t ampere = 0, max_ampere = 0; |
int32_t ampere_wasted = 0; |
/** |
* SPI interrupt handler |
*/ |
ISR(SPI_STC_vect) { |
*iptr++ = SPDR; // safe received byte to buffer |
icnt--; // dec length |
if (icnt) { |
//SPDR = *iptr; // send next byte |
spi_ready = 1; // we _should_ send later because the slave needs more time |
} else { |
SPCR &= ~_BV(SPIE); // deactivate interrupt |
INT0_HIGH // transfer is done, slave does not need to listen |
} |
} |
/** |
* check if SPI transfer is still busy |
*/ |
int TransferIsBusy(void) { |
return SPCR & _BV(SPIE); |
} |
/** |
* start a new transfer of <data> with length <len> |
*/ |
void StartTransfer(unsigned char *data, size_t len) { |
INT0_LOW // /SS LOW ^= SS HIGH ^= slave should listen |
// set up pointer and length for interrupt handler |
iptr = data; |
icnt = len; |
SPCR |= _BV(SPIE); // enable spi interrupt |
SPDR = *iptr; // start transfer by first bye |
} |
/* ########################################################################## |
* / STROM TEST END |
* ##########################################################################*/ |
/** |
* timer kicks in every 1000uS ^= 1ms |
*/ |
ISR(TIMER0_OVF_vect) { |
211,199 → 124,6 |
SPDR = *iptr; |
} |
} |
/* ########################################################################## |
* A simple config menu for the flags |
* ##########################################################################*/ |
/** |
* helper function for menu updating |
*/ |
void config_menu_drawings(uint8_t chosen) { |
// clear prevoius _cursor_ |
write_ascii_string(3, (chosen + 5) % 8, " "); |
// draw current _cursor_ |
write_ascii_string(3, chosen + 5, ">"); |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
write_ascii_string_pgm(23, 5, ON); |
} else { |
write_ascii_string_pgm(23, 5, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
write_ascii_string_pgm(23, 6, ON); |
} else { |
write_ascii_string_pgm(23, 6, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_BIGVARIO) { |
write_ascii_string_pgm(23, 7, ON); |
} else { |
write_ascii_string_pgm(23, 7, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_STATS) { |
write_ascii_string_pgm(23, 8, ON); |
} else { |
write_ascii_string_pgm(23, 8, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_WARNINGS) { |
write_ascii_string_pgm(23, 9, ON); |
} else { |
write_ascii_string_pgm(23, 9, OFF); |
} |
} |
/** |
* some sort of clicking response in the menu |
*/ |
void config_menu_doclick(uint8_t chosen, char** menu) { |
write_ascii_string(4, chosen + 5, "DONE "); |
_delay_ms(1000); |
write_ascii_string(4, chosen + 5, menu[chosen]); |
} |
/** |
* a simple config menu tryout |
*/ |
void config_menu(void) { |
// disable interrupts (makes the menu more smoothely) |
cli(); |
// clear screen |
clear(); |
char* menu[9] = {"Full HUD", |
"Art.Horizon in HUD", |
"Big Vario bar", |
"Statistics", |
"Warnings", // TODO: do it! |
"Reset uptime", |
"Request OSD-data", |
"Disable Debug-data", |
"EXIT"}; |
uint8_t inmenu = 1; |
uint8_t chosen = 0; |
write_ascii_string(6, 2, "C-OSD Config Menu"); |
// wait a bit before doing stuff so user has chance to release button |
_delay_ms(250); |
write_ascii_string(4, 5, menu[0]); |
write_ascii_string(4, 6, menu[1]); |
write_ascii_string(4, 7, menu[2]); |
write_ascii_string(4, 8, menu[3]); |
write_ascii_string(4, 9, menu[4]); |
write_ascii_string(4, 10, menu[5]); |
write_ascii_string(4, 11, menu[6]); |
write_ascii_string(4, 12, menu[7]); |
write_ascii_string(4, 13, menu[8]); |
config_menu_drawings(chosen); |
while (inmenu) { |
if (s2_pressed()) { |
write_ascii_string(3, chosen + 5, " "); |
chosen = (chosen + 1) % 9; |
write_ascii_string(3, chosen + 5, ">"); |
_delay_ms(500); |
} else if (s1_pressed()) { |
switch (chosen) { |
case 0: // full HUD |
COSD_FLAGS ^= COSD_FLAG_HUD; |
config_menu_drawings(chosen); |
break; |
case 1: // art horizon |
COSD_FLAGS ^= COSD_FLAG_ARTHORIZON; |
config_menu_drawings(chosen); |
break; |
case 2: // big vario |
COSD_FLAGS ^= COSD_FLAG_BIGVARIO; |
config_menu_drawings(chosen); |
break; |
case 3: // statistics |
COSD_FLAGS ^= COSD_FLAG_STATS; |
config_menu_drawings(chosen); |
break; |
case 4: // warnings |
COSD_FLAGS ^= COSD_FLAG_WARNINGS; |
config_menu_drawings(chosen); |
break; |
case 5: // reset uptime |
uptime = 0; |
config_menu_doclick(chosen, menu); |
break; |
case 6: // re-request OSD data |
#if FCONLY |
// request data ever 100ms from FC; |
usart1_request_mk_data(0, 'd', 100); |
#else |
// request OSD Data from NC every 100ms |
usart1_request_mk_data(1, 'o', 100); |
// and disable debug... |
usart1_request_mk_data(0, 'd', 0); |
#endif |
config_menu_doclick(chosen, menu); |
break; |
case 7: // disable debug data |
// disable sending of debug data |
// may result in smoother ddata display |
usart1_request_mk_data(0, 'd', 0); |
config_menu_doclick(chosen, menu); |
break; |
case 8: // exit |
inmenu = 0; |
break; |
} |
_delay_ms(250); |
} |
} |
// clear screen up again |
clear(); |
// update flags to paint display again if needed |
COSD_FLAGS &= ~COSD_ICONS_WRITTEN; |
// enable interrupts again |
sei(); |
} |
/** |
* auto config some stuff on startup, currently only battery cells |
* TODO: this is testing stuff, strings should go progmem and so on... |
*/ |
void auto_config(uint8_t UBat) { |
clear(); |
write_ascii_string(2, 2, "C-OSD Initialisation"); |
#if FCONLY |
write_ascii_string(2, 3, "FC only Mode"); |
#else |
write_ascii_string(2, 3, "NaviCtrl Mode"); |
#endif |
write_ascii_string(2, 4, BUILDDATE); |
uint8_t cellnum = 0; |
if (CELL_NUM == -1) { |
write_ascii_string(2, 6, "Guessing Number of Cells"); |
do { |
cellnum++; |
} while (UBat > ((cellnum * CELL_VOLT_MAX) + 23)); |
} else { |
cellnum = CELL_NUM; |
} |
min_voltage = cellnum * CELL_VOLT_MIN; |
max_voltage = cellnum * CELL_VOLT_MAX; |
write_ascii_string(2, 7, "Number of Cells:"); |
write_ndigit_number_u(21, 7, cellnum, 1, 0); |
write_ascii_string(2, 8, "Warn Voltage :"); |
write_ndigit_number_s_10th(20, 8, min_voltage, 100, 0); |
write_ascii_string(2, 9, "Max Voltage :"); |
write_ndigit_number_s_10th(20, 9, max_voltage, 100, 0); |
_delay_ms(200); |
clear(); |
// update flags to paint display again because of clear |
COSD_FLAGS &= ~COSD_ICONS_WRITTEN; |
} |
#endif // ends !(ALLCHARSDEBUG|(WRITECHARS != -1))#endif // ends !(ALLCHARSDEBUG|(WRITECHARS != -1)) |
/* ########################################################################## |
546,8 → 266,6 |
//char arrowdir[8] = {218, 217, 224, 223, 222, 221, 220, 219}; |
#endif |
while (1) { |
// in case SPI is ready and there is nothing to send right now |
if (!icnt && spi_ready) { |
566,7 → 284,7 |
//ampere_wasted = *((int32_t *) &spi_cmd_buffer + 3); |
// if this is the first receival we should print the small A |
if (!(COSD_FLAGS2 & COSD_FLAG_STROMREC)) { |
COSD_FLAGS &= ~COSD_ICONS_WRITTEN; |
COSD_FLAGS2 &= ~COSD_ICONS_WRITTEN; |
// update this flag |
COSD_FLAGS2 |= COSD_FLAG_STROMREC; |
} |
586,7 → 304,6 |
StartTransfer((unsigned char*) spi_cmd_buffer, 7); |
} |
if (rxd_buffer_locked) { |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
#if FCONLY |
if (rxd_buffer[2] == 'D') { // FC Data |
Decode64(); |
596,7 → 313,7 |
if (last_UBat == 255) { |
// fix for min_UBat |
min_UBat = debugData.Analog[9]; |
auto_config(debugData.Analog[9]); |
init_cosd(debugData.Analog[9]); |
} |
#include "osd_fcmode_default.c" |
} |
609,12 → 326,11 |
if (last_UBat == 255) { |
// fix for min_UBat |
min_UBat = naviData.UBat; |
auto_config(naviData.UBat); |
init_cosd(naviData.UBat); |
} |
#include "osd_ncmode_default.c" |
} |
#endif |
} |
rxd_buffer_locked = 0; |
} |
// handle keypress |
/C-OSD/trunk/main.h |
---|
60,7 → 60,7 |
#define BLINK 0b01001111 // attribute byte for blinking chars |
/* ########################################################################## |
* FLAGS usable during runtime |
* FLAGS usable during runtime that get saved |
* ##########################################################################*/ |
#define COSD_FLAG_NTSC 1 |
#define COSD_FLAG_HUD 2 |
68,10 → 68,13 |
#define COSD_FLAG_BIGVARIO 8 |
#define COSD_FLAG_STATS 16 |
#define COSD_FLAG_WARNINGS 32 |
#define COSD_ICONS_WRITTEN 64 |
#define COSD_WASFLYING 128 |
/* ########################################################################## |
* FLAGS only usable during runtime (not saved) |
* ##########################################################################*/ |
#define COSD_FLAG_STROMREC 1 |
#define COSD_ICONS_WRITTEN 2 |
#define COSD_WASFLYING 4 |
/* ########################################################################## |
* LED controll |
91,3 → 94,13 |
#define S1_PRESSED !(PINC & (1<<PC5)) |
#define S2_PRESSED !(PINC & (1<<PC4)) |
/* ########################################################################## |
* extern spi controlled vars |
* ##########################################################################*/ |
extern volatile uint16_t icnt; |
extern volatile unsigned char * iptr; |
extern volatile unsigned char spi_cmd_buffer[]; |
extern volatile uint8_t spi_ready; |
extern int16_t ampere, max_ampere; |
extern int32_t ampere_wasted; |
/C-OSD/trunk/osd_fcmode_default.c |
---|
17,9 → 17,9 |
* Free Software Foundation, Inc., * |
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * |
****************************************************************************/ |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
// write icons at init or after menu/mode-switch |
if (!(COSD_FLAGS & COSD_ICONS_WRITTEN)) { |
if (!(COSD_FLAGS2 & COSD_ICONS_WRITTEN)) { |
write_char_xy(10, top_line, 0xCA); // RC-transmitter |
write_char_xy(27, top_line, 0xCC); // small meters m height |
write_char_xy(7, bottom_line, 0x9E); // small v |
27,7 → 27,7 |
write_char_xy(7, bottom_line - 1, 0x9F); // small A |
write_char_xy(14, bottom_line - 1, 0xB5); // mah |
} |
COSD_FLAGS |= COSD_ICONS_WRITTEN; |
COSD_FLAGS2 |= COSD_ICONS_WRITTEN; |
} |
write_ndigit_number_u(7, top_line, debugData.Analog[10], 100, 0); |
38,9 → 38,7 |
for (uint8_t x = 0; x < 4; x++) |
write_char_att_xy(7 + x, top_line, 0); |
} |
last_RC_Quality = debugData.Analog[10]; |
if (debugData.Analog[5] > 300 || debugData.Analog[5] < -300) { |
// above 10m only write full meters |
write_ndigit_number_s(23, top_line, debugData.Analog[5] / 30, 1000, 0); |
58,6 → 56,7 |
if (COSD_FLAGS2 & COSD_FLAG_STROMREC) { |
//write_ndigit_number_s(3, bottom_line - 1, ampere, 1000, 0); |
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 100, 0); |
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 1000, 0); |
} |
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage); |
69,8 → 68,10 |
for (uint8_t x = 2; x < 8; x++) |
write_char_att_xy(x, bottom_line, 0); |
} |
} |
// remember last values |
last_UBat = debugData.Analog[9]; |
last_RC_Quality = debugData.Analog[10]; |
/* |
debugData.Analog[0]); // AngleNick |
/C-OSD/trunk/osd_ncmode_default.c |
---|
17,9 → 17,9 |
* Free Software Foundation, Inc., * |
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * |
****************************************************************************/ |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
// write icons at init or after menu/mode-switch |
if (!(COSD_FLAGS & COSD_ICONS_WRITTEN)) { |
if (!(COSD_FLAGS2 & COSD_ICONS_WRITTEN)) { |
write_char_xy(5, top_line, 0xCB); // km/h |
write_char_xy(10, top_line, 0xCA); // RC-transmitter |
write_char_xy(16, top_line, 0xD0); // degree symbol |
36,7 → 36,7 |
write_char_xy(21, bottom_line, 0xD2); // fly clock |
write_char_xy(26, bottom_line, 0xC8); // sat1 |
write_char_xy(27, bottom_line, 0xC9); // sat2 |
COSD_FLAGS |= COSD_ICONS_WRITTEN; |
COSD_FLAGS2 |= COSD_ICONS_WRITTEN; |
} |
// first line |
50,8 → 50,8 |
for (uint8_t x = 0; x < 4; x++) |
write_char_att_xy(7 + x, top_line, 0); |
} |
last_RC_Quality = naviData.RC_Quality; |
if (naviData.NCFlags & NC_FLAG_NOSERIALLINK) { |
write_char_xy(11, top_line, 0); // clear |
} else { |
90,16 → 90,16 |
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle |
clear(); |
// update flags to paint display again if needed |
COSD_FLAGS &= ~COSD_ICONS_WRITTEN; |
COSD_FLAGS2 &= ~COSD_ICONS_WRITTEN; |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll); |
} |
// motors are on, assume we were/are flying |
COSD_FLAGS |= COSD_WASFLYING; |
COSD_FLAGS2 |= COSD_WASFLYING; |
} else { |
// stats |
if ((COSD_FLAGS & COSD_WASFLYING) && (COSD_FLAGS & COSD_FLAG_STATS)) { |
if ((COSD_FLAGS2 & COSD_WASFLYING) && (COSD_FLAGS & COSD_FLAG_STATS)) { |
uint8_t line = 3; |
write_ascii_string_pgm(2, line, stats_item_pointers[0]); // max Altitude |
write_ndigit_number_s(18, line, max_Altimeter / 30, 1000, 0); |
137,7 → 137,7 |
if (COSD_FLAGS2 & COSD_FLAG_STROMREC) { |
//write_ndigit_number_s(3, bottom_line - 1, ampere, 1000, 0); |
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 100, 0); |
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted, 1000, 0); |
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 1000, 0); |
} |
// bottom line |
150,8 → 150,6 |
for (uint8_t x = 2; x < 8; x++) |
write_char_att_xy(x, bottom_line, 0); |
} |
// remember last values |
last_UBat = naviData.UBat; |
write_time(8, bottom_line, uptime); |
write_time(15, bottom_line, naviData.FlyingTime); |
171,6 → 169,7 |
} else { // (naviData.NCFlags & NC_FLAG_FREE) |
write_char_xy(27, bottom_line, 201); // sat2 (free) |
} |
} |
//write_number_s(8, 5, RxDataLen); |
//write_number_s(16, 5, setsReceived++); |
187,6 → 186,8 |
if (ampere > max_ampere) max_ampere = ampere; |
} |
// remember last values |
last_RC_Quality = naviData.RC_Quality; |
last_UBat = naviData.UBat; |
old_MKFlags = naviData.MKFlags; |
seconds_since_last_data = 0; |
/C-OSD/trunk/spi.c |
---|
0,0 → 1,86 |
/**************************************************************************** |
* Copyright (C) 2009 by Claas Anders "CaScAdE" Rathje * |
* admiralcascade@gmail.com * |
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ * |
* * |
* 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. * |
* * |
* 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. * |
****************************************************************************/ |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include "spi.h" |
#include "main.h" |
volatile uint16_t icnt = 0; |
volatile unsigned char * iptr; |
volatile unsigned char spi_cmd_buffer[8]; |
volatile uint8_t spi_ready = 1; |
int16_t ampere = 0, max_ampere = 0; |
int32_t ampere_wasted = 0; |
#define INT0_HIGH PORTD |= (1 << PD2); |
#define INT0_LOW PORTD &= ~(1 << PD2); |
/** |
* init the SPI as master |
*/ |
void SpiMasterInit(void) { |
volatile char IOReg; |
// set PB4(/SS), PB5(MOSI), PB7(SCK) as output |
DDRB = (1 << PB4) | (1 << PB5) | (1 << PB7); |
PORTB |= (1 << PB4); // pullup SS |
// enable SPI Interrupt and SPI in Master Mode with SCK = CK/128 |
SPCR = (1 << SPIE) | (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1); |
IOReg = SPSR; // clear SPIF bit in SPSR |
IOReg = SPDR; |
//sei(); // we do it later |
} |
/** |
* SPI interrupt handler |
*/ |
ISR(SPI_STC_vect) { |
*iptr++ = SPDR; // safe received byte to buffer |
icnt--; // dec length |
if (icnt) { |
//SPDR = *iptr; // send next byte |
spi_ready = 1; // we _should_ send later because the slave needs more time |
} else { |
SPCR &= ~_BV(SPIE); // deactivate interrupt |
INT0_HIGH // transfer is done, slave does not need to listen |
} |
} |
/** |
* check if SPI transfer is still busy |
*/ |
int TransferIsBusy(void) { |
return SPCR & _BV(SPIE); |
} |
/** |
* start a new transfer of <data> with length <len> |
*/ |
void StartTransfer(unsigned char *data, uint16_t len) { |
INT0_LOW // /SS LOW ^= SS HIGH ^= slave should listen |
// set up pointer and length for interrupt handler |
iptr = data; |
icnt = len; |
SPCR |= _BV(SPIE); // enable spi interrupt |
SPDR = *iptr; // start transfer by first bye |
} |
/C-OSD/trunk/spi.h |
---|
0,0 → 1,39 |
/**************************************************************************** |
* Copyright (C) 2009 by Claas Anders "CaScAdE" Rathje * |
* admiralcascade@gmail.com * |
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ * |
* * |
* 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. * |
* * |
* 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. * |
****************************************************************************/ |
/** |
* SPI interrupt handler |
*/ |
ISR(SPI_STC_vect); |
/** |
* init the SPI as master |
*/ |
void SpiMasterInit(void); |
/** |
* check if SPI transfer is still busy |
*/ |
int TransferIsBusy(void); |
/** |
* start a new transfer of <data> with length <len> |
*/ |
void StartTransfer(unsigned char *, uint16_t); |