diff options
Diffstat (limited to 'software/hhd70dongle/hhd70dongle.c')
-rw-r--r-- | software/hhd70dongle/hhd70dongle.c | 201 |
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); + } +} |