Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: tiny2313 & mega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5, 6
Terapefft
Доброго времени суток господа!!
Подскажите пожалуйста начинающему....Передо мной стоит задача следующего характера: в оборудовании имеется плата индикации (на ней стоит tiny2313) и плата управления (на ней mega8). Недавно я переделывал прогу для тини2313 (раньше там использовался s1200). Сейчас стоит задача переделать немного прогу на мегу8....
Сейчас она управляет клапаном, т.е. при достижении клапаном определеного датчика (на 0,5 литра или на 1 л), он возвращается обратно, дозируя тем самым необходимое количество жидкости. Но теперь необходимо просто поставить насос (сигнал с платы идет на частотник, а насос подключен к нему), который будет дозировать следующим образом: включатся на некоторый промежуток времени (который можно будет изменять) и выключатся. Алгоритм работы я представляю: нужен регистр в который будет сохранятся введеное значение с платы индикации, потом это значение должно попасть в счетчик, и в самой програме после выставления флага на включение насоса перейти на ПП обработки прерывания для выдержания насоса во включеном состоянии нужное количество времени. Посоветуйте пожалуйста как это все лучше сделать... Вот исходник проги для платы управления
Семён
Цитата(Terapefft @ Nov 10 2006, 11:54) *
Доброго времени суток господа!!
Подскажите пожалуйста начинающему....Передо мной стоит задача следующего характера: в оборудовании имеется плата индикации (на ней стоит tiny2313) и плата управления (на ней mega8). Недавно я переделывал прогу для тини2313 (раньше там использовался s1200). Сейчас стоит задача переделать немного прогу на мегу8....
Сейчас она управляет клапаном, т.е. при достижении клапаном определеного датчика (на 0,5 литра или на 1 л), он возвращается обратно, дозируя тем самым необходимое количество жидкости. Но теперь необходимо просто поставить насос (сигнал с платы идет на частотник, а насос подключен к нему), который будет дозировать следующим образом: включатся на некоторый промежуток времени (который можно будет изменять) и выключатся. Алгоритм работы я представляю: нужен регистр в который будет сохранятся введеное значение с платы индикации, потом это значение должно попасть в счетчик, и в самой програме после выставления флага на включение насоса перейти на ПП обработки прерывания для выдержания насоса во включеном состоянии нужное количество времени. Посоветуйте пожалуйста как это все лучше сделать... Вот исходник проги для платы управления

В меге8 есть еще один таймер, который Вы не используете в программе. Запрограммируйте его с нужной Вам дискретностью (точность отсчета) и по переполнению декрементируете значение с платы индикации, как дойдете до нуля выставляете флаг «Насос отключить»
Dog Pawlowa
Цитата(Terapefft @ Nov 10 2006, 11:54) *
Посоветуйте пожалуйста как это все лучше сделать... Вот исходник проги для платы управления

Посоветовать не жалко... Не обижайтесь, но может Вам опыта набраться, прежде чем двухпроцессорные комплексы разрабатывать ?
Простейший вопрос - обработка ошибок. Человек нажимает на кнопки, а если что-то не отработало, но на табло он увидеть, что что-то не в порядке. Значит, подключение должно быть двухсторонним.
Значит, должен быть интерфейс.
И пошло-поехало...
А для отработки временных задержек должно работать прерывание таймера с фиксированной длительностью.
Terapefft
2 Dog Pawlowa я прекрасно понимаю что не достаточно мне еще опыта, но к сожалению мое начальство это мало интересует...тем более что в нашей фирме эту тему больше некому поручить. Я тут недавно мучался с тини2313, переделывал под них проги...но с ними как то попроще было...
Dog Pawlowa
Цитата(Terapefft @ Nov 10 2006, 14:22) *
2 Dog Pawlowa я прекрасно понимаю что не достаточно мне еще опыта, но к сожалению мое начальство это мало интересует...тем более что в нашей фирме эту тему больше некому поручить.

Ну, повезло значит. Так лучше, чем просто штаны просиживать :-)
Попробуйте все-таки начать с проектирования сверху вниз - то есть определить функции двух блоков и их взаимодействие. Поверьте, таймеры и программа - это абсолютно неважно на этом этапе. В большинстве моих приборов работает прерывание таймера с частотой 1 кГц, и его период 1 мс вполне достаточен для точности задания времени. Аппаратный таймер не нужен. Попробуйте написать такой фрагмент программы.
Семён
Цитата(Terapefft @ Nov 10 2006, 14:22) *
Я тут недавно мучался с тини2313, переделывал под них проги...но с ними как то попроще было...

Да помню тот вопрос, кстати, Вы обещали написать, в чем были грабли.
Terapefft
Цитата(Семён @ Nov 10 2006, 14:47) *
Цитата(Terapefft @ Nov 10 2006, 14:22) *

Я тут недавно мучался с тини2313, переделывал под них проги...но с ними как то попроще было...

Да помню тот вопрос, кстати, Вы обещали написать, в чем были грабли.

я на самом деле уже переделал штуки 4 программы smile.gif в первых трех надо было просто добавить инициализацию стэка, добавить строчку в ПП записи в EEPROM, и правильно выставить фузыsmile.gif а вот с последней пришлось помучатся...
Terapefft
Цитата(Dog Pawlowa @ Nov 10 2006, 14:46) *
Цитата(Terapefft @ Nov 10 2006, 14:22) *

2 Dog Pawlowa я прекрасно понимаю что не достаточно мне еще опыта, но к сожалению мое начальство это мало интересует...тем более что в нашей фирме эту тему больше некому поручить.

Ну, повезло значит. Так лучше, чем просто штаны просиживать :-)
Попробуйте все-таки начать с проектирования сверху вниз - то есть определить функции двух блоков и их взаимодействие. Поверьте, таймеры и программа - это абсолютно неважно на этом этапе. В большинстве моих приборов работает прерывание таймера с частотой 1 кГц, и его период 1 мс вполне достаточен для точности задания времени. Аппаратный таймер не нужен. Попробуйте написать такой фрагмент программы.

у меня есть обе проги рабочие, там нада просто выкинуть подпрограму где обрабатываются сигналы от датчиков и вставить свое, просто эти гады мне времени мало выделили на все это. А объяснять им бесполезно. Я вот тут сделал подпрограмму для второго таймера с нужной мне точностью

ldi rin4, 0b00000111;
out tccr2, rin4;
ldi rin4, $3c;
out tcnt2, rin4;

ldi rin4, 0b01000000;
out timsk, rin4;

а вот как сделать так чтобы время включения насоса менять можно было бы?
вот на всякий случай прога для ПИ
slog
Я сильно не разбирался с твоей программой, так просто взглянул.
Вот что заметил сразу:

;-----------------------------------------------------------------------
; подпрограмма перевода числа в диапазоне 0 - 15 в код семисегментного
; индикатора числам от 10 до 15 соответствует код от A до F

Вот это вообще-то по таблице делать лучше
Dog Pawlowa
Цитата(Terapefft @ Nov 10 2006, 17:27) *
Я вот тут сделал подпрограмму для второго таймера с нужной мне точностью

а вот как сделать так чтобы время включения насоса менять можно было бы?
вот на всякий случай прога для ПИ

Увы, пишу только на С, и до уровня кодирования регистров и таймеров дохожу только после продумывания структуры прибора. Чего и Вам желаю :-)
Вы выбрали способ передачи информации о времени работы насоса?
SasaVitebsk
Цитата(slog @ Nov 10 2006, 17:46) *
Я сильно не разбирался с твоей программой, так просто взглянул.
Вот что заметил сразу:

;-----------------------------------------------------------------------
; подпрограмма перевода числа в диапазоне 0 - 15 в код семисегментного
; индикатора числам от 10 до 15 соответствует код от A до F

Вот это вообще-то по таблице делать лучше


biggrin.gif

Видал я линейных программистов, но чтобы до такой степени. blink.gif

Если таблицей(согласно 'slog'), то на асме это делается так (wl = 0-15):

ldi Zl,low(TablHex*2)
ldi Zh,high(TablHex*2)
add Zl,wl ; определить смещение
adc Zh,Vol0
lpm wl,Z ; найти истинный код символа
...
TablHex:
.db $30, $31, $32, $33, $34, $35, $36, $37
.db $38, $39, $41, $42, $43, $44, $45, $46

(таблица другая)
Банально, правда?
defunct
Terapefft
Писали бы такого рода программы на C.. Оно проще и быстрее будет.
Компилятор сгенерит более компактный код, чем тот что Вы пишете..
Kovrov
Цитата(Terapefft @ Nov 10 2006, 15:22) *
но к сожалению мое начальство это мало интересует...тем более что в нашей фирме эту тему больше некому поручить.

Offtopic:
последнее время очень модно стало писать на асм именно на рабочем месте, в надежде на плохую читаемость или вовсе не читаемость другим человеком , если к примеру писавшего увольняют или сам увольняется.
Наверное какая никакая отрада для души.
vesago
Несомненное есть и такое. Но имхо - это маразм. В наше время на мой взгляд имеет значение только скорость. Ушло в прошлое время когда программеру платили за строчки кода и неразрывно связанной с этим идеи эксклюзивности. Незря все большии позиции завоевывает опенсоурс.
SasaVitebsk
Цитата(vesago @ Nov 12 2006, 17:45) *
Несомненное есть и такое. Но имхо - это маразм. В наше время на мой взгляд имеет значение только скорость. Ушло в прошлое время когда программеру платили за строчки кода и неразрывно связанной с этим идеи эксклюзивности. Незря все большии позиции завоевывает опенсоурс.

Если взламывать, то на Си сложнее чем на асме. А если документацию передавать, то наново легче написать чем разобраться и внести изменения. Здесь, конечно с асмом посложнее.
Terapefft
Цитата(Dog Pawlowa @ Nov 10 2006, 22:19) *
Цитата(Terapefft @ Nov 10 2006, 17:27) *

Я вот тут сделал подпрограмму для второго таймера с нужной мне точностью

а вот как сделать так чтобы время включения насоса менять можно было бы?
вот на всякий случай прога для ПИ

Увы, пишу только на С, и до уровня кодирования регистров и таймеров дохожу только после продумывания структуры прибора. Чего и Вам желаю :-)
Вы выбрали способ передачи информации о времени работы насоса?

Насколько я себе представляю мне нужно просто выставить флаг включения насоса, выдержать нужное мне время, с помощью таймера счетчика. И затем выставить флаг отключения насоса. Или я что то не так понимаю?
Семён
Цитата(Terapefft @ Nov 13 2006, 09:07) *
Насколько я себе представляю мне нужно просто выставить флаг включения насоса, выдержать нужное мне время, с помощью таймера счетчика. И затем выставить флаг отключения насоса. Или я что то не так понимаю?

Обсолютно правильно

Цитата(Kovrov @ Nov 12 2006, 17:26) *
Offtopic:
последнее время очень модно стало писать на асм именно на рабочем месте, в надежде на плохую читаемость или вовсе не читаемость другим человеком , если к примеру писавшего увольняют или сам увольняется.
Наверное какая никакая отрада для души.

ИМХО: Не забывайте, что иногда еще фигурирует стоимость окончательного устройства. Для не больших проектов ассемблер, особенно при работе с битами, более интересен.
Terapefft
а вот как сделать так чтобы значение введеное с платы индикации сохранялось в счетчике на плате управления?
Wild007
Цитата(Terapefft @ Nov 13 2006, 11:49) *
а вот как сделать так чтобы значение введеное с платы индикации сохранялось в счетчике на плате управления?


Через SPI smile.gif .
Семён
Цитата(Terapefft @ Nov 13 2006, 12:49) *
а вот как сделать так чтобы значение введеное с платы индикации сохранялось в счетчике на плате управления?

ИМХО: Конкретную реализацию за Вас вряд ли кто-то будет делать. Поэтому изучите, как сейчас у Вас реализована связь и добавти передачу своего значения.
Terapefft
Я вроде сделал в меню параметр который будет контролировать время включения насоса, все нормально меняется. Для отсчета времени выбрал счетчик timer2, так как он не использовался, но когда я в начале проги поставил переход на метку timer2 и сконфигурировал таймер, у меня почему при включении питания теперь индикатор вобще не светится
Wild007
Цитата(Terapefft @ Nov 15 2006, 14:24) *
Я вроде сделал в меню параметр который будет контролировать время включения насоса, все нормально меняется. Для отсчета времени выбрал счетчик timer2, так как он не использовался, но когда я в начале проги поставил переход на метку timer2 и сконфигурировал таймер, у меня почему при включении питания теперь индикатор вобще не светится

Без текста проги ответ -- это стрельба по воробьям smile.gif
Terapefft
вот исходник smile.gif который я уже пытался переделать

вот исходник smile.gif который я уже пытался переделать
Wild007
Стандартная ошибка:
timer2:

ldi rin,0b00000111 ; CK/1024
out tccr2,rin ;
ldi rin,$3c ; $3c=60
out tcnt2,rin ; Ïåðèîä (255-60)*1024/2000000=0.09984c

ldi rin,0b01000000 ; Ïîäêëþ÷àåì òîëüêî òàéìåð Timer2
out timsk,rin ; overflow timer2


ldi rin4,TNASOS ;здесь создан бесконечный цикл smile.gif
dec rin4
cpi rin4,0 ;
brne timer2 ;при возврате из этой точки rin4 ВСЕГДА равен TNASOS
reti
Ищи точку для

ldi rin4,TNASOS
успехов!! smile.gif
Terapefft
просто это мой первый болеменее серъезный проект smile.gif а если вот так сделать ? :
ldi rin4,TNASOS ;

timer2:

ldi rin,0b00000111 ; CK/1024
out tccr2,rin ;
ldi rin,$3c ; $3c=60
out tcnt2,rin ; Ïåðèîä (255-60)*1024/2000000=0.09984c

ldi rin,0b01000000 ; Ïîäêëþ÷àåì òîëüêî òàéìåð Timer2
out timsk,rin ; overflow timer2


dec rin4
cpi rin4,0 ;
brne timer2 ;
reti
Wild007
Цитата(Terapefft @ Nov 15 2006, 15:53) *
просто это мой первый болеменее серъезный проект smile.gif а если вот так сделать ? :
ldi rin4,TNASOS ;

timer2:

ldi rin,0b00000111 ; CK/1024
out tccr2,rin ;
ldi rin,$3c ; $3c=60
out tcnt2,rin ; Ïåðèîä (255-60)*1024/2000000=0.09984c

ldi rin,0b01000000 ; Ïîäêëþ÷àåì òîëüêî òàéìåð Timer2
out timsk,rin ; overflow timer2


dec rin4
cpi rin4,0 ;
brne timer2 ;
reti

Работать будет, НО некоректно в п\п обработки прерываний долго заниматься какими нибудь вычислениями, тем более устраивать там задержки. П\п должна выставить(изменить) какой-то флаг и вернуться в MAIN_LOOP и уже там обрабатывать информацию о произошедшем прерывании. Во время обработки прерывания все (CLI) прерывания запрещаются при входе в п\п прерывания и разрешаются после команды RETI. Поэтому код обработки должен быть как можно короче, для правильной и своевременной обработки других прерываний. smile.gif smile.gif
Wild007
И в догонку:
Студия имеет хорошие возможности для отладки. Создавать отдельные окна, в них писать куски програмы, отлаживать, и потом вставлять в основной текст прогрвммы. При отладке сразу большой программы всегда возникает много вопросов и найти ошибки не так то просто.
Terapefft
я вот вчера вечером еще раз переделал прогу, попробовал просто подключить таймер2, вроде все нормально компилится, но когда прошиваю контроллер и ставлю на плату, после подачи питания даже индикатор перестал светится, может опять чего нить не так сделал? Причем до того как я ввел таймер2 все нормально работало....
Wild007
Ну попорядку:
.def d =r0 ;R0 не желателно использовать, т.к. он используются командой LPM
timer2:
cli ;Ты видимо не понял: Вход в пп обработки УЖЕ останавливает обработку других прерываний.
ldi rin,$3c ; $3c=60
out tcnt2,rin ;
ldi rin,TNASOS ;
prov:

dec rin ;
cpi rin,0 ;
brne prov ;Этот цикл лучше вынести в главный цикл (MAIN_LOOP)

reti ; А команда RETI сама разрешает прерывания.
sei : В данном случае SEI должно стоять перед RETI, хотя в их использовании (CLI, SEI) нет необходимости smile.gif

При отладке обрати внимание на регистр TIFR, там появляются нежелательные флаги. И как говорится: Учите матчасть. За это здорово Бьют smile.gif smile.gif smile.gif
Terapefft
переделал все, прошил контролер, поставил на плату а толку никакого sad.gif все равно не светится. а когда убираю второй таймер, то все нормально....из за чего это может происходить???
Dog Pawlowa
Цитата(Terapefft @ Nov 16 2006, 16:12) *
переделал все, прошил контролер, поставил на плату а толку никакого sad.gif все равно не светится. а когда убираю второй таймер, то все нормально....из за чего это может происходить???

Вопросы приблизительно такие, как если я оказался за штурвалом самолета :-)

Несколько советов.
1. Атмега 32 дороже на копейки по сравнению с потраченным временем. Можно сделать проект на Атмеге, которая поддерживает JTAG. Тогда отладка и поиск ошибок легки и непринужденны.
2. В городе есть специалисты по AVR? Советую найти, придти с бутылкой, поплакаться и договориться. Я вот студентов учу за бесплатно, за бутылку я бы горы перевернул. laugh.gif

Ясно одно - ступеньку непонимания Вы самостоятельно не перешагнете, а тут за Вас никто двухконтроллерный проект не заваяет.
Terapefft
2 Dog Pawlowa спасиба Вам за дельный совет....повезло Вашим студентам
Terapefft
за меня не надо ваять проект, я просто хочу понять почему он не работает со вторым таймером
Wild007
Цитата(Terapefft @ Nov 16 2006, 15:12) *
переделал все, прошил контролер, поставил на плату а толку никакого sad.gif все равно не светится. а когда убираю второй таймер, то все нормально....из за чего это может происходить???

Для того, чтобы найти ОЧЕРЕДНУЮ АСиПку smile.gif нужен ОЧЕРЕДНОЙ текст.
Terapefft
а сейчас возникла очередная проблема sad.gif даже при отключеном втором таймере, когда запускаешь устройство, проходит цикл, загорается первая, вторая и третья лампочка, и индикатор гаснет, а затем опять точно также, хотя он должен гореть постояно. хекс которым прошивают щас работает нормально, ничего не гаснет, но дело в том что исходника к нему нетsad.gif . А тот который я нашел тоже работает нормально , вот тока почему то гаснет после каждого цикла
Wild007
Цитата(Terapefft @ Nov 17 2006, 11:05) *
а сейчас возникла очередная проблема sad.gif даже при отключеном втором таймере, когда запускаешь устройство, проходит цикл, загорается первая, вторая и третья лампочка, и индикатор гаснет, а затем опять точно также, хотя он должен гореть постояно. хекс которым прошивают щас работает нормально, ничего не гаснет, но дело в том что исходника к нему нетsad.gif . А тот который я нашел тоже работает нормально , вот тока почему то гаснет после каждого цикла

Т.е. ты (и я) пытаемся разобраться в нерабочем исходнике??????????? ohmy.gif
Terapefft
ну я думаю эту проблему я решу, главное со вторым таймером разобратся

просто я это только седня обнаружил
Wild007
Цитата(Terapefft @ Nov 17 2006, 11:47) *
ну я думаю эту проблему я решу, главное со вторым таймером разобратся

просто я это только седня обнаружил

Как я писал раньше: Студия имеет хорошие возможности для отладки. Создавать отдельные окна, в них писать куски програмы, отлаживать, и потом вставлять в основной текст прогрвммы. При отладке сразу большой программы всегда возникает много вопросов и найти ошибки не так то просто.
А отлаживать сразу на железе мм...
В TIMER2 ошибок вроде нет, но вначале програмы:
.cseg
.org $000
rjmp main ; reset Handle
;.org $004
; reti
; rjmp timer2 ; Timer 2 overflow Handle 0.1 ñåêóíäû
.org $008
; reti ;
rjmp timer1 ; Timer 1 overflow Handle
.org $009
; reti
rjmp timer0 ; Timer 0 overflow Handle 0.1 ñåêóíäû
.org $00E
; reti
rjmp adc_preob ; ADC convertion complete
.org $010
; reti
rjmp ancomp ; Analog Comparator handle

заремлины RETI, а у тебя в TIFR появляются лишние флаги (это только то что я увидел) и прерывания летят не туда куда ты думаешь. На все неиспользуемые прерывания корректней ставить RETI для уменьшения головной боли от отладки, т.к. при возникновении непредвиденного прерывания програма продолжит выполнение дальше ничего не изменив. А если нет RETI, в точке прерывания, РС идет дальше и выполняет RJMP другого прерывания, что не есть хорошо.
И я согласен с Dog Pawlowa : бери бутылку и на поиски smile.gif
Terapefft
дык яб с удовольствием smile.gif тока где его достать такого умельца....
Wild007
Цитата(Terapefft @ Nov 17 2006, 12:25) *
дык яб с удовольствием smile.gif тока где его достать такого умельца....

Ну ни зачто не поверю что в вашем городе только ты занимаешься AVR. Дай объявление в газету и ты будешь приятно удивлен!! smile.gif
Alex_Pol
Цитата(Wild007 @ Nov 17 2006, 11:17) *
Т.е. ты (и я) пытаемся разобраться в нерабочем исходнике??????????? ohmy.gif

Это у терапеффта вечная проблема: несоответствие представляемых исходников реально работающей программе. Причём, несоответствия не велики, но разобраться невозможно.
2Terapefft @. Возьмите ваш hex - файл. Засуньте его в "Студию". Она кинется его отлаживать и выдаст дезассемблированный искомый исходник. Формат жутковатый, полуфабрикат, но разобраться можно.
С помощью этого полуфабриката приведите исходник, имеющийся у вас, в соответствие с прошивкой. Работы на пол - дня максимум. После этого можете выкладывать исходник, будем помогать. В ходе выполнения работы по сравнению двух файлов, просветление может наступить само. Тогда отпишите нам, где лежали грабли. Вот всё, что могу пока посоветовать. smile.gif
Terapefft
вроде все исправил, теперь работает нормально, индикатор не гаснет после каждого цикла smile.gif. Но со вторым таймером все равно никак...
Wild007
Цитата(Terapefft @ Nov 17 2006, 13:20) *
вроде все исправил, теперь работает нормально, индикатор не гаснет после каждого цикла smile.gif. Но со вторым таймером все равно никак...

Так ведь в приложенном файле он заремлен!
Terapefft
так я и говорю что без него теперь все нормально работает как и должно (раньше и без него индикация гасла после каждого цикла). А теперь как тока убираешь ";" перед .org $004, то после подачи питания, на плате индикации вобще ничего не высвечивается
Wild007
Цитата(Terapefft @ Nov 17 2006, 13:49) *
так я и говорю что без него теперь все нормально работает как и должно (раньше и без него индикация гасла после каждого цикла). А теперь как тока убираешь ";" перед .org $004, то после подачи питания, на плате индикации вобще ничего не высвечивается

А в стек переменную RIN отправлять не пробовал в прерывани? smile.gif
Terapefft
щас попробовал, все равно плата индикации не светится sad.gif
singlskv
Цитата(Terapefft @ Nov 17 2006, 15:11) *
щас попробовал, все равно плата индикации не светится sad.gif

Код
;---------------    Timer0        --------------------------------------


    ldi    rin,0b00000001; Подключаем только Timer0
    out    timsk,rin; overflow timer0

;---------------    Timer2        --------------------------------------

    ldi    rin,0b01000000; Подключаем только Timer2
    out    timsk,rin; overflow timer2

Вот он Ваш еггор smile.gif
Если Вам необходимы прерывания всех трех таймеров, то
нужно написать один раз:
ldi rin,0b01000101
out timsk,rin
Terapefft
во засветился smile.gif))) осталось теперь сделать так чтоб после выставления флага на включение насоса, выполнялось прерывание которое выдерживало бы насос во включеном состоянии..Займусь на выходных smile.gif))
yung
Извиняюсь за offtop, не "Эльф-4М" в очередной раз потеряло единственного инженера и теперь вновь принятый за все отдувается? По тематике похоже.
Terapefft
2 yung имено так smile.gif)) попал блин под расдачу...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.