Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Оживляем МК

Сообщений 1 страница 15 из 15

1

Andrusha написал(а):

А генератор уже выпаяли? Без него перпрограммировать фьюзы не получится.

Выпаял. Проверил, что gps ожил. Пальцем прижал к плате и начал менять фьюзы.

Andrusha написал(а):

В даташите всё прописано. Чем программируете?

UsbAsp через баском. Шил всегда через Sinaprog, но что то фьюзы на этой тиньке ей неподвластны.
Причём баском предлагает много вариантов из серии 000010, 100010 и т.д. Чем отличаются не понял, разбираться поленился, начал перебирать. В итоге связь программатор - тинька пропала. Причём, тинька что то делает, зажигает светодиод, но медленно. Дальше заморачиваться не стал. Поздно было уже. Потом поэкспериментирую...

Andrusha написал(а):

Когда игрался с Nextion, UART устойчиво работал на скорости до 115200, именно от внутреннего осциллятора 8МГц, выше уже шли глюки. Правда контроллер М168р.

Я тоже долго пользовался uart от внутренней цепочки, без кварца. Много МК стабильно работало, а один всю кровь свернул.

0

2

Nec написал(а):

Шил всегда через Sinaprog

Попробуйте AVRDUDEPROG. Мне эта оболочка нравится намного больше Синапроги. Все фьюзы как на ладони, нужно только убрать/поставить нужные галочки и запрограммировать.
https://forumupload.ru/uploads/0000/25/b8/1743/t199945.jpg

Отредактировано Andrusha (2023-09-01 08:40:23)

0

3

Andrusha написал(а):

Попробуйте AVRDUDEPROG

Попробовал. Не распознаётся. Труп)

0

4

Nec написал(а):

Не распознаётся. Труп

Это с впаянным генератором? Без внешнего тактирования так и будет.

0

5

Это не разобрался в AvrDude) и с впаяным и без впаяного генератора одинаково. До этого без генератора распознался всеми прогами. А теперь и моргать почему то перестало. Хз что натыкал....
Пусть уже покоится с миром. Итак я его измучал) как будет интересно освоить ВВ программаторы, вернусь к этому вопросу. Сейчас лучше новую плату подыскать с обычным кварцем, дешевую и без заморочек. Глаз пал на ардуино про мини. Но вполтора раза дороже 88ой...

Отредактировано Nec (2023-09-01 20:15:53)

0

6

Nec написал(а):

Сейчас лучше новую плату подыскать с обычным кварцем

А самому ручками сделать?

0

7

Забавно то, что рассыпуха в Китае стоит дороже готовых плат.
Было дело, хотел с психу вытравить двухслойную с полигонами и землёй. Приценивался на  мегу8. Мк 100р, кварц и прочие мелочи ещё около 20р. Плюс текстолит, плюс время. Про мини на 168ой меге стоит 160р. Те же деньги без заморочек и двукратный запас памяти. Смысл?

Отредактировано Nec (2023-09-02 10:06:02)

0

8

Nec написал(а):

Не распознаётся. Труп)

Почитал даташит, раздел "параллельное программирование", взял вторую такую же рабочую плату и проводами запаял Франкенштейна) DC-DC на 12В давал питание на ногу ресет пациента. 5В питание брал с порта МК-программатора. Важно было ногу ресет прижать к земле, подать питание на программатор, а потом ,через некоторое время, подать 12В. Выручил простой переключатель, который щелкал вручную. Стандартные фьюзы подглядел в даташите. Тинька ожила без кварца)))
Оставлю код тут. Может быть кому-нибудь пригодится...

HVPP программатор

$regfile = "attiny88.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 64

Config Submode = New

'======================================== Константы ==============================================
'значения нужных нам фьюзов
Const High_fuse_write = &B1101_1111
Const Low_fuse_write = &B1110_1110
Const Extended_fuse_write = &B1111_1111
'команды
Const Cmd_write_fuse = &B0100_0000
Const Cmd_erase_chip = &B1000_0000
Const Cmd_read_signature = &B0000_1000
Const Cmd_read_fuse = &B0000_0100

'======================================= Переменные ==============================================
Dim Signature As Dword                                      'сигнатура. по ней.можно определять что за МК
Dim Low_fuse As Byte
Dim High_fuse As Byte
Dim Extended_fuse As Byte
Dim Lock_bits As Byte
Dim Buffer_byte As Byte

'======================================= Настройка портов =======================================

Clki Alias Porta.0 : Config Clki = Output : Reset Clki
'порты точно совпадают с заводскими портами Attiny88 для HVPP
Bsy Alias Pind.1 : Config Bsy = Input : Set Bsy
Oe Alias Portd.2 : Config Oe = Output : Set Oe
Wr Alias Portd.3 : Config Wr = Output : Set Wr
Bs1 Alias Portd.4 : Config Bs1 = Output : Reset Bs1
Bs2 Alias Portc.2 : Config Bs2 = Output : Reset Bs2
Xa0 Alias Portd.5 : Config Xa0 = Output : Reset Xa0
Xa1 Alias Portd.6 : Config Xa1 = Output : Reset Xa1
Pagel Alias Portd.7 : Config Pagel = Output : Reset Pagel
5v Alias Portc.5 : Config 5v = Output : 5v = 0
12v Alias Portc.7 : Config 12v = Output : 12v = 0
Led Alias Portd.0 : Config Led = Output

'выход в терминал
Open "Comc.4:115200,8,n,1" For Output As #1

'======================================== Ф У Н К Ц И И  ================================================

Declare Sub Writebyte(byval Cmd As Byte)
Declare Sub Readbyte()
Declare Sub Writefuse()
Declare Sub Read_fuse()
Declare Sub Read_signature()
Declare Sub Erase_chip()
Declare Sub Start_prog()
Declare Sub Waitfornotbusy()

Sub Start_prog()
    Waitms 100
    Set 5v                                                  'тут запитываем программируемый МК от порта МК-программатора
    Waitms 1
           Set Led : Wait 5 : Reset Led                     'задержка на переключение ресет с 0В на 12В вручную.
    Set 12v                                                 'ВАЖНО чтобы до подачи питания ресет был прижат к земле
    Waitms 5
End Sub

Sub Writebyte(byval Cmd As Byte)
    Oe = 1                                                  'сообщаем, что собираемся писать
    Waitms 5
    Config Portc.1 = Output                                 'порты на выход
    Config Portc.0 = Output
    Config Portb.5 = Output
    Config Portb.4 = Output
    Config Portb.3 = Output
    Config Portb.2 = Output
    Config Portb.1 = Output
    Config Portb.0 = Output

    Portc.1 = Cmd.7                                         'побитно присваиваем портам значение
    Portc.0 = Cmd.6
    Portb.5 = Cmd.5
    Portb.4 = Cmd.4
    Portb.3 = Cmd.3
    Portb.2 = Cmd.2
    Portb.1 = Cmd.1
    Portb.0 = Cmd.0

    Waitms 5
    Set Clki                                                'передаем значение портов в МК положительным импульсом CLKI
    Waitms 5
    Reset Clki
    Waitms 5
End Sub()

Sub Readbyte()
    Buffer_byte = 0
    Waitms 5
    Oe = 0                                                  'сообщаем, что собираемся читать
    Waitms 5
    Config Pinc.1 = Input : Set Pinc.1                      'порты на вход с подтяжкой к питанию
    Config Pinc.0 = Input : Set Pinc.0
    Config Pinb.5 = Input : Set Pinb.5
    Config Pinb.4 = Input : Set Pinb.4
    Config Pinb.3 = Input : Set Pinb.3
    Config Pinb.2 = Input : Set Pinb.2
    Config Pinb.1 = Input : Set Pinb.1
    Config Pinb.0 = Input : Set Pinb.0

    Buffer_byte.7 = Pinc.1                                  'побитно присваиваем значение переменной
    Buffer_byte.6 = Pinc.0
    Buffer_byte.5 = Pinb.5
    Buffer_byte.4 = Pinb.4
    Buffer_byte.3 = Pinb.3
    Buffer_byte.2 = Pinb.2
    Buffer_byte.1 = Pinb.1
    Buffer_byte.0 = Pinb.0
    Waitms 5
    Oe = 1
    Waitms 5
End Sub

Sub Waitfornotbusy()
    Waitms 5
    Wr = 0                                                  'отрицательным импульсом WR записываем
    Waitms 5
    Wr = 1
    Waitms 5
    While Bsy = 0 : Wend                                    'ждем пока МК запишет
End Sub

Sub Erase_chip()                                            'очистка МК
    Xa0 = 0 : Xa1 = 1 : Bs1 = 0 : Bs2 = 0
    Writebyte Cmd_erase_chip
    Xa1 = 0
    Waitfornotbusy
End Sub

Sub Writefuse()                                             'запись нужных нам фьюзов
    Xa0 = 0 : Xa1 = 1 : Bs1 = 0 : Bs2 = 0
    Writebyte Cmd_write_fuse
    Xa1 = 0 : Xa0 = 1
          Writebyte Low_fuse_write
          Waitfornotbusy

    Xa0 = 0 : Xa1 = 1 : Bs1 = 0 : Bs2 = 0
    Writebyte Cmd_write_fuse
    Xa1 = 0 : Xa0 = 1
          Writebyte High_fuse_write
          Bs1 = 1
          Waitfornotbusy
          Bs1 = 0

    Xa0 = 0 : Xa1 = 1 : Bs1 = 0 : Bs2 = 0
    Writebyte Cmd_write_fuse
    Xa1 = 0 : Xa0 = 1
          Writebyte Extended_fuse_write
          Bs2 = 1
          Waitfornotbusy
          Bs2 = 0

    Xa0 = 0 : Xa1 = 0 : Bs1 = 0 : Bs2 = 0
'    Writebyte 0
'    Xa1 = 0
End Sub

Sub Read_signature()                                        'чтение сигнатуры
    Xa0 = 0 : Xa1 = 1 : Bs1 = 0 : Bs2 = 0
    Writebyte Cmd_read_signature
    Xa1 = 0
    Writebyte 0
    Readbyte
    Signature = Buffer_byte
    Shift Signature , Left , 8

    Xa1 = 1
    Writebyte Cmd_read_signature
    Xa1 = 0
    Writebyte 1
    Readbyte
    Signature = Signature + Buffer_byte
    Shift Signature , Left , 8

    Xa1 = 1
    Writebyte Cmd_read_signature
    Xa1 = 0
    Writebyte 2
    Readbyte
    Signature = Signature + Buffer_byte
End Sub

Sub Read_fuse()                                             'чтение фьюзов
    Xa0 = 0 : Xa1 = 1 : Bs1 = 0 : Bs2 = 0
    Writebyte Cmd_read_fuse
    Xa1 = 0
    Readbyte
    Low_fuse = Buffer_byte

    Bs2 = 1 : Bs1 = 1
    Readbyte
    High_fuse = Buffer_byte

    Bs2 = 1 : Bs1 = 0
    Readbyte
    Extended_fuse = Buffer_byte

    Bs2 = 0 : Bs1 = 1
    Readbyte
    Lock_bits = Buffer_byte
End Sub

'=================================================================================================

                                     'Г Л А В Н Ы Й   Ц И К Л

'=================================================================================================
Start_prog
Waitms 100
Read_signature
Read_fuse

Print#1 , "signature " ; Hex(signature) ; " " ; "Low_fuse " ; Hex(low_fuse) ; " " ; "High_fuse " ; Hex(high_fuse) ; " " ; "Extended_fuse " ; Hex(extended_fuse) ; " " ; "Lock_bits " ; Hex(lock_bits)
Print#1 , "Erase chip..."

Erase_chip

Print#1 , "Write fuse..."

Writefuse

Read_signature
Read_fuse

Print#1 , "signature " ; Hex(signature) ; " " ; "Low_fuse " ; Hex(low_fuse) ; " " ; "High_fuse " ; Hex(high_fuse) ; " " ; "Extended_fuse " ; Hex(extended_fuse) ; " " ; "Lock_bits " ; Hex(lock_bits)
Do
  Toggle Led
  Waitms 500
Loop

End

+1

9

