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

порт D- atmega64L

Вт май 21, 2019 11:30:01

Приветствую!Прошу подсказать где поставить запятую, КАЗНИТЬ НЕЛЬЗЯ ПОМИЛОВАТЬ! Ну а по делу такая ситуация: не программируется порт D. ни DDRD ни PORTD. пишу стандартно DDRD=0xFF;отладчик останавливаю после команды, а там фиг,все как было.Хотел использовать TWI, подтянул резисторами к VCC, а там МК воще в аут уходит.на не подключённых выводах напряжение 2.8 В,на других портах по нолям... Проверил все порты, все Ок, а этот упёрся. Нет ли там каких-то секретов? в даташит ничего особенного не нашёл,все как обычно вроде.

Re: порт D- atmega64L

Вт май 21, 2019 13:10:52

А можно увидеть что получилось в ассемблере? Просто чтобы убедиться, что при Ваших параметрах/дефайнах компиляции Вы обращаетесь к адресу регистров порта D именно ATMega64/L, а не какой-то другой ATMega.

Re: порт D- atmega64L

Вт май 21, 2019 14:02:09

Порт работает как порт ежли не включены аппаратные модули.
Когда включен аппаратный модуль на соответствующих выводах порта работа в режиме порта отключается.
Бывают и нюансы - но то внимательно вычитывать надо как относительно самого порта, так и относительно используемого аппаратного модуля. В данном случае - похоже модуль TWI используется - следловательно смотрим описание работы его лапок.
8)

Re: порт D- atmega64L

Вт май 21, 2019 21:02:43

А можно увидеть что получилось в ассемблере? Просто чтобы убедиться, что при Ваших параметрах/дефайнах компиляции Вы обращаетесь к адресу регистров порта D именно ATMega64/L, а не какой-то другой ATMega.


это на С
Спойлер
Код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>



int main(void)
{
    DDRD=0xFF;
   PORTD=0x00;
   
    while (1)
    {
      PORTD=0xFF;
      _delay_ms(1000);
      PORTD=0x00;
      _delay_ms(1000);
      
    }
}


assembler code
Спойлер
Код:
00000044  JMP 0x00000050      Jump
--- ../../../../crt1/gcrt1.S ----------
00000046  CLR R1      Clear Register
00000047  OUT 0x3F,R1      Out to I/O location
00000048  SER R28      Set Register
00000049  LDI R29,0x10      Load immediate
0000004A  OUT 0x3E,R29      Out to I/O location
0000004B  OUT 0x3D,R28      Out to I/O location
0000004C  CALL 0x00000052      Call subroutine
0000004E  JMP 0x0000006A      Jump
00000050  JMP 0x00000000      Jump
--- C:\DATA_controller\test portD\test portD\Debug/.././main.c ----------
{
    DDRD=0xFF;
00000052  SER R24      Set Register
00000053  OUT 0x11,R24      Out to I/O location
   PORTD=0x00;
00000054  OUT 0x12,R1      Out to I/O location
      PORTD=0xFF;
00000055  OUT 0x12,R24      Out to I/O location
--- c:\program files\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\util/delay.h
   __builtin_avr_delay_cycles(__ticks_dc);
00000056  SER R18      Set Register
00000057  LDI R19,0x69      Load immediate
00000058  LDI R25,0x18      Load immediate
00000059  SUBI R18,0x01      Subtract immediate
0000005A  SBCI R19,0x00      Subtract immediate with carry
0000005B  SBCI R25,0x00      Subtract immediate with carry
0000005C  BRNE PC-0x03      Branch if not equal
0000005D  RJMP PC+0x0001      Relative jump
0000005E  NOP       No operation
--- C:\DATA_controller\test portD\test portD\Debug/.././main.c ----------
      PORTD=0x00;
0000005F  OUT 0x12,R1      Out to I/O location
--- c:\program files\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\util/delay.h
   __builtin_avr_delay_cycles(__ticks_dc);
00000060  SER R18      Set Register
00000061  LDI R19,0x69      Load immediate
00000062  LDI R25,0x18      Load immediate
00000063  SUBI R18,0x01      Subtract immediate
00000064  SBCI R19,0x00      Subtract immediate with carry
00000065  SBCI R25,0x00      Subtract immediate with carry
00000066  BRNE PC-0x03      Branch if not equal
00000067  RJMP PC+0x0001      Relative jump
00000068  NOP       No operation
00000069  RJMP PC-0x0014      Relative jump
--- No source file ----------
0000006A  CLI       Global Interrupt Disable
0000006B  RJMP PC-0x0000      Relative jump
0000006C  NOP       Undefined


Добавлено after 3 minutes 37 seconds:
В данном случае - похоже модуль TWI используется
не думаю
Вложения
Скриншот 21-05-2019 220711.jpg
(130.26 KiB) Скачиваний: 292

Re: порт D- atmega64L

Вт май 21, 2019 21:10:19

не знаю, как в новой студии, но в старой обновление "квадратиков" в окошке портов происходило на такт позже, чем реально должно было происходить.

Re: порт D- atmega64L

Вт май 21, 2019 21:26:55

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

Re: порт D- atmega64L

Вт май 21, 2019 21:51:22

ну, что он не переходит - это, вероятно, там задержка ваша отрабатывает кучу циклов... А вообще-то симптомы странные - ваш МК симулятором студии вообще поддерживается? или у вас "железный" отладчик показывает такие парадоксы?

Re: порт D- atmega64L

Вт май 21, 2019 22:05:39

там задержка ваша отрабатывает в куч циклов...
отладка до основного цикла дойти не может,все встает на конфигурации, до while

Добавлено after 1 minute 16 seconds:
или у вас "железный" отладчик показывает такие парадоксы
да, все это на железе

Добавлено after 1 minute 43 seconds:
ваш МК симулятором студии вообще поддерживается
в симуляторе все логично, проверял

Добавлено after 5 minutes 11 seconds:
вообще-то симптомы странные

так и быть, завтра буду выпаивать :solder: и :kill:

Re: порт D- atmega64L

Ср май 22, 2019 05:16:10

FUSE-бит M103C, который по умолчанию запрограммирован, как раз работает с портом D и, возможно, влияет. Программа скомпилированная - херь какая-то. Если есть
Код:
0000004C  CALL 0x00000052      Call subroutine
то должен быть и
Код:
RET

Спойлер
Код:
;22.05.2019

.include "m64Adef.inc"

.equ   Fo=8000000

.cseg

.org 0x000
RESET:
   LDI   ZH,HIGH($1FF)
   LDI   ZL,LOW($1FF)
   OUT   SPH,ZH
   OUT   SPL,ZL

;   LDI   R16,1<<JTD
;   OUT   MCUCSR,R16
GO:
   CLR   R1

   OUT   DDRA,ZL
   OUT   DDRB,ZL
   OUT   DDRC,ZL
   OUT   DDRD,ZL
   OUT   DDRE,ZL
   STS   DDRF,ZL
   STS   DDRG,ZL
TEST:
   RCALL   DEL_300ms
   OUT   PORTD,ZL
   RCALL   DEL_300ms
   OUT   PORTD,R1
   RJMP   GO
;***********************
DEL_300ms:
   LDI   R20,BYTE3(3*Fo/10/5)
   LDI   R21,BYTE2(3*Fo/10/5)
   LDI   R22,BYTE1(3*Fo/10/5)
DEL_GO:
   SUBI   R22,1
   SBCI   R21,0
   SBCI   R20,0
   BRNE   DEL_GO
   RET

.EXIT

Попробуйте, у меня на ATmega64A работает.
Проверил с запрограммированным M103C. Тоже работает.

Re: порт D- atmega64L

Ср май 22, 2019 05:47:36

FUSE-бит M103C

этот бит у меня сброшен, если его запрограммировать просто TWI не будет работает.

Добавлено after 9 minutes 8 seconds:
Попробуйте
попробую, как вариант. я все же грешу на сам микроконтроллер.

Re: порт D- atmega64L

Пн май 27, 2019 21:24:40

Приветствую!кажись я нашел причину аномалии со своим девайсом. Перепаял я свой камушек, пытаюсь в отладчике прошарить все порты,а там такая же беда, даже хуже....там уже половина портов ведет себя не адекватно.Да и сигнатура читается через раз...Кстати попытался прошить FLASH,получл ошибку верификации...Было очень неожиданно,очень надеялся на положительный результат.Давай думать че за хер...что только не перепробовал,ничего не помогает. Купил я эти камушки с китая, по очень дешевой цене, а в одном из отзыве пишут мол они Б/У.Вот блин,думаю может китайцы мне сурогат какой-то прислали. :write: сегодня решил после работы зайти за новым камушком,да и взял самый дорогой,надеюясь на его исправность. Собрал схему по минималке, а там все точно так же. Эта версия не подтвердилась,давай думать дальше....Наверное Студия глючит,давай сносить и заново переустанавливать.И снова в молоко....Пу уж собрался закинуть все куда подальше....и тут чет меня подтолкнуло поменять шлейф JTAG. хоть я и знал что правильно распинован и цел, т.к. прозванивал я его раза три точно. Подключил значит, и ОПА как по маслу читаю,пишу,отрабатывается все как надо.....что за фокус :oops: а фокуса никакого нет ,просто их длина раза в 4 отличалась.тот шлейф,который чуть не погубил все, был см 40,а тот который спас все-см 10.Но с таким коротким шлейфом работать не удобно,решил попробовать сделать около 20 см,начал пробовать полет нормальный...Столько времени и сил потратил,но доволен,что все таки решена эта задача.И снова я убедился,все проблемы оказывается на поверхности лежат, а не где-то в китае.... :tea:
Ответить