Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Salah_ad_Din
0 / 0 / 0
Регистрация: 18.10.2015
Сообщений: 7
1

Работа с UART (Си, ATtiny 2313)

18.10.2015, 19:35. Просмотров 2110. Ответов 21
Метки нет (Все метки)

Дорогие формчане и знатаки по микроконтролёрам я Новичок в этом деле. У меня есть вопрос, есть кусок кода в котором записываю принитые данные с Uart в массив и проверяю каждый елемент массива на значение. Вопрос такой, почему я не могу проверять больше двух элементов если я массив увеличиваю на 3 елемента и записываю 3 елемента, Жду ваших советов Заранее спасибо!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Подпрограмма обработки прерывания
ISR(USORT_RX_vect)
{
   uint8_t i,tmp[2]; // uint8_t i,tmp[3];
   
   for (i=0;i<2;i++) //for (i=0;i<3;i++)
   {
     tmp[i] =UDR ;    
   }
   
  if (tmp[0]=='q'&&tmp[1]=='c')// if (tmp[0]=='q'&&tmp[1]=='c'&&tmp[2]=='a')
    {
         PORTB^= (1<<1);
        
        
            }
   
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2015, 19:35
Ответы с готовыми решениями:

ATtiny 2313
Добрый день, возникли трудности с работой с МК. Это мой первый практический опыт в паянии и работе...

Attiny 2313 не прошивается
Attiny 2313 пытаюсь прошить через arduino nano но ни как не могу подключил тут на nano есть...

AtTiny 2313, прерывания
Доброго времени суток. Решил освоить программирование МК и сразу же столкнулся с проблемой, которую...

Термостат на ATTiny 2313
Собираю термостат в Протеусе на Attiny 2313. Имеется код на ассемблере (5.txt) но компилятор...

ATtiny 2313. Контроль освещения
Требуется написать программу на Assembler или на С++ Программа не для рабочего микропроцессора,...

21
R0
17 / 17 / 13
Регистрация: 06.08.2015
Сообщений: 73
26.10.2015, 08:31 21
Цитата Сообщение от ValeryS Посмотреть сообщение
char tmp[3];
ой не заметил , но главное смысл передать.

Добавлено через 2 часа 4 минуты
Цитата Сообщение от paskal Посмотреть сообщение
Вопрос такой, почему я не могу проверять больше двух элементов
; ValeryS заметил что буфер на два элемента, поэтому больше проверить нельзя не увеличив буфер.
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
28.10.2015, 09:33 22
Вот рабочий код для AtMega8,16 и др.
Немного надо будет лишнего убрать но принцип понятен

Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#define F_CPU 8000000UL
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
 
// Usart makros of speed
#define USORT_BAUD                  9600
#define UBRR_VAL                    F_CPU / 16 / USORT_BAUD - 1
 
// USORT Receiver buffer
#define DATA_REGISTER_EMPTY         ( 1 << UDRE )
#define RX_COMPLETE                 ( 1 << RXC )
#define FRAMING_ERROR               ( 1 << FE )
 
//#define PARITY_ERROR              ( 1 << UPE )
#define DATA_OVERRUN                ( 1 << DOR )
#define RX_ADDRESS_SIZE             4
#define RX_DATA_SIZE                16
#define RX_BUFFER_SIZE              1 + RX_ADDRESS_SIZE + RX_DATA_SIZE + 1
#define USORT_STARTPACKET           0x0A
#define USORT_STOPPACKET            0x0B
// This flag is set on USORT Receiver buffer overflow
unsigned char ex_rx_index;
char ex_rx_buffer_adr[RX_ADDRESS_SIZE];
char ex_rx_buffer_cmd;
char ex_rx_buffer_dat[RX_DATA_SIZE];
bool ex_rx_buffer_overflow = false;
bool ex_rx_enable = false;
bool ex_rx_data_complite = false;
 
void UART_Init (unsigned int speed)
{
    // Устанавливаем скорость Baud Rate
    UBRRH = (unsigned char)( speed >> 8 );
    UBRRL = (unsigned char) speed;
    UCSRA = 0x00;
    
    // Hазрешение работы передатчика
    UCSRB = ( 1 << TXEN ) | ( 1 << RXEN ) | (1 << RXCIE ) | (1 << TXCIE );
    
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    _delay_ms(50);
}
 
// Send to UART
void UART_Send_Char (char data_tx)
{
    while ( !( UCSRA & (1<<5)) ) {}
    UDR = data_tx;
}
 
// Send to UART
void UART_SendString (char data_tx[])
{
    int i;
    int len;
    len = strlen( data_tx );
    for (i=0; i < len; i++) {
        UART_Send_Char(data_tx[i]);
    }
}
 
void USORT_SendPacket(char rx_device_mac[4], char rx_buffer_cmd, char rx_buffer_dat[RX_DATA_SIZE])
{
    char tmp_tx_data[RX_BUFFER_SIZE];
    sprintf(tmp_tx_data, "%c%c%c%c%c%c%s%c",    USORT_STARTPACKET,
                                                rx_device_mac[0],
                                                rx_device_mac[1],
                                                rx_device_mac[2],
                                                rx_device_mac[3],
                                                rx_buffer_cmd,
                                                rx_buffer_dat,
                                                USORT_STOPPACKET);
    UART_SendString(tmp_tx_data);
}
 
ISR(USORT_RXC_vect)
{
    char status, data;
    unsigned char sub_rx_index;
    status = UCSRA;
    data = UDR;
    if ((status & (FRAMING_ERROR /*| PARITY_ERROR */| DATA_OVERRUN))==0)
    {
 
        if (data == USORT_STARTPACKET)
        {
            memset(ex_rx_buffer_adr, 0, sizeof(ex_rx_buffer_adr));
            ex_rx_buffer_cmd = 0;
            memset(ex_rx_buffer_dat, 0, sizeof(ex_rx_buffer_dat));
            ex_rx_index=0;
            ex_rx_enable = true;
            ex_rx_data_complite = false;
            
        }
        
        if ( (data == USORT_STOPPACKET) && (ex_rx_enable == 1) )
        {
            ex_rx_enable = 0;
            ex_rx_data_complite = true;
        }
        
        if (ex_rx_enable == 1)
        {
            if ( (ex_rx_index >= 0) && (ex_rx_index <= 4) )
            {
                ex_rx_buffer_adr[ex_rx_index] = data;
                if (ex_rx_index == 4)
                {
                    if ( !strcat(ex_rx_buffer_adr, DEVICE_MAC) )
                    {
                        ex_rx_enable = 0;
                        ex_rx_data_complite = false;
                    }
                }
                ++ex_rx_index;
            } else if (ex_rx_index == 5)
            {
                ex_rx_buffer_cmd = data;
                ++ex_rx_index;
            } else if (ex_rx_index > 5)
            {
                sub_rx_index = ex_rx_index - 6;
                ex_rx_buffer_dat[sub_rx_index] = data;
                ++ex_rx_index;
            }
 
            if (ex_rx_index >= RX_BUFFER_SIZE)
            {
                ex_rx_enable = false;
                ex_rx_buffer_overflow=1;
            }
            
        }
        
    }
}
 
void ExchangeUART(char rx_buffer_cmd, char rx_buffer_dat[RX_DATA_SIZE])
{
LEDLAMP_ON(0);
    char tmp_rx_buffer[RX_DATA_SIZE];
    if (rx_buffer_cmd == 0xA2) // Активация устройства
    {
 
        memset(tmp_rx_buffer, 0, sizeof(tmp_rx_buffer));
        sprintf(tmp_rx_buffer, "%s", "GOOD!!!");
        
        //USORT_SendPacket(DEVICE_MAC, 0xA2, tmp_rx_buffer);
    }
}
 
int main(void)
{
    UART_Init(UBRR_VAL);
    
    DDRC |= ( 1 << PC0);
    
    char rx_device_mac[4] = {0x01, 0x01, 0x01, 0x01};
    
    sei();
    
    while(1)
    {
        _delay_ms(1500);
        memset(ex_rx_buffer_dat, 0, sizeof(ex_rx_buffer_dat));
        
        
        USORT_SendPacket(rx_device_mac, 0xA1, ex_rx_buffer_dat);
        _delay_ms(15);
        if (ex_rx_data_complite)
        {
            ex_rx_data_complite = false;
            ExchangeUART(ex_rx_buffer_cmd, ex_rx_buffer_dat);
        }
    }
}


тут еще добавлен некий простенький протокол.
Пакет данных содержит следующую информацию:
Стартовый байт (1 байт)|Идентификатор устройства, которому адресовано (4 байта)|Байт команды (1 байт)|Данные (до 16 байт)|Стоп байт (1 байт)

Идентификатор устройства, которому адресовано - мне нужно было для RS485

Добавлено через 6 минут
Здесь полностью код и пример проекта в Proteus
Убираете обработку rs485 и микрухи MAX и будет счастье
1
28.10.2015, 09:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2015, 09:33

Использование таймера в ATTiny 2313
#include &lt;avr/io.h&gt; #include &lt;avr/interrupt.h&gt; unsigned char rab; ISR(TIMER1_COMPA_vect) { ...

Attiny 2313 замерзает внутренний тактовый
Объект: Attiny 2313 20SU. Имеются несколько одинаковых девайсов, заточенных на внутренний такт, 8...

Attiny 2313 простая задачка с индикацией
Задача состоит вот в чем: На основе микроконтроллера Atmel Atiny2313 необходимо разработать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru