Страница 1 из 2

io_ports_atmega328

Добавлено: Пт мар 15, 2019 10:54:49
bafomet911
всем драсти;) значит надо мне было сделать КА (энкодер) для управления некоторыми параметрами. сделать то получилось, но ушел на это целый человекодень. камень был в том, что обработчик энкодера все время возвращал нажатую кнопку. кнопка висела между землей и пином порта. китайцы пожалели на платке энкодера распаять подтяжку на шину питания. когда начал копать что к чему сделал так:

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

int main(void)
{
DDRD = 0b00000000;
PORTD = 0b11111111;
DDRB = 0b11111111;
PORTB = 0b00000000;
while(1)
if(PIND==0)
{
PORTB=1;
_delay_ms(300);
PORTB=0;
_delay_ms(300);
}
}
Кнопка на нулевом пине порта D, светилка на нулевом пине порта B. и вот тут меня пожидал сюрприз, кнопка отпущена, а светилка моргает.(светилка реагирует только на высокий уровень). дальше взял резистор 10к и подтянул кнопку к шине питания. о чудо, все заработало. но пытливый ум рукам покоя не дал. начал пробовать различные комбинации инициализации портов. каково же было мое удивление, когда контроллер продолжил работать даже когда порт кнопки инициализирован на выход, а порт светилки на вход. одним словом контроллер не реагировал на изменения регистров ddrx, даже когда я полностью закоментировал инициализацию портов, все продолжило работать. мультиметром был установлен низкий уровень на портах подтянутых внутренним резистором, правдо после сброса низкий уровень появлялся не сразу а через 3-8 секунд. проверил остальные атмеги мои. плата ардуино уно, плата ардуино промини и атмега в дип корпусе на макетке беспаечной показали одинаковый результат. (в среде менял девайсы- atmega328 и atmega328p, без изменений) важный момент-все мои атмеги с индексом p,были куплены в разное время на алиэкспрес. программатор usbisp оттуда же. среда - atmelstudio 7 с оф. сайта. теперь вопрос как можно выяснить что виновато в таком косяке, софт или железо? или может так и должно быть?

Re: io_ports_atmega328

Добавлено: Пт мар 15, 2019 12:15:12
BOB51
Откуда оные (МК) поступают на рынок - Х/З...
:dont_know:
Однако при работе и под ассемблером и под адурино-IDE в рамках разумного проблем нет.
Единичные случаи повреждений (примерно 1 из 10) касается выводов "двойного назначения" - по умолчанию используемых как системные ресурсы (reset, кварц)...
Детальная диагностика тестированием под ассемблером позволяет отсеять проблемные случаи.
Однако - затраты времени и тренаж мозга штука в подобных случаях обыденная.
8)

Re: io_ports_atmega328

Добавлено: Пт мар 15, 2019 12:38:54
OKF
Главное самому понимать что ты (сам) делаешь.))) Обычно, у новичков во всём виноват компилятор. На втором месте китайские контроллеры.)))

Re: io_ports_atmega328

Добавлено: Пт мар 15, 2019 13:29:26
bafomet911
Спасибо за указанное направление. Давно хожу вокруг ассемблера.. но как то страшно исходники выглядят. За информацию по служебным пинам отдельное спасибо:) тоже попадалось.

Re: io_ports_atmega328

Добавлено: Пт мар 15, 2019 14:04:41
Ivanoff-iv
а почему сразу ассемблер?
если для того, чтобы узнать, как контроллер работает, то скачай алгоритм билдер - практически тотже ассемблер (тот же уровень) но ИМХО в освоении проще...
я бы посоветовал просто отказаться от ардуиновской надстройки и перейти на Си, а потом уже и сам поймешь в какую сторону идти. (может даже и обратно к ардуине :) за библиотеками...)

Re: io_ports_atmega328

Добавлено: Пт мар 15, 2019 15:02:31
BOB51
Диагностику на уровне железных примитивов позволяет делать только ассемблер (уровень машинных команд).
Ибо там подразумевается АБСОЛЮТНО предсказуемое исполнение заданного теста.
8)
С другой стороны делать сложные/большого объёма программы под ассемблером ЕСТЬ ВЕИКИЙ САДОМАЗОХИЗМ (коим иногда маюсь).
:twisted:

Re: io_ports_atmega328

Добавлено: Пт мар 15, 2019 21:49:12
bafomet911
Вот иногда очень надо приблизиться к уровню машинных команд... Именно ассемблер мне теперь интересен. В дуиновских библиотеках итак алгоритмы и реализации КА подглядывают, чего тут греха таить. Пока только си больше всего и использую. В дуине регистры DDRX и PORTX обычно не юзают. Так же сдается мне что на асм лучше можно реализовывать драйверы устройств.. дисплей там или ещё чего. Чтоб больше места свободного под основной код оставалось.. поправьте если ошибаюсь. Часто приходится реализовывать кон. Автоматы.

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 04:22:50
akl
На ассемблере все делается проще. :)
По вопросу. Попробуйте сбросить WDT

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

; Turn off global interrupt
	cli
; Reset Watchdog Timer
	wdr

	CLR	R15
	OUT	MCUSR,R15
; Start timed sequence
	LDI	R16,1<<WDCE|1<<WDE
	STS   WDTCSR, r16
	CBR	R16,1<<WDE
	STS	WDTCSR,R16

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 07:49:42
bafomet911
На си макрос cli(); запрещает глобальные прерывания.. наверное так же и для сторожевого таймера прокатит. Пойду пробовать .

Добавлено after 40 minutes 53 seconds:
Полчаса с вашим кодом разбирался.. вы мой код переписали на асм!? Я правильно понял?

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 08:11:42
akl
Нет, это программный запрет работы WDT. Просто, в конце прошлого года пришла партия ATmega168PAс разрешенным WDT, хотя FUSE-бит WDTON был незапрограммирован, собака работала и сбрасывала камень. DS по этому поводу блеет что-то невнятное. Пришлось программно запрещать работу собаки.

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 08:19:50
BOB51
Надо отслеживать ерраты и аппноты на сайте производителя (с точностью до буковки названия и диапазона дат выпуска).
Там много интересного...
Только вот у АВРок определить принадлежность к конкретной подгруппе(ревизии) весьма сложно (в отличии от ПИКовых).
:twisted:

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 08:50:00
bafomet911
Спасибо.... Вон оно как получается.. блин, на асм оказывается каждый раз надо вектор прерываний и размер памяти вначале кода писать... Пока темный лес, но увидел те же регистры ddr port pin. Самое главное узнал что эти регистры имеют адреса, которые вбиты в подключаемом файле инициализации. Эти же адреса видел в даташитах на контроллер. Т.е. я уже рядом с разгадкой тайны внутреннего резистора подтяжки. Собаку запретил в проэкте теста на си, без изменений.. мучаю асм. Сверяю адреса регистров в файлах инициализации с даташитом. Интересно жуть как.:)

Добавлено after 3 minutes 29 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=3592553#p3592553"]Надо отслеживать ерраты и аппноты на сайте производителя (с точностью до буковки названия и диапазона дат выпуска).
Там много интересного...
Только вот у АВРок определить принадлежность к конкретной подгруппе(ревизии) весьма сложно (в отличии от ПИКовых).
:twisted:[/uquote]
У мну английский хромает :cry: не пинайте сильно :facepalm: знаю что стыдоба...

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 09:37:04
akl
Ваш код на асм
Спойлер

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

.include "m328pdef.inc"

.equ	Fo=1000000

.org	0
	RJMP	START

START:
	ldi XL,low(RAMEND) 	;
	ldi XH,high(RAMEND)	;
	out SPH, XH		; 
	out SPL, XL		;загрузить стек 
					
; Turn off global interrupt
	cli
; Reset Watchdog Timer
	wdr

	CLR	R15
	OUT	MCUSR,R15
; Start timed sequence
	LDI	R16,1<<WDCE|1<<WDE
	STS   WDTCSR, r16
	CBR	R16,1<<WDE
	STS	WDTCSR,R16

