Изменение кода для счетчика
- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Конечно, лучше учить поэтапно. Но у меня получается, что выполняю такие задания параллельно с чтением теории, задания такие уже задают, знаний не хватает. Ищу по кускам, но куски вместе не склеиваются. В учебниках упражнения приводятся для выполнения непосредственно в ОС, как правило. Поэтому самостоятельная практика началась с уроков того сайта, откуда был взят изначальный код.
- Реклама
давай по шагам...
1) объяви переменную i для счетчика
и опиши массив (10 элементов, с кодами цифр - можешь скопировать их (коды) из соих примеров (если не подойдут потом поправим))
1) объяви переменную i для счетчика
и опиши массив (10 элементов, с кодами цифр - можешь скопировать их (коды) из соих примеров (если не подойдут потом поправим))
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Массив знаков получился такой:
Добавлено after 6 minutes 12 seconds:
А может быть и так можно:
Код: Выделить всё
for (i=0; i<10; i+1) // i должна быть от нуля до 9 включительно, т. к. строго меньше 10, шаг отсчета 1
char dig [10]= // Массив символов для индикатора
{
0b00000110;
0b01011011;
0b01001111;
0b01100110;
0b01101101;
0b01111101;
0b00000111;
0b01111111;
0b01101111;
0b00111111;
}А может быть и так можно:
Код: Выделить всё
char dig [i=0; i<10; i+1]=
{
0b00000110;
0b01011011;
0b01001111;
0b01100110;
0b01101101;
0b01111101;
0b00000111;
0b01111111;
0b01101111;
0b00111111;
}i+1 здесь не будет давать нужного вам эффекта, т.к. результат выражения ничему не присваивается. здесь или i++ надо писать, или i+=1 или i = i + 1 иначе цикл у вас будет вечнымmnirti писал(а):for (i=0; i<10; i+1)
это всё магические числа, что плохо по определению.mnirti писал(а):char dig [10]= // Массив символов для индикатора
{
0b00000110;
0b01011011;
0b01001111;
0b01100110;
0b01101101;
0b01111101;
0b00000111;
0b01111111;
0b01101111;
0b00111111;
}
так точно нельзя.mnirti писал(а):char dig
вы по какой книге язык Си изучаете? неужели там такое написано?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Получается:
Код: Выделить всё
for (i=0; i<10; i++) // инкремента
char dig [10]= // Массив чисел
{
1<<2; // например, 4
...
}- Реклама
- Сообщения: 537
- Зарегистрирован: Вт фев 09, 2010 17:52:26
[uquote="ARV",url="/forum/viewtopic.php?p=3123245#p3123245"][/quote]это всё магические числа, что плохо по определению.[/uquote]
Чем это плохо я не знаю(если достаточно памяти), но инициализация массива делается примерно так:
https://prog-cpp.ru/c-massiv/
а заодно почитайте и это http://cpp.com.ru/kr_cbook/ch5kr.html скоро понадобиться
Чем это плохо я не знаю(если достаточно памяти), но инициализация массива делается примерно так:
Код: Выделить всё
char dig [10]= // Массив символов для индикатора
{
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111,
0b00111111
};а заодно почитайте и это http://cpp.com.ru/kr_cbook/ch5kr.html скоро понадобиться
[uquote="ARV",url="/forum/viewtopic.php?p=3123245#p3123245"]
mnirti массив лучше:
1. сделать константным - мы в нём по ходу программы ни чего менять не будем,
2. объявлять не в цикле for (почитайте про область видимости переменных)
3. если массив заполняется при объявлении — его размер можно не писать, компилятор сам сощитает ... dig[]={...};
4. элементы массива разделяются запятыми
это всё магические числа[/uquote] я считаю это — настройка периферии, а как без них предлагаете знакогенератор собрать?mnirti писал(а):char dig [10]= // Массив символов для индикатора
{
0b00000110;
0b01011011;
0b01001111;
0b01100110;
0b01101101;
0b01111101;
0b00000111;
0b01111111;
0b01101111;
0b00111111;
}
mnirti массив лучше:
1. сделать константным - мы в нём по ходу программы ни чего менять не будем,
2. объявлять не в цикле for (почитайте про область видимости переменных)
3. если массив заполняется при объявлении — его размер можно не писать, компилятор сам сощитает ... dig[]={...};
4. элементы массива разделяются запятыми
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
жальcodenamehawk писал(а):Чем это плохо я не знаю
можно, но не нужно, иначе сложнее контролировать его правильное заполнение.Ivanoff-iv писал(а):если массив заполняется при объявлении — его размер можно не писать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Читаю и слушаю всех, код выходит таким:
Счетчик пока еще не работает. Наверное неправильно написаны пустые циклы, ко всему прочему пропадает питание после нажатия кнопки.
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
unsigned int i;
int main(void)
{
unsigned char butcount=0;
DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0b00000000; // Весь регистр на выход
PORTB = 0b00000001; // Младший бит, нулевая нога на вход
const char dig [10]= // Константный массив чисел,
//объявлен в основной функции
{
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111,
0b00111111
};
//---------------------------------
while ((PINB&0b00000001)==1)) // Пустой цикл: кнопка не нажата
if ((PINB&0b00000001)==1))
{
}
//---------------------------------
while ((PINB&0b00000001)==0)) // Цикл выполняется до тех пор, пока на нулевой ноге есть логический ноль
{
for (i=0; i<10; i++) //
if ((PINB&0b00000001)==0))
_delay_ms(1500);
//---------------------------------
while ((PINB&0b00000001)==0)) // Пустой цикл: кнопка нажата
if ((PINB&0b00000001)==0))
{
}
}
//---------------------------------
PORTD=const char dig[i]; // Вывод значений в порт D
}9 строка: переменная не нужна (она ни где не используется).
32-36: дополнительной проверки не надо,достаточно только цикла.
40: этот цикл сделай закольцованным навсегда, без учета кнопки.
43: циклу for добавь операторные скобки и в них впиши
задержку,
пустой цикл с условием по кнопке
и вывод iтой цифры в порт.
всё дальнейшее стирай.
32-36: дополнительной проверки не надо,достаточно только цикла.
40: этот цикл сделай закольцованным навсегда, без учета кнопки.
43: циклу for добавь операторные скобки и в них впиши
задержку,
пустой цикл с условием по кнопке
и вывод iтой цифры в порт.
всё дальнейшее стирай.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 537
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Что бы написать программу, надо ее себе представить.
Удобней всего это сделать на бумаге, например в графическом виде.
http://www.maksakov-sa.ru/Algol/SpPrAlg ... index.html
Программа в процессоре никогда не должна "закончиться", для этого в функции main создается
бесконечный цикл
В вашем случае удобнее ввести переменную в которую считать состояние кнопки(кнопок) и в зависимости от нее делать разветвления программы.
Для того, чтобы определить какое это нажатие первое или второе нужна еще одна переменная.
В ней будет хранится информация о том это первое или второе нажатие кнопки.
(Или внутри блока еще один опрос кнопки, немного усложняется программа)
Добавлено after 6 minutes 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3123296#p3123296"]
Покажите как вы бы "правильно" сделали хранение символов, для отображения их на LED.
Удобней всего это сделать на бумаге, например в графическом виде.
http://www.maksakov-sa.ru/Algol/SpPrAlg ... index.html
Программа в процессоре никогда не должна "закончиться", для этого в функции main создается
бесконечный цикл
Код: Выделить всё
int main(void)
//main start
{
//инициализация переменных и настройка железа(настройка портов на вход- выход)
while (1)
{
// Тут будет основной код
}
}//main end
Код: Выделить всё
unsigned char knopka;
unsigned int perevennaja=0;
while (1)
{
knopka = PINB;
// если кнопка нажата делаем то
if ((knopka & 0b00000001) == 0 )
{
//Если надо добавляете проверку на мах значение, с учетом того ее увеличите
perenennaja++;
} else //если кнопка не нажата делаем то
{
//Если надо добавляете проверку на min значение, с учетом того ее уменьшите
peremennaja--;
}
//тут удобное место написать код для отображения значения "perenennaja"
_delay_ms(300); перед следующим опросом кнопки, пропускаем дребезг кнопки
}
В ней будет хранится информация о том это первое или второе нажатие кнопки.
(Или внутри блока еще один опрос кнопки, немного усложняется программа)
Добавлено after 6 minutes 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3123296#p3123296"]
жаль[/uquote]codenamehawk писал(а):Чем это плохо я не знаю
Покажите как вы бы "правильно" сделали хранение символов, для отображения их на LED.
так 100500 раз уже было показано...codenamehawk писал(а):Покажите как вы бы "правильно" сделали хранение символов, для отображения их на LED
Код: Выделить всё
#define _A _BV(0)
#define _B _BV(1)
#define _C _BV(2)
#define _D _BV(3)
#define _E _BV(4)
#define _F _BV(5)
#define _G _BV(6)
#define _H _BV(7)
#define _dig_0 (_A | _B | _C | _D | _E | _F)
#define _dig_1 (_B | _C)
#define _dig_2 (_A | _B | _G | _E | _D)
// и так далее все цифры и другие знаки, которые нужны
char DIG[10] = {_dig_0, _dig_1, _dig_2, /* и так далее */ _dig_9};если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 537
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Код: Выделить всё
#define _A _BV(0)
#define _B _BV(1)
#define _C _BV(2)
#define _D _BV(3)
#define _E _BV(4)
#define _F _BV(5)
#define _G _BV(6)
#define _H _BV(7)
#define _dig_0 (_A | _B | _C | _D | _E | _F)
#define _dig_1 (_B | _C)
#define _dig_2 (_A | _B | _G | _E | _D)
// и так далее все цифры и другие знаки, которые нужныНамного проще один раз рассчитать в проге
http://www.getchip.net/posts/080-konver ... ndikatora/
и далее просто использовать константы.
Код получится одинаковым, а не нужной писанины меньше.
много раз слышал фразу "математика мне не нужна, я люблю историю и пойду учиться в на истфак" - найдите 7 отличий от вашего утверждения...codenamehawk писал(а):Это нужно только если кто сам создает знаки
жаль, что правила хорошего тона постепенно умирают как в реальной жизни, так и в программировании. зачем пользоваться салфеткой, если можно и рукой рот вытереть? зачем избавляться от магических чисел, если "только один раз надо"?
как минимум затем, чтобы самого себя уважать не за лень, а за аккуратность.
извините за оффтоп.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Теперь код переписан так, но отладчик выдает 7 ошибок:
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
// unsigned int i; переменная не используется
int main(void)
{
unsigned char butcount=0;
DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0b00000000; // Весь регистр на выход
PORTB = 0b00000001; // Младший бит, нулевая нога на вход
const char dig [10]= // Константный массив чисел,
//объявлен в основной функции
{
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111,
0b00111111
};
//---------------------------------
while ((PINB&0b00000001)==1)) // Пустой цикл: кнопка не нажата
// if ((PINB&0b00000001)==1)) Без дополнительной проверки
{
}
//---------------------------------
while (1) // Бесконечный цикл
if ((PINB&0b00000001)==0))
for (i=0; i<10; i++)
{
_delay_ms(1500);
}
//---------------------------------
while ((PINB&0b00000001)==0)) // Пустой цикл: кнопка нажата
if ((PINB&0b00000001)==0))
{
}
PORTD=const char dig[i]; // Вывод значений в порт D
}вы пытаетесь протестировать интуицию остальных? или к чему эти интригующие слова про 7 ошибок? нам надо угадать, какие именно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 453
- Зарегистрирован: Ср июн 08, 2011 20:25:20
[uquote="mnirti",url="/forum/viewtopic.php?p=3124650#p3124650"]while (1) // Бесконечный цикл[/uquote] скобки {} добавите для всего куска кода, где это цикл
, а так работает только для след. строки. И т.д для других while.....
- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Список ошибок, выданных компилятором, теперь новый, код немного подправлен, в циклах есть дополнительные скобки.
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
// unsigned int i; переменная не используется
int main(void)
{
unsigned char butcount=0;
DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0b00000000; // Весь регистр на выход
PORTB = 0b00000001; // Младший бит, нулевая нога на вход
const char dig [10]= // Константный массив чисел,
//объявлен в основной функции
{
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101,
0b00000111,
0b01111111,
0b01101111,
0b00111111
};
//---------------------------------
while ((PINB&0b00000001)==1)) // Пустой цикл: кнопка не нажата
// if ((PINB&0b00000001)==1)) Без дополнительной проверки
{
}
//---------------------------------
while (1) // Бесконечный цикл
{
if ((PINB&0b00000001)==0))
for (i=0; i<10; i++)
{
_delay_ms(1500);
}
}
//---------------------------------
while ((PINB&0b00000001)==0)) // Пустой цикл: кнопка нажата
{
if ((PINB&0b00000001)==0))
}
PORTD=const char dig[i]; // Вывод значений в порт D
}- Вложения
-
- Отладка.jpg
- (235.26 КБ) 427 скачиваний
- Сообщения: 537
- Зарегистрирован: Вт фев 09, 2010 17:52:26
[uquote="mnirti",url="/forum/viewtopic.php?p=3124650#p3124650"][/uquote]
Что тут делает const char?
Почитайте про глобальные и локальные переменные.
Компилятор показывает строку с ошибкой и тип ошибки.
Добавлено after 6 minutes 35 seconds:
Комментируйте, что делает каждый блок программы.
Что делает этот блок
Код: Выделить всё
PORTD=const char dig[i]; // Вывод значений в порт DЧто тут делает const char?
Почитайте про глобальные и локальные переменные.
Компилятор показывает строку с ошибкой и тип ошибки.
Добавлено after 6 minutes 35 seconds:
Комментируйте, что делает каждый блок программы.
Что делает этот блок
Код: Выделить всё
while ((PINB&0b00000001)==1)) // Пустой цикл: кнопка не нажата
// if ((PINB&0b00000001)==1)) Без дополнительной проверки
{
}- Сообщения: 26
- Зарегистрирован: Вт май 23, 2017 15:41:09
Константа была добавлена в дополнение к массиву, который посоветовали сделать константным. Указанный Вами блок выполняется только, если на ножке появляется логическая единица, то есть кнопка не нажата.


