Перейти к содержанию

Видеокурс по AVR-микроконтроллерам для начинающих


Рекомендуемые сообщения

Кто подскажет, почему с конца программы до начала программы проходит около 4 секунд.

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

1. //atmega16

2. #define F_CPU 1000000 //cksel = 0001 pri ckopt = 1

3. #include <avr/io.h>

4. #include <util/delay.h>

5. void preset (){

6. DDRC = 0xFF; //port B out

7. DDRD = 0xFF;

8. DDRA = 0xFF;

9. DDRB = 0xFF;

10. PORTC = 0x00; // port B = 0

11. PORTD = 0x00;

12. PORTB = 0x00;

13. PORTA = 0x00;

14. }

15. int main(void)

16. {

17. preset();

18. while(1)

19. {

20. PORTB = 0x01;

21. _delay_ms(500);// jdem 0.5c

22. PORTB = 0x02;

23. _delay_ms(500);// jdem 0.5c

24. PORTB = 0x04;

25. _delay_ms(500);// jdem 0.5c

26. PORTB = 0x08;

27. _delay_ms(500);// jdem 0.5c

28. PORTB = 0x10;

29. _delay_ms(500);// jdem 0.5c

30. PORTB = 0x20;

31. _delay_ms(500);// jdem 0.5c

32. PORTB = 0x40;

33. _delay_ms(500);// jdem 0.5c

34. PORTB = 0x80;

35. _delay_ms(500);// jdem 0.5c

36. PORTB = 0x00;

37. PORTD = 0x01 ;

38. _delay_ms(500);// jdem 0.5c

39. PORTD = 0x02 ;

40. _delay_ms(500);// jdem 0.5c

41. PORTD =0x04;

42. _delay_ms(500); // jdem 0.5c

43. PORTD = 0x08;

44. _delay_ms(500); // jdem 0.5c

45. PORTD = 0x10;

46. _delay_ms(500); // jdem 0.5c

47. PORTD = 0x20;

48. _delay_ms(500); // jdem 0.5c

49. PORTD = 0x40;

50. _delay_ms(500); // jdem 0.5c

51. PORTD = 0x80;

52. _delay_ms(500); // jdem 0.5c

53. PORTD = 0x00;

54. PORTC = 0x01 ;

55. _delay_ms(500);// jdem 0.5c

56. PORTC = 0x02 ;

57. _delay_ms(500);// jdem 0.5c

58. PORTC = 0x40 ;

59. _delay_ms(500);// jdem 0.5c

60. PORTC = 0x80 ;

61. _delay_ms(500);// jdem 0.5c

62. PORTC = 0x00;

63. PORTA = 0x80;

64. _delay_ms(500);// jdem 0.5c

65. PORTA = 0x40;

66. _delay_ms(500);// jdem 0.5c

67. PORTA = 0x20;

68. _delay_ms(500);// jdem 0.5c

69. PORTA = 0x10;

70. _delay_ms(500);// jdem 0.5c

71. PORTA = 0x08;

72. _delay_ms(500);// jdem 0.5c

73. PORTA = 0x04;

74. _delay_ms(500);// jdem 0.5c

75. PORTA = 0x02;

76. _delay_ms(500);// jdem 0.5c

77. PORTA = 0x01;

78. _delay_ms(500);// jdem 0.5c

79. PORTA = 0x00;

80. }

81. }

Изменено пользователем endry81
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Господа! Прошу ногами не пинать сильно! Вопрос по уроку №3: почему при запуске симулятора в протеусе квадратики рядом с ножками мигают синим и серым цветом, а не синим и красным?

Схема

e11bc481b8f419b30bb5ea91336fff47.png

Код

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
void preset()
{
DDRB = 0xff;
PORTB = 0x00;
}
int main(void)
{
preset;
   while(1)
   {
    PORTB = 0xff;
 _delay_ms(1000);
    PORTB = 0b00000000;
 _delay_ms(1000);
   }
}

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А Вы контроллеру прошивку указали?... + насколько мне память не изменяет - вызов функции идет со скобками... т.е. preset(); , а не preset; у Вас код неправильный указан....

Изменено пользователем MadLor
Ссылка на комментарий
Поделиться на другие сайты

Всем привет. Подскажите кто знает, что за ошибка вылетает при компиляции через avr studio

[ERROR] Failed to launch. Missing file: C:\Users\atmel studio\6.2\fishingalarm\fishingalarm\Debug\fishingalarm.elf

Ссылка на комментарий
Поделиться на другие сайты

Пишет что не найден файл... И путь какой-то странный... Вы что работаете под пользователем - atmel studio ?

Изменено пользователем MadLor
Ссылка на комментарий
Поделиться на другие сайты

Приветствую, огромное спасибо за видео уроки! Вопрос по ATmel Studio 6 (а так же 4 и 5). После написания проги не могу сохранить ее в расширении .HEX для проверки в Proteuse. Предлагает в .c .h .txt и др. Что не так делаю?

post-192800-0-44081500-1437829420_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Фууххх, наконец доделал домашку по 6 уроку. Вроде работает.)

