Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Новый вопрос возник.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
Написал программу для Avr MEGA 8, которая занимается тем, что следит за состоянием кнопки на ножке PORTC.0 (ножка - кнопка - Vcc) и если кнопка нажата, то загорается диод, подключенный к ножке PORTB.0. Вся проблема в том, что ISIS напрочь отказывается выполнять программу, т.е. вне зависимости от того, нажата кнопка, или нет, светодиод либо горит либо нет (в зависимости от начальных условий). Бъюсь уже ап стену, но не помогает, может вы поможете?
Вот исходник:


/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.5 Standard
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project :
Version :
Date : 18.03.2005
Author : ps1x
Company : ccc
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

for (;;)

{
while (PORTC.0 & 0);
{
PORTB.0=0;
while (PORTC.0 & 1);
{
PORTB.0 = 1;
}
}
}
defunct
Код
for(;;)
{
   if (PC0)   // или PORTC.0
      PORTB.0 = 1;
   else
      PORTB.0 = 0;
}


Если кнопка замыкает пин порта с GND и отсутствует pull-up резистор, то необходимо сперва подключить внутренний pull-up резистор:

Код
PORTC.0 = 1; // Подключаем внутренний pull-up резистор
for(;;)
{
   if (PC0)   // или PORTC.0  
      PORTB.0 = 1;
   else
      PORTB.0 = 0;
}
ps1x
Не работает :____((
defunct
Цитата(ps1x @ Mar 18 2006, 04:55) *
Не работает :____((

Дык кнопку с GND соедините и см. второй вариант кода с внутренним pull-up.
ps1x
Приложил рисунок для ясности дела.
Еще, может быть дело в симуляторе? или в CVAVR?


Рисунок в момент работы симулятора, второй вариант тоже пробовал, однако не помогло...

Еще настораживает момент, что (см рисунок) ярлычки рядом с кнопкой и на МК красные (на них Vcc???), хотя прошивка залита с 0 на всех разьемах порта C...
defunct
Симулятор это дело десятое.. Как вы на нем нажатие кнопки эмулируете?
Прикрепил картинку с типовой схемой включения кнопки.
ps1x
Нажатие на кнопку симулирую просто - нажимаю на нее (т.е. кликаю, при этом изображение кнопки меняется и цветные ярлычки тоже, значит вроде бы меняется напряжение на соответствующей ножке).
Такой вариант подключения тоже не сработал angry.gif sad.gif ohmy.gif
defunct
Цитата(ps1x @ Mar 18 2006, 05:30) *
Такой вариант подключения тоже не сработал angry.gif sad.gif ohmy.gif

Абаждите, а в CV часом порты не разнесены?
регистр ввода - PINX
регистр вывода - PORTX
ps1x
УРАААААААААА!!!!!!!!! ОГРОМНЕЙШЕЕ СПАСИБО!!!!!! Действительно порты разнесены )))) правда я об этом не знал... (( чтож учиться учиться и еще раз учиться!
defunct
Цитата(ps1x @ Mar 18 2006, 05:44) *
Действительно порты разнесены )))) правда я об этом не знал... (( чтож учиться учиться и еще раз учиться!

Дык, а я с определениями портов в CV не знаком т.к. с ним не работал.. Понадеялся, что ваш код был изначально правильный. wink.gif
Ну зато теперь кнопку включите по типовой схеме..
MakFatum
не могу понять, что значит разнесены порты?...
я тоже CVavr пользуюсь...
SpyBot
Цитата(MakFatum @ Mar 18 2006, 10:51) *
не могу понять, что значит разнесены порты?...
я тоже CVavr пользуюсь...

Это значит, что чтобы вывести значение в порт надо написать PORTx, а чтобы считать значение - PINx.
MakFatum
ага, понятно....просто термин "разнесены" сбил с толку...
Вот вопрос по синтаксису...

for (;;)

вот это в скобках (;;) - что обозначает?...
Попробую догадаться: Бесконечный цикл?
AVR
Цитата(MakFatum @ Mar 18 2006, 15:48) *
Вот вопрос по синтаксису...
for (;;)
вот это в скобках (;;) - что обозначает?...
Попробую догадаться: Бесконечный цикл?

Да, это бесконечный цикл. Ведь в for первое это начальное значение, второе условие выхода из цикла, третье - выражение, которое выполняется в конце каждого цикла. т.к. ничего не укаазно, то значит и выхода из цикла не будет.
Сам лично предпочитаю while(true), красивее смотрится... smile.gif
beer_warrior
Цитата
Сам лично предпочитаю while(true), красивее смотрится... smile.gif

Красиво конечно, но как правило не оптимально, будут лишние операторы.
До jmp label компилируется именно for (;;)
Old1
Цитата(defunct @ Mar 18 2006, 07:40) *
Абаждите, а в CV часом порты не разнесены?
регистр ввода - PINX
регистр вывода - PORTX

Причем здесь CV или какой другой компилятор? Это в AVR порты разнесены, и какой компилятор не используй если нужно вывести данные через порт - пишем в PORTX, если нужно прочитать уровни на выводах порта - читаем PINX. Или нет?
defunct
Цитата(Old1 @ Mar 19 2006, 16:50) *
Цитата(defunct @ Mar 18 2006, 07:40) *

Абаждите, а в CV часом порты не разнесены?
регистр ввода - PINX
регистр вывода - PORTX

Причем здесь CV или какой другой компилятор? Это в AVR порты разнесены, и какой компилятор не используй если нужно вывести данные через порт - пишем в PORTX, если нужно прочитать уровни на выводах порта - читаем PINX. Или нет?

Да все так, позор мне, что сразу не заметил этой ошибки, да еще и ввел в заблуждение уважаемую публику. Конечно это в AVR порты физически разнесены. Только C настолько могучий язык, что можно всякого нагородить, как например реализованы свойства в классах (при записи можно обращаться к одному полю, а при чтении к совершенно другому).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.