ARV, я именно так и поступил вылез еще один баг проги при компиляции и прошивке одного и того же проэкта из под студии и из под eclipse я получаю разные результаты, хотя и там и там оптимизация отключена после прошивки из под студии в роботе оборудования я замечаю баг, а вот eclipse и 6-я студия выдает чистый результат в чем может быть загвоздка ?
/* * Timer 1 используется как источник времени * в часах 6 штук газоразрядных индикаторов * * динамическая индикация организована на таймере Т2 * данный таймер работает в режиме Fast PWM с частотой ....... * в сравнении мы выводим нужную нам цифру на К155ИД1 и зажигаем анод требуемой лампы * в переполнении мы выключаем выходы К155ИД1 и тушим все лампы * изменяя значение которое мы заносим в OCR2 (регистр сравнения таймера Т2) мы изменяем время * срабатывания прерывания "по совпадению" и тем самым регулируем яркость соответствующей лампы */
unsigned char fr[6]; // какой разряд изменил значение unsigned char Screen[6]; // массив экрана, сюда мы храним старое значение времени unsigned char TimeScreen[6]; // массив временного экрана, сюда мы пишем "новоиспеченную" цифру unsigned char BrightnessOldNumber[6]={10,10,10,10,10,10};// буфер временного хранения яркостей для каждого разряда СТАРОЙ цифры unsigned char BrightnessNewNumber[6]={250,250,250,250,250,250};// буфер временного хранения яркостей для каждого разряда НОВОЙ цифры
unsigned char psc[26]={10,30,50,70,90,110,130,150,170,190,210,230,250, // в данном массиве хранятся значения для регистра OCR2 250,230,210,190,170,150,130,110,90,70,50,30,10};// если OCR2=10 то цифра будет светить по максимуму // если OCR2=250 то цифра будет светить по минимуму
// Timer 2 overflow interrupt service routine ISR (TIMER2_OVF_vect) // данное прерывание происходит с периодичностью раз в 2мс { static unsigned char i;
TurnOff_Nixie();
if (flagSS==1) //если после смены времени выполнилась ф-ция SetScreen { switch (mode) { //---------- эффект плавной смены ---------- case 0: if (++counter==15) // если прошло 30мс { counter=0; iocr++; for (i=0; i<=5; i++) { if (fr[i]==1) // смотрим в каком разряде изменилась цифра { BrightnessOldNumber[i]=psc[iocr]; // изменяем яркость от max до minute }
if (iocr==13) // если яркость достигла minute и цифра потухла { Screen[i]=TimeScreen[i];// выводим новое значение } }
if (iocr>=25) { flagSS=0; iocr=0; } } break;
//---------- эффект перебора ---------- case 1: if (++counter==28) // если прошло 76 мс (период смены перебираемой цифры) { counter=0; number++; // меняем переборную цифру
for (i=0; i<=5; i++) { if (fr[i]==1) // смотрим в каком разряде произошло изменение цифры { if (number<=9) { Screen[i]=number; // там где было изменение начинаем делать перебор } else { Screen[i]=TimeScreen[i];// выводим новое значение fr[i]=0; // сбрасываем фл number=0; flagSS=0; } } } } break;
//---------- эффект перелива ----------
case 2: if (++counter==15) { cnt_timer=cnt_timer+(counter*2); counter=0;
if (fl1==0) { iocr1++; for (i=0; i<=5; i++) { if (fr[i]==1) { BrightnessNewNumber[i]=psc[iocr1]; } } }
if (fl1==1) { iocr++; for (i=0; i<=5; i++) { if (fr[i]==1) { BrightnessOldNumber[i]=psc[iocr]; }
} }
fl1^=1;
if (iocr>=12) { //fl=0; fl1=0; iocr=0; iocr1=13; flagSS=0;
if (mode!=2) // если выбран ЛЮБОЙ режим КРОМЕ перелива { OCR2=BrightnessOldNumber[t]; if (++t>=6) t=0; if (++var>=6) var=0;
} else // при режиме ПЕРЕЛИВ цифр { if (fl==0) { if (++t0>=6) t0=0; OCR2=BrightnessNewNumber[t0]; } if (fl==1) { if (++t1>=6) t1=0; OCR2=BrightnessOldNumber[t1];
//Timer 2 output compare interrupt service routine ISR (TIMER2_COMP_vect) { if (mode!=2) // если НЕ выбран ПЕРЕЛИВ цифр { //PORTB=Screen[var]; Input_Decoder(Screen[var]); // посылаем число на вход К155ИД1 } else { //PORTB=TimeScreen[var]; //Input_Decoder(Screen[var]); // посылаем число на вход К155ИД1 if (fl==0) Input_Decoder(TimeScreen[var]);// если выводится НОВАЯ цифра if (fl==1) Input_Decoder(Screen[var]); // если выводится СТАРАЯ цифра }
switch (var) { case 0: AnodRazryda0; break; // зажигаем лампу десятков часов case 1: AnodRazryda1; break; // зажигаем лампу единиц часов case 2: AnodRazryda2; break; // зажигаем лампу десятков минут case 3: AnodRazryda3; break; // зажигаем лампу единиц минут case 4: AnodRazryda4; break; // зажигаем лампу десятков секунд case 5: AnodRazryda5; break; // зажигаем лампу единиц секунд
int main(void) { DDRB =0b11111111;//The Port B Data Direction Registe 0-пин порта на вход 1-пин порта на выход PORTB=0b00000000;//The Port B Data Register 1/0 - on/off pull-up resistor
DDRC= 0b00000011; PORTC=0b00000000;
DDRD =0b00011011; PORTD=0b11100000;
// Timer/Counter 1 initialization TCCR1A=0x00; TCCR1B|= 1<<CS12 | // clk/256 - делим основную частоту МК на 256 (предделидель для таймера), Clock value: 31,250 kHz 1<<WGM12; // Mode: CTC top=OCR1A (сброс при совпадении с OCR1A) TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x7A; OCR1AL=0x11; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization ASSR=0x00; TCCR2|= 1 << WGM20 | 1 << WGM21 | // Fast PWM mode 1 << CS22; // clk/256 - делим основную частоту МК на 256 (предделидель для таймера) TCNT2=0x00; OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK|= 1<<OCIE2 | // флаг разрешения прерывания по событию "совпадение" таймера/счетчика Т2 1<<TOIE2 | // флаг разрешения прерывания по переполнению таймера/счетчика Т2 1<<OCIE1A; // флаг разрешения прерывания по событию "сопадение А" таймера/счетчика Т2
sei (); // Global enable interrupts
while (1) {
if (flag==1) // если прошла 1с { if (++metka>=9) switch (mode) // выбираем режим отображения времени { case 0: SetScreen(hour,minute,second); break; // плавная смена цифр (ч:м:c) case 1: SetScreen(hour,minute,second); break; // перебор цифр(ч:м:c) case 2: SetScreen(hour,minute,second); break; // перелив цифр (ч:м:c) case 3: SetScreen(hour,minute,second); break; // обычная смена цифр (ч:м:c)
фотография не помогла в чем проблема-то? по идее в 4-й студии и 6-й студии одинаковые компиляторы, результат тоже должен быть одинаковый... по исходнику мало что понятно (вообще, в чужом коде разбираться - это тяжкий труд)
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Заголовок сообщения: Re: AVR studio 4 в вопросах и ответах
Добавлено: Сб апр 19, 2014 22:50:45
Сверлит текстолит когтями
Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34 Сообщений: 1287 Откуда: Запад Беларуси
Рейтинг сообщения:0
Я уже разобрался... Можно работать также, как и с портами. Взять одну переменную и использовать её биты. Только вместо PORT.. написать переменную... Вот например условие:
Код:
if ((temp&(1 << 1)) != 0)
если второй бит равен 1...
Как сделать так, чтобы при нажатии и удержании кнопки код выполнился только 1 раз? Например запись в EEPROM.
Код:
eeprom_update_byte(&my[temp],OCR0A); temp++;
Совсем не надо, чтобы одно значение записалось сразу в несколько ячеек массива. Не хочется использовать пустые циклы, ждущие отпускания кнопки. Или может использовать INT0..
Если у Вас PB3 - не объединен с выводом UART, то только эмулировать работу порта. т. е. смотрите описание работы протокола. Там есть старт-биты и стоп-биты(1 или 2). бит четности может быть или не быть. Алгоритм такой: 1. Устанавливаете вывод в 1. (начальное состояние) 2. сбрасываете вывод в 0 (начало передачи) 3. программная задержка согласно скорости передачи (для 115200 бод 8.7 мкс) в задержке надо учесть время выполнения команд сброса, и пересыла в порт. В принципе, может безболезненно отличатся до 10% в обе стороны. 4. посылаете младший бит. например, так: Спойлер
Код:
mov r16, r19 ;загружаем значение для передачи andi r16, 1 ;берем младший бит shl ; 3 сдвига влево для 3-й ножки порта shl shl in r17, PINB andi r17, ~(0b1000) ; сбрасываем 3-й бит or r17, r16 ; если 3-й бит 1, то установим его out PORTB, r17 shr r19 ; готовим следующий бит для передачи
5. опять программная задержка 6. повторяете п. 4 и п.5 пока не передадите все 8 бит 7. устанавливаете порт в 1 (стоп-бит) 8. задержка 9. Если стоп-бита 2 - повторить п.7 и п.8 Передано!
Так, может, лучше оптимизирует? У Вас там дословно написано, что: "Секция text переполнена на 466 байт" Секция text - это секция кода. Попробуйте изменить настройки оптимизации на более сильные
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения