Перейти к содержанию
    

Программирование ATtiny13А

Попробовал зашить программу в ATtiny13А. Выдает ошибку.

При этом в ATtiny13 шьется без проблем. В чем загвоздка?

Для справки, заливаю с помощью STK600 из под AtmelStudio6,0 в высоковольтном режиме (в ISP режиме данная связка STK600 -AtmelStudio6,0 не видит ATtiny13).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, нюансы в схеме подключения ISP интерфейса? У меня ATtiny13A прекрасно прошиваются связкой avrdude/der-Hammer по ISP. Высоковольтную часть der-Hammer'а использовал только раз для "воскрешения" ATtiny2313V.

Хотя странно, что обычные тиньки (без А) прошиваются, тем более что идентификационные сигнатуры у них совпадают...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может в 13А уже что-то зашито? У меня такое было, когда в контроллер была зашита программа, работающая на низкой частоте. Я сначала выставлял скорость 5 кб/с, затем делал стирание, а после этого на нормальной скорости прошивал новую программу.

Изменено пользователем Игoрь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может в 13А уже что-то зашито? У меня такое было, когда в контроллер была зашита программа, работающая на низкой частоте. Я сначала выставлял скорость 5 кб/с, затем делал стирание, а после этого на нормальной скорости прошивал новую программу.

Все нормально с микросхемой. Перед заливкой делаю стирание чипа.

Но... в 13 все проходит хорошо, а в 13А - выдает ошибку при верификации.

 

Однако попробую Ваш совет на счет низкой скорости. А еще я заказал 13А в другом месте (с другой партии). Поэкспериментирую на них.

Ну и вопрос по ходу:" А какие программы (и их версии) поддерживают STK600"

У меня есть еще CodeVision, но версия 2.05 STK600 не видит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть проблемка с Attiny13.

Стал пробывать сделать прерывание от INT0, прерывание должно срабатывать от низкого уровня на ножке.

Программа на ассемблере в AVR Studio 4.16.

При симуляции в Simulator 2 прерывание INT0 срабатывает постоянно. Независимо от того что на выводе.

В моделировании в протеусе таже беда.

Переписал программу на СИ, тоже самое.

живьем микросхемы пока нет.

Подскажите что это может быть, ошибка в коде, глюк AVR. Будет ли нормально работать на железе.

Вот кусочек кода:

ldi r16, (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0);
out DDRB, r16;
ldi r16, (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(1<<0);
out PORTB, r16;
....
//инициализация прерываний
ldi r16, (0<<PUD)|(0<<SE)|(0<<SM1)|(0<<SM0)|(0<<ISC01)|(0<<ISC00);
out MCUCR, r16;
ldi r16, (0<<INT0)|(1<<PCIE);//01
out GIMSK, r16;
ldi r16, (0<<PCINT5)|(0<<PCINT4)|(0<<PCINT3)|(1<<PCINT2)|(0<<PCINT1)|(0<<PCINT0);
out PCMSK, r16;
.....
//прерывание INT0
INT0_vect:
nop
reti;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас вывод INT0(PB1/PCINT1) настроен на выход и на нём 1. Причём прерывания от INT0 Вы отключили (GIMSK.INT0 = 0). А включено у Вас прерывание по изменению состояния вывода PCINT2(PB2) (PCMSK.PCINT2 = 1, GIMSK.PCIE = 1). И если вывод PB2 (вход без "подтяжки") висит в воздухе и метка INT0_vect располагается по адресу 0x0001, то вы можете постоянно попадать на команду reti (адрес 0x0002) из-за неопределённости состояния вывода PB2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения. Вчера что то так неважно себя чувствовал сам не понял что написал.

Код привел ошибочный. Прерывание INT0 это я потом запретил после экспериментов.

Так конечно должно быть:

ldi r16, (1<<INT0)|(1<<PCIE);//01
out GIMSK, r16;

Выводы PB0 и PB2 подтянуты к питания через резистор 10кОм.

Еще я пробовал включатьбит PUD В регистре MCUCR.

Это никак не влияет. INT0 срабатывает постоянно.

Установка вывода PB0 на вход или выход так же никак не влияет.

Изменено пользователем mmor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы всё же приведите полный текст программы (в теге codebox, например) и желательно ссылку на схему. Не то у Вас подтянуты PB0 и PB2, а INT0 - это PB1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот полный код на настоящий момент. прерывание INT0 срабатывает постоянно в симулинке в AVR.

программа вобщем ничего не делает, просто пытаюсь на ассемблере запустить прерывания по инт0. Прерывания от порта PB2 стал делать в качестве альтернативы, отключив прерывание по инт0. Без инт0 прерывание от PB2 срабатывает нормально.

Пробовал и в протеусе, и в симулинке установкой и снятием третьего бита (бит 2 если от нуля).

Схема самая простая в протеусе. Контроллер, на вывода PB0 И PB2 через резисторы 10 кОм подведено питание 5 В. И на эти же выводы по кнопке button. Нажал кнопку - на выводе 0. Отжал - лог. 1.

 

 

 

.include "tn13def.inc"


.org 0
rjmp init

.org 1
rjmp INT0_vect
.org 2
rjmp PCI0_vect

init:
//---------------------------------------------------------------------
//установка вершины стека
ldi r16,$DF                ; загружаем константу в регистр общего пользования r16
out SPL,r16                ; указываем верхнюю границу стэка
//---------------------------------------------------------------------
//инициализация выводов
//---------------------------------------------------------------------
//направление вывода "ног": 1 - вывод, 0 - ввод
ldi r16, (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
out DDRB, r16;
ldi r16, (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
out PORTB, r16;
//---------------------------------------------------------------------
//инициализация таймера
ldi r16, $00;
out TCNT0, r16;
ldi r16, $15;
out OCR0A, r16
ldi r16, $5;
out OCR0B, r16
ldi r16, $12;
out TCCR0A, r16;
ldi r16, $03;	//$04
out TCCR0B, r16;

//---------------------------------------------------------------------
//инициализация прерываний
ldi r16, (1<<PUD)|(0<<SE)|(0<<SM1)|(0<<SM0)|(0<<ISC01)|(0<<ISC00);//01
out MCUCR, r16;
ldi r16, (1<<INT0)|(1<<PCIE);//01
out GIMSK, r16;
ldi r16, (0<<PCINT5)|(0<<PCINT4)|(0<<PCINT3)|(1<<PCINT2)|(0<<PCINT1)|(0<<PCINT0);//04
out PCMSK, r16;
//---------------------------------------------------------------------

//разрешаем прерывания
ldi r16, $80;
out SREG, r16;

main:                         ; тело цикла

nop;                          ; команда, которая ничего не делает  
nop;

rjmp main;                    ; переход на метку main
//---------------------------------------------------------------------
//прерывание INT0
INT0_vect:
nop
reti;

//---------------------------------------------------------------------
//прерывание PCIN4
PCI0_vect:
nop
reti;

 

еще не понял почему INT0 - это PB1?

 

И ведь правда PB1!!!! только сейчас разглядел!!!

Вот что значит замыленный взгляд. Привык тчо на атмегах это 0-й пин.

Звиняйте за беспокойство, сейчас буду переделывать!

 

а PB1 у меня как раз таймер дергает!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...