CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

unalex писал(а):проект взят отсюда

Вы ошибаетесь уважаемый. У меня код другой. Попроще.
Реклама
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: CodeVision AVR в вопросах и ответах

Сообщение unalex »

Aid1992 писал(а):sprintf(lcd_buffer,"t%u=%.2f\xdfC",++i,temp);


а я разве об этом не писал?

unalex писал(а):как все нормальные люди выводят

Код:
float temp;
printf ("temp= %4.2f", temp, " градусов\n");
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Аватара пользователя
Aid1992
Встал на лапы
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Re: CodeVision AVR в вопросах и ответах

Сообщение Aid1992 »

unalex писал(а):а я разве об этом не писал?

Ну понимаете, я въехал не сразу :))
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

Суть в чем, внешнее прерывание по спаду запускает таймер потом настраиваю прерывание по фронту, при срабатывании прерывания по фронту считываю значение счетного регистра таймера но что то делаю не правильно в протеусе смотрю вот код обработчика,почему не работает

Код: Выделить всё

//MCUCR&=0b11111100;
 //MCUCR|=0b00000010;//прерывание INT0 по спаду
вот это?

Код: Выделить всё

// Place your code here
if (flag==front)//если прерывание по фроту
                {
                T=TCNT1-3;//считать значение периода обращения
                if(uoz>T)
                        {TCNT1=0;//обнулить таймер
                        OCR1A=uoz-T;
                        OCR1B=OCR1A+n;
                        }
                send=1;//флаг отправки периода
                if(uoz<T)
                        {
                        TCCR1B=stop;//остаовить таймер
                        TCNT1=0;//обнулить таймер
                        spark=0;//сброс искры
                        }
                flag=spad;
                MCUCR=MCUCR-1;//этот код работает ниже которйы закомментирован нет
                //MCUCR&=0b11111100;
                //MCUCR|=0b00000010;//прерывание INT0 по спаду
                red_led=0; //красный светодиод погасить индикация того что ВМТ
                }
else            //если прерывание по спаду
                {
                TCCR1B=start;//запустить таймер
                flag=front;
                MCUCR=MCUCR+1;//этот код работает ниже которйы закомментирован нет
                //MCUCR&=0b11111100;
                //MCUCR|=0b00000011;//прерывание INT0 по фронту
                OCR1A=uoz;
                OCR1B=uoz+n;
                red_led=1; //красный светодиод зажечь индикация того что до ВМТ осталось 30 градусов
                }               
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *Trigger* »

А Вы останавливаете таймер перед считыванием? Вообще-то, можно использовать для таких целей Input Capture.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Реклама
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

Всем мяу! :)
подскажите,работаю с оператором switch(решил попробовать,удобная штука),написал простую программу,но светодиоды отказываются моргать...В чем может быть дело?
Спойлер

Код: Выделить всё

#include <mega8.h>
#include <delay.h>

unsigned char ABC;

void main(void)
{

switch (ABC){
case 1:
PORTD = 0b10000000;
break;

case 2:
PORTD = 0b11000000;
break;

case 3:
PORTD = 0b11100000;
break;

case 4:
PORTD = 0b11110000;
break;

case 5:
PORTD = 0b11111000;
break;

case 6:
PORTD = 0b11111100;
break;

case 7:
PORTD = 0b11111110;
break;

case 8:
PORTD = 0b11111111;
break;
}

PORTD=0x00;
DDRD=0xFF;

// 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;
SFIOR=0x00;

while (1)
      {
      for (ABC = 0; ABC < 8; ABC++){
      delay_ms(1000);
      };

      };
}

Спасибо за помощь!
Последний раз редактировалось Gudd-Head Чт апр 11, 2013 10:02:31, всего редактировалось 1 раз.
Причина: Нарушение п.2.5 Правил Форума
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

свич засунуть под вайл. А-то он однократно выполняется. И даже до настройки портов.
Docendo discimus
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

В том что switch выполняется до того как ABC меняется и к тому же выполняется только один раз. Это нужно делать в "вечном" цикле.
«И всё-таки она вертится!»
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

спасибо,пошел пробовать!

А еще такой вопрос,как организовать выполнение куска программы определенное кол-во раз?
с помощью цикла "for"?Или имеются другие варианты?
Последний раз редактировалось Gudd-Head Чт апр 11, 2013 10:04:15, всего редактировалось 1 раз.
Причина: Нарушение п.2.2 Правил Форума
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: CodeVision AVR в вопросах и ответах

Сообщение ChipKiller »

Сериг писал(а):работаю с оператором switch(решил попробовать,удобная штука)

если значения ABC идут подряд - проще использовать табличную выборку

Код: Выделить всё

flash char table[8]={0x80,0xC0....};
......
PORTD = table[ABC-1];
как организовать выполнение куска программы определенное кол-во раз?
while, for, if-goto
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

*Trigger* писал(а):А Вы останавливаете таймер перед считыванием? Вообще-то, можно использовать для таких целей Input Capture.

нет таймер не останавливаю дело не в том в протеусе все работает нормальо это по таймеру а вот перенастройка прерывания не хочет выполятся так как хотелось бы я про

Код: Выделить всё

         MCUCR=MCUCR-1;//это работает
                //MCUCR&=0b11111100;//это нет
                //MCUCR|=0b00000010;//прерывание INT0 по спаду
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

dimka86 , а не пробовали смотреть что происходит с регистрами в это время и подумать как нужно правильно сделать?

Вообще я не заметил в коде где у вас включается само прерывание int0, может в этом дело?

Ps, лучше сразу выкладывать весь код, чтобы другие коты могли посмотреть и попробовать что у вас там не работает.
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

код обработчика прерывания выше я вот с каким вопросам

Код: Выделить всё

MCUCR&=0b11111100;//устанавливает в ноль 0,1 разряды остальные не изменяются
MCUCR|=0b00000011;//устаавливает в 1 разряды 0,1 остальные не меняет

или я не прав ошибка именно в этом я увере на 100%
подскажите еще один момен имнется строка char str1[7] перемеая чтоб ее сделать пустой подойдет такой метод

Код: Выделить всё

str1[0]='\0';
то есть записать символ коца строки или надо кака то в цикле?
Последний раз редактировалось dimka86 Чт апр 11, 2013 13:07:55, всего редактировалось 2 раза.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

dimka86 писал(а):устанавливает в ноль 0,1 разряды остальные не изменяются
верно
dimka86 писал(а):устаавливает в 1 разряды 0,1 остальные не меняет
верно, не ошибся
dimka86 писал(а):перемеая чтоб ее сделать пустой подойдет такой метод
подойдет.
Ставим плюсы: )
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

ibiza11спасибо буду пробовать
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

dimka86, повторяю для невнимательных - выложи полный код, потом можно будет обсуждать его.
Я не про обработку прерывания, а про разрешение самого прерывания. Флаг прерывания может и устанавливается, но прерывание не происходит вот я о чем.
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

vitalik_1984 спасибо за участие я разобрался все в протэусе заработало
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Ну и что же там было? Просто разрывает любопытство, а язык немой оказался. :(
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

vitalik_1984 изачально прерывание настроено так

Код: Выделить всё

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Rising Edge
GICR|=0xC0;
MCUCR=0x0E;
GIFR=0xC0;
а так я меняю настройку
MCUCR&=0b11111110;//по спаду
а так
MCUCR|=0b00000001;//прерывание INT0 по фронту

просто устанавливаю или сбрасываю нолевой разряд MCUCR если вам нужна моя бредятена не доведенная до ума напишите в личку, я както выложил длинный листинг получил предупреждение
Belerafon
Встал на лапы
Сообщения: 110
Зарегистрирован: Вс май 10, 2009 18:23:45

Re: CodeVision AVR в вопросах и ответах

Сообщение Belerafon »

Подскажите как можно реализовать функцию: не могу придумать как произвести арифметические действия с массивом такого типа: 1234.5678 обработать нужно так: 12+(34.5678/60) подталкните в какую сторону капать?
Ответить

Вернуться в «AVR»