Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 0
Регистрация: 09.05.2020
Сообщений: 5
1

Передача данных и команд с ПК на ATmega128, по интерфейсу RS-232

09.05.2020, 17:37. Просмотров 1460. Ответов 20
Метки нет (Все метки)

Здравствуйте, уважаемые программисты и конструкторы, мне нужно сделать так, чтобы температура с DS18B20 отобразилась на ПК при запросе с него(можно с клавиатуры просто 1 иди t набрать)(или стандарт Modbus). Совсем не смогла понять как будет код выглядеть и нужно ли ещё как то Usart подключать(в коде). C подключением вроде разобралась(прикрепила скрин из протеуса). Что нужно добавить в коде?
C
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
// ОСновная Функция main.c
#include "SchemeSpec.h"
 
void port_ini(void)
{
    DDRD=0xff;
    PORTD=0x00;
    DDRE=(1<<0)|(1<<1);
    PORTE=(0<<0)|(0<<1);
}
int main(void)
{
    unsigned int tt=0; //переменная для хранения температуры
    
    port_ini();
    LCD_ini();
    
    while(1)
    {
        wirecheck();
        tt = MKconvert(DSconvert()); //измеряем температуру
        position(0,1);
        str_lcd("T=");
        if (tt<=0x80) // t>0
        {
            if(tt>=0x64)
            {
                LCDsendchar(0x31);
                LCDsendchar((tt)/10+0x30-0xa);
                LCDsendchar((tt)%10+0x30);
            }
            else
            {
                LCDsendchar((tt)/10+0x30);
                LCDsendchar((tt)%10+0x30);
            }
        }
        else
        {
            str_lcd("-");// t<0
            LCDsendchar((~tt+1)/10-0x50);
            LCDsendchar((~tt+1)%10+0x30);
        }
        str_lcd("*");
        str_lcd("C");
        LCDsendchar(0x0);
    }
}
C
1
2
3
4
5
6
7
8
9
10
11
12
//Подключение библиотек и Спецификация устройства
#ifndef SchemeSpec_H_
#define SchemeSpec_H_
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include "LCDspec.h"
#include "DSspec.h"
#endif
C
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
//Отладка Термометра 
#include "DSspec.h"
 
char wirecheck(void)
{
    char stack=SREG;
    cli();
    char dt;
    DDRD |= (1<<1); //держим шину
    _delay_us(485);
    DDRD &= ~(1<<1); //отпускаем шину
    _delay_us(65);
    if ((PIND & (1<<1))==0)//проверяем подключено ли устройстово
    {
        dt=1;//устройство найдено
        position(0,0);
        str_lcd("Hello, Nice day");
    }
    else
    {
        dt=0;//устройства не найдено
        position(0,0);
        str_lcd("NO CONNECTION");
    }
    SREG=stack;
    _delay_us(480);
    return dt; //вернем результат
}
 
void DSsendbit(char bit)
{
    char stack=SREG;
    cli(); //запрещаем прерывание
    DDRD |= (1<<1); //держим шину
    _delay_us(2); //задержка (2мкс)
    if(bit)
    {
        DDRD &= ~(1<<1); //отпускаем шину
    }
    _delay_us(65); //задержка (60мкс)
    DDRD &= ~(1<<1); //отпускаем шину
    SREG=stack;
}
 
void DSsendbyte(unsigned char byte)
{
    char i;
    for(i=0;i<8;i++) //посылаем отдельно каждый бит на устройство
    {
        if((byte & (1<<i)) == 1<<i)
        {
            DSsendbit(1); //посылаем 1
        }
        else DSsendbit(0); //посылаем 0
    }
}
 
char DSreadbit(void)
{
    char stack=SREG;
    cli(); //запрещаем прерывание
    char bit; //хранения бита
    DDRD |= (1<<1); //притягиваем шину
    _delay_us(2); // задержка (2 мкс)
    DDRD &= ~(1<<1); //отпускаем шину
    _delay_us(13); // 15 мкс должно получиться суммарно, т.к. 2 мкс мы уже выждали
    bit = (PIND & (1<<1))>>1;
    _delay_us(45);
    SREG=stack;
    return bit; //вернем результат
}
 
