роботы
робототехника
микроконтроллеры
Главная
Как сделать робота
Новости
Спорт
Статьи
Wiki
Форум
Downloads
Ссылки
Контакты  


 Страниц (17): В начало « ... 9 10 11 12 [13] 14 15 16 17 »   

> Без описания
nest Администратор
Отправлено: 08 Ноября, 2009 - 15:21:05
Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  





1_ulyanovsk, а схему ? :)
 
 Top
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 16:05:35
Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  





На все выходы порта D подключены аноды цифрового индикатора D0-D7 (НА СХЕМЕ НЕ ПОКАЗАН) катод индикатора на минус.
Прикреплено изображение
58764654.JPG

 
 Top
nest Администратор
Отправлено: 08 Ноября, 2009 - 16:28:48
Post Id



Администратор


Сообщений всего: 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];
}


и схему:
Прикреплено изображение
58764654.png

 
 Top
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 17:11:13
Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  





Использую симулято Avr simulator ide. Для этой отладки он хорошо подходит и скорость тоже хороша. И заметил да и гдето что то слышал. Но когда я ставлю в этом симуляторе ON на ногу С0 то PINC0 не загорается. То есть единица на C0 есть а PINC.0 нет и прочитать нельзя. Зато рботает как нужно. Странно. Я включил подтягивающий резистор
PORTC=0x01; и резистор повесил на землю 9 кОм. Не робит. Еще один эмперический факт. Задел пальцем за дорожки на плате (остальныеPINC не С0) цифры побежали. Отпускаю счет останавливается на произвольной цифре.
PS: не знаете еще симуляторов? реального времемени кроме протеуса. Он у меня лагает. NOD32 будь он не ладен.

(Отредактировано автором: 08 Ноября, 2009 - 17:13:00)

 
 Top
nest Администратор
Отправлено: 08 Ноября, 2009 - 17:18:13
Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  





аааа ... : ))))


while(1){
if (PINC==0b00000001){ ; проверяем то только бит#0
N=N+1;
if (N==10) {N=0}; (проверяем на переполнение сразу после наращивания)
}
PORTD=Dig[N];
}


1_ulyanovsk пишет:
не знаете еще симуляторов?

пользуюсь только AVRStudio, там встроенный... но пишу на асм. так что не знаю, как там встроенный симулятор дружит с кодом СИ.
 
 Top
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 17:27:22
Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  





Схема живет свой жизнью. Кнопку игнорирует. Сама цыфры меняет, когда хочет останавливается. Кажется щас от программатора сама выдернется и на кухню пойдет проверять есть ли что в холодильнике хорошего ? Искуствееный интелект Ежики кудрявые. . . А существенно PINC==0b00000001 или PINC==0b1 ведь одно и тоже
 
 Top
nest Администратор
Отправлено: 08 Ноября, 2009 - 17:33:49
Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  





1_ulyanovsk пишет:
PINC==0b00000001 или PINC==0b1 ведь одно и тоже

вообще да.
 
 Top
1_ulyanovsk
Отправлено: 08 Ноября, 2009 - 17:39:31
Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  





nest пишет:
1_ulyanovsk пишет:
PINC==0b00000001 или PINC==0b1 ведь одно и тоже

вообще да.

Хорошо. Но я думаю я еденицу не формирую на входе.
 
 Top
VCOM Супермодератор
Отправлено: 08 Ноября, 2009 - 22:40:21
Post Id



Супермодератор


Сообщений всего: 658
Дата рег-ции: Март 2007  





Дак это... Надо чтоб было так
if ((PINC & 0b00000001)==0b00000001)
Воть... Имхо...
 
 Top
nest Администратор
Отправлено: 08 Ноября, 2009 - 22:51:58
Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  





VCOM, что то не понятно ... что это даст ? и ... что это за запись

я не тесно знаком с СИ, но если делать аналогично как в Шаг-за-Шагом:
if (PINC & (1<<PINC0)) // проверить "1" на PINC.0

может, прощще ещё так:
if (PINC0){
; чё нить выполняем...
}
 
 Top
VCOM Супермодератор
Отправлено: 08 Ноября, 2009 - 23:02:19
Post Id



Супермодератор


Сообщений всего: 658
Дата рег-ции: Март 2007  





Это логическое И. Т.е. маска. Эта конструкция нам говорит что нас интересует только PINC0... Все остальные мы не учитываем...
if (PINC & (1<<PINC0))
так то-же можно...
if (PINC0)... Так скорее всего нельзя... Скорее всего PINC0 объявлен как 0 PINC1 как 1 и т.д.
Тут от конкретного компилятора зависит...
(Добавление)
А если так будет написано...
if (PINC==0b00000001)
ну а остальные входы то куда подключены? Как DDRC настроен... DDRC = 0x00; Значит они все на вход настроены, они в воздухе болтаются... Поэтому ниче и не работает... А еще лучше подтягивающие резисторы включить и на 0 кнопку нажимать... Вот... Имхо как то так...
 
 Top
nest Администратор
Отправлено: 08 Ноября, 2009 - 23:35:40
Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  






if (PINC & (1<<PINC0))
интересно посмотреть, что там наваляет компилятор : )))

а как красиво это на асме:
sbic PORTC,0
или
sbis PORTC,0
 
 Top
VCOM Супермодератор
Отправлено: 08 Ноября, 2009 - 23:38:33
Post Id



Супермодератор


Сообщений всего: 658
Дата рег-ции: Март 2007  





А то! Умные ща компиляторы пошли Ж)))) Раньше бы он стал бы 1 сдвигать, потом pinc читать, потом сравнивать Ж))))
 
 Top
1_ulyanovsk
Отправлено: 09 Ноября, 2009 - 20:42:51
Post Id



Маршал


Сообщений всего: 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

int N;
N=0;

unsigned char DigNumber = 0;
unsigned char Dig[10];

int main(void)
{

DDRD = 0xff; // порт D- все ноги выходы
DDRC=0x00; // порт С- все ноги входы
PORTC=0x01; включаю на С0 подтягив. резистор

Dig[0] = (a+b+c+d+e+f);
Dig[1] = (b+c);
Dig[2] = (a+b+g+e+d);
Dig[3] = (a+b+g+c+d);
Dig[4] = (f+g+b+c);
Dig[5] = (a+f+g+c+d);
Dig[6] = (a+f+g+c+d+e);
Dig[7] = (a+b+c);
Dig[8] = (a+b+c+d+e+f+g);
Dig[9] = (a+b+c+d+f+g);

while(1)
{
if (PINC0) N=N+1; // проверяю еденицу на С0 (вход кстати инверсный ???)
PORTD=Dig[N]; // Посылаю на порт D перменную Dig ну и цифру на сегменты соотв.
if (N==10) N=0; // ограничиваю счет до девятки
}
}
КНОПКА заколдованая
Прикреплено изображение
58764654.JPG

(Отредактировано автором: 09 Ноября, 2009 - 20:43:30)

 
 Top
nest Администратор
Отправлено: 09 Ноября, 2009 - 20:48:48
Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  





вот и пойми с этим СИ
то ли проблема компилятора, то ли проблема своя "не туда соединили провод".

1_ulyanovsk, можете прошивочку(HEX) приклеить на форум ?
 
 Top
Страниц (17): В начало « ... 9 10 11 12 [13] 14 15 16 17 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown