На все выходы порта D подключены аноды цифрового индикатора D0-D7 (НА СХЕМЕ НЕ ПОКАЗАН) катод индикатора на минус. Прикреплено изображение
nest
Отправлено: 08 Ноября, 2009 - 16:28:48
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
1_ulyanovsk пишет:
На симуляторе работает как надо. Цыфры бегут пока нажата кнопка.
про внутреннюю подтяжку не забываем! она хоть и "дохлая", и я ей не доверяю, но она есть
ещё всегда следует упомянуть, какой симулятор используете...
лучше ставить комментарии в свой код. например:
DDRD = 0xff; настроили все ноги порта D на выход
DDRC = 0x00; настроили все ноги порта С на вход
и немного подправим алгоритм вывода:
while(1){
if (PINC==0b1){
N=N+1;
if (N==10) {N=0}; (проверяем на переполнение сразу после наращивания)
}
PORTD=Dig[N];
}
и схему: Прикреплено изображение
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 17:11:13
Маршал
Сообщений всего: 126
Дата рег-ции: Сент. 2009
Использую симулято Avr simulator ide. Для этой отладки он хорошо подходит и скорость тоже хороша. И заметил да и гдето что то слышал. Но когда я ставлю в этом симуляторе ON на ногу С0 то PINC0 не загорается. То есть единица на C0 есть а PINC.0 нет и прочитать нельзя. Зато рботает как нужно. Странно. Я включил подтягивающий резистор
PORTC=0x01; и резистор повесил на землю 9 кОм. Не робит. Еще один эмперический факт. Задел пальцем за дорожки на плате (остальныеPINC не С0) цифры побежали. Отпускаю счет останавливается на произвольной цифре.
PS: не знаете еще симуляторов? реального времемени кроме протеуса. Он у меня лагает. NOD32 будь он не ладен.
while(1){
if (PINC==0b00000001){ ; проверяем то только бит#0
N=N+1;
if (N==10) {N=0}; (проверяем на переполнение сразу после наращивания)
}
PORTD=Dig[N];
}
1_ulyanovsk пишет:
не знаете еще симуляторов?
пользуюсь только AVRStudio, там встроенный... но пишу на асм. так что не знаю, как там встроенный симулятор дружит с кодом СИ.
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 17:27:22
Маршал
Сообщений всего: 126
Дата рег-ции: Сент. 2009
Схема живет свой жизнью. Кнопку игнорирует. Сама цыфры меняет, когда хочет останавливается. Кажется щас от программатора сама выдернется и на кухню пойдет проверять есть ли что в холодильнике хорошего ? Искуствееный интелект Ежики кудрявые. . . А существенно PINC==0b00000001 или PINC==0b1 ведь одно и тоже
nest
Отправлено: 08 Ноября, 2009 - 17:33:49
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
1_ulyanovsk пишет:
PINC==0b00000001 или PINC==0b1 ведь одно и тоже
вообще да.
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 17:39:31
Маршал
Сообщений всего: 126
Дата рег-ции: Сент. 2009
nest пишет:
1_ulyanovsk пишет:
PINC==0b00000001 или PINC==0b1 ведь одно и тоже
вообще да.
Хорошо. Но я думаю я еденицу не формирую на входе.
VCOM
Отправлено: 08 Ноября, 2009 - 22:40:21
Супермодератор
Сообщений всего: 659
Дата рег-ции: Март 2007
Дак это... Надо чтоб было так
if ((PINC & 0b00000001)==0b00000001)
Воть... Имхо...
nest
Отправлено: 08 Ноября, 2009 - 22:51:58
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
VCOM, что то не понятно ... что это даст ? и ... что это за запись
я не тесно знаком с СИ, но если делать аналогично как в Шаг-за-Шагом: if (PINC & (1<<PINC0)) // проверить "1" на PINC.0
может, прощще ещё так: if (PINC0){
; чё нить выполняем...
}
VCOM
Отправлено: 08 Ноября, 2009 - 23:02:19
Супермодератор
Сообщений всего: 659
Дата рег-ции: Март 2007
Это логическое И. Т.е. маска. Эта конструкция нам говорит что нас интересует только PINC0... Все остальные мы не учитываем...
if (PINC & (1<<PINC0))
так то-же можно...
if (PINC0)... Так скорее всего нельзя... Скорее всего PINC0 объявлен как 0 PINC1 как 1 и т.д.
Тут от конкретного компилятора зависит... (Добавление)
А если так будет написано...
if (PINC==0b00000001)
ну а остальные входы то куда подключены? Как DDRC настроен... DDRC = 0x00; Значит они все на вход настроены, они в воздухе болтаются... Поэтому ниче и не работает... А еще лучше подтягивающие резисторы включить и на 0 кнопку нажимать... Вот... Имхо как то так...
nest
Отправлено: 08 Ноября, 2009 - 23:35:40
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
if (PINC & (1<<PINC0))
интересно посмотреть, что там наваляет компилятор : )))
а как красиво это на асме: sbic PORTC,0
или
sbis PORTC,0
VCOM
Отправлено: 08 Ноября, 2009 - 23:38:33
Супермодератор
Сообщений всего: 659
Дата рег-ции: Март 2007
А то! Умные ща компиляторы пошли Ж)))) Раньше бы он стал бы 1 сдвигать, потом pinc читать, потом сравнивать Ж))))
1_ulyanovsk
Отправлено: 09 Ноября, 2009 - 20:42:51
Маршал
Сообщений всего: 126
Дата рег-ции: Сент. 2009
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#define a 1
#define b 8
#define c 128
#define d 16
#define e 4
#define f 2
#define g 32
#define h 64
while(1)
{
if (PINC0) N=N+1; // проверяю еденицу на С0 (вход кстати инверсный ???)
PORTD=Dig[N]; // Посылаю на порт D перменную Dig ну и цифру на сегменты соотв.
if (N==10) N=0; // ограничиваю счет до девятки
}
}
КНОПКА заколдованая Прикреплено изображение
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.