проблема с программрованием Attiny261V
проблема с программрованием Attiny261V
сразу извиняюсь что создал отдельную тему - вдруг уже было похожее, но тут уже нужно вопрос решить срочно (вчера)...
есть плата (проверена на всё уже что только можно) - управление водой (в саду) для полива и водопровода
программу пишу на atmel studio, прошивку заливаю через progisp.
текст программы:
/*
* pump_comtrol_2.cpp
*
* Created: 21.05.2019 16:10:37
* Author : lsv_general
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define Port_Sens200Top PA5
#define Pin_Sens200Top PINA5
#define Port_Sens200Bottom PA6
#define Pin_Sens200Bottom PINA6
#define Port_Sens500Bottom PA7
#define Pin_Sens500Bottom PINA7
#define Port_SensShower PA4
#define Pin_SensShower PINA4
#define Port_Reserv PA3
#define Pin_Reserv PINA3
#define Port_Run200 PB4
#define Port_RunShower PB6
#define Port_Pump PB5
volatile uint16_t c_sec = 0;
volatile uint16_t c_msec = 0;
volatile uint8_t isWork = 0;
volatile uint8_t timer_500 = 0;
//volatile uint8_t Pump200Work = 0;
volatile bool Pump200Work = false;
volatile bool PumpShowerWork = false;
volatile bool b200 = false;
volatile bool bTest = false;
void delay(uint16_t msec);
ISR ( TIMER0_COMPA_vect)
{
c_sec++;
if (c_sec>999){
c_sec=0;
isWork=1;
}
c_msec++;
}
int main(void)
{
Pump200Work=false;
PumpShowerWork=false;
MCUCR = (1<<PUD);
DDRA = (0<<Port_Sens200Top)|(0<<Port_Sens200Bottom)|(0<<Port_Sens500Bottom)|(0<<Port_SensShower)|(1<<Port_Reserv);
DDRB = (1<<Port_Run200)|(1<<Port_RunShower)|(1<<Port_Pump);
TCCR0A = (0<<ICEN0)|(0<<TCW0)|(1<<CTC0)|(0<<ICNC0)|(0<<ICES0)|(0<<ACIC0); // 8-bit CTC mode
TCCR0B = 0x05;//0x05; // делитель 1024
TCNT0L = 0;
OCR0A = 3; // число для сравнения счетчика
TIMSK = (1<<OCIE0A);
sei();
while (1)
{
if (isWork==1){
isWork=0;
bTest=!bTest;
//continue;
if (timer_500>0) {
timer_500--;
}
b200=!b200;
if (bTest){
PORTA |= (1<<Port_Reserv);
} else {
PORTA &= ~(1<<Port_Reserv);
}
}
}
}
void delay(uint16_t msec)
{
c_msec=0;
while (c_msec!=msec){}
}
проблема возникает на простом месте - если комментировать строку
b200=!b200;
то всё работает, в смысле "тестовый" светодиод моргает как положено, если расскомментировать и залить в контроллер - даже светодиод не моргает.
где и что не так ?
есть плата (проверена на всё уже что только можно) - управление водой (в саду) для полива и водопровода
программу пишу на atmel studio, прошивку заливаю через progisp.
текст программы:
/*
* pump_comtrol_2.cpp
*
* Created: 21.05.2019 16:10:37
* Author : lsv_general
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define Port_Sens200Top PA5
#define Pin_Sens200Top PINA5
#define Port_Sens200Bottom PA6
#define Pin_Sens200Bottom PINA6
#define Port_Sens500Bottom PA7
#define Pin_Sens500Bottom PINA7
#define Port_SensShower PA4
#define Pin_SensShower PINA4
#define Port_Reserv PA3
#define Pin_Reserv PINA3
#define Port_Run200 PB4
#define Port_RunShower PB6
#define Port_Pump PB5
volatile uint16_t c_sec = 0;
volatile uint16_t c_msec = 0;
volatile uint8_t isWork = 0;
volatile uint8_t timer_500 = 0;
//volatile uint8_t Pump200Work = 0;
volatile bool Pump200Work = false;
volatile bool PumpShowerWork = false;
volatile bool b200 = false;
volatile bool bTest = false;
void delay(uint16_t msec);
ISR ( TIMER0_COMPA_vect)
{
c_sec++;
if (c_sec>999){
c_sec=0;
isWork=1;
}
c_msec++;
}
int main(void)
{
Pump200Work=false;
PumpShowerWork=false;
MCUCR = (1<<PUD);
DDRA = (0<<Port_Sens200Top)|(0<<Port_Sens200Bottom)|(0<<Port_Sens500Bottom)|(0<<Port_SensShower)|(1<<Port_Reserv);
DDRB = (1<<Port_Run200)|(1<<Port_RunShower)|(1<<Port_Pump);
TCCR0A = (0<<ICEN0)|(0<<TCW0)|(1<<CTC0)|(0<<ICNC0)|(0<<ICES0)|(0<<ACIC0); // 8-bit CTC mode
TCCR0B = 0x05;//0x05; // делитель 1024
TCNT0L = 0;
OCR0A = 3; // число для сравнения счетчика
TIMSK = (1<<OCIE0A);
sei();
while (1)
{
if (isWork==1){
isWork=0;
bTest=!bTest;
//continue;
if (timer_500>0) {
timer_500--;
}
b200=!b200;
if (bTest){
PORTA |= (1<<Port_Reserv);
} else {
PORTA &= ~(1<<Port_Reserv);
}
}
}
}
void delay(uint16_t msec)
{
c_msec=0;
while (c_msec!=msec){}
}
проблема возникает на простом месте - если комментировать строку
b200=!b200;
то всё работает, в смысле "тестовый" светодиод моргает как положено, если расскомментировать и залить в контроллер - даже светодиод не моргает.
где и что не так ?
-
Самсусамыч
Re: проблема с программрованием Attiny261V
Предполагаю что алгоритм простой. Интересно было бы его узнать. 
Re: проблема с программрованием Attiny261V
Предполагаю что алгоритм простой. Интересно было бы его узнать. 
алгоритм действительно простой (три поплавковых датчика, реле давления, два электроклапана и насос), и его нет в тексте сверху только по одной причине, как только что-то "пополняется" в программе перестаёт работать всё. Вот методом исключения добился устойчивого глюка на практически ровном месте. Куда "копать" уже просто не представляю.
-
Самсусамыч
Re: проблема с программрованием Attiny261V
Я спрашивал за алгоритм, чтобы написать свой вариант по вашему словесному описанию. Вы лишь озвучили какая используется периферия. О самом алгоритме ни слово.
Схему платы тоже желательно показать… и саму плату тоже… так как часто бывает, что проблемы возникают ещё и при неправильной разводке ПП. Ещё - МК на какой частоте тактируется?
Re: проблема с программрованием Attiny261V
Я спрашивал за алгоритм, чтобы написать свой вариант по вашему словесному описанию. Вы лишь озвучили какая используется периферия. О самом алгоритме ни слово.
Схему платы тоже желательно показать… и саму плату тоже… так как часто бывает, что проблемы возникают ещё и при неправильной разводке ПП. Ещё - МК на какой частоте тактируется?
будет и схема, и если надо плата, я чё-та уперся в мертвое место... ...как только я делаю присвоение к переменной типа volatile uint8_t - всё встаёт в ступор
-
Самсусамыч
Re: проблема с программрованием Attiny261V
Я не знаю Си… пишу совсем на другом языке… потому мне важен просто словесное описание ваших хотелок… далее напишу тестовый вариант, а Вы его проверите в железе… и если всё будет работать нормуль, то расскажу как я организовал свой вариант.
Короче без Вашего описания и схемы, помощи от меня ждать бессмысленно. Ваша программа из первого поста, для меня не читабельна. 

Re: проблема с программрованием Attiny261V
Ваше предложение я понял и буду иметь ввиду )) но мну очень интересует использование atmel studio... ...и похоже тут что-то встаёт клином, что-то посоветуете попроще может быть ? на С ? ...что бы были варианты при вот таком вот затыке
Добавлено after 1 minute 38 seconds:
на "совсем другом языке" - ассемблер ? ...я чёт тяжело его воспринимаю ))
Добавлено after 1 minute 38 seconds:
на "совсем другом языке" - ассемблер ? ...я чёт тяжело его воспринимаю ))
-
Самсусамыч
Re: проблема с программрованием Attiny261V
Attiny261V - для любительских поделок весьма редковстречающийся...
Ставить его предпочтительно или из-за недостатка лапок в других моделях или для применения имеющихся там полезностей -
• 3 High Frequency PWM Outputs with Separate Output Compare Registers
• Programmable Dead Time Generator
и/или
• 16 Differential ADC Channel Pairs
• 15 Differential ADC Channel Pairs with Programmable Gain (1x, 8x, 20x, 32x)
С атмел студией - разве под ассемблером помочь можно...
Си - у меня под адуринку рассчитан, а там Attiny261V нету...
В принципе посмотреть общую схемку с "хотелками" - может чего и придумается...

Ставить его предпочтительно или из-за недостатка лапок в других моделях или для применения имеющихся там полезностей -
• 3 High Frequency PWM Outputs with Separate Output Compare Registers
• Programmable Dead Time Generator
и/или
• 16 Differential ADC Channel Pairs
• 15 Differential ADC Channel Pairs with Programmable Gain (1x, 8x, 20x, 32x)
С атмел студией - разве под ассемблером помочь можно...
Си - у меня под адуринку рассчитан, а там Attiny261V нету...
В принципе посмотреть общую схемку с "хотелками" - может чего и придумается...
Re: проблема с программрованием Attiny261V
SergL, вы скомпилируйте проект со строчкой b200=!b200; из первого сообщения этой темы.
Проект полностью в архив zip и сюда выложите.
Проект полностью в архив zip и сюда выложите.
Re: проблема с программрованием Attiny261V
Вы уверены, что привели весь код? У вас же b200 нигде не используется больше. И никаких timed sequence в цикле рядом я не вижу, чтобы он как-то мешал работать. Где #include <stdbool.h>, <stdint.h> ? У вас без них по идее ругнулось бы.
Re: проблема с программрованием Attiny261V
спасибо за все ответы... ...а вообще контроллеры бракованые часто попадаются в магазинах ?
...тот что уже впаяный в плату - глючит "на ровном месте", нашёл в загашнике такой же второй (покупал сразу два), собрал "макетку" - всё работает как запрограммировано, но (!!!) частота нифига не 8МГц, а где-то ~1МГц.
вот думаю чего поделать - пойти ещё что-ль в другой магазин попробовать купить ))) или остановиться на втором и "на глаз" счётчик использовать
Добавлено after 2 minutes 4 seconds:
хм... ...не знаю, всё отлично компилится (Atmel Studio 7)
...тот что уже впаяный в плату - глючит "на ровном месте", нашёл в загашнике такой же второй (покупал сразу два), собрал "макетку" - всё работает как запрограммировано, но (!!!) частота нифига не 8МГц, а где-то ~1МГц.
вот думаю чего поделать - пойти ещё что-ль в другой магазин попробовать купить ))) или остановиться на втором и "на глаз" счётчик использовать
Добавлено after 2 minutes 4 seconds:
Вы уверены, что привели весь код? У вас же b200 нигде не используется больше. И никаких timed sequence в цикле рядом я не вижу, чтобы он как-то мешал работать. Где #include <stdbool.h>, <stdint.h> ? У вас без них по идее ругнулось бы.
хм... ...не знаю, всё отлично компилится (Atmel Studio 7)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: проблема с программрованием Attiny261V
новые микроконтроллеры идут с завода с запрограммированным фьюзом CKDIV8 и активным внутренним генератором 8МГц, таким образом эти МК работают на частоте 1 МГц "из коробки"SergL писал(а):частота нифига не 8МГц, а где-то ~1МГц
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: проблема с программрованием Attiny261V
новые микроконтроллеры идут с завода с запрограммированным фьюзом CKDIV8 и активным внутренним генератором 8МГц, таким образом эти МК работают на частоте 1 МГц "из коробки"SergL писал(а):частота нифига не 8МГц, а где-то ~1МГц
о как... ...а в даташите:
The device is shipped with CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed. The default
clock source setting is therefore the Internal Oscillator running at 8 MHz with longest start-up
time and an initial system clock prescaling of 8. This default setting ensures that all users can
make their desired clock source setting using an In-System or High-voltage Programmer
и при чтении фьюзов из CKSEL только CKSEL1 выставлен
а я же сам выставляю деление частоты
Добавлено after 3 minutes 8 seconds:
пока программа выглядит так:
/*
* pump_comtrol_2.cpp
*
* Created: 21.05.2019 16:10:37
* Author : lsv_general
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define Port_Sens200Top PA5
#define Pin_Sens200Top PINA5
#define Port_Sens200Bottom PA6
#define Pin_Sens200Bottom PINA6
#define Port_Sens500Bottom PA7
#define Pin_Sens500Bottom PINA7 // есть вода +5V
#define Port_SensShower PA4
#define Pin_SensShower PINA4
#define Port_Reserv PA3
#define Pin_Reserv PINA3
#define Port_Run200 PB4
#define Port_RunShower PB6
#define Port_Pump PB5
volatile uint16_t c_sec = 0;
volatile uint16_t c_msec = 0;
volatile uint8_t iSens500 = 0;
volatile bool isWork = false;
volatile bool Pump200Work = false;
volatile bool PumpShowerWork = false;
volatile bool bNeed200 = false;
volatile bool bTest = false;
ISR ( TIMER0_COMPA_vect)
{
c_sec++;
if (c_sec>999){ //999
c_sec=0;
if (iSens500>0) {
iSens500--;
}
isWork=true;
}
c_msec++;
}
void delay(uint16_t msec)
{
c_msec=0;
while (c_msec!=msec){
}
}
bool Pin500Bottom()
{
return !(PINA & (1 << Pin_Sens500Bottom));
}
void PumpOn()
{
PORTB |= _BV(Port_Pump);
}
void PumpOff()
{
PORTB &= ~_BV(Port_Pump);
}
void Valve200On()
{
PORTB |= _BV(Port_Run200);
Pump200Work=true;
}
void Valve200Off()
{
PORTB &= ~_BV(Port_Run200);
Pump200Work=false;
}
void ValveShowerOn()
{
PORTB |= _BV(Port_RunShower);
PumpShowerWork=true;
}
void ValveShowerOff()
{
PORTB &= ~_BV(Port_RunShower);
PumpShowerWork=false;
}
void AllOff()
{
PumpOff();
Valve200Off();
ValveShowerOff();
}
int main(void)
{
MCUCR = (1<<PUD);
DDRA = (0<<Port_Sens200Top)|(0<<Port_Sens200Bottom)|(0<<Port_Sens500Bottom)|(0<<Port_SensShower)|(1<<Port_Reserv);
DDRB = (1<<Port_Run200)|(1<<Port_RunShower)|(1<<Port_Pump);
TCCR0A = (0<<ICEN0)|(0<<TCW0)|(1<<CTC0)|(0<<ICNC0)|(0<<ICES0)|(0<<ACIC0); // 8-bit CTC mode
TCCR0B = (1<<CS02)|(0<<CS01)|(1<<CS00);//0x05; // делитель 1024
TCNT0L = 0;
OCR0A = 1; // число для сравнения счетчика
TIMSK = (1<<OCIE0A);
sei();
//delay(1000);
while (1)
{
if (isWork){
isWork=false;
if (bNeed200) {
bNeed200 = bNeed200 && (PINA & (1 << Pin_Sens200Top));
} else {
bNeed200 = (PINA & (1 << Pin_Sens200Top)) && (PINA & (1 << Pin_Sens200Bottom));
}
if (Pin500Bottom()) { // уровень резервного бака ! нельзя включать насос.
AllOff();
iSens500 = 5; // ожидаем наполнение нижнего бака - 1 минуту.
}
if (iSens500>0) {
continue;
}
bTest=!bTest;
if (bTest){
PORTA |= 1 << Port_Reserv;
} else {
PORTA &= ~1 << Port_Reserv;
}
// сначала проверяем реле давления - для поддержания давления воды
if (PINA & (1 << Pin_SensShower)) {
ValveShowerOn();
PumpOn();
if (bNeed200) { // если было включено наполнение верхнего бака - отключаем клапан
Valve200Off();
}
continue;
}
if ((!(PINA & (1 << Pin_SensShower))) && PumpShowerWork) { // реле давления отключилось - выключаем накачку
if (bNeed200) { // требуется наполнение верхнего бака - переключаем клапаны
Valve200On();
ValveShowerOff();
} else { // иначе - отключаем клапаны и насос
AllOff();
}
continue;
}
// проверяем необходимость наполнения верхнего бака
if (bNeed200) {
Valve200On();
PumpOn();
} else { // иначе - выключаем насос
Valve200Off();
PumpOff();
}
}
}
}
с делителем и другими настройками таймера пока буду "играться"
Добавлено after 57 seconds:
...блин, все табы "испортились"
Re: проблема с программрованием Attiny261V
The device is shipped with CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed. The default
clock source setting is therefore the Internal Oscillator running at 8 MHz with longest start-up
time and an initial system clock prescaling of 8. This default setting ensures that all users can
make their desired clock source setting using an In-System or High-voltage Programmer
и при чтении фьюзов из CKSEL только CKSEL1 выставлен
Ну и? Никаких противоречий. CKSEL1 = 1 === CKSEL = 0010
Частота МК получается 1 МГц, за счет включенного CKDIV8, который ставит предделитель Fclk. Вы же ставите в коде делитель таймера. Это ж разные вещи.
Чтобы "табы" не съезжали, надо в тег [code] запихивать.
Re: проблема с программрованием Attiny261V
Ну и? Никаких противоречий. CKSEL1 = 1 === CKSEL = 0010
Частота МК получается 1 МГц, за счет включенного CKDIV8, который ставит предделитель Fclk. Вы же ставите в коде делитель таймера. Это ж разные вещи.
Частота МК получается 1 МГц, за счет включенного CKDIV8, который ставит предделитель Fclk. Вы же ставите в коде делитель таймера. Это ж разные вещи.
что-то я реально затупил... ...всё из-за хренового знания английского языка. Большое спасибо !!!
Re: проблема с программрованием Attiny261V
ну... ...вроде всё, закончил
вырезал косячный контроллер (в прямом смысле вырезал - выпаивал по одной ноге), впаял новый, прошитый, провёл тестирование (вместо датчиков - джамперы) - работает как часы ))
Самсусамыч, Вам действительно нужна схема ? )) ...видел по разным темам что Вы и так очень хорошо в них разбираетесь, уж такую "мелочь" собрать даж напрягаться Вам не придётся ))
вырезал косячный контроллер (в прямом смысле вырезал - выпаивал по одной ноге), впаял новый, прошитый, провёл тестирование (вместо датчиков - джамперы) - работает как часы ))
Самсусамыч, Вам действительно нужна схема ? )) ...видел по разным темам что Вы и так очень хорошо в них разбираетесь, уж такую "мелочь" собрать даж напрягаться Вам не придётся ))
-
Самсусамыч
Re: проблема с программрованием Attiny261V
Схема мне нужна была, чтобы для Вас написать программу. А так как Вы и сами справились, то я рад, что у Вас всё получилось.
Вот есть такой таймер для полива… https://radiokot.ru/forum/viewtopic.php?f=2&t=167311 посмотрите, может пригодится.
Re: проблема с программрованием Attiny261V
А так как Вы и сами справились, то я рад, что у Вас всё получилось.
ой не сглазьте ) работает пока только всё дома, в выходные если всё будет благополучно - опробую при всём подключении датчиков/клапанов/насоса... ..а вообще планируется ещё более интересная история - капельный полив (но он плохо управляемый простыми трубками) с измерением влажности включением/перекрытия воды, измерением температура и возмохно автоматическим открытием "окон"... ...но эт чёт дофига ресурсов, надо посчитать, помидоры/огурцы могут не стоить того ) ...хотя время/силы родителей это очень много съэкономит ))
Re: проблема с программрованием Attiny261V
Огурцы да помидоры по сравнению с какими испанскими... Как сравнить? А опыт, а удовольствие? Нечего тут сомневаться, ДЕЛАЙТЕ!
Я всё-всё узнAю и стану профессором.