|
Счетчик на 2313, счетчик импульсов |
|
|
|
Nov 24 2008, 14:53
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 16-06-08
Из: Челны
Пользователь №: 38 318

|
Прошу не закидывать камнями, это мой первый проект. Взялся за задачу. Счетчик на авр. В качестве камня решил взять 2313. дисплей взял тот что был в протеусе. Импульсы приходят с частотой 1 мегагерц. Отрабатывают на прерывания. Так же будет кнопка на обнуление. Данный прибор хочу поставить на линию, счетчик готовой продукции. Программную среду решил использовать CAVR ,брался за ИАР но не осилил жки модуль(в программировании я тоже не силен). В общем накидал такую схемку. Код получился такой. Код #include <90s2313.h> #asm .equ __lcd_port=0x18;PORTB #endasm #include <lcd.h> #include <delay.h> #include <stdio.h> char i; interrupt [EXT_INT0] void ext_int0_isr(void) { }
interrupt [EXT_INT1] void ext_int1_isr(void) {
i++; lcd_putchar(i); delay_ms(20); lcd_clear();
}
void main(void) {
PORTD=0xff; DDRD=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: On // INT1 Mode: Rising Edge GIMSK=0xC0; MCUCR=0x0F; GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
// LCD module initialization lcd_init(16);
// Global enable interrupts #asm("sei")
while (1) { }; } В общем он на жки выводит символы, 123..abc.. и т.д А надо счет, максимальная цифра 1000 000. Подскажите что не так?
Эскизы прикрепленных изображений
--------------------
www.ea16.ru
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 19)
|
Nov 24 2008, 15:51
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Aleksandr_des @ Nov 24 2008, 18:53)  Код получился такой. Код /************************/ char i; interrupt [EXT_INT0] void ext_int0_isr(void) { }
interrupt [EXT_INT1] void ext_int1_isr(void) {
i++; lcd_putchar(i); delay_ms(20); lcd_clear();
} В общем он на жки выводит символы, 123..abc.. и т.д А надо счет, максимальная цифра 1000 000. Подскажите что не так? Дык, все не так. 1.Для того чтоб посчитать до 10^6 надо переменную типа long 2. lcd_putchar(i); выводит char - вам же надо вывести long Исправляйте кривизну, и удачи!
|
|
|
|
|
Nov 26 2008, 13:24
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 16-06-08
Из: Челны
Пользователь №: 38 318

|
Переписал все. Код #include <90s8535.h> #include <delay.h> #include <stdio.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15;PORTC #endasm #include <lcd.h> long i; char lcd_buffer[33]; interrupt [EXT_INT1] void ext_int1_isr(void) { i++; }
void main(void) { GIMSK=0xC0; MCUCR=0x0E; GIFR=0xC0; lcd_init(16); #asm("sei") while (1) { sprintf(lcd_buffer,i); lcd_puts(lcd_buffer); delay_ms(50); lcd_clear();
}; } Подскажите пожалуйста как перевести значение переменной long в char?
--------------------
www.ea16.ru
|
|
|
|
|
Nov 26 2008, 13:53
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 16-06-08
Из: Челны
Пользователь №: 38 318

|
Цитата(Nemo2000 @ Nov 26 2008, 16:41)  Да не long в char вам переводить надо, а понять, что же вы хотите увидеть. Счет с частотой в 1 МГц? Даже если бы ЖКИ и позволил с такой частотой обновлять инфу, вы уверены, что что-нить на нем разобрали бы?  Задержка разве не позволит увидеть?, не надо же фиксировать значение в онлайне, но зато можно посмотреть какая сотня или тысяча идет. Или например в момент остановки счета.
--------------------
www.ea16.ru
|
|
|
|
|
Nov 26 2008, 14:03
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Значительно лучше. Цитата(Aleksandr_des @ Nov 26 2008, 15:53)  Подскажите пожалуйста как перевести значение переменной long в char? sprintf(lcd_buffer, "%ld", i); И еще. Не long i; а volatile long i;
|
|
|
|
|
Nov 26 2008, 14:30
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 8-04-05
Из: Санк-Петербург
Пользователь №: 3 972

|
Цитата(Aleksandr_des @ Nov 26 2008, 17:53)  Задержка разве не позволит увидеть?, не надо же фиксировать значение в онлайне, но зато можно посмотреть какая сотня или тысяча идет. Или например в момент остановки счета. Сотня пролетает за 100мкс, тысяча - за 1мс... что с учетом задержки в 50мс выглядит тоже не очень понятно, впрочем дело ваше. 1. long i как уже и советовали заменить на volatile unsigned long i (маск значение 4294967296) 2.char lsd_buffer[33] 33 из каких соображений? Если выводить только i то там максимум 10 знаков. кроме этого так же добавил бы unsigned char lsd_... 3.lsd_puts в качестве аргумента принимает char? (сам не знаю, но так написано у _Pasha) если да то вывод написать чуть по другому Код for (j = 0; j < 10, j++) { lsd_puts(lsd_buffer[j]); } как-то так.
|
|
|
|
|
Nov 26 2008, 14:46
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Nemo2000 @ Nov 26 2008, 16:30)  добавил бы unsigned char lsd_... Эээ.. А зачем? Цитата 3.lsd_puts в качестве аргумента принимает char? (сам не знаю, но так написано у _Pasha) если да то вывод написать чуть по другому Код for (j = 0; j < 10, j++) { lsd_puts(lsd_buffer[j]); } как-то так. В исходном варианте использовалась lcd_putchar(). В исправленном - lcd_put s(), которая, как я подозреваю, выводит строку целиком.
|
|
|
|
|
Nov 26 2008, 15:12
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 8-04-05
Из: Санк-Петербург
Пользователь №: 3 972

|
Цитата(vik0 @ Nov 26 2008, 18:46)  Эээ.. А зачем? я так думаю (с)  коды символов - они беззнаковые, посему на мой взгляд, так будет правильнее, на истину в последней инстанции не претендую  Цитата В исходном варианте использовалась lcd_putchar(). В исправленном - lcd_puts(), которая, как я подозреваю, выводит строку целиком. Не заметил. Виноват, исправлюсь
|
|
|
|
|
Nov 26 2008, 15:35
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата И еще. Не long i; а volatile long i; Попутно спрошу а почему именно volatile? И обязательно-ли для всех переменных что используються в прерываниях использовать этот квалификатор?
|
|
|
|
|
Nov 26 2008, 17:59
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(mempfis_ @ Nov 26 2008, 18:35)  Попутно спрошу а почему именно volatile? "volatile" дает компилятору понять, что переменная может измениться неизвестным для него (компилятора) образом. Например, есть такая ситтуация. Код int i;
ISR (SOME_SIGNAL_vect) { i = 0xFF; }
int main(void) { ... i = 0; // Читаем переменную из памяти some_wait(); // Чего то ждем
some_routine(i); // Какая-та функция, использующая i ... } Если во время some_wait будет вызвано прерывание, то i изменится. Но компилятор оптимизирует обращения к переменным и после операции "i = 0" значение i уже находится в регистрах, так что повторного чтения i перед вызовом some_routine не происходит, в результате some_routine будет вызвано со старым i. Что бы такого не происходило, используют volatile. Это указывает компилятору, что обращение к переменной оптимизировать не надо. Цитата(mempfis_ @ Nov 26 2008, 18:35)  И обязательно-ли для всех переменных что используються в прерываниях использовать этот квалификатор? Как Вы наверное понимаете, необходимость объявлять как volatile, с прерыванием связана косвено.
|
|
|
|
|
Nov 26 2008, 18:09
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(mempfis_ @ Nov 26 2008, 17:35)  Попутно спрошу а почему именно volatile? Если по-простому, то это - информация для компилятора, указывающая на то, что значение переменной может быть изменено в любой момент. Цитата И обязательно-ли для всех переменных что используються в прерываниях использовать этот квалификатор? Да, если переменная используется где-либо еще.
|
|
|
|
|
Nov 27 2008, 08:57
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(mempfis_ @ Nov 27 2008, 10:50)  В одних случаях код вообще не меняется, А вы оптимизацию включите  Цитата а в других появляются сообщения типа: Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement когда пытаюсь передать volatile глобальную переменную как параметр функции. Кусок кода привели бы... Цитата Почему компилятор считает что эта глобальная переменная "в соответствии с volatile-доступом неопределена в этом выражении"? Нет. "порядок доступа к volatile переменным не определен в данном выражении"
|
|
|
|
|
Nov 27 2008, 10:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата А вы оптимизацию включите Подобное предупреждение выскакивает при любых уровнях оптимизации Цитата Кусок кода привели бы... Полный код привести не могу (он очень большой) Работает он приблизительно так как приведено ниже (только проверок внутри State1, State2 больше): Код #define time1 10 #define time2 20 unsigned int timer;
#define state1 0 #define state2 1
//прерывание от ТС1 по совпадению с автосбросом #pragma vector=TIMER1_COMPA_vect __interrupt void TIMER1_COMPA_IRQ(void) { //сканирование кнопки Button_Scun(); }
void GoToState1(unsigned int t) { SaveLog(t); timer = 0; state = state1; }
void GoToState2(unsigned int t) { SaveLog(t); timer = 0; state = state2; }
void State1(void) { timer++; if(timer > time1) GoToState2(timer); }
void State2(void) { timer++; if(timer > time2) GoToState1(timer); }
void main(void) { state = state1; timer=0;
for(;;) { __watchdog_reset(); __enable_interrupt(); __sleep();
switch(state) { case state_1: State1(); break;
case state_2: State2(); break; }
}
} Цитата Нет. "порядок доступа к volatile переменным не определен в данном выражении" Сорри быстро и невнимательно прочитал
|
|
|
|
|
Nov 28 2008, 08:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Aesthete Animus @ Nov 27 2008, 21:35)  Извините, но из того куска кода, что Вы показали, я (видимо не я один) не понял, как он должен работать и уж тем более что в нем не работает. Тем более не ясно, как это вообще связано с volatile. Изначально я просто поинтересовался в чём суть volatile и вы и vik0 всё доступно разъяснили  Код у меня рабочий но привести его не могу из-за размеров (ну ещё из-за того что это коммерческий проект  ). В моём коде используется много глобальных переменных (без volatile). Некоторые из них спокойно переносят присваивание им квалификатора volatile, а для некоторых появляется ошибка приведённая выше (а именно у тех которые передаются как параметры в функции). Но в любом случае hex-файл прошивки получается один в один что с volatile что без Спасибо всем ответившим на мой вопрос. Думаю стоит помоч топикстартеру с реализацией его идеи.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|