Технический форум по робототехнике.
Chip15 » 16 дек 2007, 12:22
Всем привет. Возникла проблема с програмированием Tiny2313.
Программа простейшая т.к это мой первый опыт по програмированию контроллера. По задумке светодиод должен мигать.
AVR Studio при компиляции выдает:
- Код: Выделить всё • Развернуть
Copyright (C) 1995-2006 ATMEL Corporation
C:\000\2313.asm(14): Including file 'C:\Fgyjns\tn2313def.inc'
C:\Fgyjns\tn2313def.inc(123): error: Attempt to redefine keyword 'z'
C:\000\2313.asm(14): info: 'C:\Fgyjns\tn2313def.inc' included from here
C:\Fgyjns\tn2313def.inc(383): error: Attempt to redefine keyword 'or'
C:\000\2313.asm(14): info: 'C:\Fgyjns\tn2313def.inc' included from here
Assembly failed, 2 errors, 0 warnings
Где собака зарыта?
Исходник:
- Код: Выделить всё • Развернуть
.device ATTINY2313
.nolist
.include "C:\Fgyjns\tn2313def.inc"
.list
.def temp =r16
rjmp Init
Init:
ser temp ;PortA, portB PortD выходы
out DDRA,temp ;
out DDRD,temp ;
out DDRB,temp ;
clr temp ; Подтяжки нет
out PortB,temp ;
out PortA,temp ;
out PortD,temp ;
Start:
sbi PortB,0 ; Включаем сид 1
cbi portB,0 ; Выключаем сид 1
rjmp Start ; Возврат к метке Start
вывод программ и исходники оформляем тегом CODE
avr123.nm.ru » 16 дек 2007, 12:35
rig » 16 дек 2007, 13:52
частота кварца довольно высокая не вдаваясь в ошибки
- Код: Выделить всё • Развернуть
Start:
sbi PortB,0 ; Включаем сид 1
cbi portB,0 ; Выключаем сид 1
rjmp Start ; Возврат к метке Start
эта часть кода отвечающая за мигание будет выполняться с частотой чть меньше тактовой . мигания будет не заметн. скорей всего диод будет всетиться чуть меньше максимальной яркости. нужно паузы вставлять межу изменением состояния вывода порта.
если делать на си то примерно так
- Код: Выделить всё • Развернуть
while(1)
{PORTB.0=0;
delay_ms(1000); // пауза 1 сек
PORTB.0=1;
delay_ms(1000); // пауза 1 сек
}
все просто и понятно.
удачи в начинаниях

Последний раз редактировалось
Myp 16 дек 2007, 16:59, всего редактировалось 1 раз.
Причина: не забываем про тег
avr123.nm.ru » 16 дек 2007, 15:13
delay_ms(1000); // пауза 1000 мсЕще понятней !

steel_monkey » 16 дек 2007, 18:33
Проблема во включаемом файле tn2313def.inc. Посмотрите файл в директории АВРстудии ...atmel\avr tools\avrassembler2\appnotes\tn2313def.inc
. У меня студия версии 4 с чем-то, там включаемый файл берется из директории ассемблер 2 (!!!). А программа будет работать как указал товарищ rig.
Для того, чтобы светодиод замигал медленнее надо добавить стандартную задержку:
добавим еще один используемый регистр
- Код: Выделить всё • Развернуть
.def temp2 =r17
и вот напишем основной цикл так:
- Код: Выделить всё • Развернуть
Start:
sbi PortB,0 ; Включаем сид 1
;***************************************************************************
;*************** код задержки после включения светодиода******
;***************************************************************************
ldi temp2, 100 ; загружаем в регистр (назовем его старшим) число 100
loop_mark_1: ; вводим первую вспомогательную метку
ldi temp, 100 ; загружаем во второй (младший) регистр число 100
loop_mark_2: ; вводим вторую вспомогательную метку
subi temp, 1 ; декрементируем младший регистр
brne loop_mark_2 ; если он не обнулен- вычитаем еще раз и так до тех пор пока не обнулится
subi temp2, 1 ; гогда младший регистр обнулился, декрементируем старший
brne loop_mark_1 ; если старший регистр не равен нулю - снова загружаем в младший регистр число 100 и повторяем вычитания
; если старший регистр равен нулю- переходим в выключению светодиода
cbi portB,0 ; Выключаем сид 1
;***************************************************************************
;*************** код задержки после выключения светодиода******
;***************************************************************************
ldi temp2, 100 ; загружаем в регистр (назовем его старшим) число 100
loop_mark_1_: ; вводим первую вспомогательную метку
ldi temp, 100 ; загружаем во второй (младший) регистр число 100
loop_mark_2_: ; вводим вторую вспомогательную метку
subi temp, 1 ; декрементируем младший регистр
brne loop_mark_2_ ; если он не обнулен- вычитаем еще раз и так до тех пор пока не обнулится
subi temp2, 1 ; гогда младший регистр обнулился, декрементируем старший
brne loop_mark_1_ ; если старший регистр не равен нулю - снова загружаем в младший регистр число 100 и повторяем вычитания
; если старший регистр равен нулю- переходим в выключению светодиода
rjmp Start ; Возврат к метке Start
Задержку можно расчитать точно по тактам кварца и времени выполнения команд. Вычитание занимает 1 такт, проверка условия с переходом занимает 1 такт если условие не выполнено, и 2 такта, если выполнено. Итого, задержка будет примерно 100*100*3 ( 3 это вычитание и переход к метке loop_mark_2) + 100*3 ( это переход к метке loop_mark_1 и загрузка в младший регистр сотни).
Надеюсь, изложил понятно.
P.S. Господа, "учите си" в этой теме звучит как у известного юмориста
-Йогурт свежий?
-Грушовый.
Chip15 » 22 дек 2007, 06:52
Усе. В той проге разобрался. Теперь новая проблема.
Программа должна работать след. образом. При нажатии на кнопку 1 должен зажеться 0 на индикаторе . При нажатии на кнопу 2 должна зажеться 1. Индикатор с общим катодом. Кнопки подключены к PD0 и к PD1 и на землю. Индикатор подключен к порту B. В порядке dacgbfe-1234567. Точка на индикаторе и вывод 0 порта В незадействованы.
Вот исходник:
- Код: Выделить всё • Развернуть
;***********************************
; Автор: ***
; Дата: ***
; Версия: 1.0
; Имя файла: LEDon
; Для AVR 2313
; Тактовая частота: 4МГЦ
; Выполняет зажжение светодиода по нажатию соответствующей кнопки
;***********************************
.nolist
.include "tn2313def.inc"
.list
.def temp0 =r16
.def temp1 =r17
.def temp2 =r18
Init:
ldi temp0,0b111 ;Все выводы порта А выход
out DDRA,temp0
ser temp0 ;Все выводы порта B выход
out DDRB,temp0
ldi temp0,0b11111100 ;Вывод 0 и 1 порта D вход
out DDRD,temp0
ldi temp0,0b00000011 ;подтяжка порта D включена
out PortD,temp0
Start:
ldi temp1,0b11111100 ;0
ldi temp2,0b01100000 ;1
sbic PinD,0 ;Проверяем нажатие кнопки 1
out PortB,temp1 ;Зажигаем 0
rjmp Loop_1
Loop_1:
sbic PinD,1 ;Проверяем кнопку 2
out PortB,temp2 ;Зажигаем 1
rjmp Start
хотел чтоб все работало на частоте 4МГц с внешним кварцом, но низнаю как выставить фьюзы.
Выставил галочки :
CKSEL0
CKSEL2
CKSEL3
SUT0
он должен работать от внутреней цепочки.
В AVR Srudio все работает, а на яву нехочет.
Прив вкключении питания все сигменты начинают мигать и светяться ну ооочень тускло. На кнопки не реагирует. При отключении питания на мгновение ярко загораются некоторые сигменты.
незнаю где собака зарыта.

Может фузы нетак стоят?.
pomidor » 22 дек 2007, 20:08
вот как у меня стоят фьюзы в понипроге для внешнего кварца и максимального стартуп-тайма - запрограммирован (=0) только spien, остальные в 1 - незапрограммированные, стр 25-27 даташита на attiny2313
- Вложения
-

Chip15 » 23 дек 2007, 10:35
Все. С фузами разобрался.
Немного переделал прогу.
В симуляторе все работает как надо. но в контроллере работает не правильно.
Смысл в том чтобы при нажатии на кнопку 1 (PD0)агорался на индикаторе 0, при отпускании- индикатор тух. При нажатии на кн 2 (PD1) на индикаторе загоралась бы 1-при отпускании кн 2 индикатор должен тухнуть.
При прошитой микре при ненажатых кнопках горит 0. При нажатии на кн1 (PD0) загорается 1. при отпускании-горит 0. На кн 2 (PD1) вообще нет реакции. Что сделать? Индикатор с общим катодом.
Вот исходник:
- Код: Выделить всё • Развернуть
def temp0 =r16
.def temp1 =r17
.def temp2 =r18
Init:
ser temp0 ;Все выводы порта А выход
out DDRA,temp0
ser temp0 ;Все выводы порта B выход
out DDRB,temp0
ldi temp0,0b11111100 ;Вывод 0 и 1 порта D вход
out DDRD,temp0
ldi temp0,0b00000011 ;подтяжка порта D включена
out PortD,temp0
Start:
ldi temp1,0b11111100 ;0
ldi temp2,0b01100000 ;1
sbic PinD,0 ;Проверяем нажатие кнопки 1
rjmp Loop_3
Loop_1:
sbic PinD,1 ;Проверяем кнопку 2
rjmp Loop_2
ALL_OFF:
clr temp1 ;Гасим все светодиоды
out PortB,temp1
rjmp Start
Loop_2:
out PortB,temp2 ;Зажигаем 1
rjmp Start
Loop_3:
out PortB,temp1 ;Зажигаем 0
rjmp Start
про CODE сколько еще говорить?!
ниужели выделить текст и нажать Code так сложно!
?
Последний раз редактировалось
Vooon 23 дек 2007, 10:52, всего редактировалось 1 раз.
Причина: тег CODE
steel_monkey » 23 дек 2007, 14:37
SBIC на SBIS замените.
Chip15 » 23 дек 2007, 15:33
но у меня кнопки к минусу подключены.
И почему в симуляторе (AVR Studio) работает как надо, а в реале как описано выше?
steel_monkey » 23 дек 2007, 18:33
Ну посмотрите по программе, если на нулевой ноге единица ( не нажато), пропуска команды не происходит и переходим к Loop_3, то есть зажигаем нуль. Поствил вместо SBIC SBIS и в протеусе все заработало, а до этого было как у Вас.
Chip15 » 24 дек 2007, 13:16
Не могу понять почему а AVR Studio все работает? Ставлю как Вы указали и работает не так как положено. Может прога глючить?
steel_monkey » 24 дек 2007, 22:26
Прога нормально не работает в первоначально редакции ( в протеусе так точно). Про студию ничего сказать не могу, там не смотрел ( но и там тоже правльно работать не должна). Глючить такая прога не может.
Просто тупо пройдитсь по командам и все поймете.
Duhas » 25 дек 2007, 00:02
может еще и автор глючит? проверьте соответсвие того что вы хотите и выбраных команд.. а также соответсвие лог уровней и итога на выходе... в сответствии с подключением вснешней обвязки
steel_monkey » 25 дек 2007, 03:12
В протеусе в первоначальном работает все именно так, как описал товарищ Чип, так что с обвязкой все ОК.