Сб ноя 20, 2021 18:50:00
char str[] = "\0";
char *str = "\0";
Сб ноя 20, 2021 19:17:27
void foo(const char* s) {}
foo("bar");
Пт ноя 26, 2021 21:16:42
Пт ноя 26, 2021 22:52:21
Пт ноя 26, 2021 22:56:05
Сб ноя 27, 2021 10:20:39
Сб ноя 27, 2021 10:30:20
Сб ноя 27, 2021 11:05:15
Сб ноя 27, 2021 12:17:06
Сб ноя 27, 2021 14:03:28
Сб ноя 27, 2021 14:42:37
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BAUD_RATE 2400L
unsigned char ch[2] = "A";
void UART0_Init(void) {
UBRR0 = (F_CPU + 4 * BAUD_RATE) / (8 * BAUD_RATE) - 1; // если с кварцем
UCSR0A = 1 << U2X0; // удвоение скорости обмена( предделитель уменьшается с 16 до 8)
UCSR0B = 1 << TXEN0 | // разрешение передачи
1 << TXCIE0; // разрешение прерывания по завершению передачи
UCSR0C = 1 << UCSZ00 | 1 << UCSZ01 | // определение размера слова данных в 8 бит
1 << USBS0; // передатчик посылает 2 СТОП-бита
}
void uart_send_char(unsigned char *ch){
while (! (UCSR0A & _BV(UDRE0)) ); // Wait for empty transmit buffer
UDR0 = *ch;
}
int main(void) {
UART0_Init();
sei (); // Global enable interrupts
while(1){
uart_send_char(ch);
}
}
Сб ноя 27, 2021 15:10:00
Вс ноя 28, 2021 16:51:43
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000
#define BAUD 9600
#define BRC ((F_CPU/16/BAUD)-1) // baud rate calculation
int main(void) {
UBRR0H = (BRC >> 8);
UBRR0L = BRC;
UCSR0B = _BV(TXEN0); // разрешение работы передачика USART
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); // определение размера слова данных в 8 бит
while(1){
UDR0 = 'W'; // инициализация передачи
_delay_ms(100);
}
}
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#define F_CPU 16000000
#define BAUD 9600
#define BRC ((F_CPU/16/BAUD)-1) // baud rate calculation
#define TX_BUFFER_SIZE 128
#define enable_interrupt_when_data_register_USART_is_empty UCSR0B |= _BV(UDRIE0)
#define disable_interrupt_when_data_register_USART_is_empty UCSR0B &= ~(1 << UDRIE0)
char TX_BUFFER[TX_BUFFER_SIZE] = " String №1 \n\r";
//char *p_str = " String №2 \n\r";
char *p;
ISR (USART0_TX_vect){// передача закончена
}
ISR (USART0_UDRE_vect){ // регистр данных пуст
if (*p == '\0'){
disable_interrupt_when_data_register_USART_is_empty;
} else {
UDR0 = *p;
p++;
}
}
void uart_send_string(char *s){
if(bit_is_clear(UCSR0A,TXC0)){ // если предыдущая передача закончена
p = s;
UDR0 = *p;
p++;
enable_interrupt_when_data_register_USART_is_empty;
}
}
int main(void) {
DDRB |= _BV(7);
UBRR0H = (BRC >> 8);
UBRR0L = BRC;
//UBRR0 = BRC ;
UCSR0B = _BV(TXEN0)| // разрешение работы передачика USART
_BV(TXCIE0); // разрешение прерывания по завершению передачи
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); // определение размера слова данных в 8 бит
sei (); // Global enable interrupts
while(1){
uart_send_string(TX_BUFFER);
_delay_ms(1000);
}
}
Вс ноя 28, 2021 19:25:56
а если предыдущая передача не закончена, что тогда? _delay_ms(1000) для надежности? и зачем тогда огород с передачей по прерываниям, если все равно ждать время?FreshMan писал(а):void uart_send_string(char *s){
if(bit_is_clear(UCSR0A,TXC0)){ // если предыдущая передача закончена
p = s;
UDR0 = *p;
p++;
enable_interrupt_when_data_register_USART_is_empty;
}
}
void send_char(c){
while_bit_is_set(UCSR0A, UDRE);
UDR0 = c;
}
void send_str(char *s){
while(*s) send_char(s++);
}
Вс ноя 28, 2021 19:49:26
а если предыдущая передача не закончена, что тогда? _delay_ms(1000) для надежности? и зачем тогда огород с передачей по прерываниям,FreshMan писал(а):void uart_send_string(char *s){
if(bit_is_clear(UCSR0A,TXC0)){ // если предыдущая передача закончена
p = s;
UDR0 = *p;
p++;
enable_interrupt_when_data_register_USART_is_empty;
}
}
Вс ноя 28, 2021 22:06:28
ну так и где это условие у вас? у вас, если флажок пустоты буфера не установлен, функция тупо ничего не сделает, а вызвавший её код никак об этом не узнает...FreshMan писал(а):было бы правильней не начинать новую передачу пока старая не закончена.
да уж писал много раз... вот тут, например: https://simple-devices.ru/articles/7-so ... omment-392 (там, после смены владельца сайта, порушились врезки кода, но, если напрячься, все будет понятно)FreshMan писал(а):а можна по подробней об этом ?
Пн ноя 29, 2021 11:52:22
В UNIX изначально была многозадачность, то есть пока интерактивный поток ждет пользователя, демоны вполне себе выполняются.тем более, что подобный принцип прекрасно поддерживается системными функциями printf, использовать которые для вывода на компьютерную консоль - милое дело! и практически весь UNIX вырос из именно такого, блокирующего printf...
Пн ноя 29, 2021 19:38:36
удобнее, как проще. конечный автомат написать - это думать надо... а так - не надоCOKPOWEHEU писал(а):Но ведь по прерываниям удобнее.
это когда дел много...COKPOWEHEU писал(а):и занимаешься своими делами
так в МК то же самое. просто для меня приоритеты расставлены так: то, что должно делаться быстро, делается по прерываниям, а то, что может и подождать - в основном цикле. отсюда прием по прерываниям в фоне, а вывод - без прерываний в цикле.COKPOWEHEU писал(а):то есть пока интерактивный поток ждет пользователя, демоны вполне себе выполняются
Пн ноя 29, 2021 21:33:23
Э-э-э... Вы что, работу с UART каждый раз с нуля пишете? А если кольцевой буфер и прерывания уже написаны, подключение ничем не отличается от работы на задержках.удобнее, как проще. конечный автомат написать - это думать надо... а так - не надо
Пн ноя 29, 2021 22:38:19
тогда, пожалуйста, покажите, как просто кольцевой буфер с прерываниями скрестить с prntf?COKPOWEHEU писал(а):А если кольцевой буфер и прерывания уже написаны, подключение ничем не отличается от работы на задержках.