GO:
	SER	R16
	OUT	DDRB,R16
	OUT	PORTB,R15
	OUT	PORTD,R16

	SBIC	PIND,0
	RJMP	PC-1

	OUT	PORTB,R16

	RCALL	DEL_300ms

	OUT	PORTB,R15

	RCALL	DEL_300ms

	RJMP	GO
;****
DEL_300ms:
	LDI	R20,BYTE3(300*Fo/1000/5)
	LDI	R21,BYTE2(300*Fo/1000/5)
	LDI	R22,BYTE1(300*Fo/1000/5)
WAIT_DEL:
	SUBI	R22,BYTE1(1)
	SBCI	R21,BYTE2(1)
	SBCI	R20,BYTE3(1)
	BRNE	WAIT_DEL

	RET
;****
.EXIT

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 09:42:20
BOB51
bafomet911 писал(а):...
У мну английский хромает :cry: не пинайте сильно :facepalm: знаю что стыдоба...
Тогда поискать книги Евстифеева для освоения.
И какой-нить переводчик а-ля СОКРАТ(или гугль онлайн) для первоисточников.
Без инглиш (а в скором времени и ЧИНА) тяжко житие будеть...
:beer:

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 12:54:58
bafomet911
[uquote="akl",url="/forum/viewtopic.php?p=3592604#p3592604"]Ваш код на асм
Спойлер

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

.include "m328pdef.inc"

.equ	Fo=1000000

.org	0
	RJMP	START

START:
	ldi XL,low(RAMEND) 	;
	ldi XH,high(RAMEND)	;
	out SPH, XH		; 
	out SPL, XL		;загрузить стек 
					
; Turn off global interrupt
	cli
; Reset Watchdog Timer
	wdr

	CLR	R15
	OUT	MCUSR,R15
; Start timed sequence
	LDI	R16,1<<WDCE|1<<WDE
	STS   WDTCSR, r16
	CBR	R16,1<<WDE
	STS	WDTCSR,R16

GO:
	SER	R16
	OUT	DDRB,R16
	OUT	PORTB,R15
	OUT	PORTD,R16

	SBIC	PIND,0
	RJMP	PC-1

	OUT	PORTB,R16

	RCALL	DEL_300ms

	OUT	PORTB,R15

	RCALL	DEL_300ms

	RJMP	GO
;****
DEL_300ms:
	LDI	R20,BYTE3(300*Fo/1000/5)
	LDI	R21,BYTE2(300*Fo/1000/5)
	LDI	R22,BYTE1(300*Fo/1000/5)
WAIT_DEL:
	SUBI	R22,BYTE1(1)
	SBCI	R21,BYTE2(1)
	SBCI	R20,BYTE3(1)
	BRNE	WAIT_DEL

	RET
;****
.EXIT
[/uquote]

Изображение
ниче се разница в размере скомпилином....
для си:
СпойлерunOutputFileVerifyTask"
Program Memory Usage : 344 bytes 1,0 % Full
Data Memory Usage : 2 bytes 0,1 % Full
Done executing task "RunOutputFileVerifyTask".
Добавлено after 15 minutes 11 seconds:
уряяяяяяя!!! коректно все без внешнего резистора подтяжки!!!! АСМ Сцуко Сила Великая!!!! И я ею хочу овладеть!!! Путь Джедая вибираю одако я:)
СпойлерИзображение
Вывод-
1)косяк атмел студии!
2)китай атмеги имеют место быть:)

Всем добра!!!

Добавлено after 1 minute 38 seconds:
[uquote="akl",url="/forum/viewtopic.php?p=3592604#p3592604"]Ваш код на асм
Спойлер

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

.include "m328pdef.inc"

.equ	Fo=1000000

.org	0
	RJMP	START

START:
	ldi XL,low(RAMEND) 	;
	ldi XH,high(RAMEND)	;
	out SPH, XH		; 
	out SPL, XL		;загрузить стек 
					
; Turn off global interrupt
	cli
; Reset Watchdog Timer
	wdr

	CLR	R15
	OUT	MCUSR,R15
; Start timed sequence
	LDI	R16,1<<WDCE|1<<WDE
	STS   WDTCSR, r16
	CBR	R16,1<<WDE
	STS	WDTCSR,R16

