После изготовления Memory shield(о котором, я надеюсь, скоро напишу) я хотел проверить его работу, но всё время не хватало времени, да и знаний тоже. Может и сейчас я в чём-то ошибаюсь, но всё-таки выложу это здесь.
Это простенький пример тестирования памяти. Кстати. Хочу отметить, что даже без подключенного шилда, то что читается из памяти вполне определено — а именно младший байт адреса, т.к. он мультеплексирован с шиной адреса и на контактах, болтающихся в воздухе, остаётся только что выставленное значение(у AVR есть функция поддтяжки этих пинов к питанию, но я её пока не использовал).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
#include <avr/io.h> #include <avr/power.h> #include <stdarg.h> static inline void uart_putc(const char DataByte) { while (!(UCSR1A & (1 << UDRE1))) ; UDR1 = DataByte; } static inline char uart_getc(void) { while (!(UCSR1A & (1 << RXC1))) ; return UDR1; } void print_hex(uint16_t val) { char c; uint16_t i; for (i = 0; i < 4; i++) { c = (val & 0xf000) >> 12; val <<= 4; if (c > 9) { uart_putc(c + 'a' - 10); } else { uart_putc(c + '0'); } } } void print_hex8(uint8_t val) { uint8_t c = val >> 4; if (c > 9) { uart_putc(c + 'a' - 10); } else { uart_putc(c + '0'); } c = val & 0x0f; if (c > 9) { uart_putc(c + 'a' - 10); } else { uart_putc(c + '0'); } } void print_uint16_t(uint16_t val) { uart_putc(val / 10000 + '0'); val = val % 10000; uart_putc(val / 1000 + '0'); val = val % 1000; uart_putc(val / 100 + '0'); val = val % 100; uart_putc(val / 10 + '0'); val = val % 10; uart_putc(val + '0'); } void uart_puts(const char *str) { char c; while (c = *str) { uart_putc(c); str++; } } void uart_printf(const char *str, ...) { char c; uint16_t val; va_list vl; va_start(vl, str); while (c = *str) { if (c == '%') { val = va_arg(vl,uint16_t); str++; c = *str; if (c == 'i') { print_uint16_t(val); } else if (c == 'x') { print_hex(val); } else { uart_puts("!ERROR!"); } str++; } else { uart_putc(c); str++; } } va_end(vl); } uint8_t data[32760]; int main() { uint16_t page, line, col; clock_prescale_set(clock_div_1); UBRR1 = 8; UCSR1A = (1 << U2X1); UCSR1C = (1 << UCSZ11) | (1 << UCSZ10); UCSR1B = (1 << RXEN1) | (1 << TXEN1); XMCRB = 0x00; XMCRA = 1 << SRE; for (page = 0; page < 128; page++) { for(col = 0; col < 256;col++){ _MMIO_BYTE(0x8000 + 256*page + col) = page; } uart_printf("Page %x writed\r\n", page); } for (page = 0; page < 128; page++) { uart_printf("\r\nStart of page %x\r\n", page); for (line = 0; line < 16; line++) { uart_printf("%x : ", line); for (col = 0; col < 16; col++) { print_hex8( _MMIO_BYTE(0x8000 + 256*page + 16*line + col)); uart_putc(' '); } uart_puts("\r\n"); } } while (1) { } } |