avatar_Игорь

Порекомендуйте контроллер. Я созрел начинать.

Автор Игорь, 12-09-2011, 20:42:18

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

ИгорьTopic starter

В любом случае буферизованный лучше 5-ти проводков. Плату программатора уже отЛУТил, сейчас буду травить. Это будет моя первая плата с 20-ногой микросхемой поверхностного монтажа. Подстраховался - купил вторую в DIP-корпусе.

Купил 26-ю тиньку. Буду вникать в даташит.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

m16

Цитата: Игорь від 13-09-2011, 17:48:00Купил 26-ю тиньку. Буду вникать в даташит.
вникнешь попозже когда простая программа на сях сожрёт два кило флэша  или 128 байт рамы  тыньки  и прийдётся идти в магазин за мегой.
Игорь , зачем создавал тему, просил совета  если делаешь по- своему, непонимаю.


ИгорьTopic starter

Просил совета. Услышал аргументы.
1. Про нехватку ног
2. Про рост потребностей по мере проектирования.
Учел эти аргументы, за ночь перелопатил и расписал постановку задачи.
Убедился и выложил на обсуждение три момента.
1. выводов надо 16.
2. задача разрастаться не будет.
3. предположил, что можно применить тини2312 или тини26
До вечера никто не ткнул пальцем в изъяны в моих доводах, новых аргументов не поступило.
Воспринял это молчание как согласие, поэтому купил 26-ю и занялся программатором.
С учетом полученных ранее рекомендаций делаю буферизованный.

К вечеру получил новый аргумент про недостаток памяти. Это не пугает. Контроллеры доступны и недороги, собирать буду на "непаятельной" макетке, если понадобится другой контроллер, трудоемких переделок монтажа и перелопачивания программы не понадобится.

m16, можно ли твои слова о том, чо сишная прога съедает много места, воспринять как совет не тратить время на СИ и сразу пробовать свои силы в ассемблере?



Поймал первую граблю. Всю жизнь разводил платы под DIP-корпуса, а сейчас развел программатор под поверхностный монтаж и - разумеется - забыл про то, что перед печатью нужно отзеркалить изображение. Так что сборка программатора переносится на завтра. Зато высплюсь :)
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

ИгорьTopic starter

Цитата: vovanxp від 13-09-2011, 15:47:43Я думаю что микроконтроллер должен делать практически все, а те радио детали что вокруг должны согласовывать сигналы. IMXO
Входные RC - цепочки и будут согласовывать сигналы - устранять дребезг контактов, фильтровать наводки и блокировать случайные срабатывания.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

m16

Цитата: Игорь від 13-09-2011, 22:34:19m16, можно ли твои слова о том, чо сишная прога съедает много места, воспринять как совет не тратить время на СИ и сразу пробовать свои силы в ассемблере?
нет не советую. конечно же пиши на сях , я так понял с этим ты знаком . просто при таком раскладе камень пожирнее нужно закладывать тем более ты только учишься

Цитата: Игорь від 13-09-2011, 22:34:19забыл про то, что перед печатью нужно отзеркалить изображение. Так что сборка программатора переносится на завтра. Зато высплюсь
ну и что ? пузом к верху припаяй , делов то.

Цитата: Игорь від 13-09-2011, 22:34:192. задача разрастаться не будет.
не верю


Бандерівець

#20
Цитата: Игорь від 13-09-2011, 22:34:19тратить время на СИ и сразу пробовать свои силы в ассемблере?
Об этом я все расписал
http://labspirt.com/forum/index.php?topic=399.msg7518#msg7518


Хотя не меня спрашивали  ;)

Borbos

 Я решил не впихивать программатор в корпус разъёма LTP.Все равно надо будет делать USB программатор,а там может и Дракон понадобится.[attach=1]
ɐwʎ ɔ vǝmоɔ dиw

ИгорьTopic starter

