Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
1

Произвольное измениние переменной без нажатия кнопки

29.07.2016, 19:02. Показов 1131. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу прощения за идиотский вопрос, но у меня беда с логическим выполнением. грубо говоря на плате 2 кнопки, переменная err =1, если нажимаем кнопку "1" то вызывается функция tempmenu и ждет нажатия другой кнопки. и в принципе все так и работает, но через некоторое время (около 5 секунд) err устанавливается в 1, так как вместо надписи "ждем меню" появляется "все пучком", но эта переменная может изменится только после нажатия кнопки, почему она сама меняется если верхний if дает false не могу понять.
ATmega32a, компил. atmel studio 7

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#define   BitIsClear(reg, bit)    ((reg & (1<<bit)) == 0)
#define   BitIsSet(reg, bit)    ((reg & (1<<bit)) != 0)
#define   SetBit(reg, bit)          reg |= (1<<bit)
#define   ClearBit(reg, bit)       reg &= (~(1<<bit))
uint8_t i2 = 0;
uint8_t err = 1; 
void tempmenu2(void){ 
    if (BitIsClear(PINC, 6)){
        _delay_ms(100);
        if (BitIsClear(PINC, 6)){
            while (BitIsClear(PINC, 6));
            if (err == 0) //  меняем переменную после нажатия кнопки
            {err = 1;
                }else{err = 0;}
            }
        }
}
int main (void)
{
    // конфигурируем порты
 
    DDRD = 0x10;  // 00 01 00 00
    PORTD = 0x0E; // 00 00 11 10
    DDRC = 0x02; // 00 00 00 10
    PORTC = 0xF8;// 11 11 10 00
        TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); 
    TIMSK |= (1<<TOIE1);  
    TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00); 
    TIMSK |=(1<<TOIE0); 
    sei();
 
while(1){
    tempmenu2();
        
        
    if (err ==1){
    _delay_ms(100);
    LCDcommand(0b00000001);
        LCDstring("VSE Puсhkom",0,0);  
    }else{
        _delay_ms(100);
        LCDcommand(0b00000001);
        LCDstring("Jdem menu",0,0); // этот пункт должен работать все время  после нажатия первой кнопки
        tempmenu();}
        
        
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2016, 19:02
Ответы с готовыми решениями:

Как отправить все чекбоксыы без обновления страницы и без нажатия кнопки?
Нужно обновлять данные без перезагрузки и без нажатия кнопки на странице, пишу так: &lt;form...

Действие без нажатия кнопки
Добрый день Нужно реализовать следующее Поле поиска Поле ответа С полем ответа понятно это...

Посчитать без нажатия кнопки
Здравствуйте! Как сделать, чтоб когда я ввожу градусы в цельсиях , мне сразу одновременно...

Считывание переменной без нажатия Enter
Как считать переменную без нажатия Enter ?

Расчет без нажатия кнопки Выполнить
Добрый день форумчани! Примите меня в свои ряды. Я здесь новенький и программирование занимаюсь...

20
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
29.07.2016, 19:16 2
Цитата Сообщение от dj_oni Посмотреть сообщение
tempmenu();
не вижу реализации этой функции
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
29.07.2016, 19:23  [ТС] 3
Прошу прощения, в комментах завалялась ))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void tempmenu (void){
    if (BitIsClear(PINC, 7)){
        //label2:
        _delay_ms(10);
        if (BitIsClear(PINC, 7)){
            while (BitIsClear(PINC, 7));
            if (i2 >= 3){
                i = 0;
                }else{
                i2++;
            }
        }
    }
}
ISR(TIMER0_OVF_vect){
    switch (i2){
        case 1: LCDcommand(0b00000001);
        LCDstring("coming soon",0,0);
        break;
        case 2: LCDcommand(0b00000001);
        LCDstring("tomorrow",0,0);
        break;
        case 3: LCDcommand(0b00000001);
        LCDstring("Ill be back",0,0);
        break;
        case 0: break;
    }
    TCNT0=0x00; // обнудение счетчика
    TIFR=0x00; // обнуление флага
}
0
Тутошний я
2146 / 1201 / 225
Регистрация: 03.11.2009
Сообщений: 4,416
Записей в блоге: 2
31.07.2016, 00:28 4
попробуй поставить подтягивающий резистор на кнопку. дополнительно.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
31.07.2016, 07:24 5
несколько пожеланий
Цитата Сообщение от dj_oni Посмотреть сообщение
C
1
2
3
if (err == 0) // *меняем переменную после нажатия кнопки
  {err = 1;
   }else{err = 0;}
меняется на одну строчку
C
1
err=!err;
Цитата Сообщение от dj_oni Посмотреть сообщение
C
1
2
3
4
if (i2 >= 3){
  i = 0;
   }else{
      2++;
можно заменить на
C
1
2
3
4
5
6
7
8
switch(i2)
{
 case 0 : i2=1; break;
 case 1: i2=2; break;
 case 2: i2=3; break;
 case3:
 default: i2=0;
}
ну и вопрос
Цитата Сообщение от dj_oni Посмотреть сообщение
if (i2 >= 3){
i = 0;
i что за переменная? где определена? тогда i2 никогда не вернется к 0, точнее вернется но через 256 нажатий
или это описка и должна быть i2?
и какая переменная скачет?
скинь полностью файл или проект

Добавлено через 3 минуты
Цитата Сообщение от dj_oni Посмотреть сообщение
C
1
if (err ==1)
замени на
C
1
if (err!=0)
1
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
31.07.2016, 09:38 6
Ещё можно применить тернарный оператор
C
1
i2 = (i2>2 ? 0 : i2+1);
С большой долей вероятности ValeryS нашёл ошибку - разные переменные в условии и в каждой ветке if (i2, i, 2++).

Добавлено через 2 минуты
Ещё, возможно, что i2 надо определить как volatile - чтобы оптимизатор не удалил код там, где i2 не модифицируется

Добавлено через 7 минут
Ещё, возможна ситуация со срабатыванием WDT. Несколько лет назад, avr-gcc не отключал его при инициализации, это требовалось сделать или вручную или установкой fuse.

Добавлено через 2 минуты
C
1
2
3
4
5
6
7
#include <avr/wdt.h>
....................
void main(void)
{
  wdt_disable();
....................
}
Добавлено через 3 минуты

Не по теме:

Sorry, у меня старинный браузер "не хочет" "нажимать" на кнопки кода, а соответствующие BBCode плохо помню.

0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
31.07.2016, 09:58 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
"нажимать" на кнопки кода, а соответствующие BBCode плохо помню.
ну в этой ветке все просто
для Си {C} ...{/C}
для АСМ {asm} ....{/asm}
фигурные скобки поменяй на квадратные
1
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
02.08.2016, 20:14  [ТС] 8
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
switch(i2) { case 0 : i2=1; break; case 1: i2=2; break; case 2: i2=3; break; case3: default: i2=0; }
Не понял логики ? и каким образом меню будет меняться при нажатии кнопки? В таком случае оно просто все перелистнулось и все.(проверил)

По Вашим советам заменил кое что и сам поколдовал вот весь код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#define   BitIsClear(reg, bit)    ((reg & (1<<bit)) == 0)
#define   BitIsSet(reg, bit)    ((reg & (1<<bit)) != 0)
#define   SetBit(reg, bit)          reg |= (1<<bit)
#define   ClearBit(reg, bit)       reg &= (~(1<<bit))
//SetBit(PORTB, 0); 
volatile uint8_t i2 = 0;
volatile uint8_t err = 1;
void tempmenu(void);
void tempmenu2(void);
void check (void);
void tempmenu (void){
    if (BitIsClear(PINC, 7)){
        //label2:
        _delay_ms(120);
        if (BitIsClear(PINC, 7)){
            while (BitIsClear(PINC, 7));
            if (i2 >= 4){
                i2 = 0;
                }else{
                i2++;
            }
        }
    }
    // начало меню
        switch (i2){
            case 1: LCDcommand(0b00000001);
            LCDstring("logoname",0,0);
            break;
            case 2: LCDcommand(0b00000001);
            LCDstring("do not work",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
            break;
            case 3: LCDcommand(0b00000001);
            LCDstring("ALL be fine",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
            break;
            case 4: err = 1; break; /* если отсюда убрать err=1;  то тогда все кнопки работают, но не выходим из меню на надпись "все пучком" (только если нажать 2 кнопку, надпись появляется)*/
            default: i2=0;
        }
    // конец меню  
}
 
void tempmenu2(void){
    if (BitIsClear(PINC, 6)){
        _delay_ms(120);
        if (BitIsClear(PINC, 6)){
            while (BitIsClear(PINC, 6));
            err = !err; 
            }
        }
}
 
void check(){
    if (err != 0){
        _delay_ms(100);
        LCDcommand(0b00000001);
        LCDstring("VSE Puchkom",0,0);
        tempmenu2();
    }
    if (err == 0 && i2 == 0){
        _delay_ms(100);
        LCDcommand(0b00000001);
        LCDstring("Jdem menu",0,0);
        tempmenu();
        
    }
    if (err == 0 && i2 != 0){
        _delay_ms(100);
        tempmenu();
    }
}
 
 
int main (void)
{
    //#define XTAL 12000000L
    // конфигурируем порты
 
    DDRD = 0x10;  // 00 01 00 00
    PORTD = 0x0E; // 00 00 11 10
    DDRC = 0x02; // 00 00 00 10
    PORTC = 0xF8;// 11 11 10 00
    
    LCDinit();  //Инициализация LCD, эту функцию в первую очередь, потом все остальное.
    
    
    while(1){
    tempmenu();
    tempmenu2();
    check();
            
}
}
При этом раскладе нажимаем 2 кнопку появляется надпись "ждем меню", нажимаем 1 кнопку и листаем по меню, когда доходим до конца меню выходим из него и появляется надпись "Все пучком", НО после этого жми не жми на 2 кнопку, но войти повторно в меню не выходит. Если из 37 строки убрать err=1; то все кнопки работают все время, но по выходу из меню на дисплее "ждем меню"(что логично), а нужно, чтобы светилось "все пучком".

Оптимизировать сейчас код не имеет смысла , так как на доставшейся "кривой плате" стоит мега32а , но которой висит дисплей и считывается всего 4 ножки + 2 управляют реле

Добавлено через 7 часов 53 минуты
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ещё, возможна ситуация со срабатыванием WDT
Попробовал вставить Ваш код, не помогло
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
02.08.2016, 20:32 9
Цитата Сообщение от dj_oni Посмотреть сообщение
Не понял логики ? и каким образом меню будет меняться при нажатии кнопки?
меню не будет, будет меняться переменная
Это аналог конструкции с if, только более гибкий
есть такое понятие "конечный автомат"
Цитата Сообщение от dj_oni Посмотреть сообщение
В таком случае оно просто все перелистнулось и все.(проверил)
ежли поставить в бесконечный цикл, то да
но ведь это нужно вставить в функцию tempmenu, вместо конструкции if

Добавлено через 2 минуты
Цитата Сообщение от dj_oni Посмотреть сообщение
case 4: err = 1; break;
вот зачем здесь break? тебе нужно провалится и обнулить i2
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
02.08.2016, 20:53  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
вот зачем здесь break? тебе нужно провалится и обнулить i2
не поверите, буквально 3 минуты назад, до Вашего сообщения, убрал этот break и все заработало и только хотел написать сообщение и увидел Ваш пост. Но чего не могу понять, так это почему он мешает, ведь он должен всего лишь вывалиться из switch, а дальше по циклу в случае необходимости снова вызвать tempmenu.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
02.08.2016, 21:15 11
смотри что происходит
i2 равно 4
C
1
case 4: err = 1; break;
присвоили err 1 но i2 осталась 4
при следующем заходе в функцию
выполняется это,будем считать что кнопки правильно нажимаются
C
1
2
if (i2 >= 4){
   i2 = 0;
i2 обнуляется
далее switch поскольку для нуля нет ветки
попадаем сюда
C
1
default: i2=0;
опять обнуляем
в результате "мертвый цикл"
а если уберешь break то сразу обнуляешь i2
1
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
03.08.2016, 08:38  [ТС] 12
ValeryS, Спасибо огромное теперь понял логическую ошибку.
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
05.08.2016, 17:54  [ТС] 13
Еще один момент не могу осилить, если в case написать
C++
1
param++;
то он будет складываться до бесконечности, что в принципе логично, ведь функция tempmenu сидит в бесконечном цикле(что в принципе и нужно для проверки нажатия кнопки ), а как заставить опцию switch выполнятся один раз, сообразить не могу.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
05.08.2016, 18:24 14
Цитата Сообщение от dj_oni Посмотреть сообщение
а как заставить опцию switch выполнятся один раз,
ввести еше одну переменную -флаг равен 1
и в switch обнулять
примерно так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
flag=1;
 
.....................
if(flag)
{
 flag=0;
switch(..)
{
............
}
 
 
 
}
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
05.08.2016, 19:02  [ТС] 15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
uint_8t ranf = 0;
uint_8t flag = 1;
void tempmenu (void){
    if (BitIsClear(PINC, 7)){
        //label2:
        _delay_ms(120);
        if (BitIsClear(PINC, 7)){
            while (BitIsClear(PINC, 7));
            if (i2 >= 4){
                i2 = 0;
                }else{
                i2++; flag =1;
            }
        }
    }
    // начало меню
        switch (i2){
            case 1: LCDcommand(0b00000001);
            LCDstring("logoname",0,0);
            ranf++;
            LCDram(ranf,0,1);
            flag = 0;
            break;
            case 2: LCDcommand(0b00000001);
            LCDstring("do not work",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
            flag = 0;
            break;
            case 3: LCDcommand(0b00000001);
            LCDstring("ALL be fine",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
             flag = 0;
            break;
            case 4: err = 1;  
            default: i2=0;
        }
    // конец меню   
}
по логике вещей если нажал кнопку, т.е. изменилось состояние i2 и flag=1, идет разрешение switch выполняется case 1 идет инкремент, после чего flag =0 и по идеи switch больше не должен запускаться (пока не нажмем на кнопку, точнее должен работать тот case на котором остановились), а у меня на дисплее ranf нкрементируется до потери пульса.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
05.08.2016, 19:35 16
Цитата Сообщение от dj_oni Посмотреть сообщение
идет разрешение switch
иде оно???
Цитата Сообщение от ValeryS Посмотреть сообщение
if(flag)
вот этого не вижу
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
06.08.2016, 11:38  [ТС] 17
Здесь пропустил, но в программе оно есть и не помогает ((

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
uint_8t ranf = 0;
uint_8t flag = 1;
void tempmenu (void){
    if (BitIsClear(PINC, 7)){
        //label2:
        _delay_ms(120);
        if (BitIsClear(PINC, 7)){
            while (BitIsClear(PINC, 7));
            if (i2 >= 4){
                i2 = 0;
                }else{
                i2++; flag =1;
            }
        }
    }
    // начало меню
if (flag){
        switch (i2){
            case 1: LCDcommand(0b00000001);
            LCDstring("logoname",0,0);
            ranf++;
            LCDram(ranf,0,1);
            flag = 0;
            break;
            case 2: LCDcommand(0b00000001);
            LCDstring("do not work",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
            flag = 0;
            break;
            case 3: LCDcommand(0b00000001);
            LCDstring("ALL be fine",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
             flag = 0;
            break;
            case 4: err = 1;  
            default: i2=0;
        }
    // конец меню 
}  
}
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
06.08.2016, 12:46 18

Не по теме:

dj_oni, вы сейчас подошли к ситуации, когда перемешанные интерфейс и логика работы мешают разобраться в ситуации, почему не работает.
Вам бы выполнить рефакторинг - разделить нажатия кнопок (антидребезг, выставить запрос необходимости обработать нажатие), обработку нажатия (смысловая часть нажатия - смена состояния системы, сброс состояния необходимости обработать нажатие), логику работы меню (при необходимости отправка на LCD сообщения, соответствующего состоянию).

Грубо говоря, ваша система представляет собой конечный автомат с 3 состояниями, которые изменяются в зависимости от нажатия двух кнопок. Так от состояния и зависит строка на LCD.

Перед броском на клавиатуру, требуется на бумаге записать перечень состояний, условия перехода из каждого состояния.

Это я к тому, что в вашей программе состояния описаны "говорящими переменными" i2, flag, errб ranf. Неясен принцип их изменения.

И у меня ощущение некорректности обработки нажатия кнопки - при некоторых условиях значение i2 будет изменятся через каждые 120мс.



Добавлено через 11 минут
И ещё - нас на уроках учили такому приёму программирования МК "разрезания циклов" - когда процесс (например, опрос клавиатуры) не оставляет управление у себя в цикле ожидания, а сохраняя текущее состояние в переменной отдаёт управление другому процессу.
К примеру, ждём нажатия кнопки
вместо
C++
1
  while (не нажата);
применяем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  switch (KeyState)
  {
  .................
  case 14:
    if (нажата)
    {
      KeyState = 15; //переходим к следующему состоянию
      какие-то простые действия без циклов
    };
    break;
  case 15:
..............
  }
0
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
07.08.2016, 09:18  [ТС] 19
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение

Не по теме:

dj_oni, вы сейчас подошли к ситуации, когда перемешанные интерфейс и логика работы мешают разобраться в ситуации, почему не работает.
Вам бы выполнить рефакторинг - разделить нажатия кнопок (антидребезг, выставить запрос необходимости обработать нажатие), обработку нажатия (смысловая часть нажатия - смена состояния системы, сброс состояния необходимости обработать нажатие), логику работы меню (при необходимости отправка на LCD сообщения, соответствующего состоянию).

Грубо говоря, ваша система представляет собой конечный автомат с 3 состояниями, которые изменяются в зависимости от нажатия двух кнопок. Так от состояния и зависит строка на LCD.

Перед броском на клавиатуру, требуется на бумаге записать перечень состояний, условия перехода из каждого состояния.

Это я к тому, что в вашей программе состояния описаны "говорящими переменными" i2, flag, errб ranf. Неясен принцип их изменения.

И у меня ощущение некорректности обработки нажатия кнопки - при некоторых условиях значение i2 будет изменятся через каждые 120мс.

i2, flag - обычное условие, err - он и в африке errror, а ranf просто некая переменная для инкремента, коих у меня валом, так как case условий 12 штук, но смысл их выкладывать лишние case? в проге лишние case закоменчены и работаю только с тем куском кода в котором проблема.

насчет i2 с чего ему меняться каждые 120 мс если условие не выполняется, а конкретно кнопка не нажата?
Проблема заключается в том, что опрос кнопок сидит в вечном цикле, как вынести условие case за пределы постоянного опроса этого я не могу понять. т.е. если вошли в 1 case условие, должны его выполнить один раз и выводить на дисплей одно и тоже, до тех пор пока не нажмем 1,2... и т.д . кнопку

Добавлено через 8 минут
Я пробовал разделить и разнести их в разные функции
функция 1:
C
1
2
3
4
5
6
7
8
9
10
11
12
if (BitIsClear(PINC, 7)){
        //label2:
        _delay_ms(120);
        if (BitIsClear(PINC, 7)){
            while (BitIsClear(PINC, 7));
            if (i2 >= 4){
                i2 = 0;
                }else{
                i2++; flag =1;
            }
        }
    }
функция 2:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
switch (i2){
            case 1: LCDcommand(0b00000001);
            LCDstring("logoname",0,0);
            ranf++;
            LCDram(ranf,0,1);
            flag = 0;
            break;
            case 2: LCDcommand(0b00000001);
            LCDstring("do not work",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
            flag = 0;
            break;
            case 3: LCDcommand(0b00000001);
            LCDstring("ALL be fine",0,0);
            //if (BitIsClear(PINC, 7)){goto label2;}
             flag = 0;
            break;
            case 4: err = 1;  
            default: i2=0;
        }
в случае если i2 = 0 вызываем обе функции, если нет вызываем только вторую, но она сволочь все равно крутится в бесконечном цикле при каждом цикле выполняет повторно case условие

Добавлено через 20 часов 11 минут
Понял свою ошибку flag нужно проверять в самом case условии и только там где необходимо.
Но вот другой вопрос не совсем уже в тему, но все с той же программой связано. Пишу дальше прогу и понимаю, что придется общаться с eeprom ладно бы только чтение, но необходимо еще и записывать переменную и относительно часто (10 раз в день, может чаще). Если я правильно себе все представил, то на ножку(к примеру PA0) микрухи должна подаваться логическая 1 с питания через оптрон, а сама микруха запитывается через конденсатор большой емкости и в случае исчезновения 1 на ноге , все переменные записываются в eeprom.
Собственно говоря на этой чудной плате выше описаного процесса не происходило(просто нет элементной базы для этого) и есть предположение что eeprom мог исчерпать свой ресурс по записи, по крайней мере когда записывал файл epp, программа uniprof поругалась на несколько адресов, но все вроде записала и все вроде работает. Можно как то проверить eeprom и в случае чего допустим обойти поврежденную часть памяти? Просто новую микруху покупать не хочется.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
07.08.2016, 09:24 20
Цитата Сообщение от dj_oni Посмотреть сообщение
и есть предположение что eeprom мог исчерпать свой ресурс по записи,
100 000 циклов тебе достаточно?
Цитата Сообщение от dj_oni Посмотреть сообщение
а сама микруха запитывается через конденсатор большой емкости и в случае исчезновения 1 на ноге , все переменные записываются в eeprom.
зачем такие сложности?
записывай когда нужная переменная изменится
А вот как записывать зависит от компилятора, в CVAVR например запись что в ОЗУ, что в EEPROM синтаксически никак не отличаются,разница в объявлении
Цитата Сообщение от dj_oni Посмотреть сообщение
, по крайней мере когда записывал файл epp, программа uniprof поругалась на несколько адресов,
попробуй стереть перед записью
0
07.08.2016, 09:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2016, 09:24
Помогаю со студенческими работами здесь

Обработка нажатия кнопки без фиксации
Здравствуйте! Помогите, пожалуйста. По идее, после нажатия первой кнопки, выполняется вся...

Запуск функции без нажатия кнопки
Здравствуйте. Подскажите пожалуйста. Я создал в QT Designer 3 окошка. 1 - водится значение &quot;а&quot; 2...

Скрипт с кнопки выполняется без её нажатия
Есть кнопка с кодом: &lt;button...

Расчет значений без нажатия кнопки
Все привет! Ребят в питоне еще новичок ,новичком. Взялся делать приложение для расчета...

Результат нажатия кнопки без обновления страницы
Здравствуйте! Есть простейшая web-форма для ввода значения логина и кнопка &quot;Поиск&quot; (get-запрос)....

Отправка данных из Формы без нажатия кнопки
Как такое устроить ? Чтобы человек ввёл данные подождал две секунды и данные отправились...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru