Issue in Serial Communication
Objective: Program ATTiny44 to send AT Commands to ESP8266-12E SMD.
- I'm using parts of Neil's hello.ftdi.44.echo.c
- Programming environment Arduino IDE using Arduino as ISP
- Board Configuration (External 20MHz) : https://github.com/SpenceKonde/ATTinyCore
Issue: Inconsistent and Incorrect parsing of serial data.
Code
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#define output(directions,pin) (directions |= pin) // set port direction for output
#define set(port,pin) (port |= pin) // set port pin
#define clear(port,pin) (port &= (~pin)) // clear port pin
#define pin_test(pins,pin) (pins & pin) // test for port pin
#define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set
#define bit_delay_time 8.5 // bit delay for 115200 with overhead
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay
#define serial_port PORTA
#define serial_direction DDRA
#define serial_pins PINA
#define serial_pin_in (1 << PA1)
#define serial_pin_out (1 << PA0)
#define max_buffer 25
void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {
//
// send character in txchar on port pin
// assumes line driver (inverts bits)
//
// start bit
//
clear(*port,pin);
bit_delay();
//
// unrolled loop to write data bits
//
if bit_test(txchar,0)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,1)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,2)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,3)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,4)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,5)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,6)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,7)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
//
// stop bit
//
set(*port,pin);
bit_delay();
//
// char delay
//
bit_delay();
}
void put_string(volatile unsigned char *port, unsigned char pin, char *str) {
//
// print a null-terminated string
//
static int index;
index = 0;
do {
put_char(port, pin, str[index]);
++index;
} while (str[index] != 0);
}
void setup() {
DDRB |= (1 << PB2);
// put your setup code here, to run once:
static char chr;
static char buffer[max_buffer] = {0};
static int index = 0;
//
// set clock divider to /1
//
CLKPR = (1 << CLKPCE);
CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
// initialize output pins
//
set(serial_port, serial_pin_out);
output(serial_direction, serial_pin_out);
put_string(&serial_port, serial_pin_out, "AT+CWMODE=1\r\n" );
delay(500);
put_string(&serial_port, serial_pin_out, "AT+CWJAP=\"SeeknFind\",\"nill1123\"\r\n" );
delay(500);
}
void loop() {
PORTB |= (1 << PB2);
// put your main code here, to run repeatedly:
delay(1000);
put_string(&serial_port, serial_pin_out, "AT+CIPMUX=1\r\n" );
PORTB = 0;
delay(2000);
}
Output
Edited by Manoj Sahukar