Чт авг 01, 2019 21:40:46
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(8, 6); // request 6 bytes from slave device #8
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
delay(500);
}
Сб авг 03, 2019 19:26:12
#include <Wire.h>
#define adres 0x40>>1
void setup()
{
Wire.begin(); // подключение к шине i2c
Serial.begin(9600); // запуск последовательного порта
delay(2000); // пауза
}
void loop()
{
Wire.requestFrom(adres, 6); // запрос 6 байт от слейва #2
while(Wire.available()) // пока есть, что читать
{
char c = Wire.read(); // получаем байт (как символ)
Serial.print(c, HEX); // печатает в порт
Serial.print(" ");
}
Serial.print("\n\r");
delay(500);
}
#include <avr/interrupt.h>
#include "TWI.h"
#define InvBit(reg, bit) reg ^= (1<<(bit))
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))
#define BitIsSet(reg, bit) ((reg & (1<<bit)) != 0)
extern volatile unsigned char outgoingBuffer[6];
volatile uint32_t value1 = 0x00;
int main( void )
{
sei(); //!< Enable global interrupts.
twi_slave_init();
twi_slave_enable();
for(int i=0; i<6; outgoingBuffer[i++]=0) {} // очистка передающего буфера
while (1)
{
value1++;
outgoingBuffer[3] = (value1 & 0xff000000) >> 24;
outgoingBuffer[2] = (value1 & 0x00ff0000) >> 16;
outgoingBuffer[1] = (value1 & 0x0000ff00) >> 8;
outgoingBuffer[0] = (value1 & 0x000000ff);
}
}
Вс авг 04, 2019 19:07:17
Пн авг 05, 2019 06:56:15
Могли бы сначала мой пример повторить, а потом свое изобретать.kras писал(а):Адрес Слейва вроде и там и там постарался одинаковый поставить, может еще с ним что не так?
#define adres 0x5C>>1
#define SLAVE_ADDRESS 0x5C>>1
Пн авг 05, 2019 16:26:04
Serial.print("dat");
while(Wire.available())
Пн авг 05, 2019 16:39:04
Резисторы стоят?kras писал(а):1. Соединил PB0 с A5 Arduino, PB1 с A4 Arduino. GND с GND.
Пн авг 05, 2019 19:58:56
Вт авг 06, 2019 07:11:30
Вт авг 06, 2019 13:58:31
Вт авг 06, 2019 17:41:00
Нет, это был просто эксперимент.kras писал(а):По фото, кстати, понял фишку с адресом, он по умолчанию 7 бит, так?) Поэтому >>1 сдвиг на 1 бит? Ну вообще интересно, я то обычно просто задавал hex типа 0x5D и все работало.
Не знаю что там Ардуино делает, но Slavekras писал(а):Или библиотека обычно сама сдвигает? Или там настройка адреса была, что он получался 8 бит? Для меня это не было раньше понятно, ведь получается, что нельзя задать любой Hex адрес, компилятор, выходит, все равно обрежет 1 бит, так?
//!Send ACK, SCL is low now
if((val & 0xFE) == (SLAVE_ADDRESS << 1))
Смотря чем программируете, если с makefile настройки берете, то в разделе Programming Options (avrdude) я не вижу что бы фьюзы программировали, как там на счет фьюзов?kras писал(а):1. Я же на Аттини 9.6 МГц задаю в Makefile. Но кварц внешний не использую, то есть внутренний там не может прифигеть и поставить автоматом другую частоту?
Что там на рисунке за STM32?kras писал(а):2. Скорость передачи и скорость приема могут не совпадать? Тактовые частоты мастера и слейва могут не совпадать, где
это перепроверить?
Ср авг 07, 2019 10:42:27
Ср авг 07, 2019 20:50:43
Ни о чем это мне не говорит, я программирую через может так будет понятно.kras писал(а):Программирую AVR ISP MKII.
Придется вам вспомнить.kras писал(а):Я честно немного забыл про фьюзы.
Текущая частота 9,6МГц, можете написать обыкновенную "моргалку" с заранее вам известной частотой, зашить в контроллер и определить примерно на какой частоте он работает.kras писал(а):И напомните смысл, почему их надо трогать, почему без них может не работать?
Без понятия как там в MakeFile, выше я уже написал через что программирую.kras писал(а):Как конкретно тогда должно быть прописано по фьюзам в MakeFile? Напомните, как в WinAVR посмотреть текущее значение фьюзов?
Вам что 6 битного адреса мало что ли?kras писал(а):2. Получается, что на Slave тогда сдвигать не надо, только на Master?
Осциллограф вам здесь не поможет, разве что логический анализатор.kras писал(а):А может вспомогательный код добавить? Например, светодиодом мигать в определенные моменты? Ну просто я не понимаю, все таки, как лучше отследить, идут ли данные и почему не принимаются в итоге. Осциллографом попробую, кстати.
Чт авг 08, 2019 17:07:48
#define F_CPU 960000UL // Указываем тактовую частоту МК
#define LED PB4 // Используем светодиод, подключенный к PB2 (7 пин)
#include <avr/io.h> // Подключаем определения ввода/вывода
#include <util/delay.h> // Подключаем библиотеку функций задержки
int main(void)
{
// Светодиод
DDRB |= (1<<LED); // конфигурируем пин как выход
PORTB &= ~(1<<LED); // по умолчанию светодиод выключен
// Основной цикл
while (1)
{
_delay_ms (1000); // задержка 500 мс
PORTB ^= (1<<LED); // инвертируем состояние пина
}
}
Чт авг 08, 2019 17:52:57
Чт авг 08, 2019 19:39:36
Предположительно Частота контроллера 9,6МГц + включен внутренний делитель на 8 итоговая 9,6/8=1,2МГц.kras писал(а):Светодиод переключается раз в секунду.
Какая тут частота в дефайне, 0,96 МГц?
Так вот, когда я в дефайне CPU увеличиваю частоту в 10 раз (+ нолик), то начинается фигня, светодиод мигает очень долго.
Когда я комментирую дефайн CPU совсем (//#define F_CPU 960000UL), светодиод также мигает очень долго.
Это не поможет. В даной программе не используются задержки. Чем выше частота, тем меньше время выполнения одного такта контроллера.kras писал(а):В принципе тогда я понял возможную проблему, но плохо понимаю, как было бы лучше ее устранить. Можно и дефайном CPU, но тогда подскажите, какую частоту лучше поставить, будет ли это, все таки, 0,96 МГц или же +9,6 МГц?
Для работы программы требуется 9,6МГц.kras писал(а):Для I2C есть разница (для TWI), какая тактовая частота используется?
Пт авг 09, 2019 12:53:38
Пт авг 09, 2019 16:29:32
Пт авг 09, 2019 18:20:37
Пт авг 09, 2019 18:39:35
Пт авг 09, 2019 22:25:40