Search the Community
Showing results for tags 'attiny85'.
-
Прошу помощи в реализации интерфейса I2C на Attiny85 в режиме ведомого. Проблема в следующем: При срабатывании прерывания по переполнению счетчика, в регистре данных USIDR оказывается полученный байт сдвинутый влево. Код тестировал в Proteus. На скриншотах показана ячейка памяти 2F, которой соответствует регистр USIDR. На первом скриншоте отправляется 0x00, в USIDR оказывается 0x01; на втором скриншоте отправляется 0x01, в USIDR - 0x03. Думал проблема в симуляции, но нет. Тестировал в железе - то же самое. Заранее благодарю! Код: // Инициализация I2C интерфейса void i2c_init() { // Настройка интерфейса USI на режим TWI USICR |= (1<<USIWM0); USICR |= (1<<USIWM1); // Настройка интерфейса на источник тактирования USICR &= ~(1<<USICLK); USICR &= ~(1<<USICS0); USICR |= (1<<USICS1); // Выставление пинов интерфейса на вход // SDA DDRB &= ~(1<<0); PORTB &= ~(1<<0); // SCL DDRB &= ~(1<<2); PORTB &= ~(1<<2); // Включение прерывания по старту и очистка флага прерывания USICR |= (1<<USISIE); USISR |= (1<<USISIF); } // Прерывание по старту ISR(USI_START_vect){ while( (PINB & (1 << PIN_SCL)) && (!(PINB & (1 << PIN_SDA))) ); // Очистка регистра статуса USISR |= (1<<USISIF); // Включение прерывания по переполнению USICR |= (1<<USIOIE); } // Прерывание по переполнению счетчика ISR(USI_OVF_vect){ uint8_t i2c_byte = USIDR; *pwm_0 = 0; if (i2c_byte>=1){ *pwm_0 = 250; } if (i2c_byte==1){ *pwm_0 = 100; } USISR |= (1<<USIOIF); // Сброс флага прерывания по переполнению USISR = 0; // Сброс счетчика }
-
На примере GSM/GPRS Goouuu Tech IOT-GA6-B и ATtiny85. Программа «Звонилка». Программа на BASCOM-AVR. Источник https://178654.blogspot.com/p/uart.html
- 1 reply
-
- Uart
- BASCOM-AVR
-
(and 2 more)
Tagged with:
-
Есть ли жизнь на Марсе, нет ли её там - науке это не известно. Наука пока не в курсе дела. Есть ли жизнь в экосистеме AVR? Или эти мамонты уже вымерли, уступив более теплокровным ARM? По-моему, для неленивого энтузиаста экосистема AVR предоставляет еще множество возможностей. Не смотря на 8 бит и достаточно скромные характеристики, жизнь там не только существует, но и довольно эффектно развивается. На видео - небольшая (как кредитка) игрушечка, реализованная на attiny85... Напомню: всего 6 ног, 8К flash и 512 байт RAM. Вот так-то...
-
Всем привет. Решил сделать небольшую домашнюю метеостанцию. Есть приемник с экраном, куда выводится инфа (построено на ATMEGA 328P) и есть передатчик, который посылает инфу по возудху (построено на ATtiny85). В передатчике использую обычные DHT22. В принципе качество чуть ниже среднего. Но главный недостаток - порой сбоит, присылая данные в 2 раза больше предидущих, потом опять приходит в себя. и так повторяется постоянно. При этом время между измерениями не меньше 20 сек. В общем заказал я себе с Китаюшки более точные датчики - CJMCU-1080 HDC1080 Вещица прекрасная, но общается по I2C. А библиотеку рабочую под нее я смог найти только одну "ClosedCube_HDC1080.h" и никаких модификаций под ATtiny я найти не смог. Для ее работы соответственно нужен Wire.h В общем решил я его поковырять самостоятельно, хоть и не прогер. Забрался во внутренности ClosedCube_HDC1080.cpp и везде заменил Wire на TinyWireM (некий аналог Wire для ATtiny). И у меня даже получилось считывать валжность, но вот вместо температуры приходит гадость. Ибо при компиляции Arduino IDE ругалась на строку (я ее ниже в коде закомментировал) uint8_t buf[4]; for (int i = 1; i < (seconds*66); i++) { TinyWireM.beginTransmission(_address); TinyWireM.write(0x00); TinyWireM.endTransmission(); delay(20); TinyWireM.requestFrom(_address, (uint8_t)4); // TinyWireM.readBytes(buf, (size_t)4); } Ошибку пишет следующую: \ClosedCube_HDC1080.cpp: In member function 'void ClosedCube_HDC1080::heatUp(uint8_t)': \ClosedCube_HDC1080.cpp:81:13: error: 'class USI_TWI' has no member named 'readBytes' TinyWireM.readBytes(buf, (size_t)4); Может есть ребята более понимающие в коде и сумеющие победить эту проблему, чтобы и температуру этот датчик смог передавать через ATtiny85. Вот полный текст файла ClosedCube_HDC1080.cpp (уже замененный ну и строчка закоментирована): #include <TinyWireM.h> #include "ClosedCube_HDC1080.h" ClosedCube_HDC1080::ClosedCube_HDC1080() { } void ClosedCube_HDC1080::begin(uint8_t address) { _address = address; TinyWireM.begin(); // Heater off, 14 bit Temperature and Humidity Measurement Resolution TinyWireM.beginTransmission(_address); TinyWireM.write(CONFIGURATION); TinyWireM.write(0x0); TinyWireM.write(0x0); TinyWireM.endTransmission(); } HDC1080_Registers ClosedCube_HDC1080::readRegister() { HDC1080_Registers reg; reg.rawData = (readData(CONFIGURATION) >> 8); return reg; } void ClosedCube_HDC1080::writeRegister(HDC1080_Registers reg) { TinyWireM.beginTransmission(_address); TinyWireM.write(CONFIGURATION); TinyWireM.write(reg.rawData); TinyWireM.write(0x00); TinyWireM.endTransmission(); delay(10); } void ClosedCube_HDC1080::heatUp(uint8_t seconds) { HDC1080_Registers reg = readRegister(); reg.Heater = 1; reg.ModeOfAcquisition = 1; writeRegister(reg); uint8_t buf[4]; for (int i = 1; i < (seconds*66); i++) { TinyWireM.beginTransmission(_address); TinyWireM.write(0x00); TinyWireM.endTransmission(); delay(20); TinyWireM.requestFrom(_address, (uint8_t)4); // TinyWireM.readBytes(buf, (size_t)4); } reg.Heater = 0; reg.ModeOfAcquisition = 0; writeRegister(reg); } float ClosedCube_HDC1080::readT() { return readTemperature(); } float ClosedCube_HDC1080::readTemperature() { uint16_t rawT = readData(TEMPERATURE); return (rawT / pow(2, 16)) * 165 - 40; } float ClosedCube_HDC1080::readH() { return readHumidity(); } float ClosedCube_HDC1080::readHumidity() { uint16_t rawH = readData(HUMIDITY); return (rawH / pow(2, 16)) * 100; } uint16_t ClosedCube_HDC1080::readManufacturerId() { return readData(MANUFACTURER_ID); } uint16_t ClosedCube_HDC1080::readDeviceId() { return readData(DEVICE_ID); } uint16_t ClosedCube_HDC1080::readData(uint8_t pointer) { TinyWireM.beginTransmission(_address); TinyWireM.write(pointer); TinyWireM.endTransmission(); delay(9); TinyWireM.requestFrom(_address, (uint8_t)2); byte msb = TinyWireM.read(); byte lsb = TinyWireM.read(); return msb << 8 | lsb; }