Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать простейшею прогу для AT90S2313 
:(
    Опции темы
jeti
Дата 9.11.2005, 15:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте. smile Помогите написать очень простенькую прогу, для AT90S2313.

Задача: подал питание контроллера, светодиодик мигнул, потом к примеру через 20 сек мигнул, потом к примеру через 30 сек мигнул, потом к примеру через 45 сек мигнул, потом к примеру через 25 сек мигнул, все. Всего четыре раза.

Прежложите пожалуйста, свой вариант исходника, желательно с коментариями, и бъясните где выставлять интервалы.
Буду очень благодарен. А то, в инете инфы мало, нашел только пару статеек, но все равно ничего не выходит.
Всовсем немного знаю С, еще меньше асемблер.


  Вверх
PILOT
Дата 9.11.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



Я против исходников всей программы, она не настолько сложна чтобы не разобраться самому:
0) пиши на ассемблере, тогда ты поймешь как все работает
1) напиши процедуры задержек на заданное кол-во секунд учитывая только время выполнения одной команды (т.е. без прерываний)
2) разберись с работой портов ввода вывода, с тем чтобы правильно настроить нужный тебе порт/пин
3) вызывай по очереди процедуры с указанием времени задержки в кач-ве параметра
4) не забывай тушить и зажигать светодиод между вызовами
5) обеспечь зацикливание программы, чтобы программа не выполняла пустой код за твоей программой.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
maximuswand
Дата 18.11.2005, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.11.2005

Репутация: нет
Всего: нет



Если есть желание - посмтри код над который я пытаюсь писать сейчас. Это начальная версия, но можно кое-чего взять. Здесь используются оба прерывания. Главное что тут есть описание, что и для чего. (Писать готовый пример лень)

Посмотри момент как запускаются таймеры и исправь под себя. У меня подпрограмма "detect_freq" считает отсчёты счётчика-таймера1 и когда на собирается нужное кол-во - происходит возврат из подпрограммы - где и включается (выключается) диод. Потом вызов подпрограммы пауз с новым параметром и так далее.

Код


; PB0, PB1 -  используются для компаратора
; вместо них подуключены PD0, PD1
; вывод PD6 используется как звуковой выход на динамик
; вывод PD5 используется как звуковой выход в линию (посылка ответа)
; выводы PD0-1 и PB2-7 используются для выбора настройки на станцию.



.include "2313def.inc"    ;директива компилятора,
            ;чтобы он включил соответствующий файл
.def t=r16        ;обзовем для удобства регистр r16 как "t"
.def t1=r17
.def t2=r18
.def t3=r26
.def temp=r27
.def temp1=r28
.def freqH1=r1
.def freqL1=r2
.def freqH2=r3
.def freqL2=r4
.def dlitH=r5
.def dlitL=r6

.def LeftFreqH=r19
.def LeftFreqL=r20
.equ leftFreqConstH=0
.equ LeftFreqConstL=60

.ORG 0            ;директива компилятору, чтобы он вставил
            ;следующую команду по адресу 0
    RJMP start    ;переход на начало программы
;    RJMP comparat

.ORG $001
    RJMP loop

.ORG $006        ;адрес вектора прерывания, храниться в 2313def.inc
    RJMP timeint    ;переход на подпрограмму обработки прерывания от таймера


.CSEG            ;здесь начинается CODE SEGMENT - сегмент кода

start:
    LDI t,RAMEND    ;загружаем в регистр адрес последнего байта ОЗУ
                    ;LDI - загрузка в регистр числа
    OUT SPL,t        ;и выводим в порт SPL - указатель стека

    CLI        ;запрет прерываний

    LDI t,0        ;коэффициент предварительного деления таймера = 8
    OUT TCCR0,t    ;вывести в регустр управления таймером

    LDI t,0        ;разрешение прерываний по переполнению таймера счётчика
    OUT TIMSK,t


    LDI t,0            ;PB0-7 - входы
    OUT DDRB,t        ;выводим в порт
    LDI t,0b1100000    ;PD0-4 - входы,PD5-6 - выходы 
    OUT DDRD,t

    LDI t,0            ;таймер-счётчик1 отключен от ОС1, работа ШИМ - запрещена
    OUT TCCR1A,t

    LDI t,0b1    
    OUT TCCR1B,t    ; частота счётчика 1 = частоте кварца

;    LDI t,8        ;разрешить прерывания по входу захвата (выход компаратора)
;    OUT TIMSK,t    ;запись в регистр управления прерываниями от таймера

    LDI t,0
    OUT TCNT1H,t
    OUT TCNT1L,t

    LDI t,3            ;запрос на переывание по нарастающему фронту (INT0)
    OUT MCUCR,t

    LDI t,64        ;разрешение внешних прерываний    
    OUT GIMSK,t

    ;запретить прерывания от таймера счётчика
    LDI t,0        ;не разрешить прерывания от таймера 1 по совпадению
    OUT TIMSK,t

    LDI t,0b1111    ;включение сторожевого таймера (2048 ms)
    OUT WDTCR,t

;    LDI t,128        ;прерывания по переполнению счётчика1
;    OUT TIMSK,t

;распознование кода, установленного перемычками
    IN t1,PINB
    MOV t2,t1
    ANDI t1,0b00001111    ;откинем старший ниббл (остался МЛАДШИЙ) первая частота - младший ниббл
    ANDI t2,0b11110000    ;откинем младший ниббл (остался СТАРШИЙ) вторая частота - старший ниббл
    LSR    t2        ;сдвиг вправо
    LSR t2
    LSR t2
    LSR    t2        ;остался старший ниббл

    CPI t1,0    ;проверка кода на "пустые" перемычки
    BRNE ne_null
    LDI t1,1
ne_null:
    CPI t2,0
    BRNE ne_null1
    LDI t2,2
ne_null1:

    ;Определение параметров первой частоты
    MOV t,t1    ;номер частоты (перемычками) для подпрограммы
    LDI t3,1    ;порядковый номер частоты в комбинации (1/2)
    LDI ZH,High(deshifrat)
    LDI ZL,Low(deshifrat)
    icall
    LDI t,0b1110    ;включение сторожевого таймера (1024 ms)
    OUT WDTCR,t
    LDI t3,1        ;порядковы йномер частоты - 1
    WDR
;    rcall detect_freq
    rjmp detect_freq

    ;Определение параметров второй частоты
    MOV t,t2    ;номер частоты (перемычками) для подпрограммы
    LDI t3,2    ;порядковый номер частоты в комбинации (1/2)
    LDI ZH,High(deshifrat)
    LDI ZL,Low(deshifrat)
    icall
    LDI t,0b1111    ;включение сторожевого таймера (2048 ms)
    OUT WDTCR,t
    LDI t3,2        ;порядковы йномер частоты - 2
    WDR
    rcall detect_freq

    ;если до сюда добрались - частоты распознаны
    rjmp sound    




detect_freq:
    ;подпрограмма определения своей частоты
    ;если частота определена произойдёт возврат из этой подпрограммы
    ;иначе по истечении времени сторожевой таймер произведёт сброс
    ;Z - счётчик кол-ва совпадений
    ;принимает FreqH1,FreqL1,FreqH2,FreqL2,DlitH1,DlitL1,DlitH2,DlitL2,t3
    ;где t3- номер частоты (1/2)

    LDI t,0
    OUT TCNT1H,t
    OUT TCNT1L,t
    LDI    ZH,0    ;обнулим счётчик распознанных периодов
    LDI    ZL,0
    SEI

stop:
    ;проверим не равен ли счётчик тактов нулю (своей частоты небыло)
    MOV t,ZH
    MOV t1,ZL
    OR t1,t
    BRNE not_WDR ;если были определённые периоды - обнуление сторожевого 
    ;таймера не делаем (чтобы был сброс в случае ошибки не более чем через 1 сек)
    CPI t3,2
    BREQ not_WDR    ;если частота вторая - то обнуление сторожевого таймера 
                    ;не производится и сброс возникает в любом случае через 2 минуты
                    ;если частота распознана ранее не будет
    WDR
not_WDR:
    CP zh,DlitH
    BRLO stop
    CP zl,DlitL
    BRLO stop
    CLI
    RET            ;возврат в основную программу

add_1_Z:
    LDI temp,1
    LDI temp1,0
    ADD ZL,temp        ;увеличение текущёй позиции на 1
    ADC ZH,temp1
    RET


loop:
    IN t2,TCNT1L
    IN t1,TCNT1H
    WDR
    ;Проверить, что длительность одного периода НЕ МЕНЕЕ этой
    MOV LeftFreqH,FreqH1
    MOV LeftFreqL,FreqL1
    ; сравнение двух пар регистров
    CP t1,LeftFreqH    
    BRLO exit_loop        ; если меньше незачёт
    CP t2,leftFreqL
    BRLO exit_loop

    ;Проверить, что длительность одного периода НЕ БОЛЕЕ этой
    MOV LeftFreqH,FreqH2
    MOV LeftFreqL,FreqL2
    ; сравнение двух пар регистров
    CP t1,LeftFreqH    
    BREQ next        ; если равно - хорошо
    BRSH exit_loop        ; если больше незачёт
next:
    CP t2,leftFreqL
    BREQ end_compare        ; если равно - хорошо
    BRSH exit_loop        ; если больше незачёт

end_compare:
;если сюда пришли - значит совпала частота.
    rcall add_1_Z    ;Увеличим на 1 счётчик длительности Z
exit_loop:
    LDI t,0
    OUT TCNT1H,t
    OUT TCNT1L,t
    SEI    
    RETI