#22
Цитата: m16 від 13-09-2011, 22:55:24пузом к верху припаяй , делов то.
Проволочками подпаивать - не дело, а ноги выкручивать такой манюне как-то не хочется. Не беда, завтра напечатаю заново и сделаю
Цитата: vovanxp від 13-09-2011, 22:57:48Об этом я все расписал...Хотя не меня спрашивали
Я видел твое мнение, и ты слышал мое. Мне можно это не расписывать. Свои первые шаги в программировании я делал задолго до первой встречи с персоналкой, еще с программируемым калькулятором МК-61 в начале восьмидесятых, это был ассемблер в чистом виде...
Помню - примерно в 1984 году мы с братом устраивали соревнования - чья программка на МК61 будет иметь меньше шагов и займет меньше ячеек памяти... Он был студентом ФАВТ (автоматика и вычтехника), а я - как всегда - сантехником. :). Я проигрывал, но не всегда.
Потом он подсадил меня на на клиппер... Не все и слово такое знают, наверное, но мои небухгалтерские проги расчета зарплаты и составления планов производства работ, написанные на этом языке еще до эры 1С, на моё удивление проработали в Одессагазе лет 10 - до 2000 года, из них 5 лет без моей поддержки - после моего ухода из этой организации. Но после этого стали печатать 1900 год, а исходников, чтобы подшаманить - разумеется не сохранилось. еще пару лет ими пользовались, затирая неправильный год "штрихом" и исправляя вручную.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

ИгорьTopic starter

#23
Докладываю.
Первый шаг сделан, спасибо за пинок в нужном направлении.

Полностью задачу не решил, но процентов 50 готово.
Сделал генератор ШИМ с периодом 4-5 секунд. Скважность имеет 19 равномерных градаций и зависит от цифры, которая светится на индикаторе. С этой скважностью сейчас мигает светодиод, а в реальной конструкции будет открываться транзисторный (мосфет) ключ, открывающий клапан отбора.
Изменить цифру (и скважность) можно нажатием на копку reset. Это приводит к последовательному росту скважности, с обнулением после достижения максимума.

[attach=1]

Размер hex-файла - 701 килобайт. Надеюсь, что оставшихся 65% памяти мне хватит для реализации оставшихся задач.
Разумеется, размер файла в байтах. Перепутал.

Код писал на ассемблере, по-дилетантски, как и положено сантехнику, не вдаваясь глубоко в детали, а сразу применяя то, что удалось освоить.

Интересно было бы решить аналогичную задачу на С/С++ чтобы сравнить размер итогового hex-файла.

.include "d:\avr\avrasm\appnotes\tn26def.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def ResDA=R21
.cseg
.org 0
rjmp RESET ; Reset handler
rjmp EXT_INT0 ; IRQ0 handler
rjmp PIN_CHANGE ; Pin change handler
rjmp TIM1_CMP1A ; Timer1 compare match 1A
rjmp TIM1_CMP1B ; Timer1 compare match 1B
rjmp TIM1_OVF ; Timer1 overflow handler
rjmp TIM0_OVF ; Timer0 overflow handler
rjmp USI_STRT ; USI Start handler
rjmp USI_OVF ; USI Overflow handler
rjmp EE_RDY ; EEPROM Ready handler
rjmp ANA_COMP ; Analog Comparator handl
rjmp ADC_ ; ADC Conversion Handler
;RESET:
EXT_INT0:     
PIN_CHANGE:
TIM1_CMP1A:
TIM1_CMP1B:
TIM1_OVF:
TIM0_OVF:
USI_STRT:
USI_OVF:
EE_RDY:
ANA_COMP:
ADC_:
          reti

;****************************************************
; ЦИКЛ ОТБОРА
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset:


ldi Temp,RamEnd ;установка указателя стека
out SP,Temp

ldi Temp, 1 ;задержка запуска после сброса
rcall wait

inc ResDA ;инкремент счетчика ресетов
cpi ResDA, 20 ; Сравнить с 20
brLO loo ; если меньше 20, перепрыгнуть
ldi ResDA, 0 ; присвоить значение 0

loo: ldi Temp,0b11111111 ;настройка портa
out DDRA,Temp ;"А" на индикацию цифр

rcall svet ;показать цифру на индикаторе

ldi Temp,0b00000100 ;настройка портa
out DDRB,Temp ;"В" пока на один выход - светодиод отбора



;*****************************************************************
;Цикл отбора **
;*****************************************************************
cikl: cpi ResDa,0  ; Сравнить отбор с нулем **
        brne Q1  ; Если нет - перейти на "Q1" **
rcall clos ; Если ноль - закрыть клапан **
rjmp cikl ; начать новый цикл **
Q1: cpi ResDa,19 ; Сравнить отбор с максимумом **
        brne Q2  ; Если нет - перейти на "Q2" **
rcall ope ; Если максимум - открыть клапан **
rjmp cikl ; начать новый цикл **
; еСЛИ ОТБОР НЕ НУЛЕВОЙ И НЕ ПОЛНЫЙ **
Q2: rcall ope ; открыть клапан **
MOV Temp, ResDa ; Загрузить длительность отбора в РОН **
rcall wait ; Выдержать паузу **
rcall clos ; закрыть клапан **
; Вычислить длит. отсутствия отбора: **
ldi Temp, 19 ; 1) в РОН загрузить 19 **
sub temp, ResDa ; 2) из 19 вычесть длительность отбора **
rcall wait ; Выдержать паузу **
rjmp cikl ; Начать новый цикл отбора **
;*****************************************************************
; Конец цикла отбора **
;*****************************************************************


;*****************************************************************
; Подпрограммы **
;*****************************************************************

; --------------------
; ВЫВОД ЦИФРЫ НА ТАБЛО
; --------------------
svet: cpi ResDA, 0
brne w1
ldi Temp, 0b00111111
w1: cpi ResDA, 1
brne w2
ldi Temp, 0b10111111
w2: cpi ResDA, 2
brne w3
ldi Temp, 0b00000110
w3: cpi ResDA, 3
brne w4
ldi Temp, 0b10000110
w4: cpi ResDA, 4
brne w5
ldi Temp, 0b01011011
w5: cpi ResDA, 5
brne w6
ldi Temp, 0b11011011
w6: cpi ResDA, 6
brne w7
ldi Temp, 0b01001111
w7: cpi ResDA, 7
brne w8
ldi Temp, 0b11001111
w8: cpi ResDA, 8
brne w9
ldi Temp, 0b01100110
w9: cpi ResDA, 9
brne w10
ldi Temp, 0b11100110
w10: cpi ResDA, 10
brne w11
ldi Temp, 0b01101101
w11: cpi ResDA, 11
brne w12
ldi Temp, 0b11101101
w12: cpi ResDA, 12
brne w13
ldi Temp, 0b01111101
w13: cpi ResDA, 13
brne w14
ldi Temp, 0b11111101
w14: cpi ResDA, 14
brne w15
ldi Temp, 0b00000111
w15: cpi ResDA, 15
brne w16
ldi Temp, 0b10000111
w16: cpi ResDA, 16
brne w17
ldi Temp, 0b01111111
w17: cpi ResDA, 17
brne w18
ldi Temp, 0b11111111
w18: cpi ResDA, 18
brne w19
ldi Temp, 0b01101111
w19: cpi ResDA, 19
brne w20
ldi Temp, 0b11101111
w20: out PortA, temp
ret

; ----------------
; Открытие клапана
; ----------------
Ope: ldi Temp, 0b00000100
out Portb, temp
ret

; ----------------
; Закрытие клапана
; ----------------
Clos: ldi Temp, 0b00000000
out Portb, temp
ret

; -----------------------------------
; Пауза, ee длительность = РОН "Temp"
; -----------------------------------
wait: ldi Temp1,0
ldi Temp2,0

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp
brne Loop

ret


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

ИгорьTopic starter

Снял ролик.
Для наглядности уменьшил период импульсов впятеро.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

m16

поздравляю с первой программой. как правило новички забываю стэк инициализировать , смотрю с этим у тебя всё в порядке. децимальную точку ты пользуешь для расширения до 20-ти число ступеней . если понадобится больше то можно использовать шестнадцатиричную форму исчисления , тем более что буквы А,b,C,d,E,F  легко синтезируются на семисегментнике. в итоге ты получишь 32 ступени (если конечно они нужны).
Цитата: Игорь від 19-09-2011, 20:52:49ВЫВОД ЦИФРЫ НА ТАБЛО
разумеетя нужно делать через массив. это и быстрее и код короче.

в строке  .include "d:\avr\avrasm\appnotes\tn26def.inc"

полный путь  можно не указывать, достаточно
.include "tn26def.inc"

ЦитатаРазмер hex-файла - 701 килобайт
не верю

завтра код изучу

ИгорьTopic starter

#26
m16, спасибо за комментарий.
По поводу стека - споткнулся. Сперва использовал стек - передавал через него длительности, потом пошел другим путем и инициализацию стека закомментировал. Прошилось, но не пошло. Понял, что стеком пользуюсь не только я... :), вернул на место. Всё заработало.

Сложнее всего было сообразить как работает подсмотренная где-то программа задержки. Присвоил регистру ноль, декрементировал. Получил минус единицу. По логике при дальнейшем декрементировании регистр никогда не обнулится...
Подумал, допёр, что минус 1 - это 255 (8 единиц) в регистре. И моя задержка равна 255х255хзасылаемоё число машинных циклов.

Цитата: m16 від 19-09-2011, 21:53:43не верю
Сам в шоке...
Вот код.

:020000020000FC
:100000000CC00AC009C008C007C006C005C004C0B3
:1000100003C002C001C000C018950FED0DBF01E084
:100020005DD05395543108F050E00FEF0ABB12D069
:1000300004E007BB503011F44ED0FCCF533111F423
:1000400047D0F8CF45D0052F49D045D003E1051B57
:1000500045D0F0CF503009F40FE3513009F40FEBE5
:10006000523009F406E0533009F406E8543009F43C
:100070000BE5553009F40BED563009F40FE4573019
:1000800009F40FEC583009F406E6593009F406EE8D
:100090005A3009F40DE65B3009F40DEE5C3009F4DA
:1000A0000DE75D3009F40DEF5E3009F407E05F30D5
:1000B00009F407E8503109F40FE7513109F40FEF63
:1000C000523109F40FE6533109F40FEE0BBB0895DA
:1000D00004E008BB089500E008BB089510E020E0AC
:1000E0001A95F1F712E32A95D9F70A95C9F70895F9
:00000001FF
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

ИгорьTopic starter

#27
Заглядывая вперед, вижу, что мне надо разобраться с приоритетностью прерываний. Наврное ресет самое приорететное, поэтому кнопку с этой линии куда-то надо будет убирать. Reset будет следить за наличием напряжения в сети - при перезагрузке отбор начинаться не должен. Туда-же подвешу сигнал от датчика потопа. Если система будет остановлена по этому прерыванию, состояние будет называться " потоп или конец света" :)

Самое неприоритетное прерывание должно будет соответствовать зашкалу температуры в насадке. По этому прерыванию должен отключиться отбор и включиться пикающий звуковой сигнал с нарастающей частотой и скважностью, который через 5-10 минут должен превратиться в непрерывный. После этого нагрев и вода должны отключиться. Может быть НЕ одновременно.

Еще два прерывания - от реле температуры в кубе и от реле температуры на трубке связи. Они должны включить звук и отключить нагрев и воду. Без предварительного звукового сопровождения.

На первый взгляд объем оставшихся планов не намного больше (а может и меньше) уже решенной части. Задачи-то однотипные, буду использовать подпрограммы.

Всё, падаю спать. Прошлую ночь не спал совсем.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

vadiv

Цитата: m16 від 19-09-2011, 21:53:43Размер hex-файла - 701 килобайт
Да без кило 701 байт скорее всего

m16

Цитата: Игорь від 19-09-2011, 21:57:47По поводу стека - споткнулся. Сперва использовал стек - передавал через него длительности, потом пошел другим путем и инициализацию стека закомментировал.
за стэком нужно следить . в пределах подпрограммы  каждому PUSH  должен быть свой РОР .  потом для временного хранения можно смело пользовать младшую половину ронов  r0-r15.

Цитата: Игорь від 19-09-2011, 22:17:43Заглядывая вперед, вижу, что мне надо разобраться с приоритетностью прерываний. Наврное ресет самое приорететное, поэтому кнопку с этой линии куда-то надо будет убирать.
приоритет прерываний в авре на аппаратном уровне можо сказать  условная и его нужно организовывать на программном уровне


SMF spam blocked by CleanTalk