Atmega8 странности при передаче данных по usart

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Родился
Сообщения: 9
Зарегистрирован: Вт дек 06, 2016 10:28:53

Сообщение ktulhu-forever »

Пишу программу, которая передаёт данные с МК на компьютер, где данные обрабатываются через PySerial.
Для микроконтроллерной программы значение 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++);
  }
}


Makefile
Спойлер

Код: Выделить всё

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)

Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Сообщение AndyBig »

А где определяются значения переменных UBRRH_VALUE и UBRRL_VALUE?
Реклама
Родился
Сообщения: 9
Зарегистрирован: Вт дек 06, 2016 10:28:53

Сообщение ktulhu-forever »

В setbaud.h
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Прекрасный ответ. Ни о чём.
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 9
Зарегистрирован: Вт дек 06, 2016 10:28:53

Сообщение ktulhu-forever »

Код: Выделить всё

  #ifdef __ASSEMBLER__
    #define UBRR_VALUE (((F_CPU) + 8 * (BAUD)) / (16 * (BAUD)) -1)
  #else
    #define UBRR_VALUE (((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL)
  #endif

Код: Выделить всё

  #ifdef UBRR_VALUE
  /* Check for overflow */
    #if UBRR_VALUE >= (1 << 12)
      #warning "UBRR value overflow"
    #endif
  
  #define UBRRL_VALUE (UBRR_VALUE & 0xff)
  #define UBRRH_VALUE (UBRR_VALUE >> 8)
  #endif
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ktulhu-forever писал(а):почему заработало только тогда, когда BAUD на компьютере был уменьшет относительно контроллерского в 2 раза
наверняка проблема кроется в том, что у вас есть различие между указанной в проекте тактовой частотой МК и реальной частотой его тактирования.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Ответить

Вернуться в «Теория»