summaryrefslogtreecommitdiff
path: root/software/cmx589a_teensy_test/cmx589a.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/cmx589a_teensy_test/cmx589a.c')
-rw-r--r--software/cmx589a_teensy_test/cmx589a.c267
1 files changed, 267 insertions, 0 deletions
diff --git a/software/cmx589a_teensy_test/cmx589a.c b/software/cmx589a_teensy_test/cmx589a.c
new file mode 100644
index 0000000..ebeeca6
--- /dev/null
+++ b/software/cmx589a_teensy_test/cmx589a.c
@@ -0,0 +1,267 @@
+/* Simple example for Teensy USB Development Board
+ * http://www.pjrc.com/teensy/
+ * Copyright (c) 2008 PJRC.COM, LLC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <avr/io.h>
+#include <avr/pgmspace.h>
+#include <stdint.h>
+#include <util/delay.h>
+#include "usb_serial.h"
+#include "uart.h"
+
+#define LED_CONFIG (DDRD |= (1<<6))
+#define LED_ON (PORTD |= (1<<6))
+#define LED_OFF (PORTD &= ~(1<<6))
+#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
+
+#define INT1_SET_INPUT (DDRD |= (1<<1))
+#define PB3_SET_OUTPUT (DDRB &= ~ (1<<3))
+#define PB7_SET_OUTPUT (DDRB &= ~(1<<7))
+
+#define PB3_TX_ENABLE (PORTB |= (1<<3))
+#define PB3_TX_DISABLE (PORTB &= ~(1<<3))
+
+#define ExtInt1On EIMSK |= 1 << INT1
+#define ExtInt1Config EICRA |= (1 << ISC10 ) | ( 1 << ISC11)
+
+#define UART_SET_DEFAULT UCSR1C = 0
+#define UART_SET_8BIT UCSR1C |= (1 << UMSEL10) | (1 << UCSZ10) | (1 << UCSZ11)
+#define UART_SET_EXT_CLK XCK1_DDR &= ~(1<<XCK1)
+
+
+
+
+//#define INIT_COUNTER_0 TCNT0 = 0
+//#define SET_CTC_MODE WGM &= !7; WGM |= 2
+//#define SET_EXT_FREQ_5_3_MHZ OCR0A = 3
+
+
+unsigned int snr_rsii_counter = 0;
+ISR(INT1_vect)
+{
+ snr_rsii_counter++;
+
+ return 0;
+}
+
+#define BAUD_RATE 9600
+
+// write a string to the uart
+#define uart_print(s) uart_print_P(PSTR(s))
+void uart_print_P(const char *str)
+{
+ char c;
+ while (1) {
+ c = pgm_read_byte(str++);
+ if (!c) break;
+ uart_putchar(c);
+ }
+}
+
+void send_str(const char *s);
+uint8_t recv_str(char *buf, uint8_t size);
+void parse_and_execute_command(const char *buf, uint8_t num);
+
+// Basic command interpreter for controlling port pins
+int main(void)
+{
+ char buf[32];
+ uint8_t n, c;
+
+ // set for 16 MHz clock, and turn on the LED
+ CPU_PRESCALE(0);
+ LED_CONFIG;
+ LED_ON;
+
+ INT1_SET_INPUT;
+ ExtInt1On;
+ ExtInt1Config;
+
+ PB3_SET_OUTPUT;
+ //PB3_TX_DISABLE;
+ PB3_TX_ENABLE;
+
+ usb_init();
+ uart_init(BAUD_RATE);
+
+
+ while (1) {
+ if (uart_available()) {
+ c = uart_getchar();
+
+ }
+ uart_print("TEST\r\n");
+ }
+ return 0;
+
+ //END
+
+ // initialize the USB, and then wait for the host
+ // to set configuration. If the Teensy is powered
+ // without a PC connected to the USB port, this
+ // will wait forever.
+ while (!usb_configured()) /* wait */ ;
+ _delay_ms(1000);
+
+ while (1) {
+ // wait for the user to run their terminal emulator program
+ // which sets DTR to indicate it is ready to receive.
+ while (!(usb_serial_get_control() & USB_SERIAL_DTR)) /* wait */ ;
+
+ // discard anything that was received prior. Sometimes the
+ // operating system or other software will send a modem
+ // "AT command", which can still be buffered.
+ usb_serial_flush_input();
+
+ // print a nice welcome message
+ send_str(PSTR("\r\nTeensy USB Serial Example, "
+ "Simple Pin Control Shell\r\n\r\n"
+ "Example Commands\r\n"
+ " B0? Read Port B, pin 0\r\n"
+ " C2=0 Write Port C, pin 1 LOW\r\n"
+ " D6=1 Write Port D, pin 6 HIGH (D6 is LED pin)\r\n\r\n"));
+
+ // and then listen for commands and process them
+ while (1) {
+ send_str(PSTR("> "));
+ n = recv_str(buf, sizeof(buf));
+ if (n == 255) break;
+ send_str(PSTR("\r\n"));
+ parse_and_execute_command(buf, n);
+ }
+ }
+}
+
+
+// Send a string to the USB serial port. The string must be in
+// flash memory, using PSTR
+//
+void send_str(const char *s)
+{
+ char c;
+ while (1) {
+ c = pgm_read_byte(s++);
+ if (!c) break;
+ usb_serial_putchar(c);
+ }
+}
+
+// Receive a string from the USB serial port. The string is stored
+// in the buffer and this function will not exceed the buffer size.
+// A carriage return or newline completes the string, and is not
+// stored into the buffer.
+// The return value is the number of characters received, or 255 if
+// the virtual serial connection was closed while waiting.
+//
+uint8_t recv_str(char *buf, uint8_t size)
+{
+ int16_t r;
+ uint8_t count=0;
+
+ while (count < size) {
+ r = usb_serial_getchar();
+ if (r != -1) {
+ if (r == '\r' || r == '\n') return count;
+ if (r >= ' ' && r <= '~') {
+ *buf++ = r;
+ usb_serial_putchar(r);
+ count++;
+ }
+ } else {
+ if (!usb_configured() ||
+ !(usb_serial_get_control() & USB_SERIAL_DTR)) {
+ // user no longer connected
+ return 255;
+ }
+ // just a normal timeout, keep waiting
+ }
+ }
+ return count;
+}
+
+// parse a user command and execute it, or print an error message
+//
+void parse_and_execute_command(const char *buf, uint8_t num)
+{
+ uint8_t port, pin, val;
+
+ if (num < 3) {
+ send_str(PSTR("unrecognized format, 3 chars min req'd\r\n"));
+ return;
+ }
+ // first character is the port letter
+ if (buf[0] >= 'A' && buf[0] <= 'F') {
+ port = buf[0] - 'A';
+ } else if (buf[0] >= 'a' && buf[0] <= 'f') {
+ port = buf[0] - 'a';
+ } else {
+ send_str(PSTR("Unknown port \""));
+ usb_serial_putchar(buf[0]);
+ send_str(PSTR("\", must be A - F\r\n"));
+ return;
+ }
+ // second character is the pin number
+ if (buf[1] >= '0' && buf[1] <= '7') {
+ pin = buf[1] - '0';
+ } else {
+ send_str(PSTR("Unknown pin \""));
+ usb_serial_putchar(buf[0]);
+ send_str(PSTR("\", must be 0 to 7\r\n"));
+ return;
+ }
+ // if the third character is a question mark, read the pin
+ if (buf[2] == '?') {
+ // make the pin an input
+ *(uint8_t *)(0x21 + port * 3) &= ~(1 << pin);
+ // read the pin
+ val = *(uint8_t *)(0x20 + port * 3) & (1 << pin);
+ usb_serial_putchar(val ? '1' : '0');
+ send_str(PSTR("\r\n"));
+ return;
+ }
+ // if the third character is an equals sign, write the pin
+ if (num >= 4 && buf[2] == '=') {
+ if (buf[3] == '0') {
+ // make the pin an output
+ *(uint8_t *)(0x21 + port * 3) |= (1 << pin);
+ // drive it low
+ *(uint8_t *)(0x22 + port * 3) &= ~(1 << pin);
+ return;
+ } else if (buf[3] == '1') {
+ // make the pin an output
+ *(uint8_t *)(0x21 + port * 3) |= (1 << pin);
+ // drive it high
+ *(uint8_t *)(0x22 + port * 3) |= (1 << pin);
+ return;
+ } else {
+ send_str(PSTR("Unknown value \""));
+ usb_serial_putchar(buf[3]);
+ send_str(PSTR("\", must be 0 or 1\r\n"));
+ return;
+ }
+ }
+ // otherwise, error message
+ send_str(PSTR("Unknown command \""));
+ usb_serial_putchar(buf[0]);
+ send_str(PSTR("\", must be ? or =\r\n"));
+}
+