как увидеть показания с аналогового датчика на attiny13
- Войдите на сайт для отправки комментариев
Чт, 10/09/2015 - 10:21
Подскажите, как можно увидеть показания, снятые с аналог. входа тини13, сериал принт - не поддерживается, как тогда быть? Скетч, например такой:
void setup() {
pinMode(3, OUTPUT);
}
int sensorValue = analogRead(2);
void loop() {
sensorValue = analogRead(2);
if (sensorValue >= 887 && sensorValue <= 888) {
digitalWrite(3, HIGH) ;
delay(1000);
digitalWrite(3, LOW) ;
delay(1000);
}
else {
digitalWrite(3, LOW);
}
}
Если скорость опроса аналогового входа не критична, то можно считанные данные отправлять в функцию имитирующую работу UART. Далее преобразователь UART -> USB и программа "монитор".
как это осуществить программно , знаний, к сожалению пока не хватает(
Странный вопрос, а как надо-то? Вариантов-то миллион - можно семисегментный индикатор присобачить, можно по смс послать, можно сделать web-страницу и смотреть её браузером. Чего надо-то?
romiras, что-то мне подсказывает, что долго вы будете ждать выполнение вашего условия if (sensorvalue....
как увидеть результат на пк напрямую, через usb кабель
Почему, если не секрет?)
romiras, ну как, условие сработает только при значениях 887 или 888.
это было накидано просто для примера, цифры из головы
Можно ли по spi подключить lcd 1602 к attiny? если да, тогда проблема решена
https://www.google.ru/search?q=attiny13+serial+communication+arduino&new...
Ну дак это хороший повод поднабраться знаний. Изучите протокол UART, задайтесь конкретной скоростью, например 9600. С помощью функций delay научитесь передавать какой либо символ. Пока это научитесь делать, поймёте работу UART углублённо. Затем немного модифицируете программу и будете передавать уже нужные Вам символы. Не думаю, что с это очень сложная задача. Было бы достаточная мотивация.
будем разбираться
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=1...
Посмотри тут. Attiny и LCD http://rfanat.ru/s21/avr-atyny13-voltm.html
То что надо! Спасибо!
https://habr.com/ru/post/251141/
#define F_CPU 9600000 #include <avr/io.h> #include <util/delay.h> #define SOFT_TX_PIN (1<<PB1) // PB1 будет работать как TXD #define SOFT_TX_PORT PORTB #define SOFT_TX_DDR DDRB int helloHabr = 0; int main (void) { uart_tx_init (); // инициализация прог. UARTа while (1) { helloHabr++; uart_print("Hello Habr, I'm ATtiny13 "); // превед num_to_str(helloHabr, 4); // 0..9999 т.к. только 4 числа можно вывести uart_print(" counds"); uart_print("\r\n"); // переход на новую строчку _delay_ms(1000); } return 0; } void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00; // prescaler 1 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 75; //115200 baudrate at prescaler 1 } // Функция вывода содержимого переменной void num_to_str(unsigned int value, unsigned char nDigit) { switch (nDigit) { case 4: uart_send_byte((value / 1000) + '0'); case 3: uart_send_byte(((value / 100) % 10) + '0'); case 2: uart_send_byte(((value / 10) % 10) + '0'); case 1: uart_send_byte((value % 10) + '0'); } } void uart_print(char *str) { byte i = 0; while (str[i]) { uart_send_byte(str[i++]); } } //bitbanged UART transmit byte void uart_send_byte (unsigned char data) { unsigned char i; TCCR0B = 0; TCNT0 = 0; TIFR0 |= 1 << OCF0A; TCCR0B |= (1 << CS00); TIFR0 |= 1 << OCF0A; SOFT_TX_PORT &= ~SOFT_TX_PIN; while (!(TIFR0 & (1 << OCF0A))); TIFR0 |= 1 << OCF0A; for (i = 0; i < 8; i++) { if (data & 1) SOFT_TX_PORT |= SOFT_TX_PIN; else SOFT_TX_PORT &= ~SOFT_TX_PIN; data >>= 1; while (!(TIFR0 & (1 << OCF0A))); TIFR0 |= 1 << OCF0A; } SOFT_TX_PORT |= SOFT_TX_PIN; while (!(TIFR0 & (1 << OCF0A))); TIFR0 |= 1 << OCF0A; }OCR0A = 75; //115200 baudrate at prescaler 1
Как сделать скорость 9600 ? В протеусе не поддерживается скорость 115200
Очевидно увеличить значение в столько раз, в сколько 115200 отличается от 9600 .
Такой ответ устроит ?
Вряд ли.
Потому как 75*12=900
Что совсем чуть чуть не влазит в 1 байт.
Ну значит нужно пересчитать значение с другим прескалером.
Ну и не забыть его выставить
Кстати, странное значение 75.
Оно под эту частоту и скорость вроде как и не подходит
Там зависимость от частоты тактирования и предделителя. Тактовая указана как 9.6МГц
в смысле? у него регистр не 16 битный разве? и сам отвечу - 8 битный, стр.80 даташита
тогда видимо так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 || 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }На 57600
На остальных скоростях иероглифы
Калькулятор говорит:
Прескалер 8
OCRx 124
а делители как выставили?
а если прескалер на 64?
Что мне сделать?)
Что мне сделать?)
покажите настройки порта
В протеусе? Я в протеусе пробую.
#21 картинки
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 || 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }В протеусе? Я в протеусе пробую.
#21 картинки
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 || 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }и получилось 57600?
Получается, да
Получается, да
странно! очень странно! вот этот лживый С )))
а попробуйте сударыня по данным калькулятора от Кактуса
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS01; // prescaler 1 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 124; //115200 baudrate at prescaler 1 }Так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS01; // prescaler 1 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 124; //115200 baudrate at prescaler 1 }Так?
да
Работает
Где тут смайл в темных очках?))))
Большое спасибо))) А то бы делала семисегментные индикаторы на 595...
Большое спасибо))) А то бы делала семисегментные индикаторы на 595...
поинтересуюсь, для чего тини13?
Делаю резистивную клавиатуру, при нажатии на определённую кнопку, например 3, будет три звуковых сигнала и мигание лампоки, и т.п. Для детского творчества)
Вот и нужно было посмотреть что будет на входе при различных резисторах.
а если прескалер на 64?
То тогда OCRx=15, но реальная частота будет 9375.
А при прескалере 8 и OCRx=124 , ровно 9600
Калькулятор под андроид брал тут:
https://play.google.com/store/apps/details?id=ru.chipenable.avrcalculato...
Делаю резистивную клавиатуру, при нажатии на определённую кнопку, например 3, будет три звуковых сигнала и мигание лампоки, и т.п. Для детского творчества)
Вот и нужно было посмотреть что будет на входе при различных резисторах.
Делаю резистивную клавиатуру, при нажатии на определённую кнопку, например 3, будет три звуковых сигнала и мигание лампоки, и т.п. Для детского творчества)
Вот и нужно было посмотреть что будет на входе при различных резисторах.
Если привести считываемое значение к диапазону 0-99. То можно просто мигать светодиодом для считывания.
Например 67- мигаем 6 раз, пауза мигаем 7 раз. Затем - по новой
Что вы все в математике магию ищите, всегда же ей сами пользуетесь )))
Что вы все в математике магию ищите, всегда же ей сами пользуетесь )))
патамушта в природе нет десятичной арифметики, совсем нет )))
Что мне сделать?)
а вот так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 | 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }Что мне сделать?)
а вот так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 | 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }Написал же уже.
"Вот так" скорость будет 9375бод
Что мне сделать?)
а вот так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 | 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }ты не увидел мой косяк, было 57600... )))
ЗЫ это при 15, а я высчитал 14 )))
В протеусе? Я в протеусе пробую.
#21 картинки
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 || 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }ошибка в строке 4, разбор идёт справа на лево, установит делитель на 8, получит true и нулевой бит устанавливать не будет, ну а ниже мы умножили значением счетчика в 6 раз, итого получили делитель на 2, то-есть 57600 )))
Что мне сделать?)
а вот так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 | 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }ты не увидел мой косяк, было 57600... )))
ЗЫ это при 15, а я высчитал 14 )))
А прескалер 64 и OCRx 14 дадут 10000бод
Что мне сделать?)
а вот так?
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 | 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }ты не увидел мой косяк, было 57600... )))
ЗЫ это при 15, а я высчитал 14 )))
9300 тогда ближе, эта тема кстати озвучивалась, что при выборе стараться выбирать OCR максимально возможный
Чего ты пристал то к прескалеру 64 ?
Если с прескалером 8, частота именно та что нужна
не к прескалеру, а ошибке в выборе прескалера как такового (коду программы), одна лишняя палка, а каков результат )))
void uart_tx_init () { TCCR0A = 1 << WGM01; // compare mode TCCR0B = 1 << CS00 || 1 << CS01; // prescaler 64 SOFT_TX_PORT |= SOFT_TX_PIN; SOFT_TX_DDR |= SOFT_TX_PIN; OCR0A = 14; // 9600 //115200 baudrate at prescaler 1 }ошибка в строке 4, разбор идёт справа на лево, установит делитель на 8, получит true и нулевой бит устанавливать не будет
Нет, как раз только нулевой бит и установит. TCCR0B = 1;