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

Как у вас работают контроллеры/ардуины с АлиЭкспресс?

Работают без нареканий
14
61%
Иногда бывают непонятные баги
1
4%
Почти сразу выходят из строя
0
Нет ответов.
Покупаю контроллеры в проверенных местах
4
17%
Радиодетали с Али - шайтан эксперимент
4
17%
 
Всего голосов : 23

io_ports_atmega328

Пт мар 15, 2019 10:54:49

всем драсти;) значит надо мне было сделать КА (энкодер) для управления некоторыми параметрами. сделать то получилось, но ушел на это целый человекодень. камень был в том, что обработчик энкодера все время возвращал нажатую кнопку. кнопка висела между землей и пином порта. китайцы пожалели на платке энкодера распаять подтяжку на шину питания. когда начал копать что к чему сделал так:
Код:
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

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

Re: io_ports_atmega328

Пт мар 15, 2019 12:38:54

Главное самому понимать что ты (сам) делаешь.))) Обычно, у новичков во всём виноват компилятор. На втором месте китайские контроллеры.)))

Re: io_ports_atmega328

Пт мар 15, 2019 13:29:26

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

Re: io_ports_atmega328

Пт мар 15, 2019 14:04:41

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

Re: io_ports_atmega328

Пт мар 15, 2019 15:02:31

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

Re: io_ports_atmega328

Пт мар 15, 2019 21:49:12

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

Re: io_ports_atmega328

Сб мар 16, 2019 04:22:50

На ассемблере все делается проще. :)
По вопросу. Попробуйте сбросить 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

На си макрос cli(); запрещает глобальные прерывания.. наверное так же и для сторожевого таймера прокатит. Пойду пробовать .

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

Re: io_ports_atmega328

Сб мар 16, 2019 08:11:42

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

Re: io_ports_atmega328

Сб мар 16, 2019 08:19:50

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

Re: io_ports_atmega328

Сб мар 16, 2019 08:50:00

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

Добавлено after 3 minutes 29 seconds:
Надо отслеживать ерраты и аппноты на сайте производителя (с точностью до буковки названия и диапазона дат выпуска).
Там много интересного...
Только вот у АВРок определить принадлежность к конкретной подгруппе(ревизии) весьма сложно (в отличии от ПИКовых).
:twisted:

У мну английский хромает :cry: не пинайте сильно :facepalm: знаю что стыдоба...

Re: io_ports_atmega328

Сб мар 16, 2019 09:37:04

Ваш код на асм
Спойлер
Код:
.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

bafomet911 писал(а):...
У мну английский хромает :cry: не пинайте сильно :facepalm: знаю что стыдоба...

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

Re: io_ports_atmega328

Сб мар 16, 2019 12:54:58

Ваш код на асм
Спойлер
Код:
.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


Изображение
ниче се разница в размере скомпилином....
для си:

Спойлер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:
Ваш код на асм
Спойлер
Код:
.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 17:02:39

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

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

Добавлено 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

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

Re: io_ports_atmega328

Сб мар 16, 2019 22:36:39

Спасибо за указанное направление :) возьму на вооружение.

Re: io_ports_atmega328

Чт мар 21, 2019 16:51:43

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