Mercurial > ~darius > hgwebdir.cgi > avr
diff testavr.c @ 37:25fa387ef7e9
- Conditionalise USB support.
- Add ROM write command (we).
- Add command to read the EEPROM status field of a DS2502 (rt).
- Add command to dump the EEPROM data of a DS2502 (rr).
- Add command to change data direction registers (dd).
author | darius |
---|---|
date | Tue, 23 Oct 2007 11:03:22 +0930 |
parents | 48056516b3eb |
children | 0a148f362097 |
line wrap: on
line diff
--- a/testavr.c Tue Oct 23 10:55:51 2007 +0930 +++ b/testavr.c Tue Oct 23 11:03:22 2007 +0930 @@ -37,7 +37,9 @@ #include <util/delay.h> #include "1wire.h" +#ifdef WITHUSB #include "usb.h" +#endif #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1) #define UART_BAUD_RATE 38400 @@ -123,25 +125,34 @@ /* Disable interrupts while we frob stuff */ cli(); +#if 1 /* Disable JTAG (yes twice) */ MCUCSR |= _BV(JTD); MCUCSR |= _BV(JTD); - +#endif + +#ifdef WITHUSB /* USB data bus (7:0) */ DDRA = 0x00; PORTA = 0x00; - /* USB control (3:0) */ - DDRB = 0x0e; + /* USB control (4:0) */ + DDRB = 0x0d; PORTB = 0x00; - +#else + DDRA = 0xff; + PORTA = 0x00; +#endif /* GPIO (0:7) */ DDRC = 0xff; PORTC = 0x00; - /* GPIO (2:7) */ - DDRD = 0xfc; - PORTD = 0xfc; + /* USART (0:1), IDBus (2:5), 485 (6:6), GPIO (7:7) */ + DDRD = 0xf7; + PORTD = 0xf7; + + /* Set up the one wire stuff */ + OWInit(); /* Init UART */ UBRRH = UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU) >> 8; @@ -157,9 +168,30 @@ /* Ready to go! */ sei(); +#if 0 + DDRA = 0xff; + DDRC = 0xff; + while (1) { + uart_putsP(PSTR("1\n\r")); + PORTA = 0xff; + uart_putsP(PSTR("2\n\r")); + PORTC = 0x00; + uart_putsP(PSTR("3\n\r")); + _delay_us(1); + uart_putsP(PSTR("4\n\r")); + PORTA = 0x80; + uart_putsP(PSTR("5\n\r")); + PORTC = 0xff; + uart_putsP(PSTR("6\n\r")); + } +#endif + +#ifdef WITHUSB + uart_putsP(PSTR("Calling usb_init\n\r")); usb_init(); +#endif + uart_putsP(PSTR("done\n\r")); _delay_us(1000); - uart_putsP(PSTR("> ")); cmd.state = 0; @@ -172,8 +204,10 @@ cmd.state = 0; } - if (!(PINB & _BV(PB0))) +#ifdef WITHUSB + if (!(PDICTL & _BV(PDIINT))) usb_intr(); +#endif } } @@ -236,6 +270,133 @@ } else if (cmd.buf[0] == 'w' && cmd.buf[1] == 'b') { arg = (int)strtol((char *)cmd.buf + 3, (char **)NULL, 16); OWWriteByte(arg); + } else if (cmd.buf[0] == 'r' && cmd.buf[1] == 't') { + if (cmd.len < 26) { + uart_putsP(PSTR("Unable to parse ROM ID\n\r")); + return; + } + + if (OWTouchReset() != 0) { + uart_putsP(PSTR("No presence\n\r")); + return; + } + + for (i = 0; i < 8; i++) + ROM[i] = (int)strtol((char *)cmd.buf + 3 * (i + 1), (char **)NULL, 16); + + if (ROM[0] != OW_FAMILY_ROM) { + uart_putsP(PSTR("ROM specified isn't a DS2502\n\r")); + return; + } + + if (OWTouchReset() != 0) { + uart_putsP(PSTR("No presence\n\r")); + return; + } + + crc = 0; + + OWCRC(OW_READ_STATUS, &crc); + OWSendCmd(ROM, OW_READ_STATUS); + + OWWriteByte(0x00); + OWCRC(0x00, &crc); + + OWWriteByte(0x00); + OWCRC(0x00, &crc); + + if (crc != OWReadByte()) { + uart_putsP(PSTR("CRC mismatch on command & address\n\r")); + return; + } + + crc = 0; + for (i = 0; i < 8; i++) { + temp = OWReadByte(); + uart_puts_hex(temp); + OWCRC(temp, &crc); + uart_putsP(PSTR(" ")); + } + uart_putsP(PSTR("\n\r")); + if (crc != OWReadByte()) { + uart_putsP(PSTR("CRC mismatch on data\n\r")); + return; + } + } else if (cmd.buf[0] == 'w' && cmd.buf[1] == 'e') { + if (cmd.len < 26) { + uart_putsP(PSTR("Unable to parse ROM ID\n\r")); + return; + } + + for (i = 0; i < 8; i++) + ROM[i] = (int)strtol((char *)cmd.buf + 3 * (i + 1), (char **)NULL, 16); + + if (ROM[0] != OW_FAMILY_ROM) { + uart_putsP(PSTR("ROM specified isn't a ROM\n\r")); + return; + } + + buf[0] = (int)strtol((char *)cmd.buf + 27, (char **)NULL, 16); /* Address */ + buf[1] = (int)strtol((char *)cmd.buf + 30, (char **)NULL, 16); /* Data .. */ + buf[2] = (int)strtol((char *)cmd.buf + 33, (char **)NULL, 16); + + if (OWTouchReset() != 0) { + uart_putsP(PSTR("No presence\n\r")); + return; + } + + i = OWProgROM(ROM, buf[0], 2, &buf[1], 0, 0); + uart_putsP(PSTR("OWProgROM returned ")); + uart_puts_dec(i, 0); + uart_putsP(PSTR("\n\r")); + } else if (cmd.buf[0] == 'r' && cmd.buf[1] == 'r') { + if (cmd.len < 26) { + uart_putsP(PSTR("Unable to parse ROM ID\n\r")); + return; + } + + for (i = 0; i < 8; i++) + ROM[i] = (int)strtol((char *)cmd.buf + 3 * (i + 1), (char **)NULL, 16); + + if (ROM[0] != OW_FAMILY_ROM) { + uart_putsP(PSTR("ROM specified isn't a ROM\n\r")); + return; + } + + crc = 0; + OWSendCmd(ROM, OW_READ_MEMORY); + OWCRC(OW_READ_MEMORY, &crc); + + OWWriteByte(0x00); + OWCRC(0x00, &crc); + + OWWriteByte(0x00); + OWCRC(0x00, &crc); + + if (crc != OWReadByte()) { + uart_putsP(PSTR("CRC mismatch on command & address\n\r")); + return; + } + + crc = 0; + for (buf[0] = 0; buf[0] < 128; buf[0]++) { + buf[1] = OWReadByte(); + if (buf[0] > 0) { + if (buf[0] % 16 != 0) + uart_putsP(PSTR(" ")); + else + uart_putsP(PSTR("\n\r")); + } + + uart_puts_hex(buf[1]); + OWCRC(buf[1], &crc); + } + uart_putsP(PSTR("\n\r")); + if (crc != OWReadByte()) { + uart_putsP(PSTR("CRC mismatch on data\n\r")); + return; + } + } else if (cmd.buf[0] == 'w' && cmd.buf[1] == 'c') { if (cmd.len < 5) { uart_putsP(PSTR("No arguments\n\r")); @@ -277,6 +438,7 @@ OWSendCmd(ROM, OW_CONVERTT_CMD); i = 0; + /* Wait for the conversion */ while (OWReadBit() == 0) { i++; } @@ -431,8 +593,36 @@ uart_putsP(PSTR("0x")); uart_puts_hex(crc); uart_putsP(PSTR("\n\r")); + } else if (cmd.buf[0] == 'd' && cmd.buf[1] == 'd') { + crc = strtol((char *)cmd.buf + 8, (char **)NULL, 16); + switch (tolower(cmd.buf[4])) { + case 'a': + DDRA = crc; + break; + + case 'b': + DDRB = crc; + break; + + case 'c': + DDRC = crc; + break; + + case 'd': + DDRD = crc; + break; + + default: + uart_putsP(PSTR("Unknown port\n\r")); + return; + } + uart_putsP(PSTR("0x")); + uart_puts_hex(crc); + uart_putsP(PSTR("\n\r")); +#ifdef WITHUSB } else if (cmd.buf[0] == 'u' && cmd.buf[1] == 's') { usb_gendata(); +#endif } else { badcmd: uart_putsP(PSTR("Unknown command, ? for a list\n\r"));