sound:
    LDI t,0        ;запрет внешних прерываний    
    OUT GIMSK,t

    LDI t,2        ;коэффициент предварительного деления таймера = 8
    OUT TCCR0,t    ;вывести в регустр управления таймером

    LDI t,2        ;разрешение прерываний по переполнению таймера счётчика
    OUT TIMSK,t

    SEI            ;разрешение прерываний

loop1:
    RJMP loop1

    
timeint:        ;начало подпрограммы
    IN t1,PORTD    ;смотрим состояние выхода
    LDI t,64    ; загружаем 1
    SBRC t1,6    ;пропуск, если бит в регистре сброшен
    LDI t,0        ;загружаем 0

    OUT PORTD,t ;выводим новое состояние в порт
    RETI        ;выход из подпрограммы


deshifrat:
;подпрограмма определения параметров по коду (перемычек)
;принимает "t"- код распознаваемой частоты(1/15), "t3"-номер частоты (в посылке 1/2)
;возвращает "FreqH1","FreqL1","FreqH2","FreqL2"- длительности периодов частот верхний и нижний
;"DlitH1","DlitL1","DlitH2","DlitL2"- число отсчётов для 1-й, 2-й посылки
    ldi ZH,High(freqData*2) ;загрузка адреса 0-го
    ldi ZL,Low(freqData*2)  ;элемента в рег. пару Z
    LDI temp,8
    LDI temp1,0
DATA_loop:
    dec t
    breq READ_DATA
    ADD ZL,temp        ;увеличение текущёй позиции на 8
    ADC ZH,temp1
    rjmp data_loop
READ_DATA:
    lpm            ;считывание данных из ПЗУ
    mov FreqH1,r0
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z
    lpm
    mov FreqL1,r0
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z
    lpm
    mov FreqH2,r0
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z
    lpm
    mov FreqL2,r0
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z

    cpi t3,1        ;проверка какой код нужен
    BREQ one_freq    ;если код первой частоты сразу считаем, иначе перейдём ко второй
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z
one_freq:
    lpm
    mov DlitH,r0
    RCALL add_1_Z    ;увеличение на 1 регистровой пары Z
    lpm
    mov DlitL,r0

    RET    

freqData:
; список частот  и длительностей для разных частот (кодов набора) 1/15
; формат:
;FreqH1,FreqL1,FreqH2,FreqL2,DlitH1,DlitL1,DlitH2,DlitL2
;"FreqH","FreqL" - длительности периодов частот
;"DlitH","DlitL"- число отсчётов для данной частоты
    .db    197,178,197,188,0,189,1,154    ;316Гц
    .db    145,66,145,76,1,2,2,47        ;430Гц
    .db    106,191,106,201,1,95,2,248    ;585Гц
    .db    78,135,78,145,1,221,4,9        ;795Гц
    .db    57,200,57,210,2,136,5,124    ;1080Гц
    .db    42,109,42,119,3,114,7,119    ;1470Гц
    .db    31,41,31,51,4,176,10,40        ;2000Гц
    .db    70,35,70,45,2,22,4,133        ;890Гц
    .db    51,90,51,100,2,217,6,43        ;1215Гц
    .db    45,222,45,232,3,48,6,232    ;1360Гц
    .db    38,126,38,136,3,204,8,58    ;1620Гц

PM MAIL   Вверх
Коляй
Дата 25.11.2005, 19:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дорогие программисты, я только этой осенью влез в программирование по нужде. Просмотрел книжки по АСМу и ещё больше запутался. Да и там в основном по IBM. Уже почти всё сделал(демо-прошивку дорабатывал), осталось одно действие. Мне надо 32-х разрядное число умножить на 16-ти разрядное. Сложение у меня получается, но работает не совсем правильно, надо умножить. Сдвиг влево умножает хорошо, но на 2, а у меня 16-ти разрядное число изменяющееся. По этому подскажите, если не внапряг, и хорошо бы примерчик на АСМе? Контролер 2313. Спасибо.
  Вверх
cardinal
Дата 25.11.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Пожалуйста, один топик - один вопрос. maximuswand, используй в след. раз теги для кода!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
PILOT
Дата 1.12.2005, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



Цитата(maximuswand @ 18.11.2005, 07:37)
Если есть желание - посмтри код над который я пытаюсь писать сейчас.

Код

; PB0, PB1 -  используются для компаратора

Это твой код? Или на основе примера взятого со стороны?
Если твой, то молодец. Задачу определения собственной тактовой частоты я ставлю за преодоление некого барьера: выход из уровня начинающего.
Т.е. если после определенного времени работы с контроллером задача определения собственной частоты решается быстро и правильно, то можно быть увереным, базу человек знает хорошо.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
tyre
Дата 4.12.2005, 07:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











в целях обучения программирования АВРов могу посоветовать ALGORITHM BUILDER481 написанный Геннадием Громовым из тулы. Я с ней разобрался за несколько дней почти с нуля. Очень удобный граффический ассемблер.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.