uart на си

Тема в разделе "AVR", создана пользователем timsoon, 27 ноя 2015.

  1. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Продолжаю работу по ознакомлению с периферией микроконтроллеров avr.
    В настоящий момент осваиваю уарт. Со стороны пк использую терминальную программу и свою программу. Обмен осуществляется по исходникам из интернета, но непонятно почему на выводящем порту B всегда выдаются единицы на 4 и 5-ом пинах. прошу помощи.
    Код:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    //макросы вычисления скорости
    #define BAUD 2400
    #define UBRR_VAL F_CPU/16/BAUD-1
    
    void usart_init(unsigned int speed)
    {
        // устанавливаем скорость Baud Rate: 2400
        UBRRH=(unsigned char)(speed>>8);
        UBRRL=(unsigned char) speed;
        UCSRA=0x00;
        UCSRB|=(1<<RXEN)|(1<<TXEN);
        UCSRB|=(1<<RXCIE);// Разрешение прерываний по приему
        // Установка формата посылки: 8 бит данных, 1 стоп-бит
        UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    int t;
    //выводим принятый байт на порт
    ISR ( USART_RXC_vect)
    { t=UDR;
        PORTB = t;
    //UDR =PORTB;
    }
    
    int main(void)
    {
        DDRB=0xFF;
        DDRD|=1<<PD1;
        usart_init (UBRR_VAL);//инициализация модуля
        sei();
        while(1);
    }

    Вложения:

     
    : uart, avr
  2. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.591
    Симпатии:
    357
    Адрес:
    Алматы
    А почему int t; логичнее было бы взять unsigned char, принимаете же только один байт.
  3. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Если из-за этого некоректный вывод на порт , надо задуматься.
    Просто вдальнейшем думаю выводить 32 битные числа через каскад сдвиговых регистров. Как думаете из-за этого на порту два пина всегда в лог 1.
    --- Сообщения объединены, 29 ноя 2015 ---
    Позже в протеусе погоняю.
  4. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.591
    Симпатии:
    357
    Адрес:
    Алматы
    Трудно сказать, нужно отлаживать по шагам и смотреть что приходит и в каком состоянии пины
  5. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Ок копаем дальше,...
  6. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13
    Не совсем понятно что значит "всегда выдаются". Сразу после старт? Нужно наверное проинициализировать порт B полностью.
    Если после приема байта. Мы не знаем чего вы там посылаете в порт :)
    Да и программатор то отключаете?
    Последнее редактирование: 30 ноя 2015
  7. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    В коде все есть . Полная инициализация порта. Переменная t в нее записывается принятый байт и он же выводится в порт. Программатор не подключается к устройству. Вне зависимости от принятого байта - два пина на порту вывода всегда в лог.1.
  8. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Пока рассматриваю другой вариант с использованием уарт. Там все работает как надо, но сам принцип мне не очень нравится.
  9. Alex

    Alex В доску свой

    Сообщения:
    191
    Симпатии:
    13
    Полная инициализация порта подразумевает после переключения порта на вывод, установку выводов порта в нужное исходное состояние. Мало ли чего у Вас там на порту навешено. И конфигурацию периферии использующей тот же порт. Тогда можно быть уверенным что все будет работать как надо. Возможно в Вашем случае это не обязательно. Но Вы схемы не приложили, что за контроллер используете не сказали.
    Еще и зачем то бинарник приложили :) Куда его?
    Еще на фузы обратите внимание. Может у Вас тактовый не правильно настроен. Да и UART легко проверить эхом.
  10. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Блин. Наконецто дошло. Я отправлял символ "1" а не число 1 . Поэтому на порт выводилось 00110001 ,а не 00000001. Согласно этой таблицы https://www.google.kz/search?client...l=ru-KZ&q=цифра 1 ascii&imgrc=Jpmg0GozpAZJfM:
    --- Сообщения объединены, 4 дек 2015 ---
    Хотел уже бросить и искать другие пути.
    Хорошо один электронщик подсказал. Братство электронщиков существует.☺
  11. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Спасибо всем за помощь.
  12. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    ха .
    теперь не могу разобраться с приемом от мк.
    приходят не те символы , но их количество совпадает с отправленными.
    думаю проблема в тактировании или подтяжку линий может надо делать,кто знает?
    Код:
    /*
    * stusart.c
    *
    * Created: 27.12.2015 18:46:04
    *  Author: timsoon
    */
    
    
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #define  DATA1  2  // Подключаем к порту PA0 ножку данных сдвигового регистра
    #define  CLK1   4  // Подключаем к порту PA1 ножку тактовых импульсов сдвигового регистра
    #define  Latch1 3  // Подключаем к порту PA2 ножку защёлки сдвигового регистра
    unsigned char StatusKey=0;
    
    
    void pause (unsigned int a){
        unsigned int j;
        for (j=a;j>0;j--); // Пустой цикл
    
    }
    
    
    
    /***************** каскад №1. 74hc595 ****************/
    void  send_data1 (long int data1){
        unsigned char j;
        for (j=0;j<32;j++){
            if (( data1&0x80000000)==0x00) PORTD&=~_BV(DATA1); //Выставляем данные на PD0
            else PORTD|=_BV(DATA1);
            asm("nop");
            PORTD|=_BV(CLK1); //Импульс на 1CLK
            asm("nop");
            PORTD&=~_BV(CLK1);
            asm("nop");
            data1=(data1<<1);
        }
      
        PORTD|=_BV(Latch1); // Импульс на Latch
        asm("nop");
        PORTD&=~_BV(Latch1);
    }
    
    // Использовать вот так: send_data (0x12345678); */
    
    
    
    void send_Uart(unsigned char c)//   Отправка байта
    {
        while(!(UCSRA&(1<<UDRE)))    //  Устанавливается, когда регистр свободен
    {}
        UDR = c;
    }
    
    
    
    
    void send_Uart_str(unsigned char *s)//  Отправка строки
    {
        while (*s != 0) send_Uart(*s++);
    }
    
    
    void send_int_Uart(unsigned int c)//    Отправка числа от 0000 до 9999
    {
        unsigned char temp;
        c=c%10000;
        temp=c/100;
        send_Uart(temp/10+'0');
        send_Uart(temp%10+'0');
        temp=c%100;;
        send_Uart(temp/10+'0');
        send_Uart(temp%10+'0');
    }
    
    
    
    
    
    
    
    
    
    int i;
    int lng;
    int mystr=0b00110000;  //[]="ssssssssss";
    char rc;
    int inf;
    
    
    void glavnaprohod()
    {
        send_data1 (20973570);
    inf=0b00111100;
    UDR=mystr;
    _delay_ms (2000);
    
    }
    
    void bokovoynaprohod()
    {
        send_data1 (41959433);
        _delay_ms (1000);
        send_data1 (41959432);
        _delay_ms (1000);
    }
    
    void glavsostan()
    {
        send_data1 (25169928);
      
    }
    
    void bokovoysostan()
    {
        send_data1 (41947145);
    }
    
    void priglasit()
    {
        send_data1 (20);
    }
    void sbokovoy()
    {
        send_data1 (33570816);
    }
    
    void sglavnoy()
    {
        send_data1 (16779264);
    }
    
    void tak()
    {
        send_data1 (31);
    }
    
    
    
    
    
    
    void initUART()
    {
        UCSRB|=(1<<3)|(1<<4);
        UBRRH=0x00;
        UBRRL=0x19;
    UCSRC=0b10000110;
    UCSRA=0b00000000;
    
    
    }
    
    void main(void)
    
    {   PORTD=0x3;
        DDRD=0xFC;
        send_data1 (0b11111111111111111111111111111111);
        _delay_ms (1000);
        send_data1 (0b01010101010101010101010101010100);
        _delay_ms (1000);
        initUART();
      
        send_int_Uart(2013);   /////вместо этого приходит 4  символа
       
    
    
    
    
    
    
    
    while (1)
    {
        if ((UCSRA & (1<<7)))
        {
            rc=UDR;
        }
    
        switch (rc)
        {
            case '1': glavnaprohod(); break;
            case '2': bokovoynaprohod(); break;
            case '3': glavsostan(); break;
            case '4': bokovoysostan(); break;
            case '5': priglasit(); break;
            case '6': sbokovoy(); break;
            case '7': sglavnoy(); break;
            case '11': tak(); break;
          
          
        }
    
    }
    
    }
  13. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    Может включено удвоение скорости? Глянь настройки. У меня было подобное. Настройки для наглядности лучше не писать в 16 ричном виде, а писать в виде регистров. Так проще разбираться.
  14. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    чета походу в max232 с распиновкой попутал.
  15. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.591
    Симпатии:
    357
    Адрес:
    Алматы
    Проблема скорее всего в том, что переменной типа char присваивается значение int c, т.е. числовой код некоего символа, поэтому приходит не число, а именно символ - какая-то закорючка. Попробуй что-то такое temp = (unsigned char)(c/100);
  16. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    Надо глянуть.
  17. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    выкинул погоревший max232 ,который стоял у меня для согласования.
    все согласование переделал на транзисторах.
    теперь вроде работает, но только на скорости 2400 бод.

    вот фото уст-во состоит из модулей: стабилизатор 5в и 12 в, основная с мк, каскад четыре 74hc595 с uln2003, плата управления моторами( вперед и реверс), плата с полевиками и плата согласования rs232 c uart мк.








    20160103_225924.jpg
    --- Сообщения объединены, 3 янв 2016 ---
    ну и видео впридачу
    koteika и .ctor нравится это.
  18. .ctor

    .ctor В доску свой

    Сообщения:
    720
    Симпатии:
    209
    Род занятий:
    парогенератор
    Адрес:
    Алматы
    Производители текстолита Пляшут от счастья))
  19. timsoon

    timsoon В доску свой

    Сообщения:
    378
    Симпатии:
    46
    Род занятий:
    КИПиА, it, и прочее
    Адрес:
    г.Капчагай
    блин не говорите.
    Но это оптимальные размеры - подгонял, чтоб хоть одна сторона была одинакова. Тем более прототип - частая замена деталей на аналоги с др параметрами.
    А не знаете где в Алматы подешевле брать?
  20. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.503
    Симпатии:
    376
    Адрес:
    Талгар
    ты всё железную дорогу свою ковыряешь до сих пор ? :eek:

Поделиться этой страницей