Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 12:13

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:04 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
Даже не знаю, как эту ситуацию и описать, но попробую. Два дня подряд не могу элементарно опросить кнопку. При том, опыт в программировании AVR имею.
Итак, дано:

Программатор AVR ISP MKII(клон, есс-но);
Плата Ардуино Нано ATMega328p;
PORTC0 светодиод с ноги на массу;
PORTC1 светодиод с ноги на массу;
PORTC3 кнопка с ноги на массу;
PORTC5 светодиод с ноги на массу.

Пишу код в Студии:
Код:
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
   DDRC=0b00100011;
   PORTC=0b00001000;
   
    while(1)
    {      
         if ((PORTC&(1<<PORTC3))==0)
         {
            PORTC |=(1<<(PORTC0));
            PORTC &=~(1<<(PORTC1));         
         }
         else
         {
            PORTC |=(1<<(PORTC1));
            PORTC &=~(1<<(PORTC0));            
         }

    }
}


И нифига не работает в железе. В дебагере в симуляторе студии работает без проблем. Снимаешь/ставишь бит 3 и выполнение ходит по обоим веткам if-else. Заливаю в железо, борода. Для проверки платы, железа, питания и прочего открываю CVAVR и пишу следующий код:
Код:
#include <mega328p.h>
void main(void)
{
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
DDRC=(0<<DDC6) | (1<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (1<<DDC0);
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (1<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
DIDR1=(0<<AIN0D) | (0<<AIN1D);
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

while (1)
      {
      if(PINC.3==0){
        PORTC.0=1;
        PORTC.1=0;
      }
      else{
        PORTC.0=0;
        PORTC.1=1;
      }

      }
}



Вся эта гора инициализации генерится визардом CVAVR.

Далее, начинаю дебажить с помощью дополнительного светодиода. Вешаю его на PORTC5 к массе и начинаю его прописывать в разные ветки if-else.
Код:
PORTC |=(1<<(PORTC5));   

И вот тут открывается, что ни при каких условиях выполнение не идёт в ветку true. Как я только не переписывал условие if. Я таких масок напридумывал, и с константами, и с дефайнами, и просто по истине выражения, без приравнивания к нолю или единице-всяко разно. Но неизменно одно-в ветку true выполнение в железе не заходит, в симуляторе запросто. Вольтметром тыкал, кнопка работает, и с прошивкой от кодевижена железо работает.
Железо исправно, проверено CVAVR. У меня идеи кончились.

Вложение:
Screenshot_1.jpg
Screenshot_1.jpg [ 33.55 Кб | Просмотров: 412 ]


Вложение:
Screenshot_2.jpg
Screenshot_2.jpg [ 34.22 Кб | Просмотров: 412 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:37 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
АЦП компаратор (бит ACD в ACSR) выключите.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:44 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
NStorm писал(а):
АЦП компаратор (бит ACD в ACSR) выключите.


Код:
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


Мимо, не работает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:47 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
Код:
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);


И компаратор явно отключил, тоже борода


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:57 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
if ((PORTC&(1<<PORTC3))==0) -> if (!(PINC & (1<<PINC3)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:58 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
Код:
ACSR &=~(1<<ACD);


И так отключил, всё равно в железе болт


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 15 янв 2020, 23:59 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Вы читаете из PORT, а надо из PIN. Выше написал. А в CVAVR правильно читаете c PIN.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 16 янв 2020, 00:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
NStorm писал(а):
if ((PORTC&(1<<PORTC3))==0) -> if (!(PINC & (1<<PINC3)))


А вот так работает, независимо от состояния АЦП и компаратора. И в чём прикол?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 16 янв 2020, 00:01 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
NStorm писал(а):
Вы читаете из PORT, а надо из PIN. Выше написал. А в CVAVR правильно читаете c PIN.


Согласен, втупил. А почему в симуляторе работает как часы???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 16 янв 2020, 00:19 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Потому что в симуляторе нет физических портов. Их состояние не меняется, что привело бы к изменению буферного входного регистра PIN. А вы ручками сами меняете выходной регистр PORT, вот и работает. Хотя в режиме пина на вход биты в PORTC переключают подтяжку (pull-up), и соотв. при чтении её же и возвращают. В железе вы раз включили подтяжку и бит всегда 1. А в симуляторе вы ручками бит меняете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 16 янв 2020, 00:39 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 мар 2014, 18:01
Сообщения: 149
NStorm писал(а):
Потому что в симуляторе нет физических портов...А в симуляторе вы ручками бит меняете.


Огромное Вам человеческое спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк AVR Studio
СообщениеДобавлено: 16 янв 2020, 12:21 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Да и еще, я неспроста посоветовал поменять конструкцию вида ((PORTC&(1<<PORTC3))==0) на ([b]![b](PORT...). Уже видел, как потом люди меняли по ошибке с ==0 на ==1, чего никогда не будет для пина, отличного от Px0. Поэтому лучше ! ставить или не ставить.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB