Atmega8 странности при передаче данных по usart
Добавлено: Пн янв 29, 2018 16:44:01
Пишу программу, которая передаёт данные с МК на компьютер, где данные обрабатываются через PySerial.
Для микроконтроллерной программы значение BAUD установлено в 9600. Но когда я поставил такое же значение на компьютере
(и в питоновском коде, и в gtkterm), он начал писать всякую фигню. Потом я в gtkterm установил значение в 4800, и всё заработало.
Собственно вопрос -- почему заработало только тогда, когда BAUD на компьютере был уменьшет относительно контроллерского в 2 раза,
ведь по идее, они должны быть одинаковыми?
Код контроллера
Makefile
Питоновский код обработчика
Для микроконтроллерной программы значение BAUD установлено в 9600. Но когда я поставил такое же значение на компьютере
(и в питоновском коде, и в gtkterm), он начал писать всякую фигню. Потом я в gtkterm установил значение в 4800, и всё заработало.
Собственно вопрос -- почему заработало только тогда, когда BAUD на компьютере был уменьшет относительно контроллерского в 2 раза,
ведь по идее, они должны быть одинаковыми?
Код контроллера
Спойлер
Код: Выделить всё
#define BAUD 9600
#include <avr/io.h>
#include <util/delay.h>
#include <util/setbaud.h>
uint8_t receiveByte(void);
void usart_init();
void usart_putc(uint8_t send);
void usart_puts(const char* send);
int main(void) {
usart_init();
const char* ok = "ok\n";
while (1) {
usart_puts(ok);
_delay_ms(500);
}
return 0;
}
void usart_init(void) {
// USART baud rate register
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
// UCSRC &= ~(1 << UCSZ2);
UCSRB |= (1 << RXEN) | (1 << TXEN);
}
void usart_putc(uint8_t send) {
while ((UCSRA & (1 << UDRE)) == 0) {}
UDR = send;
}
void usart_puts(const char* send) {
while(*send) {
usart_putc(*send++);
}
}
Спойлер
Код: Выделить всё
MCU = atmega8
F_CPU = 16000000UL
BAUD = 9600
TARGET = usart
PROGRAMMER_TYPE = usbasp
PROGRAMMER_ARGS =
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
AVRSIZE = avr-size
AVRDUDE = avrdude
FORMAT = ihex
SOURCES = $(wildcard *.c $(LIBDIR)/*.c)
OBJECTS = $(SOURCES:.c=.o)
HEADERS = $(SOURCES:.c=.h)
CPP_FLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I.
C_FLAGS = -Os -g -std=gnu99 -Wall
TARGET_ARCH = -mmcu=$(MCU)
C_FLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
%.o: %.c $(HEADERS) Makefile
$(CC) $(C_FLAGS) $(CPP_FLAGS) $(TARGET_ARCH) -c -o $@ $<
$(TARGET).elf: $(OBJECTS)
$(CC) $(TARGET_ARCH) $^ $(LDLIBS) -o $@
%.hex: %.elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@
%.lst: %.elf
$(OBJDUMP) -S $< > $@
all: $(TARGET).hex
debug:
@echo
@echo "Source files:" $(SOURCES)
@echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD)
@echo
disasm: $(TARGET).lst
size: $(TARGET).elf
$(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf
clean:
rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \
$(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \
$(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \
$(TARGET).eeprom
flash: $(TARGET).hex
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$<
Спойлер
Код: Выделить всё
SERIAL_PORT = '/dev/ttyUSB1'
BAUD_RATE = 4800
import serial
sp = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=5)
sp.flush()
while True:
response = sp.readline()
print(response)