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
|
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include "ssd1306_display_driver.h"
#include "i2c.h"
#include "debug.h"
#include "br24t_eeprom_driver.h"
//this is used elsewhere (only one file) besides debug but kind of gross, maybe move to a header or something
#define SSD1306_ADDR 0x3c
#define SSD1306_CMD_REG 0x00
#define SSD1306_DATA_REG 0x40
#define SCREEN_PAGE_CNT SCREEN_RES_Y / 8
#define I2C_WRITE 0
#define I2C_READ 1
void scroll_test() {
//sets scroll area to whole screen
i2c_write_reg_multi(SSD1306_ADDR, SSD1306_CMD_REG, 3, (uint8_t[]){0xa3, 0x00, 0x20});
//set up scroll options
i2c_write_reg_multi(SSD1306_ADDR, SSD1306_CMD_REG, 6, (uint8_t[]){0x29, 0x00, 0x00, 0x00, 0x04, 0x00});
//actually activate scroll
i2c_write_reg_multi(SSD1306_ADDR, SSD1306_CMD_REG, 6, (uint8_t[]){0x2f});
}
void screen_lowlvl_testdraw() {
unsigned int on_pix;
unsigned int on_page;
printf("running screen time tests\r\n");
printf("generating test image...\r\n");
for(on_pix = 0; on_pix < sizeof(screen_buffer); on_pix++)
screen_buffer[on_pix] = ((uint8_t)0xaa << (on_pix % 8));
printf("page mode, individual byte per i2c call...\r\n");
for(on_page = 0; on_page < SCREEN_PAGE_CNT; on_page++) {
i2c_write_reg(SSD1306_ADDR, SSD1306_CMD_REG, 0xb0 + on_page);
i2c_write_reg(SSD1306_ADDR, SSD1306_CMD_REG, 0x00);
i2c_write_reg(SSD1306_ADDR, SSD1306_CMD_REG, 0x10);
for(on_pix = 0; on_pix < SCREEN_RES_X; on_pix++)
i2c_write_reg(SSD1306_ADDR, SSD1306_DATA_REG, screen_buffer[(on_page * 8) + on_pix]);
}
printf("page mode, 1 page per i2c call...\r\n");
for(on_page = 0; on_page < SCREEN_PAGE_CNT; on_page++) {
i2c_write_reg(SSD1306_ADDR, SSD1306_CMD_REG, 0xb0 + on_page);
i2c_write_reg(SSD1306_ADDR, SSD1306_CMD_REG, 0x00);
i2c_write_reg(SSD1306_ADDR, SSD1306_CMD_REG, 0x10);
i2c_write_reg_multi(SSD1306_ADDR, SSD1306_DATA_REG, SCREEN_RES_X, &screen_buffer[on_page * SCREEN_RES_X]);
}
printf("screen test draw done!\n");
}
void uart_echo() {
char buff;
for(;;) {
fread(&buff, 1, 1, stdin);
fwrite(&buff, 1, 1, stdout);
}
}
void test_clock() {
printf("The time is %s, waiting 5 mintes...\r\n", "not implimented");
_delay_ms(300000);
printf("The time is now %s, hope your RTC clock works\r\n", "not implimented");
}
/*
* TCNTn: timer/counter
* TCCRnA/B/C: timer/counter control registers
*/
void timer_init() {
TCCR1A = 0; //no waveform generation or something like that
TCCR1B = _BV(CS00); //no prescaling; use internal clock
TCCR1C = 0;
}
//makes it easier to print time; is an unsigned int and NOT to be used for more then printing
unsigned int ticks_to_seconds(uint16_t start, uint16_t end) {
return ((unsigned int)(end - start) / F_CPU);
}
void test_timer() {
uint16_t start, end;
start = TCNT1;
_delay_ms(1000);
end = TCNT1;
printf("1 second is %u ticks\r\n", end - start);
}
void eeprom_testbyte() {
uint8_t data_in = 0xde;
uint8_t data_out = 0;
printf("writing 0x%x to eeprom...\r\n", data_in);
EEPROM_WRITEBYTE(0x0000, data_in);
data_out = EEPROM_READBYTE(0x0000);
printf("byte read from eeprom: 0x%x\r\n", data_out);
}
|