Nec написал(а):

Тинька ожила без кварца

Значит генератор накрылся. Рад, что всё разрешилось бескровно.

У меня давно был похожий случай. Вместо внешнего кварца включил внешнее тактирование и контроллер умер. Сделать генератор не из чего, логики нужной нет и купить по-быстрому негде. Сделал на отладочной плате обычный ногодрыг: SET PORTX.X - RESET PORTX.X, подключил к XTAL1, и помогло - контроллер ожил и я быстренько поменял фьюзы.

0

10

Andrusha написал(а):

Значит генератор накрылся.

Не разобравшись в avrdude, прошил фьюзы. Как выяснилось, запретил SPIEN. Сделал High fuse = 0xFD, Low fuse 0xFD. И не известно что было с lock bits. Исправил на 0xDF, 0xEE

Andrusha написал(а):

Можно создать новую тему типа "Оживление МК" и попросить модераторов перенести этот код туда.

Можно, но мой интернет не позволяет создавать новые темы)))

0

11

Nec написал(а):

Не разобравшись в avrdude, прошил фьюзы

В AVRDUDEPROG вообще всё просто. Нажимаете кнопочку "По умолчанию", галочки ставятся или снимаются с фьюзов, установленных с завода. Обратить внимание на две кнопочки внизу "Прямые" и "Инверсные". Если включено "Прямые", значит галочка это единица - фьюз не запрограммирован. Если "Инверсные", значит галочка это ноль, фьюз запрограммирован. Меняете только нужные фьюзы и нажимаете кнопочку "Программирование".

Nec написал(а):

запретил SPIEN

В AVRDUDEPROG это невозможно, там галочка неактивна.

0

12

Возможно так и есть. Первый раз когда подумал, что он труп, игрался с фьюзами в баском. После очередной записи, на связь он не вышел, но как то отмаргивал свою работу. Оказалось, дорожка MOSI отвалилась от пятака. Припаял. Решил больше не экспериментировать с баскомом, открыл avrdude, вкладку фьюзы и зачем то, не разобравшись досконально, нажал "запрограммировать". После этого, ни отмаргивал, не связывался. Как я понял, а возможно и ошибаюсь, в ней шьется разом все. И фьюзы и еепром и флеш.
Ладно, терять нечего, стало интересно. Про высоковольтные программаторы слышал, но не пользовался. Почитал даташит. В нем, касаемо фьюзов, подробного описания нет. Есть отсылка к программированию флеш и пункты  "установите команду, установите нужные биты фьюзов и дерните шиной". Но была временная диаграмма состояния шин. И в этой диаграмме, шина XA0 (на память пишу, могу перепутать) всегда в одном уровне. Естественно, так фьюзы у меня не писались. Зато отрабатывал "chip erase" и считались фьюзы. Их состояние после "chip erase" я написал несколькими сообщениями выше.

0

13

Nec написал(а):

Как я понял, а возможно и ошибаюсь, в ней шьется разом все

На моей картинке выше:
Первая вкладка "Programm" - прошиваются FLASH и EEPROM.
Вторая вкладка "Fuse" - прошиваются фьюзы.
Третья вкладка "Automatic programming" - прошивается всё вместе.

Nec написал(а):

Почитал даташит. В нем, касаемо фьюзов, подробного описания нет

Вот этот сайт мне здорово помог а своё время.
http://www.getchip.net/posts/068-kak-pr … -fuse-bit/

+1

14

Andrusha написал(а):

Вот этот сайт мне здорово помог а своё время.

Особо проблем с пониманием фьюзов не было никогда. Но почитал, освежил информацию) про описание фьюзов, имел ввиду описание программирования фьюзов. И, скорее всего, ошибку в даташите на временнЫх диаграммах шин.
В любом случае, ещё раз убедился, что нужно внимательно изучать даташиты к устройствам. Там есть все и даже больше, чем нужно.

0

15

Andrusha написал(а):

Вот этот сайт мне здорово помог а своё время.
http://www.getchip.net/posts/068-kak-pr … -fuse-bit/

Или вот Установка FUSE-битов (Сообщения в теме обновлены и дополнены)

0