Форум обсуждения оборудования  

Вернуться   Форум обсуждения оборудования "Умный дом" > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.03.2013, 18:28   #11
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

С чтением портов разобрался, нашел ошибку
Ошибку исправил и проверил следующим кодом
PHP код:
#include "nanopins.h"

void setup()
{
  
D8_In;
  
D13_Out;
}

void loop()
{
if(
D8_Read==0D13_Low;
if(
D8_Read==1D13_High;

Для ускорения работы главного цикла добавил Start End
можно таким же образом зациклить в любом месте кода, но не забудьте предусмотреть выход из этого цикла
PHP код:
#include "nanopins.h"

void setup()
{
  
D8_In;
  
D13_Out;
}

void loop()
{
Start

if(D8_Read==0D13_Low;
if(
D8_Read==1D13_High;

End
Библиотеку nanopins.h перезалил
Admin вне форума   Ответить с цитированием
Старый 04.03.2013, 06:51   #12
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

Ввиду безупречной работы библиотеки,
появился соблазн переписать строчку:
attachInterrupt(0, RPM, FALLING);
в свете nanopins.h .
Как это сделать правильно и улучшит ли
оно срабатывание прерывания?

Последний раз редактировалось fot; 12.03.2013 в 08:51.
fot вне форума   Ответить с цитированием
Старый 04.03.2013, 09:43   #13
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

В шапке темы всегда актуальная ссылка на библиотеку

Выкладываю пример кода прерывания от внешнего входа D2
PHP код:
ISR(INT0_vect)  // обработчик внешнего прерывания INT0

//здесь можно написать код своего обработчика 


void setup()    

    
EICRA |= (1<<ISC00); // прерывание вызывается при спадающем или нарастающем фронте сигнала на входе;  
    
EIMSK |=(1<<INT0);//((1<<INT0)|(1<<INT1));  // разрешить прерывания INT0
}

void loop()    
{   

//EICRA &= ~((1<<ISC00)|(1<<ISC01)); //прерывание вызавается при сигнале LOW
//EICRA |= (1<<ISC01); // FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
//EICRA |=(1<<ISC00)|(1<<ISC01) // RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
// EICRA |= (1<<ISC00); // прерывание вызывается при изменении значения на входе;
Admin вне форума   Ответить с цитированием
Старый 04.03.2013, 12:34   #14
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

ВСЁ ! Наконец полетело !

PID-контроллер ведет себя лучше, чем до ускорения.
Прерывание ISR(INT0_vect) срабатывает без пропусков.
{ Start... ...End} - выполняется.
Ощущение, что работает лучше и увереннее.

Есть резерв - заменить analogRead (А2) и (А3) и analogWrite(5) PWM.

Большущее Спасибо, Admin, за профессионализм и отзывчивость.
Библиотека - класс!

Последний раз редактировалось fot; 12.03.2013 в 08:52.
fot вне форума   Ответить с цитированием
Старый 04.03.2013, 12:45   #15
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

analogWrite() нет смысла менять, так как эту функцию хардверная. analogWrite() только нофигурирует и стартует, а сам процесс выполняется в фоновом режиме и не грузит сам проц
С analogRead попробую, что нибудь придумать, но скорее всего придется Class использовать
Admin вне форума   Ответить с цитированием
Старый 04.03.2013, 14:42   #16
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

Обнаружил в библиотеке прописанные NOP-ы.
Вопрос:
Какие ограничения накладывает работа с прерываниями на
использование NOP-ов в основном цикле.
Мешают ли они вызову прерываний?

Последний раз редактировалось fot; 12.03.2013 в 08:52.
fot вне форума   Ответить с цитированием
Старый 04.03.2013, 15:13   #17
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Nop можно использовать везде, без ограничений, тем более эта комманда написана на чистом ассемблере

Добавил функции A0_Read, A1_Read, ... A7_Read
Разницу в скорости с функцией AnalogRead() ровно в два раза
A0_Read преобразовывает за 50мкс, а AnalogRead(0) за 100мкс
На скорость оцифровки оказывает влияние сам АЦП, он медленный
Можно конечно еще увеличить скорость тактирования АЦП, но тогда ухудшится качество оцифровки. Сейчас частота на границе между качеством и тактированием.
Разница в размере скетча не значительная при использовании AnalogRead(0) объем 538 байт, а при использовании A0_Read 508 байт

Скетч который я использовал для сравнения скорости работы
PHP код:
#include "nanopins.h"

void setup()
{
  
D13_Out;
}

void loop()
{
Start 

D13_High
;
uint16_t i=A0_Read//analogRead(0);
D13_Low;
i=A0_Read//analogRead(0);
End

Тестовый скетч для проверки аналогового чтения на CarDuino
PHP код:
#include "nanopins.h"

void setup()
{
 
Serial.begin(115200);
}

void loop()
{
Serial.println("************");
Serial.println(A0_ReadHEX);
Serial.println(A1_ReadHEX);
Serial.println(A2_ReadHEX);
Serial.println(A3_ReadHEX);
Serial.println(A4_ReadHEX);
Serial.println(A5_ReadHEX);
Serial.println(A6_ReadHEX);
Serial.println(A7_ReadHEX);
delay(2000);

Цитата:
Сообщение от fot Посмотреть сообщение
Я пробовал варианты analogRead из поста 7,
но что-то не завелось напрямую.
Пока бросил. Буду читать матчасть.

Ещё раз, большое спасибо! .
A6 и A7 могут работать только в аналоговом режиме
Admin вне форума   Ответить с цитированием
Старый 04.03.2013, 16:29   #18
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

Не нарадуюсь стабильной работе PID контроллера.
До использования библиотеки nanopins.h, на
стабильность вращения двигателя влияла даже
скорость обмена последовательного порта и
нельзя было выключить его.
Подумывал даже перейти на STM32.
Но теперь отключил последовательный порт,
а мотору - всё равно - очень стабильно держит
обороты при разной нагрузке. Атмегу - не узнать!
Замечательная библиотека...
Завтра буду analogRead-ом заниматься.

Последний раз редактировалось fot; 12.03.2013 в 09:09.
fot вне форума   Ответить с цитированием
Старый 04.03.2013, 19:15   #19
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Добавил к библиотеке функцию SmallUart
Я использую эту функцию во многих проектах
При использовании функции SmallUart, учитывайте тот факт, что буфферизируется только 1 байт данных, принятый с Serial порта

Тестовый код для проверки чтения и записи в UART
PHP код:
#include "nanopins.h"
uint8_t b=255;

void setup() 
{
UART_Init(115200);//инициализация последовательного порта
}

void loop() 
{  
   
//получить байт данных из последовательного порта
  
UART_ReadByte(b);
  
  
//отправить байт данных в последовательный порт
  
if(b<255
  { 
    
UART_SendByte(b);
    
b=255;
  }

Admin вне форума   Ответить с цитированием
Старый 04.03.2013, 20:20   #20
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 442
Вес репутации: 790
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Чем могу - сделал цветочки- файл keywords, но требует проверки в первом блоке где start-end и в последнем где UART, так как еще неважно понимаю деятельность этих разделов библиотеки. Еще сделать примеры - описание и будет полноценная библиотечка
Вложения
Тип файла: txt keywords.txt (3.3 Кб, 500 просмотров)
Bulatovor вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 15:06. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика