PuTTY не отправляет данные в серийный AVR - PullRequest
1 голос
/ 05 марта 2020

в упражнении для моего курса по встроенному программированию мы должны запрограммировать микросхему Atmega328p AVR для приема данных через последовательный порт. Мы должны сделать это, вызвав функцию, которая ждет, пока не получит символ. Затем он должен отображать значение ascii этого символа в светодиодных лампах, но у меня возникают проблемы даже при его получении. Я сделал много отладок, и я думаю, что сузил его до PuTTY, даже не отправляя данные, или AVR не получил должным образом. Я добавлю свой код ниже:

/*
From the PC should come a char, sent via the serial port to the USART data register. 
It will arrive in the RXB, which receives data sent to the USART data register. 
While running the loop, the program should encounter a function that is called and waits for the RXB to be filled. 
Then it will read the RXB and return it to the main loop.
The result will be stored and processed accordingly.
*/

#define F_CPU 15974400
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>

void writeChar(char x);
void initSerial();
char readChar();

int main(void)
{
    initSerial();
    while (1) 
    {
        char c = readChar(); //reads char, puts it in c
        _delay_ms(250); //waits

        writeChar(c); // spits that char back into the terminal
    }
}

void initSerial(){
UCSR0A = 0;
//UCSR0B = (1 << TXEN0); // Enable de USART Transmitter
UCSR0B = 0b00011000; //transmit and receive enable
//UCSR0C = (1 << UCSZ01) | (0 << UCSZ00); /* 8 data bits, 1 stop bit */
UCSR0C = 0b00100110; // Even parity, 8 data bits, 1 stop bit
UBRR0H=00;
UBRR0L=103; //baudrade 9600 bij
}

void writeChar(char x){
    while(!(UCSR0A & (1 << UDRE0))); // waits until it can send data
    UDR0 = x; // Puts x into the UDR0, outputting it
}

char readChar(){
    while (!(UCSR0A & (1 << RXC0))); //waits until it can send data
    return UDR0; // returns the contents of the UDR0 (the receiving part of course
}

Проблема заключается в том, что когда я вношу что-либо в PuTTY (что я предполагаю, я настроил правильно. https://prnt.sc/rc7f0f и https://prnt.sc/rc7fbj кажутся важными экранами.

Заранее спасибо, у меня совершенно нет идей.

1 Ответ

0 голосов
/ 06 марта 2020

Я исправил это сам. Я понял это, спускаясь вниз по лестнице, чтобы проверить это на другом ноутбуке. У меня все еще были светодиоды, вставленные во все контакты PORTD, все в режиме ввода (это режим по умолчанию). Я быстро взглянул на руководство пользователя Atmega328p (раздел 2.5.3), которое показало, что вывод D0 был фактически RxD для USART. При установке на него светодиода и его эффективном заземлении он всегда был на низком уровне и никогда не поднимался бы на центральный процессор, что остановило бы, пока l oop check while (!(UCSR0A & (1 << RXC0))); //waits until it can send data в readChar ();

Так что, просто удалив этот светодиод, он снова заработает. Очевидно, это означало бы, что он был плавающим, поэтому я установил, что все DDRD будут выводиться, поскольку в любом случае ничего вводить не нужно.

Это закончилось тем, что исправило это.

...