attiny13 UART

Тема в разделе "Микроконтроллеры AVR", создана пользователем ELITE, 14 июн 2018.

  1. ELITE

    ELITE Гик

    в общем надо передавать-принимать данные, данных мало и в целом скорость не важна

    нашел вроде как совсем легкую библиотечку http://www.pvsm.ru/pesochnitsa/102967

    ну и пробую из темы пример сразу

    но вот IDE не хочет её в тиньку писать - ошибки
    что я делаю не так?....
     
  2. Airbus

    Airbus Оракул

    Не тот чип взяли.Бросьте Каку.
     
    ostrov нравится это.
  3. ostrov

    ostrov Гуру

    Хотя бы 85 возьмите. Цена та же, размер тот же, памяти дофига.
     
  4. Airbus

    Airbus Оракул

    Делал програмные UART для Т13 и на Ассемблере и на Си.Поэтому не вижу смысла в глючащем занимающем половину флэша UART е у которого скорость будет плавать.Лучше Т2313 или 4313 хотя тоже Кака
     
  5. parovoZZ

    parovoZZ Гуру

    18+
    Если уж так хочется поюююбаться, то возьми 24/44/84. Ножек поболее, чем в 13, но меньше, чем в 2313/4313. Стоимость 24А где-то посередине. На борту отличный траходром - USI. В этот USI я уже вставил свой 32-х байтный SPI по самую раму. Тактируется либо внутренним калиброванным 8МГц или внешним до 20 МГц.
     
  6. ELITE

    ELITE Гик

    ну а всёже в 13 почему у автора лезет уарт, у меня нет....да и кроме уарт мне больше ничего не надо по сути - так что остающиеся 50% памяти мне вполне хватит
     
  7. Igor68

    Igor68 Гуру

    А что с подключением заголовочных файлов типа:
    Код (C++):
    #include "uart13.h"
    Ведь ни одна функция не доступна.
    И (отрывок из uart13.h)смущает:
    Код (C++):
    void uart_init();
    void uart_send(uint8_t tb);
    int16_t uart_recieve(uint8_t* rb);
    Потому как для других вызовов (из других файлов Си) сам применяю:
    Код (C++):
    extern void uart_init();
    extern void uart_send(uint8_t tb);
    extern int16_t uart_recieve(uint8_t* rb);
    А ещё можно в самом заголовочном, при этом файл Си уже ни к чему, через __inline. Что-то типа:
    Код (C++):
    __inline int16_t uart_recieve(uint8_t* rb)
    {
        if(rxbitcount < 0x09)    // Если счетчик бит на прием меньше 9
        {
            while(rxbitcount);    // Ждем пока завершится текущий прием
            *rb = rxbyte;        // Пишем по адресу указателя принятый байт
            rxbitcount = 0x09;    // Восстанавливаем значение счетчика бит
            return (*rb);        // Возвращаемся
        }
        else
        {
            return (-1);        // Иначе возвращаем -1 (принимать нечего)
        }
    }
    Но при этом переменные объявить в теле своего файла.
    ...а вообще правильнее читать смысл сообщений компилятора... ну и книги.
     
  8. ELITE

    ELITE Гик

    библиотеку подключил, и ошибок библиотек IDE нет
     
  9. ELITE

    ELITE Гик

    в общем нафик стер всё , подумал, пошугал код и вот что вышло
    Код (C++):
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>

    volatile uint8_t uart;
    uint8_t temp;
    volatile uint8_t count;
    volatile uint8_t start;
    volatile uint8_t c;
    volatile uint8_t uart_data;
    volatile uint8_t Rece_bit;
    volatile uint8_t rec;
    volatile uint8_t usart_r;
    volatile uint8_t coef;

    ISR(INT0_vect){
                    rec=1;} // Прерывание чисто для определения стартового бита при приеме,
                            // используется редко, можно сюда повесить что-либо еще

    ISR(TIM0_COMPA_vect){
            TIMSK0=0x00;
            TCCR0B=0x00;   // Единственный Таймер, используется для формирования четких промежуток
            OCR0A=0;       // между битами, как при приеме так и при передачи
            c=1;          
            TCNT0=0;
            TIMSK0=0x04;
            TCCR0B=0x02;
                          // Значение "сброс при совпадении" загружается каждый раз из переменной
    OCR0A=coef;      // Можно быстро менять скорости UART
            Rece_bit=1;
    }

    int lov (uint8_t data2) {
            if (count>=8){
            PORTB|=(1<<4); start=0; temp=0; c=0; count=0;
            TIMSK0=0; TCCR0B=0; OCR0A=0;goto nah;}
           
            if(c==1){
                    if (start==0){temp=0x80; start=1;
                    count--; goto razvet;
            }
            temp=data2;
            temp=temp>>count;
            temp=temp<<7;
            razvet:
            switch(temp){
                    case 0x80 : PORTB&=~(1<<4);  break;
                    case 0x00 : PORTB|=(1<<4);   break;
            }
            count++; c=0;
       }
    nah:;
    }      

    int UART_trans(uint8_t data){
            uint8_t f;    
            data=~data;    
            coef=115;
            TIMSK0=0x04;
            TCCR0B=0x02;
            for(f=0;f<10;f++){
                    while(c==0);
                    lov(data);
            }
            start=0; temp=0; c=0; count=0;
            TIMSK0=0; TCCR0B=0; OCR0A=0;
            coef=0;
    }

    int UART_receiv(void){
            uint8_t a;
            usart_r=0;
           
            MCUCR=0x02; // INT0 Interrupt
            GIMSK=0x40; // INT0 Interrupt
           
            while(rec==0); // Ждать, пока не случится стартовый бит
            MCUCR=0; // INT0 Interrupt
            GIMSK=0; // INT0 Interrupt
            coef=115;
            TIMSK0=0x04;
            TCCR0B=0x02;
            rec=0;
            TCNT0=0xDC;
            for(a=0; a<9; a++){
                    while(Rece_bit==0);

                    if(bit_is_set(PINB,1)){usart_r |=(1<<7);} else {usart_r &=~(1<<7);}
                    usart_r=usart_r>>1;
                    Rece_bit=0;
                }
    }

    int main(void)
    {
            DDRB&=~(1<<1); //
            DDRB|=(1<<4);  //
                   
       asm("sei");  
            while(1)
        {      
               UART_receiv(); // Сперва принимаем байт
               _delay_ms(10);  // Пауза для наглядности
               UART_trans(usart_r);  // Отправляем обратно
            }
    }
    ну да, работает только по 1 байту, но мне достаточно этого

    и в остатке еще 50% памяти и 50 байт озу
     
  10. ostrov

    ostrov Гуру

    И не забывайте, что внутренний резонатор у МК так себе, если нет внешнего кварца скорость будет нестабильной, для UART это важно. У меня вообще один из 5 МК нуждался в подводке, сразу не коннектился.
     
  11. Airbus

    Airbus Оракул

    А у меня работал как термодатчик.Можно было просто на него дунуть и пошли кракозяблы.Впрочем кажется на Ютубе было подобное видео.
     
  12. Igor68

    Igor68 Гуру

    Не могу не согласиться с этим:
    и этим:
    ...но есть предположение, что автору нужна очень низкая скорость и только для одного байта в передаче/приёме...
    ...ну или ему доплачивают при приобретении именно этих МК.
     
  13. parovoZZ

    parovoZZ Гуру

    да какая разница. Если джиттер слишком высок, то скорость не важна.
     
  14. ostrov

    ostrov Гуру

    Если один байт, то можно и без UART. Придумать свою систему передачи.
     
  15. SergeiL

    SergeiL Гуру

    Несколько диммеров на Tiny85 с софтсериал и внутренним генератором 16MHz прекрасно работают с ESP на 38400.
    Линия, правда, короткая, пару сантиметров, информации передается мало, за раз, до 5 байт.
    Честно говоря, сбоев пока не замечал.
     
  16. ELITE

    ELITE Гик

    в общем я понял, что мне не дано быть хорошим программистом.... вроде бы простая задача, а сделать никак не могу :( если на атмеге ресурсов много и мои грабли на неё я еще могу запихать, то на тиньке этого не выходит никак :(
    --------
    поэтому прошу помощи в написании кода
    в целом самая простая задача
    одна тинька имеет 2 кнопки и выход на передатчик

    вторая тинька имеет приемник и 1 выход (на светодиод) и в зависимости от того, каккая команда (из 2х) пришла - надо им вымигивать ответ (ну это уже не проблема, нучное число миганий сделать у меня получается)

    если это можно запихать в одну тиньку так, чтобы работала параллельно будет отлично

    ни сна ни экономии энергии не надо...
     
  17. ostrov

    ostrov Гуру

    Зачем UART тут я не понял?
     
  18. Airbus

    Airbus Оракул

  19. ELITE

    ELITE Гик

    да я гугл уже страниц на 200 перелистал, но кроме готовых прошивок ничего толкового не нашел....
    или всё что есть попросту не для тиньки13...

    и код из ссылки тоже минимум атмена 328 надо... на которую и так куча библиотек готовых
     
  20. ostrov

    ostrov Гуру

    В чем смысл страданий на 13? На спор что ли? Я про 85 сказал в самом начале, что заставляет ее избегать?