Форум по микроконтроллерам: Помогите Запрограммировать Atmega16 - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Помогите Запрограммировать Atmega16

#1 Пользователь офлайн   feriatos 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 17 Май 12

Отправлено 17 Май 2012 - 21:18

Здравствуйте!
Получил задание на диплом запрограммировать систему управления роботом. Система управления на базе МК ATmega16.
Схема есть в протеусе. Смысл в том, чтобы по нажатию на кнопки клавиатуры загорался определённый светодиод на схеме. На реальной собранной плате вместо светодиодов помоему будут стоять электромагниты, управляющие клапанами пневмодвигателей.
Сама программа есть, написана на Си и даже скомпилирована и есть файл прошивки. Вся проблема в том, что при симуляции в протеусе, схема ведёт себя непредсказуемо: бывает, что сигналы на входах МК и на кнопках меняются как то хаотически, а бывает протеус выдаёт такую ошибку: Time step too small(скрин приложил). Так же бывает, что светодиоды загораются самопроизвольно, внезависимости от нажатия кнопок.
Где то читал, что это может быть связано с фьюзами (на схеме используется внешний тактовый генератор) или чем то таким, но толком так и не смог разобраться.
Схемка в архиве, текст программы, а так же .hex файл в прикреплённых файлах.

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

Программа:

#include <delay.h>
#include <avr/io.h>
#include <avr/iom16.h>
main(void)


{
DDRC = 255;
DDRA = 0;
DDRB = 255;

while (1)

{
PORTC = 0b00000100;
if (PINA = 00000001) PORTB = 00000001;
if (PINA = 00000010) PORTB = 00000000;
if (PINA = 00000100) PORTB = 00000010;
if (PINA = 00001000) PORTB = 00000000;

delay_ms(1000);

PORTC = 0b00001000;
if (PINA = 00000001) PORTB = 00000100;
if (PINA = 00000010) PORTB = 00000000;
if (PINA = 00000100) PORTB = 00001000;
if (PINA = 00001000) PORTB = 00000000;

delay_ms(1000);

PORTC = 0b00010000;
if (PINA = 00000001) PORTB = 00010000;
if (PINA = 00000010) PORTB = 00000000;
if (PINA = 00000100) PORTB = 00100000;
if (PINA = 00001000) PORTB = 00000000;

delay_ms(1000);

PORTC = 0b00010000;
if (PINA = 00000001) PORTB = 01000000;
if (PINA = 00000010) PORTB = 00000000;
if (PINA = 00000100) PORTB = 10000000;
if (PINA = 00001000) PORTB = 00000000;

delay_ms(1000);

}
}

Прикрепленные изображения

  • Прикрепленное изображение: dipl.JPG

Прикрепленные файлы


0

#2 Пользователь офлайн   Murka 

  • Участник
  • PipPip
  • Группа: Пользователи
  • Сообщений: 11
  • Регистрация: 23 Март 11

Отправлено 18 Май 2012 - 02:10

Для симуляции упрости схему повыбрасывай реле лампы замени светодиодами (к ним резисторы для симуляции не нужны).
Если резисторы нужны попробуй использовать их в режиме Digital везде где это возможно. И тогда Time step too small ты не увидиш.
И ещё там есть настройки симуляции и выпадающее окно с профилями в самом низу слева (уж не помню что там написано) может помочь, но схему всё равно придётся упрощать.
По частоте тактирования см картинку сам кварц рисовать не нужно, достаточно указать в настройках.

Прикрепленные изображения

  • Прикрепленное изображение: mega.PNG

0

#3 Пользователь офлайн   feriatos 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 17 Май 12

Отправлено 18 Май 2012 - 21:58

Спасибо, буду пробовать.
Хотя упростить схему врядли получтися - она уже спаяна и программа пишется именно под неё, а не для симуляции. Протеус используется только для отладки.
0

#4 Пользователь офлайн   Murka 

  • Участник
  • PipPip
  • Группа: Пользователи
  • Сообщений: 11
  • Регистрация: 23 Март 11

Отправлено 18 Май 2012 - 22:16

Вот для отладки тебе и придётся её упростить иначе будешь отлаживать в железе.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей