Слишком низкий уровень напряжения на INT0 у Tiny2313

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение YS »

:shock:

А топикстартер же говорил про CVAVR?

В WinAVR проблемы такого рода с EEPROM мне неизвестны. Объявление пре-инициализированной переменной с атрибутом EEMEM служит всего лишь командой создать допольнительный .eep-файл.

Пруф. Код:

Код: Выделить всё

#include <avr/io.h>
#include <stdint.h>
#include <avr/eeprom.h>

volatile uint8_t array[5] EEMEM = {1,2,3,4,5};

void main(void)
{
  while (1)
  {
  }
}
Дизассемблер:
Спойлер

Код: Выделить всё

+00000000:   C019        RJMP    PC+0x001A        Relative jump
+00000001:   C020        RJMP    PC+0x0021        Relative jump
+00000002:   C01F        RJMP    PC+0x0020        Relative jump
+00000003:   C01E        RJMP    PC+0x001F        Relative jump
+00000004:   C01D        RJMP    PC+0x001E        Relative jump
+00000005:   C01C        RJMP    PC+0x001D        Relative jump
+00000006:   C01B        RJMP    PC+0x001C        Relative jump
+00000007:   C01A        RJMP    PC+0x001B        Relative jump
+00000008:   C019        RJMP    PC+0x001A        Relative jump
+00000009:   C018        RJMP    PC+0x0019        Relative jump
+0000000A:   C017        RJMP    PC+0x0018        Relative jump
+0000000B:   C016        RJMP    PC+0x0017        Relative jump
+0000000C:   C015        RJMP    PC+0x0016        Relative jump
+0000000D:   C014        RJMP    PC+0x0015        Relative jump
+0000000E:   C013        RJMP    PC+0x0014        Relative jump
+0000000F:   C012        RJMP    PC+0x0013        Relative jump
+00000010:   C011        RJMP    PC+0x0012        Relative jump
+00000011:   C010        RJMP    PC+0x0011        Relative jump
+00000012:   C00F        RJMP    PC+0x0010        Relative jump
+00000013:   C00E        RJMP    PC+0x000F        Relative jump
+00000014:   C00D        RJMP    PC+0x000E        Relative jump
+00000015:   C00C        RJMP    PC+0x000D        Relative jump
+00000016:   C00B        RJMP    PC+0x000C        Relative jump
+00000017:   C00A        RJMP    PC+0x000B        Relative jump
+00000018:   C009        RJMP    PC+0x000A        Relative jump
+00000019:   C008        RJMP    PC+0x0009        Relative jump
+0000001A:   2411        CLR     R1               Clear Register
+0000001B:   BE1F        OUT     0x3F,R1          Out to I/O location
+0000001C:   EFCF        SER     R28              Set Register
+0000001D:   E0D2        LDI     R29,0x02         Load immediate
+0000001E:   BFDE        OUT     0x3E,R29         Out to I/O location
+0000001F:   BFCD        OUT     0x3D,R28         Out to I/O location
+00000020:   D002        RCALL   PC+0x0003        Relative call subroutine
+00000021:   C002        RJMP    PC+0x0003        Relative jump
+00000022:   CFDD        RJMP    PC-0x0022        Relative jump
@00000023: main
---- ee_test.c ------------------------------------------------------------------------------------
8:        {
+00000023:   CFFF        RJMP    PC-0x0000        Relative jump
+00000024:   94F8        CLI                      Global Interrupt Disable
+00000025:   CFFF        RJMP    PC-0x0000        Relative jump
Как видно, ничего в EEPROM не пишется. Зато в выходной папке появился .eep-файл следующего содержания:

Код: Выделить всё

:050000000102030405EC
:00000001FF
Его надо просто прошить в EEPROM.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18560
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение ARV »

YS писал(а):А топикстартер же говорил про CVAVR?
не так много страниц в теме, чтобы первый пост не прочесть:
JI0ku писал(а):Использую Atmel Studio 6.2 и Дудку 3.3.
и EEPROM в теме вроде как не фигурировала...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение YS »

:shock:

Господи! Я перепутал тему. Ну все, алярм. :facepalm: Похоже, старею...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение akl »

Может, банально, камень ресетится из-за недостаточного уровня 1 на лапе RESET.
Реклама
Эиком - электронные компоненты и радиодетали
JI0ku
Родился
Сообщения: 14
Зарегистрирован: Чт июн 18, 2015 17:43:47

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение JI0ku »

Вот так выглядит полный код. Вроде, цикл замкнут. Насчёт goto: никаких хлопот оператор не представляет, почему же его так не любят? Как же без него делать безусловные переходы? :dont_know:

Код: Выделить всё

#define F_CPU 1000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int s;
#define d1 PORTB |=_BV(2); PORTB |=_BV(0); PORTB &=~_BV(0); PORTB &=~_BV(2);
#define d0 PORTB |=_BV(0); PORTB &=~_BV(0);
#define lch PORTB |=_BV(1); PORTB &=~_BV(1);

ISR(INT0_vect) {
	cli();
	_delay_ms(10);
	if ((PIND&(1<<2))==0)
	{
		if (s>1)
		{
			s=0;
		} 
		else
		{
			s++;
		}
	}
	sei();
}

int main(void)
{
	s=0;
	DDRB=0b00000111;
	DDRD=0b11111011;
	PORTD=0b00000100;
	GIMSK=(1<<INT0);
	MCUCR=(0<<ISC00)|(1<<ISC01);
	sei();
	chk: switch (s) {
		case 0: goto plus;
		case 1: goto shest;
	}
	plus:
	while (1) {
		d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;d1;d1;d1;d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000);
		d1;d0;d0;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d0;d0;d1;lch;_delay_us(9000);
		d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;d1;d1;d1;d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000);
		d1;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000); goto chk;
	}
	shest:
	while(1){
		d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;lch;_delay_us(30000);
		d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;lch;_delay_us(3000);
		d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;lch;_delay_us(30000);
		d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;lch;_delay_us(3000); goto chk;
	}
}