#define F_CPU 8000000
#include
#include
#include
#include "n5110.h"
const dly = 50;//Задержка прорисовки


void preset()//Настройка дисплея
{
Lcd_init();
Lcd_clear();
Lcd_update();
}

void thermometer()//Рисуем градусник
{

for (int i = 1;i<=6;i++)
{
Lcd_circle (18,41,i,PIXEL_ON);//Рисуем окружности
Lcd_update();
_delay_ms (dly);
}
Lcd_rect(14,45,9,9,PIXEL_ON);//Заполняем пустые квадраты
Lcd_update();
_delay_ms (dly);
Lcd_rect_empty (16,5,20,35,PIXEL_ON);//Рисуем рамку
Lcd_line(17,35,19,35,PIXEL_OFF);//Удаляем лишнии пиксели
Lcd_update();
_delay_ms (dly);
for (int i = 1;i<33;i++)//Заполняем рамку
{
Lcd_rect (17,35,i,3,PIXEL_XOR);
Lcd_update();
_delay_ms (dly);
}
Lcd_rect (17,35,31,3,PIXEL_OFF);//Очищаем рамку
Lcd_pixel(18,3,PIXEL_ON);
Lcd_pixel(18,4,PIXEL_OFF);
Lcd_update();
for (int i=36;i>0;i-=10)//Рисуем длинные деления
{
Lcd_line (3,i,15,i,PIXEL_ON);
Lcd_update();
_delay_ms (dly);
}
Lcd_line(8,34,8,30,PIXEL_ON); //Рисуем 0
Lcd_line(10,34,10,30,PIXEL_ON); //
Lcd_pixel(9,34,PIXEL_ON); //
Lcd_pixel(9,30,PIXEL_ON); //
Lcd_update();
_delay_ms (dly);

Lcd_line(5,24,5,20,PIXEL_ON); //Рисуем 1
Lcd_pixel(4,24,PIXEL_ON); //
Lcd_pixel(6,24,PIXEL_ON); //
Lcd_pixel(4,21,PIXEL_ON); //
Lcd_line(8,24,8,20,PIXEL_ON); //Рисуем 0
Lcd_line(10,24,10,20,PIXEL_ON); //
Lcd_pixel(9,24,PIXEL_ON); //
Lcd_pixel(9,20,PIXEL_ON); //
Lcd_update();
_delay_ms (dly);

Lcd_line(4,14,6,14,PIXEL_ON); //Рисуем 2
Lcd_line(4,12,6,12,PIXEL_ON); //
Lcd_line(4,10,6,10,PIXEL_ON); //
Lcd_pixel(4,13,PIXEL_ON); //
Lcd_pixel(6,11,PIXEL_ON); //
Lcd_line(8,14,8,10,PIXEL_ON); //Рисуем 0
Lcd_line(10,14,10,10,PIXEL_ON); //
Lcd_pixel(9,14,PIXEL_ON); //
Lcd_pixel(9,10,PIXEL_ON); //
Lcd_update();
_delay_ms (dly);

Lcd_line(4,4,6,4,PIXEL_ON); //Рисуем 3
Lcd_line(4,2,6,2,PIXEL_ON); //
Lcd_line(4,0,6,0,PIXEL_ON); //
Lcd_pixel(6,3,PIXEL_ON); //
Lcd_pixel(6,1,PIXEL_ON); //
Lcd_line(8,4,8,0,PIXEL_ON); //Рисуем 0
Lcd_line(10,4,10,0,PIXEL_ON); //
Lcd_pixel(9,4,PIXEL_ON); //
Lcd_pixel(9,0,PIXEL_ON); //
Lcd_update();
_delay_ms (dly);

for (int i=31;i>1;i-=10)//Рисуем короткие деления
{
Lcd_line (13,i,15,i,PIXEL_ON);
Lcd_update();
_delay_ms (dly);
}
Lcd_prints (5,3,FONT_1X,(unsigned char*)PSTR("T="));//Буква "Т"
Lcd_prints (10,3,FONT_1X,(unsigned char*)PSTR("C"));//Буква "С"
//Рисуем знак цельсия
Lcd_pixel(56,25,PIXEL_ON);
Lcd_pixel(58,25,PIXEL_ON);
Lcd_pixel(57,24,PIXEL_ON);
Lcd_pixel(57,26,PIXEL_ON);
Lcd_update();
}

int main(void)
{
preset();
thermometer();
int T;//Значение температуры
char buffer [2];//Строковое значение температуры
while(1)
{
T = rand()%31;//Случайное значение температуры от 0 до 30
Lcd_rect (17,35,T,3,PIXEL_XOR);//Показывает на градуснике
itoa(T,buffer,10);
if (T<10)//Если значение температуры - 1 разряд, то перед ним ставим "0"
{
Lcd_prints (7,3,FONT_1X,(unsigned char*)PSTR("0"));
Lcd_print (8,3,FONT_1X,(unsigned char*)buffer);
}
else//Если 2 разряда, то "0" не ставим )
{
Lcd_print (7,3,FONT_1X,(unsigned char*)buffer);
}
Lcd_update();
_delay_ms(1000);
Lcd_rect (17,35,T,3,PIXEL_XOR);
}
}

