в общем надо передавать-принимать данные, данных мало и в целом скорость не важна нашел вроде как совсем легкую библиотечку http://www.pvsm.ru/pesochnitsa/102967 ну и пробую из темы пример сразу но вот IDE не хочет её в тиньку писать - ошибки что я делаю не так?....
Делал програмные UART для Т13 и на Ассемблере и на Си.Поэтому не вижу смысла в глючащем занимающем половину флэша UART е у которого скорость будет плавать.Лучше Т2313 или 4313 хотя тоже Кака
18+ Если уж так хочется поюююбаться, то возьми 24/44/84. Ножек поболее, чем в 13, но меньше, чем в 2313/4313. Стоимость 24А где-то посередине. На борту отличный траходром - USI. В этот USI я уже вставил свой 32-х байтный SPI по самую раму. Тактируется либо внутренним калиброванным 8МГц или внешним до 20 МГц.
ну а всёже в 13 почему у автора лезет уарт, у меня нет....да и кроме уарт мне больше ничего не надо по сути - так что остающиеся 50% памяти мне вполне хватит
А что с подключением заголовочных файлов типа: Код (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 (принимать нечего) } } Но при этом переменные объявить в теле своего файла. ...а вообще правильнее читать смысл сообщений компилятора... ну и книги.
в общем нафик стер всё , подумал, пошугал код и вот что вышло Код (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 байт озу
И не забывайте, что внутренний резонатор у МК так себе, если нет внешнего кварца скорость будет нестабильной, для UART это важно. У меня вообще один из 5 МК нуждался в подводке, сразу не коннектился.
А у меня работал как термодатчик.Можно было просто на него дунуть и пошли кракозяблы.Впрочем кажется на Ютубе было подобное видео.
Не могу не согласиться с этим: и этим: ...но есть предположение, что автору нужна очень низкая скорость и только для одного байта в передаче/приёме... ...ну или ему доплачивают при приобретении именно этих МК.
Несколько диммеров на Tiny85 с софтсериал и внутренним генератором 16MHz прекрасно работают с ESP на 38400. Линия, правда, короткая, пару сантиметров, информации передается мало, за раз, до 5 байт. Честно говоря, сбоев пока не замечал.
в общем я понял, что мне не дано быть хорошим программистом.... вроде бы простая задача, а сделать никак не могу если на атмеге ресурсов много и мои грабли на неё я еще могу запихать, то на тиньке этого не выходит никак -------- поэтому прошу помощи в написании кода в целом самая простая задача одна тинька имеет 2 кнопки и выход на передатчик вторая тинька имеет приемник и 1 выход (на светодиод) и в зависимости от того, каккая команда (из 2х) пришла - надо им вымигивать ответ (ну это уже не проблема, нучное число миганий сделать у меня получается) если это можно запихать в одну тиньку так, чтобы работала параллельно будет отлично ни сна ни экономии энергии не надо...
да я гугл уже страниц на 200 перелистал, но кроме готовых прошивок ничего толкового не нашел.... или всё что есть попросту не для тиньки13... и код из ссылки тоже минимум атмена 328 надо... на которую и так куча библиотек готовых
В чем смысл страданий на 13? На спор что ли? Я про 85 сказал в самом начале, что заставляет ее избегать?