Код: Выделить всё

	DDRD=0b11111011;
	PORTD=0b00000100;
Я, ведь, правильно понимаю? Эти строги делают PD2 входом и подтягивают к пину VCC через внутренний резистор?
Как выход пин работает отлично. SKOUT, повторюсь, отключен.

Reset подтянут.
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Jack_A »

JI0ku писал(а): Насчёт goto: никаких хлопот оператор не представляет, почему же его так не любят? Как же без него делать безусловные переходы? :dont_know:
Это паранойя адептов структурного программирования :) . Go to нормальный инструмент, если правильно его уметь готовить :) Тем более в результирующем коде аналогов этих самых goto, т.е. jmp, навалом в самой рас-про-структурной программе.
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Mishany »

запрещение прерывания в обработчике прерывания это зачем? и зачем еще раз проверять pd2? если сработало прерывание, то это и так означает, что было зафиксировано нажатие кнопки.
заведите доп переменную к примеру char и испульзуйте любой из 8 бит этой переменной для фиксации нажатия кнопки, т.е. если было нажатие кнопки - пишем в определенный бит 1, в прерывании добовляем условие если переменная = 0 устанавливаем бит в 1, далее в основной программе обрабатываем нажатие, выполняя какоето действие и сбрасываем бит в 0 по завершению обработки нажатия. в случае если кнопок больше чем 1, удобно проверять только одну переменную на равенство 0 на факт: а было ли зафиксировано нажатие одной из кнопок.....
и еще вроде бы подтяжка включается аппаратно в зависимости от настройки прерывания по инт0, т.к. у меня программка как раз так работала захватывая еденичные импульсы от датчика скорости по спаду запускаем счетчик и перенастраиваем прерывание сразу по фронту и ждем конца импульса... все отлично работало без подтяжек.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18560
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение ARV »

Это не код, это шедевр! Я такое вижу впервые!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Mishany »

это точно :)))
мне стало интересно что должна делать эта программа....
мне кажется она не заработает так как хочет ее автор, там организован какойто ногодрыг по всей видимости для имитации чего либо, но ногодрыг обычно привязан жестко к таймингам для работоспособности, но есть инт0 который все это портит, при нажатии на кнопку ногодрыг даст сбой.....
автор, напишите цель вашей проги какая?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение YS »

Насчёт goto: никаких хлопот оператор не представляет, почему же его так не любят?
Он ухудшает читаемость программы. И по вашей программе это отлично видно... Не надо превращать Си в ассемблер. Это все же разные языки. :wink:

К слову, мне за всю практику еще не встречался случай, когда я бы не мог обойтись без goto. Честно сказать, мне даже не встречалось случая, когда goto был бы уместен.
Как же без него делать безусловные переходы?
Вызовом функции.

Этот фрагмент кода совершенно безумен:
chk: switch (s) {
case 0: goto plus;
case 1: goto shest;
}
plus:
while (1) {
d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;d1;d1;d1;d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000);
d1;d0;d0;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d0;d0;d1;lch;_delay_us(9000);
d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;d1;d1;d1;d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000);
d1;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000); goto chk;
}
shest:
while(1){
d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;lch;_delay_us(30000);
d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;lch;_delay_us(3000);
d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;lch;_delay_us(30000);
d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;lch;_delay_us(3000); goto chk;
}
Тут есть два совершенно бесполезных цикла и бесполезный switch. По-человечески это можно переписать так:

Код: Выделить всё

while (1)
{
  if (s)
  {
    d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;lch;_delay_us(30000);
      d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;lch;_delay_us(3000);
      d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;lch;_delay_us(30000);
      d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;lch;_delay_us(3000);
  }
  else
  {
      d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;d1;d1;d1;d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000);
      d1;d0;d0;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d1;d0;d0;d1;lch;_delay_us(9000);
      d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;d1;d1;d1;d1;d1;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000);
      d1;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d0;d1;lch;_delay_us(9000)
  }
}
И зачем тут goto?

Не могу не вспомнить группу Madness. :)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Vga »

JI0ku писал(а):Насчёт goto: никаких хлопот оператор не представляет, почему же его так не любят?
Вот именно потому и не любят, что если новичкам вовремя не дать по рукам, они пишут такие программы, как ты.
JI0ku писал(а):Как же без него делать безусловные переходы?
Никак. Они не нужны. За очень редкими (раз лет в 5-10) исключениями, когда правильно примененный goto позволяет решить задачу красивее или эффективнее, чем средства структурного программирования. Но к этому моменту вопроса "почему goto не любят" уже не возникает.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18560
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение ARV »

YS писал(а):По-человечески это можно переписать так:
ну, ваш вариант тоже человеческим можно назвать с некоторой натяжкой... логичнее было бы все-таки эти дурацкие макросы в цикле делать, а не последовательностью.
ну и сами макросы - та еще песня.

пару слов про goto - честно говоря, я не знаю красивого решения проблемы выхода из switch наружу цикла, если не использовать goto. типа такой ситуации:

Код: Выделить всё

while (some_cond(str)){
   char s = *str++;
   switch(s){
   case 'a' : break;
   case 'b' : // вот тут надо выйти из цикла
   default:
      some_func(s);
   }
}
в очень редких случаях можно сделать более-менее красивое решение, но чаще с использованием goto будет намного компактнее, понятнее, красивее и логичнее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение YS »

ну, ваш вариант тоже человеческим можно назвать с некоторой натяжкой...
Ну, макросы я просто не трогал. :) Мое "по-человечески" относилось только к общей структуре программы.
я не знаю красивого решения проблемы выхода из switch наружу цикла, если не использовать goto.
Я бы завел дополнительную переменную (первое, что приходит в голову).

Код: Выделить всё

exit_flag=1;
while (some_cond(str) && exit_flag){
   char s = *str++;
   switch(s){
   case 'a' : break;
   case 'b' : // вот тут надо выйти из цикла
      exit_flag=0;
   break;
   default:
      some_func(s);
   }
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Mishany »

напоминает ТС бросил кость, а сам наблюдает чем дело закончиться.....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18560
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение ARV »

Mishany писал(а):напоминает ТС бросил кость, а сам наблюдает чем дело закончиться.....
бросая в воду камешки, смотри на круги, ими образуемые, иначе занятие твое будет простой забавой © К.Прутков :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение watchmaker »

К слову, мне за всю практику еще не встречался случай, когда я бы не мог обойтись без goto. Честно сказать, мне даже не встречалось случая, когда goto был бы уместен.
Я вообще не помню, чтобы где-то употреблял его, кроме GWBASIC...
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение B@R5uk »

Сколько писал на Паскале, на Си, в МАТЛАБе (а писал я везде помногу) никогда не использовал Goto. Только в ассемблере, и то только потому, что там нет ничего другого.
JI0ku
Родился
Сообщения: 14
Зарегистрирован: Чт июн 18, 2015 17:43:47

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение JI0ku »

Эт, конечно, всё хорошо, но вопрос-то состоял в другом. Мне интересно, почему на ножке INT0 1,17В вместо 5В.
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Rtmip »

JI0ku писал(а):...Мне интересно, почему на ножке INT0 1,17В вместо 5В.
Как вариант этот вывод уже неисправен, после того как был выходом и его через кнопку замыкали на землю.
Попробуйте INT1.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Слишком низкий уровень напряжения на INT0 у Tiny2313

Сообщение Mishany »

или как вариант низкое сопротивление тестера, т.к. внутренняя подтяжка имеет высокое сопротивление.
Ответить

Вернуться в «AVR»