From: Manfred Steiner Date: Tue, 16 Jul 2024 16:33:59 +0000 (+0200) Subject: Board nano-644 X-Git-Url: https://git.htl-mechatronik.at/public/?a=commitdiff_plain;h=bedaf19c34ef164d73fb58ecd7819cd027dfe4b1;p=sx%2Fsimavr.git Board nano-644 --- diff --git a/examples/simuc/src/main.cpp b/examples/simuc/src/main.cpp index 19cefa8..0b98f1c 100644 --- a/examples/simuc/src/main.cpp +++ b/examples/simuc/src/main.cpp @@ -8,7 +8,7 @@ #include "simavr/simavr.h" void printVersion () { - printf("simuc V0.0.7 (%s,%s)\n", __DATE__, __TIME__); + printf("simuc V0.0.8 (%s,%s)\n", __DATE__, __TIME__); } void printHelp () { @@ -16,7 +16,7 @@ void printHelp () { printf("usage: simuc [options] elf-file [elf-file ...]\n\n"); printf(" available options (you can use file .simucinit instead):\n"); printf(" --port ... listining port for gdb (default 1234)\n"); - printf(" --board ... set board (arduino, sure, evws1)\n"); + printf(" --board ... set board (arduino, nano-644, sure, evws1)\n"); printf(" --nosync do not sync elapsed µC-time with real time\n"); printf(" --mmcu ... set target device type\n"); printf(" --frequency ... set target frequency in Hz\n"); @@ -114,6 +114,15 @@ int main (int argc, char **argv) { params.vcc = 5000; params.avcc = 5000; params.aref = 2500; + + } else if (strcmp("nano-644", argv[i]) == 0) { + params.board = BoardNano644; + params.mmcu = "atmega644p"; + params.frequency = 12000000; + params.vcc = 3300; + params.avcc = 3300; + params.aref = 1100; + } else if (strcmp("sure", argv[i]) == 0) { params.board = BoardSure; params.mmcu = "atmega16"; diff --git a/examples/simuc/src/sim/sim.cpp b/examples/simuc/src/sim/sim.cpp index c1ec1e3..9692185 100644 --- a/examples/simuc/src/sim/sim.cpp +++ b/examples/simuc/src/sim/sim.cpp @@ -101,6 +101,12 @@ std::vector gdbFromUartBuffer; std::vector gdbToUartBuffer; __attribute__((unused)) static void fromGdbUart (uint8_t b) { + printf("\n\rgdb-uart OUT -> %02X", b); + if (b > 32 && b < 127) { + printf(" %c\n", b); + } else { + printf("\n"); + } static int cnt = 0; if (b == '$') { cnt = 1; @@ -122,6 +128,13 @@ __attribute__((unused)) static void fromGdbUart (uint8_t b) { } __attribute__((unused)) static void toGdbUart (uint8_t b) { + printf("\n\rgdb-uart IN <-- %02X", b); + if (b > 32 && b < 127) { + printf(" %c\n", b); + } else { + printf("\n"); + } + static int cnt = 0; if (b == '$') { cnt = 1; @@ -159,7 +172,10 @@ void init (struct StartParameters *param) { // simavr.registerIoWrite(PORTB, handleWritePortB); simavr.setUartPtyEnabled(0, true); int uartCnt = 1; - if (strcmp(simavr.getTargetDeviceName(), "atmega324p") == 0) { + if (strcmp(simavr.getTargetDeviceName(), "atmega16") == 0) { + // simavr.setUartPtyHook(0, fromGdbUart, toGdbUart); + } + if (strcmp(simavr.getTargetDeviceName(), "atmega324p") == 0 || strcmp(simavr.getTargetDeviceName(), "atmega644p") == 0) { simavr.setUartPtyEnabled(1, true); simavr.setUartPtyHook(1, fromGdbUart, toGdbUart); uartCnt = 2; diff --git a/examples/simuc/src/simavr/simavr.cpp b/examples/simuc/src/simavr/simavr.cpp index 9c974b5..2b90430 100644 --- a/examples/simuc/src/simavr/simavr.cpp +++ b/examples/simuc/src/simavr/simavr.cpp @@ -476,8 +476,14 @@ void SimAvr::printCyclesAndElapsedTime () { uint16_t nanos = time % 1000; time = time / 1000; uint16_t micros = time % 1000; time = time / 1000; uint16_t millis = time % 1000; time = time / 1000; - uint16_t seconds = time % 1000; time = time / 1000; - printf("cycle %" PRIu64 " = %ds %03dms %03dµs %03dns", avr->cycle, seconds, millis, micros, nanos); + uint16_t seconds = time % 60; time = time / 60; + uint16_t minutes = time % 60; time = time / 60; + uint32_t hours = (uint32_t)time; // time has after divisions max. 23 Bit + if (hours == 0) { + printf("cycle %010" PRIu64 " = %2dmin %2ds %03dms %03dµs %03dns", avr->cycle, minutes, seconds, millis, micros, nanos); + } else { + printf("cycle %010" PRIu64 " = %dhrs %2dmin %2ds %03dms %03dµs %03dns", avr->cycle, hours, minutes, seconds, millis, micros, nanos); + } } bool SimAvr::sprintfLedStatus (char *s, size_t size, bool onlyOnChange) { @@ -492,37 +498,111 @@ bool SimAvr::sprintfLedStatus (char *s, size_t size, bool onlyOnChange) { int8_t nextLedL = -1; if (ddrb & 0x20) { nextLedL = portb & 0x20 ? 1 : 0; + } else { + nextLedL = -1; } if (!onlyOnChange || nextLedL != ledL) { + char c; + switch (nextLedL) { + case -1: c = '-'; break; + case 0: c = '.'; break; + case 1: c = 'X'; break; + default: c = '?'; break; + } ledL = nextLedL; - snprintf(s, size, "LED L = %c", ledL == 1 ? 'X' : '.'); + snprintf(s, size, "LED L = %c", c); rv = true; } break; } + case BoardNano644: { + static int8_t led[3] = { -1, -1, -1 }; // pin floating + static uint8_t mask[3] = { 0x04, 0x08, 0x10 }; // Bitmask for LED Red, Yellow, Green + int nextLed[3] = { -1, -1, -1 }; + char cLed[3]; + uint8_t ddrc = avr->data[0x27]; + uint8_t portc = avr->data[0x28]; + int change = 0; + for (int i = 0; i < 3; i++) { + if (ddrc & mask[i]) { + nextLed[i] = portc & mask[i] ? 1 : 0; + } else { + nextLed[i] = -1; + } + if (!onlyOnChange || nextLed[i] != led[i]) { + change++; + rv = true; + } + } + int l = 0; + if (change) { + l += snprintf(s, size, "LED RGB = "); + for (int i = 0; i < 3; i++) { + switch (nextLed[i]) { + case -1: cLed[i] = '-'; break; + case 0: cLed[i] = '.'; break; + case 1: cLed[i] = 'X'; break; + default: cLed[i] = '?'; break; + } + l += snprintf(&s[l], size - l, "%c", cLed[i]); + } + for (int i = 0; i < 3; i++) { + if (nextLed[i] != led[i]) { + led[i] = nextLed[i]; + switch (i) { + case 0: l += snprintf(&s[l], l, " -> Red = %c", cLed[i]); break; + case 1: l += snprintf(&s[l], l, " -> Yellow = %c", cLed[i]); break; + case 2: l += snprintf(&s[l], l, " -> Green = %c", cLed[i]); break; + } + } + } + } + break; + } + case BoardSure: { static int8_t led[4] = { -1, -1, -1, -1 }; // pin floating + static uint8_t mask[4] = { 0x08, 0x04, 0x02, 0x01 }; // Bitmask for LED PA3, PA2, PA1, PA0 + int nextLed[4] = { -1, -1, -1, -1 }; + char cLed[4]; uint8_t ddra = avr->data[0x3a]; uint8_t porta = avr->data[0x3b]; int change = 0; for (int i = 0; i < 4; i++) { - int8_t nextLed = -1; - if (ddra & (1 << i)) { - nextLed = porta & (1 << i) ? 0 : 1; // port output + if (ddra & mask[i]) { + nextLed[i] = porta & mask[i] ? 1 : 0; } else { - nextLed = 0; // port input _> led is off + nextLed[i] = -1; } - if (nextLed != led[i]) { - change = 1; - led[i] = nextLed; + if (!onlyOnChange || nextLed[i] != led[i]) { + change++; + rv = true; } } - if (!onlyOnChange || change) { - int n = snprintf(s, size, "LED PA[3210] ="); - for (int i = 3; i >= 0; i--) { - n += snprintf(s + n, size - n, " %c", led[i] == 1 ? 'X' : '.'); + int l = 0; + if (change) { + l += snprintf(s, size, "LED PA3:0 = "); + for (int i = 0; i < 4; i++) { + switch (nextLed[i]) { + case -1: cLed[i] = '-'; break; + case 0: cLed[i] = '.'; break; + case 1: cLed[i] = 'X'; break; + default: cLed[i] = '?'; break; + } + l += snprintf(&s[l], size - l, "%c", cLed[i]); + } + for (int i = 0; i < 4; i++) { + if (nextLed[i] != led[i]) { + led[i] = nextLed[i]; + switch (i) { + case 0: l += snprintf(&s[l], l, " -> PA3 = %c", cLed[i]); break; + case 1: l += snprintf(&s[l], l, " -> PA2 = %c", cLed[i]); break; + case 2: l += snprintf(&s[l], l, " -> PA1 = %c", cLed[i]); break; + case 3: l += snprintf(&s[l], l, " -> PA0 = %c", cLed[i]); break; + } + + } } - rv = true; } break; } diff --git a/examples/simuc/src/simavr/simavr.h b/examples/simuc/src/simavr/simavr.h index 39b58c9..7c993e7 100644 --- a/examples/simuc/src/simavr/simavr.h +++ b/examples/simuc/src/simavr/simavr.h @@ -15,6 +15,7 @@ typedef enum { BoardUnknown = 0, BoardNano, + BoardNano644, BoardSure, BoardEWS1 } EnumStartParameterBoard;