summaryrefslogtreecommitdiff
path: root/software/hhd70dongle/hhd70dongle.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/hhd70dongle/hhd70dongle.c')
-rw-r--r--software/hhd70dongle/hhd70dongle.c201
1 files changed, 97 insertions, 104 deletions
diff --git a/software/hhd70dongle/hhd70dongle.c b/software/hhd70dongle/hhd70dongle.c
index 7e11d45..3d7fa95 100644
--- a/software/hhd70dongle/hhd70dongle.c
+++ b/software/hhd70dongle/hhd70dongle.c
@@ -1,104 +1,97 @@
-/*
- *
- * mur.sat
- *
- * Somewhen in the year 2012, mur.at will have a nano satellite launched
- * into a low earth orbit (310 km above the surface of our planet). The
- * satellite itself is a TubeSat personal satellite kit, developed and
- * launched by interorbital systems. mur.sat is a joint venture of mur.at,
- * ESC im Labor and realraum.
- *
- * Please visit the project hompage at sat.mur.at for further information.
- *
- *
- * Copyright (C) 2012 Bernhard Tittelbach <xro@realraum.at>
- *
- * This file is part of mur.sat.
- *
- * mur.sat 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 3 of the License, or
- * any later version.
- *
- * mur.sat 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 mur.sat. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-#include "avr/io.h"
-#include "util/delay.h"
-
-#include "led.h"
-#include "spi.h"
-#include "usb_rawhid.h"
-
-#define ADCMUX_INTERNALTEMP 0b100111
-#define ADCMUX_ADC12 0b100100
-
-#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
-#define ADC_PRESCALER 0
-uint8_t read_buffer[64]; // buffer for reading usb signals
-uint8_t write_buffer[64]; // buffer for writing usb signals
-
-//TODOs:
-// * make as much use of sleep modes as possible
-// * use adc noise canceler (i.e. automatic sampling during cpu sleep)
-// * define and listen for an usb_hid reset command -> jump to bootload address
-// * read atmega temp
-// * safely save state in eeprom (2 memory regions, only use the one with the "written successfully bit" which is written last)
-
-
-int16_t adc_read(uint8_t mux)
-{
- uint8_t low;
- char aref = 0b11000000;
- ADCSRA = (1<<ADEN) | ADC_PRESCALER; // enable ADC
- ADCSRB = (1<<ADHSM) | (mux & 0x20); // high speed mode
- ADMUX = aref | (mux & 0x1F); // configure mux input
- ADCSRA = (1<<ADEN) | ADC_PRESCALER | (1<<ADSC); // start the conversion
- while (ADCSRA & (1<<ADSC)) ; // wait for result
- low = ADCL; // must read LSB first
- ADCSRA &= ~(1<<ADEN); // disable ADC
- return (ADCH << 8) | low; // must read MSB only once!
-}
-
-int main(void)
-{
- CPU_PRESCALE(0);
- led_init();
- spi_init();
- usb_init();
- // set PB5/ADC12 to INPUT (c1101 temp sensor)
- DDRB &= ~(1<<DDB5);
- while (!usb_configured()) /* wait */ ;
-
- //int8_t r = usb_rawhid_recv(read_buffer, 0);
- //usb_rawhid_send(write_buffer, 23);
-
- usb_rawhid_send("hhd70dongle ready",17);
-
- int16_t c1101_temp = adc_read(ADCMUX_ADC12);
- int16_t internal_temp = adc_read(ADCMUX_INTERNALTEMP);
-
- for(;;)
- {
- _delay_ms(250);
- led_toggle();
- c1101_temp = adc_read(ADCMUX_ADC12);
- internal_temp = adc_read(ADCMUX_INTERNALTEMP);
- usb_rawhid_send("temp c1101: ",12);
- write_buffer[0] = '0' + c1101_temp/26;
- write_buffer[1] = 0;
- usb_rawhid_send(write_buffer,1);
- usb_rawhid_send("temp atmega: ",13);
- write_buffer[0] = '0' + internal_temp/26;
- usb_rawhid_send(write_buffer,1);
- //~ char buf[10];
- //~ unsigned int len;
- //~ spi_read(sizeof(buf),buf,&len);
- }
-}
+/*
+ *
+ * mur.sat
+ *
+ * Somewhen in the year 2012, mur.at will have a nano satellite launched
+ * into a low earth orbit (310 km above the surface of our planet). The
+ * satellite itself is a TubeSat personal satellite kit, developed and
+ * launched by interorbital systems. mur.sat is a joint venture of mur.at,
+ * ESC im Labor and realraum.
+ *
+ * Please visit the project hompage at sat.mur.at for further information.
+ *
+ *
+ * Copyright (C) 2012 Bernhard Tittelbach <xro@realraum.at>
+ *
+ * This file is part of mur.sat.
+ *
+ * mur.sat 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 3 of the License, or
+ * any later version.
+ *
+ * mur.sat 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 mur.sat. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <avr/io.h>
+#include <util/delay.h>
+//#include <avr/stdio.h>
+
+#include "led.h"
+#include "util.h"
+#include "spi.h"
+#include "c1101lib.h"
+#include "usb_rawhid.h"
+
+#define ADCMUX_INTERNALTEMP 0b100111
+#define ADCMUX_ADC12 0b100100
+
+#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
+uint8_t read_buffer[64]; // buffer for reading usb signals
+uint8_t write_buffer[64]; // buffer for writing usb signals
+
+//TODOs:
+// * make as much use of sleep modes as possible
+// * use adc noise canceler (i.e. automatic sampling during cpu sleep)
+// * define and listen for an usb_hid reset command -> jump to bootload address
+// * read atmega temp
+// * safely save state in eeprom (2 memory regions, only use the one with the "written successfully bit" which is written last)
+
+int main(void)
+{
+ CPU_PRESCALE(0);
+ led_init();
+ spi_init();
+ usb_init();
+ // set PB5/ADC12 to INPUT (c1101 temp sensor)
+ DDRB &= ~(1<<DDB5);
+ while (!usb_configured()) /* wait */ ;
+
+ //int8_t r = usb_rawhid_recv(read_buffer, 0);
+ //usb_rawhid_send(write_buffer, 23);
+
+ usb_rawhid_send((uint8_t*)"hhd70dongle ready",17);
+
+ for(;;)
+ {
+ _delay_ms(250);
+ led_toggle();
+ usb_rawhid_recv(read_buffer,20);
+ if (read_buffer[0] == 'r')
+ reset();
+ usb_rawhid_send((uint8_t*)"temp c1101:",255);
+ debug_sprint_int16hex(write_buffer, adc_read(ADCMUX_ADC12));
+ usb_rawhid_send(write_buffer,255);
+ _delay_ms(250);
+ usb_rawhid_send((uint8_t*)"temp atmega:",255);
+ debug_sprint_int16hex(write_buffer, adc_read(ADCMUX_INTERNALTEMP));
+ usb_rawhid_send(write_buffer,255);
+ _delay_ms(250);
+ usb_rawhid_send((uint8_t*)"c1101 partnum:",255);
+ debug_sprint_int16hex(write_buffer, c1101_getPartNum());
+ usb_rawhid_send(write_buffer,255);
+ _delay_ms(250);
+ usb_rawhid_send((uint8_t*)"c1101 version:",255);
+ debug_sprint_int16hex(write_buffer, c1101_getVersion());
+ usb_rawhid_send(write_buffer,255);
+ //~ char buf[10];
+ //~ unsigned int len;
+ //~ spi_read(sizeof(buf),buf,&len);
+ }
+}