Только не понял, после компиляции, студия показывает размер чуть больше 4-х КБ.

Program Memory Usage : 4206 bytes 51,3 % Full

Data Memory Usage : 515 bytes 50,3 % Full

А Windows 12 КБ

Как так? Ведь насколько я понял, именно этот файл прошивается в МК?

И ещё вопрос. Судя по описанию, функция rand() даёт рандомные значения,

но всегда в одном и том же порядке. И что бы это исправить, её задают с

помощью функции time(). Но файла time.h я не нашёл. Его нужно скачивать отдельно?

P.S. спасибо за видеоуроки!

Изменено пользователем Cheshire
Ссылка на комментарий
Поделиться на другие сайты

Доделал 7-ой урок! Все супер :spiteful: . Но возник один вопрос. Опорное напряжение камушка 2,56 Вольт, а у меня вышло 2,05 Вольт в тестовом режиме. При уменьшении напряжения на лапке АЦП от 2,05Вольта все норм, как напряжение превышает значение 2,05В (от 2,05 - 2,56 и т.д.) добавляется знак минус и значения уходят вниз. Что за парадокс? В чем "синус"? :unknw:

post-192800-0-93218700-1438173893_thumb.jpg

post-192800-0-69020200-1438173896_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Это из за переполнения переменной в которое ацп складываете, измените ее тип. Или уменьшите число складывания до 20, соответственно и делить потом на 20 надо.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Подскажите пожалуйста! Не могу разобраться :umnik2: :umnik2:

Хочу чтобы контроллер реагировал когда на 2 лапки приходит единица. Т.е. отрабатывает только в том случае если на двух выводах единица...

#define F_CPU = 80000000;
#include <avr/io.h>
// предварительные настройки
void preset()
{
DDRB = 0x00; //Порт B работает на вход
PORTB = 0x00; //Подтягивающие сопротивление отключено

DDRD = 0xFF; //Порт С работает на выход
PORTD = 0x00; //Значение всех бит 0

}


int main(void)
{
preset();
while(1)

{
if (PINB &= (1<<PC1) & (1<<PC0))


{
PORTD = (1<<PC0) | (1<<PC1);
}

else
{
PORTD = (0<<PC0) | (0<<PC1);
}

}
}

Подскажите, где ошибаюсь?

Если в условии вместо "и" прописать "или", то работает! (т.е. если на какой-то из лапок 1, контроллер срабатывает), а когда "и", то не работает(((((

Ссылка на комментарий
Поделиться на другие сайты

&&

&& вместо и? А в чем разница?

Если в условии вместо "и" прописать "или", то работает!
Ну и в чём тогда проблема, если работает ? :)

Ну в смысле все работает с "или" :rolleyes: Т.е. при приходе единицы на одну из лапок, срабатывает условие. А нужно, чтобы срабатывало когда единица на двух ножках одновременно :rolleyes:

Изменено пользователем Sniper53
Ссылка на комментарий
Поделиться на другие сайты

Ну вообще, как-то странно, когда одну ногу уже смогли опросить, а две нет. Опрашивайте её также, как и первую, и будет Вам счастье :) Если путаетесь, то сделайте тупо - два условия.

&& вместо и?
Вообщето, "&&" - это и есть логическое "И".

Почитайте уже, наконец, литературу по языку.

Ссылка на комментарий
Поделиться на другие сайты

Добрый день. Помогите пожалуйста. Я организовал на порту В таймер0, поэтому порт В занят. Я переделал в файле .h дисплея как вы говорили на порт А

#define LCD_PORT PORTA

#define LCD_DDR DDRA

// Распиновка порта

#define LCD_DC_PIN PA1 // DC

#define LCD_CE_PIN PA2 // SCE

#define SPI_MOSI_PIN PA3 // SDIN

#define LCD_RST_PIN PA4 // RESET

#define SPI_CLK_PIN PA5 // SCLK

Врезультате у меня не запускается таймер0. Как только я убираю из моего основного файла Lcd_init, то таймер работает.

Ссылка на комментарий
Поделиться на другие сайты

Если честно, я бы не пользовался тем вариантом работы с лцд, который сейчас у вас. Он сделан криво и работает только в оригинальном варианте. Любая смена портов - и ничего не работает.

В "правильном" варианте не используется пин chip enable (он на земле висит). Сейчас не вспомню откуда его брал.

Ссылка на комментарий
Поделиться на другие сайты

Проще из своего проекта выдернуть ;)

Завтра, если не забуду. Все на рабочем компе.

Изменено пользователем strifonoff
Ссылка на комментарий
Поделиться на другие сайты

Ну вообще, как-то странно, когда одну ногу уже смогли опросить, а две нет. Опрашивайте её также, как и первую, и будет Вам счастье :) Если путаетесь, то сделайте тупо - два условия.

&& вместо и?
Вообщето, "&&" - это и есть логическое "И".

Почитайте уже, наконец, литературу по языку.

Спасибо!! Обязательно почитаю!!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...