backspace works
This commit is contained in:
@@ -104,7 +104,8 @@ void uart_tx(char c) {
|
|||||||
UDR0 = (unsigned char) c; // 20.11.1 : Put data into buffer, UDRn – USART I/O Data Register (read and write)
|
UDR0 = (unsigned char) c; // 20.11.1 : Put data into buffer, UDRn – USART I/O Data Register (read and write)
|
||||||
}
|
}
|
||||||
|
|
||||||
// screen /dev/ttyUSB0 115200
|
// write Z on serial port, at a !Hz frequency
|
||||||
|
// `screen /dev/ttyUSB0 115200`
|
||||||
int main() {
|
int main() {
|
||||||
uart_init();
|
uart_init();
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|||||||
@@ -62,29 +62,29 @@
|
|||||||
|
|
||||||
// USART
|
// USART
|
||||||
// Table 20-1 : Baud Rate Calculation
|
// Table 20-1 : Baud Rate Calculation
|
||||||
#define USART_BAUDRATE 115200
|
#define USART_BAUDRATE 115200
|
||||||
#define BAUD_PRESCALER (DIV_ROUND_CLOSEST(F_CPU, (16 * USART_BAUDRATE)) - 1)
|
#define BAUD_PRESCALER (DIV_ROUND_CLOSEST(F_CPU, (16 * USART_BAUDRATE)) - 1)
|
||||||
// Table 20-8 : Mode Selection (USART Mode SELect)
|
// Table 20-8 : Mode Selection (USART Mode SELect)
|
||||||
#define ASYNCHRONOUS (0<<UMSEL01 | 0<<UMSEL00)
|
#define ASYNCHRONOUS (0<<UMSEL01 | 0<<UMSEL00)
|
||||||
#define SYNCHRONOUS (0<<UMSEL01 | 1<<UMSEL00)
|
#define SYNCHRONOUS (0<<UMSEL01 | 1<<UMSEL00)
|
||||||
// Table 20-9 : Parity Bit Selection (USART Parity Mode)
|
// Table 20-9 : Parity Bit Selection (USART Parity Mode)
|
||||||
#define PARITY_DISABLED (0<<UPM01 | 0<<UPM00)
|
#define PARITY_DISABLED (0<<UPM01 | 0<<UPM00)
|
||||||
#define PARITY_EVEN (1<<UPM01 | 0<<UPM00)
|
#define PARITY_EVEN (1<<UPM01 | 0<<UPM00)
|
||||||
#define PARITY_ODD (1<<UPM01 | 1<<UPM00)
|
#define PARITY_ODD (1<<UPM01 | 1<<UPM00)
|
||||||
// Table 20-10 : Stop Bit Selection (USART Stop Bit Select)
|
// Table 20-10 : Stop Bit Selection (USART Stop Bit Select)
|
||||||
#define STOP_ONE_BIT (0<<USBS0)
|
#define STOP_ONE_BIT (0<<USBS0)
|
||||||
#define STOP_TWO_BIT (1<<USBS0)
|
#define STOP_TWO_BIT (1<<USBS0)
|
||||||
// Table 20-11 : Data Bit Selection (USART Character SiZe)
|
// Table 20-11 : Data Bit Selection (USART Character SiZe)
|
||||||
#define DATA_FIVE_BIT (0<<UCSZ02 | 0<<UCSZ01 | 0<<UCSZ00)
|
#define DATA_FIVE_BIT (0<<UCSZ02 | 0<<UCSZ01 | 0<<UCSZ00)
|
||||||
#define DATA_SIX_BIT (0<<UCSZ02 | 0<<UCSZ01 | 1<<UCSZ00)
|
#define DATA_SIX_BIT (0<<UCSZ02 | 0<<UCSZ01 | 1<<UCSZ00)
|
||||||
#define DATA_SEVEN_BIT (0<<UCSZ02 | 1<<UCSZ01 | 0<<UCSZ00)
|
#define DATA_SEVEN_BIT (0<<UCSZ02 | 1<<UCSZ01 | 0<<UCSZ00)
|
||||||
#define DATA_EIGHT_BIT (0<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
#define DATA_EIGHT_BIT (0<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
||||||
#define DATA_NINE_BIT (1<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
#define DATA_NINE_BIT (1<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
||||||
// 20.11.3 : USART Control and Status Register B (UCSRnB)
|
// 20.11.3 : USART Control and Status Register B (UCSRnB)
|
||||||
#define RECEIVER_DISABLED (0<<RXEN0)
|
#define RECEIVER_DISABLED (0<<RXEN0)
|
||||||
#define RECEIVER_ENABLED (1<<RXEN0)
|
#define RECEIVER_ENABLED (1<<RXEN0)
|
||||||
#define TRANSMITTER_DISABLED (0<<TXEN0)
|
#define TRANSMITTER_DISABLED (0<<TXEN0)
|
||||||
#define TRANSMITTER_ENABLED (1<<TXEN0)
|
#define TRANSMITTER_ENABLED (1<<TXEN0)
|
||||||
|
|
||||||
// TIMER
|
// TIMER
|
||||||
#define PERIOD 2000
|
#define PERIOD 2000
|
||||||
@@ -134,7 +134,7 @@ void uart_printstr(const char* str) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// print hello world, on serial port, every 2 seconds, with empty infinite loop
|
// print "Hello World!\n", on serial port, every 2 seconds, with empty infinite loop
|
||||||
// `screen /dev/ttyUSB0 115200`
|
// `screen /dev/ttyUSB0 115200`
|
||||||
int main() {
|
int main() {
|
||||||
uart_init();
|
uart_init();
|
||||||
@@ -154,5 +154,5 @@ int main() {
|
|||||||
|
|
||||||
// ISR interrupt macro : https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
|
// ISR interrupt macro : https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
|
||||||
ISR(TIMER1_COMPA_vect) { // Table 12-7 : we select the code for timer 1 on channel A
|
ISR(TIMER1_COMPA_vect) { // Table 12-7 : we select the code for timer 1 on channel A
|
||||||
uart_printstr("Hello World!");
|
uart_printstr("Hello World!\r\n"); // \n and \r : https://stackoverflow.com/questions/7812142/how-to-toggle-cr-lf-in-gnu-screen
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,7 +142,13 @@ void uart_tx(char c) {
|
|||||||
ISR(USART_RX_vect) { // Table 12-7 : we select the code for USART Receive
|
ISR(USART_RX_vect) { // Table 12-7 : we select the code for USART Receive
|
||||||
// char received_char = uart_rx();
|
// char received_char = uart_rx();
|
||||||
char received_char = UDR0; // Read received character
|
char received_char = UDR0; // Read received character
|
||||||
uart_tx(SWITCH_CASE(received_char)); // Toggle case and send back
|
if (received_char == '\b' || received_char == 127) { // If backspace is received
|
||||||
|
uart_tx('\b'); // Move cursor back
|
||||||
|
uart_tx(' '); // Erase the character on screen
|
||||||
|
uart_tx('\b'); // Move cursor back again
|
||||||
|
} else {
|
||||||
|
uart_tx(SWITCH_CASE(received_char)); // Toggle case and send back
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// send back caracters received on serial port with case toggling, using interupt and empty infinite loop
|
// send back caracters received on serial port with case toggling, using interupt and empty infinite loop
|
||||||
|
|||||||
Reference in New Issue
Block a user