Алексей10, у вас есть опыт программирования?
ADCSRA это регистр А управления и состояния аналогово-цифрового преобразователя.
ADPS0 это один из битов регистра ADCSRA задающий частоту преобразования.
Информацию об этом можно найти в даташите (техническом руководстве) микроконтроллера. Если английский плохо знаете, найдите книгу Евстифеева "Микроконтроллеры AVR семейства Mega" и ищите ответы в ней на подобные вопросы.
Arduino или дешевая автоматика
Mnz
Магистр
Город
254 86
Отв.100 18 Февр. 16, 15:40
makh
Профессор
Sаmara
2.1K 1K
Отв.101 18 Февр. 16, 17:40
набор букв и гнутых скобок!Алексей10, 18 Февр. 16, 11:41
Для таких вот персонажей, которым читать мануалы на процессоры непонятно, и делали ардуину. Чтобы на совсем понятном английском из ста слов не думая колдырить, ценой более громоздкого и тормознутого кода. Стяни Arduino IDE, там примеры понятней будут.
Алексей10
Новичок
Россия
7
Отв.102 18 Февр. 16, 18:08, через 29 мин
Mnz, спасибо за объяснения и книгу. Буду разбираться.
makh, простые примеры похожие на этот
Может есть что-то по проще чем Arduino IDE где возможно написать программу и запрограммировать ее в Arduino?
Путаюсь в этих фигурных скобках. Зачем вообще они нужны? Без них никак?
makh, простые примеры похожие на этот
// the setup function runs once when you press reset or power the boardнемного понятны, а вот посложнее, уже сплошная каша.
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Может есть что-то по проще чем Arduino IDE где возможно написать программу и запрограммировать ее в Arduino?
Путаюсь в этих фигурных скобках. Зачем вообще они нужны? Без них никак?
m16
Модератор
Тамбов
1.9K 1K
Отв.103 18 Февр. 16, 18:27, через 19 мин
Алексей10, не захламляй ветку, тебе всё ответили.
Mnz
Магистр
Город
254 86
Отв.104 18 Февр. 16, 20:16
Может есть что-то по проще чем Arduino IDE где возможно написать программу и запрограммировать ее в Arduino?Алексей10, 18 Февр. 16, 18:08Если нужно совсем просто, тогда можно присмотреться к FLProg. Но я бы не стал рекомендовать эту программу. Не пробовал но могу предположить что код получится не совсем оптимальный, хотя судя тестам Arduino IDE (в статье это Wiring) создает не самый оптимальный код.
Если хотите чего-то другого, не Arduino IDE, можете взглянуть на эту статью. https://geektimes.ru/post/257504/ Но все равно нужно уметь программировать и иметь хоть приблизительное представление как работает микроконтроллер.
kazu
Кандидат наук
Харьков
375 74
Отв.105 18 Февр. 16, 20:21, через 6 мин
Путаюсь в этих фигурных скобках. Зачем вообще они нужны? Без них никак?Алексей10, 18 Февр. 16, 18:08Керниган и Ричи "Язык программирования С" гуглится с полпинка. И/или на амперке почитать и посмотреть.
makh
Профессор
Sаmara
2.1K 1K
Отв.106 18 Февр. 16, 20:38, через 17 мин
Алексей10, можно и без скобок, раз так сильно не нравятся, на ассемблере. Но все же, ИМХО, лучше учебник по Сишечке почитать. На ассемблере писать уж точно никак не получится без мануала на процессор.
Mnz
Магистр
Город
254 86
Отв.107 18 Февр. 16, 21:14, через 37 мин
makh, не обязательно на ассемблере. Ардуина это микроконтроллер с обвязкой и прошивку можно написать почти на чем угодно, компилирующем для ATmega.
Если знания о процессоре минимальны, то наверное лучше всего подойдет BASCOM-AVR. Пример Blink будет иметь такой вид.
Если знания о процессоре минимальны, то наверное лучше всего подойдет BASCOM-AVR. Пример Blink будет иметь такой вид.
$regfile = "m328pdef.dat" ' ATmega328P.В этом простом примере не видно, но в коде по сложнее во многих случаях нет необходимости в знании устройсва контроллера и его регистров. Допустим, настройка таймера 1 выполняется командой Config Timer1 Таймер возможно настроить как счетчик, таймер или источник ШИМ, так же задать коэффициент деления предделителя и условия сравнения. И конечно же можно назначить подпрограмму обработки прерываний. Аналогично настраиваются другие модули ATmega.
$crystal = 16000000 ' Частота задающего генератора, Гц.
$hwstack = 64 ' Размер стеков.
$swstack = 64
$framesize = 64
Config Portb.5 = Output ' PortB.5 настроен выходом.
Do
Portb.5 = 1 ' Логическая 1 на выводе PortB.5
Wait 1 ' Задержка 1 секунда.
Portb.5 = 0 ' Логический 0 на выводе PortB.5
Wait 1 ' Задержка 1 секунда.
Loop
makh
Профессор
Sаmara
2.1K 1K
Отв.108 18 Февр. 16, 23:23
Ну да, без скобочек, и не ассемблер ))
Думаю, однако, что коллеге не поможет ничего кроме книжек на данном этапе.
Думаю, однако, что коллеге не поможет ничего кроме книжек на данном этапе.
kazu
Кандидат наук
Харьков
375 74
Отв.109 18 Февр. 16, 23:26, через 4 мин
Что то мне это напоминает... А, точно - можно грабить корованы.
сообщение удалено
Алексей10
Новичок
Россия
7
Отв.110 19 Февр. 16, 18:00
Пример Blink будет иметь такой вид.Mnz, 18 Февр. 16, 21:14Визуально выглядит более чистым (без лишних символов) чем в Arduino IDE. Если вам не трудно, можете показать пример по сложнее. Интересно было бы взглянуть на считывание температуры с DS18B20. Заранее спасибо.
makh
Профессор
Sаmara
2.1K 1K
Отв.111 19 Февр. 16, 18:10, через 10 мин
Алексей10, научись для начала спрашивать вопросы у гугла. А то ведь обвинят в троллинге (вполне заслуженно), да и забанят н@х. https://www.google.com/search?q=bascom+avr+ds18b20+example
Добавлено через 12мин.:
Посмотрел на bascom, вспомнил детство свое голубоглазое, прослезился -- это ж бейсик! Ой-ой .)
Добавлено через 12мин.:
Посмотрел на bascom, вспомнил детство свое голубоглазое, прослезился -- это ж бейсик! Ой-ой .)
Mnz
Магистр
Город
254 86
Отв.112 20 Февр. 16, 00:51
Интересно было бы взглянуть на считывание температуры с DS18B20. Заранее спасибо.Алексей10, 19 Февр. 16, 18:00Ответил в новой теме. Если будут вопросы о применении bascom для программирования arduino, спрашивайте там.
wiifm
Новичок
Cairns, Australia
2
Отв.113 28 Окт. 16, 08:43
Я последовал за эту нить, как вдохновение для использования двигателя клапан и создал новый файл библиотеки Arduino.
Немного прибрал. Zapal
This Arduino sketch implements the library then makes the valve move to random open positions.
Random.ino
Немного прибрал. Zapal
Скрытый текст
TwoWayMotorisedBallValve.h
/*
File: TwoWayMotorisedBallValve.cpp
Title: TwoWayMotorisedBallValve.cpp
Author(s): wiifm
Created: Oct 2016
License: GNU General Public License v3
LICENSE:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#ifndef TWO_WAY_MOTORISED_BALL_VALVE_H
#define TWO_WAY_MOTORISED_BALL_VALVE_H
#define MAX_CYCLE 5000
#define MAX_MOTOR_SPEED 255
#define CALIBRATION_CYCLES 3
#define DEBOUNCE_COUNT 5
#define DEBOUNCE_DELAY 5
#define OPENING 1
#define CLOSING -1
#define STOPPED 0
class TwoWayMotorisedBallValve {
static volatile bool openLimitReached;
static volatile bool closeLimitReached;
static uint8_t openLimitPin;
static uint8_t closeLimitPin;
public:
void begin(double* SetPoint, uint8_t OpenValvePin, uint8_t CloseValvePin, uint8_t MotorSpeedPin, uint8_t OpenLimitPin, uint8_t CloseLimitPin) {
setPoint = SetPoint;
openValvePin = OpenValvePin;
closeValvePin = CloseValvePin;
motorSpeedPin = MotorSpeedPin;
openLimitPin = OpenLimitPin;
closeLimitPin = CloseLimitPin;
pinMode(openValvePin, OUTPUT);
pinMode(closeValvePin, OUTPUT);
pinMode(motorSpeedPin, OUTPUT);
pinMode (openLimitPin, INPUT_PULLUP);
pinMode (closeLimitPin, INPUT_PULLUP);
// set the default motor speed to maximum in both directions
openMotorSpeed = MAX_MOTOR_SPEED;
closeMotorSpeed = MAX_MOTOR_SPEED;
closeLimitReached = (digitalRead(closeLimitPin) == LOW ? true : false);
openLimitReached = (digitalRead(openLimitPin) == LOW ? true : false);
calibrate();
fullyClose();
currentPosition = 0;
lastUpdate = millis() - 1;
}
long fullyClose() {
unsigned long startTime, endTime;
startTime = millis();
while (!closeLimitReached) motor(CLOSING);
endTime = millis();
motor(STOPPED);
return (long) (endTime - startTime);
}
long fullyOpen() {
unsigned long startTime, endTime;
startTime = millis();
while (!openLimitReached) motor(OPENING);
endTime = millis();
motor(STOPPED);
return (long) (endTime - startTime);
}
void update() {
static unsigned long now;
now = millis();
if ((now - lastUpdate) > 0) {
*setPoint = floor(min(max(0, *setPoint), cycleTime)+0.5);
currentPosition = currentPosition + (currentStatus * (now - lastUpdate));
lastUpdate = now;
if (currentStatus != STOPPED) {
if (openLimitReached) {
motor(STOPPED);
currentPosition = cycleTime;
}
if (closeLimitReached) {
motor(STOPPED);
currentPosition = 0;
}
if (currentPosition == *setPoint) motor(STOPPED);
}
if ((currentPosition < *setPoint) && (currentStatus != OPENING)) motor(OPENING);
if ((currentPosition > *setPoint) && (currentStatus != CLOSING)) motor(CLOSING);
// Un-comment the line below to plot target position and current positioon using Serial Plotter. NOTE: All other Serial.print commands must be commented out of the code.
//Serial.print(*setPoint); Serial.print(","); Serial.println(currentPosition);
}
}
long getCycleTime() {
return cycleTime;
}
bool isFullyClosed() {
return (currentPosition == 0);
}
bool isFullyOpened() {
return (currentPosition == cycleTime);
}
private:
void motor(int Direction) {
currentStatus = Direction;
switch (Direction) {
case OPENING:
detachInterrupt(digitalPinToInterrupt(closeLimitPin));
closeLimitReached = false;
analogWrite (motorSpeedPin, openMotorSpeed);
digitalWrite (openValvePin, HIGH);
digitalWrite (closeValvePin, LOW);
attachInterrupt(digitalPinToInterrupt(openLimitPin), openLimitISR, FALLING);
break;
case CLOSING:
detachInterrupt(digitalPinToInterrupt(openLimitPin));
openLimitReached = false;
analogWrite (motorSpeedPin, closeMotorSpeed);
digitalWrite (closeValvePin, HIGH);
digitalWrite (openValvePin, LOW);
attachInterrupt(digitalPinToInterrupt(closeLimitPin), closeLimitISR, FALLING);
break;
case STOPPED:
detachInterrupt(digitalPinToInterrupt(openLimitPin));
detachInterrupt(digitalPinToInterrupt(closeLimitPin));
digitalWrite (openValvePin, LOW);
digitalWrite (closeValvePin, LOW);
}
}
static void openLimitISR() {
if (!openLimitReached) {
openLimitReached = debounceInputPullupPin(openLimitPin);
}
}
static void closeLimitISR() {
if (!closeLimitReached) {
closeLimitReached = debounceInputPullupPin(closeLimitPin);
}
}
static bool debounceInputPullupPin(uint8_t Pin) {
int currentState;
int lastState = LOW;
int count = 0;
while (count <= DEBOUNCE_COUNT) {
delay(DEBOUNCE_DELAY);
currentState = digitalRead(Pin);
if (currentState == lastState) {
count++;
} else {
count = 0;
lastState = currentState;
}
}
return (currentState == LOW);
}
void calibrate() {
long totalOpeningTime = 0;
long totalClosingTime = 0;
float factor = 1;
fullyClose();
for (int i = 0; i < CALIBRATION_CYCLES; i++) {
totalOpeningTime = totalOpeningTime + fullyOpen();
totalClosingTime = totalClosingTime + fullyClose();
}
if ((totalOpeningTime - totalClosingTime) > 0) {
cycleTime = (int) (((float) totalOpeningTime / CALIBRATION_CYCLES) + 0.5);
//need to slow closing down
factor = (float) totalClosingTime / (float) totalOpeningTime;
closeMotorSpeed = (int) ((openMotorSpeed * factor) + 0.5);
}
if ((totalOpeningTime - totalClosingTime) < 0) {
cycleTime = (int) (((float) totalClosingTime / CALIBRATION_CYCLES) + 0.5);
//need to slow opening down
factor = (float) totalOpeningTime / (float) totalClosingTime;
openMotorSpeed = (int) ((closeMotorSpeed * factor) + 0.5);
}
}
uint8_t closeValvePin;
uint8_t openValvePin;
uint8_t motorSpeedPin;
unsigned long lastUpdate;
double *setPoint;
long currentPosition;
int currentStatus;
int openMotorSpeed;
int closeMotorSpeed;
long cycleTime;
};
#endif
This Arduino sketch implements the library then makes the valve move to random open positions.
Random.ino
#include "TwoWayMotorisedBallValve.h"
//#include <TwoWayMotorisedBallValve.h>
#define OPEN_VALVE_PIN 12
#define CLOSE_VALVE_PIN 13
#define MOTOR_SPEED_PIN 10
#define OPEN_LIMIT_PIN 2
#define CLOSE_LIMIT_PIN 3
volatile bool TwoWayMotorisedBallValve::openLimitReached;
volatile bool TwoWayMotorisedBallValve::closeLimitReached;
uint8_t TwoWayMotorisedBallValve::openLimitPin;
uint8_t TwoWayMotorisedBallValve::closeLimitPin;
TwoWayMotorisedBallValve valve;
double valveSetPoint;
unsigned long lastRandom = 0;
void setup ()
{
Serial.begin(9600);
valve.begin(&valveSetPoint, OPEN_VALVE_PIN, CLOSE_VALVE_PIN, MOTOR_SPEED_PIN, OPEN_LIMIT_PIN, CLOSE_LIMIT_PIN);
}
void doFunctionAtInterval(void (*callBackFunction)(), unsigned long *lastEvent, unsigned long Interval) {
unsigned long now = millis();
if ((now - *lastEvent) >= Interval) {
callBackFunction();
*lastEvent = now;
}
}
void loop ()
{
doFunctionAtInterval(generateRandomOutput, &lastRandom, 200);
valve.update();
}
void generateRandomOutput() {
int change = random(-1000, 1001);
valveSetPoint = min(max(0, (valveSetPoint + change)), valve.getCycleTime());
}
Отв.114 28 Окт. 16, 08:58, через 15 мин
wiifm, может код как-то в виде файла выкладывать? Мозг взрывает листать. А и еще градусник можно взять dallas ds18b20, гильзованный меньше бакса, а сдачу 11 баксов пропить с друзьями. далласовский датчик отлично поддерживается библиотеками Ардуины.
Ну и напиши что хочешь с этим делать всем добром, ибо пока все выглядит как троллинг и гугл транслейт, который ты публикуешь по непонятной причине.
Ну и напиши что хочешь с этим делать всем добром, ибо пока все выглядит как троллинг и гугл транслейт, который ты публикуешь по непонятной причине.
wiifm
Новичок
Cairns, Australia
2
Отв.115 28 Окт. 16, 12:22
Я не могу говорить по-русски, как я из Австралии. К сожалению для Google Translate. Я приложил файлы. Существует три примера, а также код библиотеки.
alex_ustus
Специалист
Nyagan
161 9
Отв.116 26 Февр. 17, 20:08
сорян за нубский вопрос; но пролистав всю ветку не увидел всей схемы подключения и "финишного" скетча. Есть у кого уже готовый проект на данном железе?