unsigned char DSreadbyte(void)
{
    char c=0;
    char i;
    for(i=0;i<8;i++)
    {
        c|=DSreadbit()<<i; //читаем бит
    }
    return c;
}
 
int DSconvert(void)
{
    unsigned char byte;//для считывания байта
    unsigned int tt=0;
    if(wirecheck()==1)
    {
        DSsendbyte(SKIP_ROM); //пропуcкаем RОМ код
        DSsendbyte(T_CONVERT); //измеряем температуру
        _delay_ms(750); //в 12-битном режиме преобразования - 750 мс
        wirecheck();
        DSsendbyte(SKIP_ROM); //пропускаем ROM код
        DSsendbyte(READ_DATA); //даем команду на чтение данных с устройства
        byte = DSreadbyte(); //читаем младший бит LS
        tt = DSreadbyte(); //читаем старший бит MS
        tt = (tt<<8)|byte; //сдвигаем старший влево, младший пишем на его место,и получаем общий результат
    }
    return tt;
}
//преобразование температуры в десятичную систему счисления
char MKconvert(unsigned int tt)
{
    char t = tt>>4;//сдвиг и отсечение части старшего байта
    return t;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
//Связь термометра с МК
#ifndef DSSPEC_H_
#define DSSPEC_H_
 
#include "SchemeSpec.h"
 
#define SKIP_ROM 0xCC //пропустить ROM код
#define T_CONVERT  0x44 //измерить температуру
#define READ_DATA 0xBE //передать байты ведущему
 
int DSconvert(void); //функция преобразования показаний датчика в температуру
char MKconvert(unsigned int tt); //преобразование температуры в единицы
#endif
2
Миниатюры
Передача данных и команд с ПК на ATmega128, по интерфейсу RS-232  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2020, 17:37
Ответы с готовыми решениями:

Некорректный прием данных по UART интерфейсу на ATMega128
Контроллер: ATMega 128 Пишу в Visual Studio 2005 Создаю диалоговое MFC приложение Суть...

Передача команд SCPI по RS-232
Привет всем есть такая задачка нужно написать программу на (MFC)c++ для управления измерительными...

Как определить протокол обмена по интерфейсу RS-232?
Здравствуйте! Есть определенное устройство с блоком управления. К блоку управления через нуль...

Передача данных с PIC16 по RS-232
Добрый день! Требуется передать результат вычислений по RS-232C (о приеме ничего не сказано),...

20
ValeryS
22.05.2020, 20:17     Передача данных и команд с ПК на ATmega128, по интерфейсу RS-232
  #21
 Комментарий модератора 
прекратите
иначе тему прикрою
и всем раздам подарки
0
22.05.2020, 20:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2020, 20:17
Привет! Вот еще темы с ответами:

RS-232. Передача и прием данных
Подскажите пожалуйста. не опытному программисту в чем может быть проблема с этим кодом: вставляю в...

Передача данных с ATMega128 (советы начинающему)
Доброго времени суток. Есть микроконтроллер Atmega128. Есть задача написать программу его работы по...

Передача входных данных для CMD команд
Добрый день ! Столкнулся с такой бедой в консольном приложении : многие команды cmd дополнительные...

Передача 4-х байтного значения по RS-232
Доброго времени суток товарищи программеры. Вопрос по работе с rs232. Работаю в AVR Studio4. ...

C#. Передача массива СОМ интерфейсу принимающему ссылку
C#. Передача массива СОМ объекту принимающему ссылку. проблема вот в чем -- есть СОМ интерфейс...

Чтение данных с RS-232
Добрый день . Пишу программу для тестирования устройств подключенных через rs-232 . В ходе...


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

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

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