GO:
	SER	R16
	OUT	DDRB,R16
	OUT	PORTB,R15
	OUT	PORTD,R16

	SBIC	PIND,0
	RJMP	PC-1

	OUT	PORTB,R16

	RCALL	DEL_300ms

	OUT	PORTB,R15

	RCALL	DEL_300ms

	RJMP	GO
;****
DEL_300ms:
	LDI	R20,BYTE3(300*Fo/1000/5)
	LDI	R21,BYTE2(300*Fo/1000/5)
	LDI	R22,BYTE1(300*Fo/1000/5)
WAIT_DEL:
	SUBI	R22,BYTE1(1)
	SBCI	R21,BYTE2(1)
	SBCI	R20,BYTE3(1)
	BRNE	WAIT_DEL

	RET
;****
.EXIT
[/uquote]

огромное спасибо за код на асм!!

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 17:02:39
Dimon456
bafomet911 писал(а):АСМ Сцуко Сила Великая!!!! И я ею хочу овладеть!!! Путь Джедая вибираю одако я:)
bafomet911 писал(а):Вывод-
1)косяк атмел студии!
Может для начало стоило разобраться?
Спойлер

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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/wdt.h>

int main(void)
{
DDRD = 0b00000000;
PORTD = 0b11111111;
DDRB = 0b11111111;
PORTB = 0b00000000;

  	wdt_enable(WDTO_2S);
	wdt_reset();

while(1) 
   {
		//if(PIND==0)
		if((PIND & (1<<(0))) == 0)
		{
			PORTB=1;
			_delay_ms(300);
			PORTB=0;
			_delay_ms(300);
		}

	wdt_reset();
  }
}
или так
Спойлер

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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void)
{
DDRD = 0b00000000;
PORTD = 0b11111111;
DDRB = 0b11111111;
PORTB = 0b00000000;
	
	cli();

	asm volatile ("wdr");
		
	MCUSR = 0x00;
	WDTCSR = 1<<WDCE|1<<WDE;
	WDTCSR &= ~(1<<WDE);

while(1) 
   {
		//if(PIND==0)
		if((PIND & (1<<(0))) == 0)
		{
			PORTB=1;
			_delay_ms(300);
			PORTB=0;
			_delay_ms(300);
		}

  }
}

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 18:27:42
bafomet911
Завтра домой прибуду когда я, испробовать непременно придется:) асм сила светлая ещё как минимум по двум причинам.. меньше флеша занимаем, работаем быстрее-предсказуемее.. даже аврдудка почему-то шьёт быстрее.. наверное из-за разницы в размере хекс файла.

Добавлено after 52 minutes 15 seconds:
На асм коде то собаку не вырубали... И все жило как положено. Планирую посмотреть io.h .. найти там адреса регистров и проверить их на соответствие дата шиту. Си надо приводить в порядок, ибо на нем мне удобнее основную программулину писать. А на асме хочу попробовать драйвера делать.. как то так. Щас в любых моих исходниках структура такая:
main.c
main.h
железка_1.с
железка_1.h
железка_2.с
железка_2.h
В каждом хедере железок прототипы только на функции, которые вызываются из майн.с
Так и планирую в дальнейшем делать. Только файлы драйверов планирую реализовать на асм. Правдо с ним для начала надо разобраться.. и ещё пока не представляю как код си общается с кодом асм..

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 22:27:39
BOB51
Ассемблер "в чистом виде" и ассемблер под Си (ассемблерные вставки) весьма в "мелочах" отличаются!
(смотри документацию применяемого компилятора Си по правилам и правописанию вставок на ассемблере!)
Иногда настолько, что способны весьма сильно настроение подпортить.
8)

Re: io_ports_atmega328

Добавлено: Сб мар 16, 2019 22:36:39
bafomet911
Спасибо за указанное направление :) возьму на вооружение.

Re: io_ports_atmega328

Добавлено: Чт мар 21, 2019 16:51:43
afz
BOB51 писал(а):Тогда поискать книги Евстифеева для освоения.
У Ди Халта неплохой учебник по асму. Спросить у Яндекса "di halt avr. учебный курс", первая же ссылка.