Страница 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
Откуда оные (МК) поступают на рынок - Х/З...
Однако при работе и под ассемблером и под адурино-IDE в рамках разумного проблем нет.
Единичные случаи повреждений (примерно 1 из 10) касается выводов "двойного назначения" - по умолчанию используемых как системные ресурсы (reset, кварц)...
Детальная диагностика тестированием под ассемблером позволяет отсеять проблемные случаи.
Однако - затраты времени и тренаж мозга штука в подобных случаях обыденная.

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
Диагностику на уровне железных примитивов позволяет делать только ассемблер (уровень машинных команд).
Ибо там подразумевается АБСОЛЮТНО предсказуемое исполнение заданного теста.
С другой стороны делать сложные/большого объёма программы под ассемблером ЕСТЬ ВЕИКИЙ САДОМАЗОХИЗМ (коим иногда маюсь).

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
Надо отслеживать ерраты и аппноты на сайте производителя (с точностью до буковки названия и диапазона дат выпуска).
Там много интересного...
Только вот у АВРок определить принадлежность к конкретной подгруппе(ревизии) весьма сложно (в отличии от ПИКовых).

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"]Надо отслеживать ерраты и аппноты на сайте производителя (с точностью до буковки названия и диапазона дат выпуска).
Там много интересного...
Только вот у АВРок определить принадлежность к конкретной подгруппе(ревизии) весьма сложно (в отличии от ПИКовых).

[/uquote]
У мну английский хромает

не пинайте сильно

знаю что стыдоба...
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 писал(а):...
У мну английский хромает

не пинайте сильно

знаю что стыдоба...
Тогда поискать книги Евстифеева для освоения.
И какой-нить переводчик а-ля СОКРАТ(или гугль онлайн) для первоисточников.
Без инглиш (а в скором времени и ЧИНА) тяжко житие будеть...

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
Ассемблер "в чистом виде" и ассемблер под Си (ассемблерные вставки) весьма в "мелочах" отличаются!
(смотри документацию применяемого компилятора Си по правилам и правописанию вставок на ассемблере!)
Иногда настолько, что способны весьма сильно настроение подпортить.

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

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