Страница 367 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт авг 05, 2016 12:19:16
WiseLord
rusl32 писал(а):// смотрим десятые здесь выводит одно из temper_d
rusl32 писал(а):// смотрим темп здесь уже выводит другое из temper_d
Потому как это могут оказаться данные от разных замеров из-за задержек в коде. И отличаться на те самые десятые.
Допустим в [0] - некое число А, в [1] - число B
По коду получается:
Код: Выделить всё
Замер 1
i = 0 A1 --
Выводим A одним способом -- --
пауза 2 секунды пауза
выводим A другим способом
i = 1 A1 A1
Выводим B одним способом B1 --
пауза 2 секунды пауза
выводим B другим способом
A1 A1
пауза 2 секунды B1 B1
пауза
Замер 2
i = 0 A2 A1
Выводим A одним способом B1 B1
пауза 2 секунды пауза
выводим A другим способом
i = 1 A2 A2
Выводим B одним способом B2 B1
пауза 2 секунды пауза
выводим B другим способом
A2 A2
пауза 2 секунды B2 B2
пауза
Замер 3
i = 0 A3 A2
Выводим A одним способом B2 B2
пауза 2 секунды пауза
выводим A другим способом
i = 1 A3 A3
Выводим B одним способом B3 B2
пауза 2 секунды пауза
выводим B другим способом
A3 A3
пауза 2 секунды B3 B3
То есть из-за наличия кучи пауз в самые неправильные моменты на экране показания "одним" способом и "другим" отличаются. Что и выглядит, возможно, как "прыгающие" десятые.
Выбросьте весь этот мусор из кода. Один раз посчитайте всё, выведите. И никаких пауз между разными выводами на экран. Иначе вперемешку данные от разных замеров и разных датчиков.
Самым правильным алгоритмом будет что-то вроде такого:
Код: Выделить всё
uint16_t tempTimer;
...
interrupt_... {
if (tempTimer)
tempTimer--;
}
....
main() {
...
if (tempTimer == 0) {
tempTimer = 750; // запускаем таймер на 750 миллисекунд,
getDataFromSensors(); // вычитываем из датчиков последние данные в буфер
startNewMeasure(); // запускаем новый замер, данные будут готовы через 750мс, там их снова заберём и обновим буфер
}
// Выводим данные
}
Всё.. Никаких задержек. Данные на дисплей будут выводиться часто, а раз в 750 мс будет "стартовать" новый цикл уменьшения tempTimer от 750мс до 0, и при достижении 0 обновлять готовые данные в некоем буфере
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт авг 05, 2016 12:46:48
rusl32
WiseLord писал(а):rusl32 писал(а):// смотрим десятые здесь выводит одно из temper_d
rusl32 писал(а):// смотрим темп здесь уже выводит другое из temper_d
Потому как это могут оказаться данные от разных замеров из-за задержек в коде. И отличаться на те самые десятые.
Всё.. Никаких задержек. Данные на дисплей будут выводиться часто, а раз в 750 мс будет "стартовать" новый цикл уменьшения tempTimer от 750мс до 0, и при достижении 0 обновлять готовые данные в некоем буфере
Я понимаю, что там не самый оптимальный код. Вопрос не в оптимальности. Пост выше -- это кусок кода без изъятий, другими словами выполняется как написано без переходов, строка за строкой. И никаких переходов и прерываний, во время паузы -пауза, измерений, вычислений и других действий с переменной не происходит. Вопрос почему выводимое значение переменной меняется если сама переменная не изменялась. Может есть какие подводные камни в использовании индексов переменных? Если индекс меняется в диапазоне 0-1 - с нулевым индексом глючит, если в диапазоне 1-2 всё как надо.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт авг 05, 2016 13:04:41
WiseLord
rusl32 писал(а):Вопрос почему выводимое значение переменной меняется если сама переменная не изменялась.
В том-то и прикол, что изменялась, потому что в ней данные от другого измерения.
Вот простой псевдокод:
Код: Выделить всё
while(1) {
for (i = 0; i < 10; i++) {
sеXY(0,0);
printt(i);
delay_ms(1000);
setXY(4,0);
print(i);
}
}
Как думаете, что будет отображаться на экране раз в секунду:
?
А вот и нет, будет отображаться
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт авг 05, 2016 13:24:36
rusl32
WiseLord писал(а):rusl32 писал(а):Вопрос почему выводимое значение переменной меняется если сама переменная не изменялась.
В том-то и прикол, что изменялась, потому что в ней данные от другого измерения.
В чем прикол? Почему так? "i"внутри цикла в произвольный момент изменяется?
Только что опробовал. Тут всё корректно (постом выше). У меня другая тема.
Код: Выделить всё
while(1){
получаем массив значений измерений;
чистим дисплей;
for(i=0,i<2,i++){
znach[i]=как то вычисляем из массива значений с индексом [i];
показываем что насчитали в znach[i] на i - ной строке в позиции 11;
пауза на чтение;
ещё раз показываем что в znach[i] на i - ной строке в позиции 3;;
}
пауза на чтение;
}
В результате получаю на одной строке результаты строго одного и того же измерения. И если for начинается с нуля они оказываются разными, если с 1 одинаковыми

Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб авг 06, 2016 07:00:41
kotriks
народ как заставить код выполняться 5 раз после чего блокировать какое либо выполнения кода? делал так не получилось.
Код: Выделить всё
unsigned char i=demo;
for( i=0; i<5; i++ ) {demo==5; }
вставляю в код для выполнения
эфект тот же ))
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб авг 06, 2016 07:24:28
WiseLord
Какой код? demo это не код, это переменная. Что Вы хотите увидеть, просто вставив её как
demo; в код?
Можно так, например:
Код: Выделить всё
void someFunction() {
static uint8_t i = 0;
if (i < 5) {
doSomething();
i++;
}
}
Функцию someFunction() можно вызывать сколько угодно раз, но doSomething() выполнится не более 5 раз, после чего будет пропускаться.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб авг 06, 2016 07:32:22
kotriks
WiseLord писал(а):Какой код? demo это не код, это переменная.
Можно так, например:
Код: Выделить всё
void someFunction() {
static uint8_t i = 0;
if (i < 5) {
doSomething();
i++;
}
}
Функцию someFunction() можно вызывать сколько угодно раз, но doSomething() выполнится не более 5 раз, после чего будет пропускаться.
спасибо, а как это будет выглядеть со вставкой переменно а не с функцией doSomething()?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб авг 06, 2016 08:31:05
WiseLord
А если по-русски? Вы же хотели код выполнять не более N раз. При чём тут переменно или постоянно?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб авг 06, 2016 11:54:59
COKPOWEHEU
Учитывая вот этот бред
вставляю в код для выполнения
автор думает, что переменную можно выполнять. Чего он пытался добиться этими кусками ведомо одному ему. Так что ждем нормальной формулировки задачи.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб авг 06, 2016 11:59:51
WiseLord
Судя по последним двум страницам форума - не дождёмся. Человек просто не понимает, чего конкретно он хочет, не различает переменные динамические и статические, да и вообще разницу между функциями и переменными, как видим, не улавливает.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт авг 16, 2016 12:21:57
TovarishStan
Всем доброго дня!
Решил тут разработать один девайс, но для его работы требуется посчитать импульсы. Ну, выходит, частотомер сперва надо сделать.
Всё хорошо, кроме одного - измеряет частоту до 65кГц с копейками. Ясен пень, вопрос в переменной, но они у меня указаны все как long int.
Я недавно только программирую, так что, если можно, поподробнее и с деталями) Прилагаю кусок кода (в спойлере).
P.S. Думаю, это не важно, но пишу в CVAVR на Atmega8A.
Спойлер
Код: Выделить всё
#include <mega8.h>
#include <stdio.h>
#include <glcd.h>
#include <font5x7.h>
long int COUNT=0; //счётчик переполнения Таймера0 (считает вх импульсы)
long int FREQ=0; //переменная частоты
long int Counter=0;
long int TTT=0;
unsigned char RES[10];
// Прерывание Таймера0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
COUNT++;
}
// Прерывание Таймера1
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
//TTT=(int)TCNT0;
TTT=TCNT0;
Counter=COUNT;
RES[1]=0;
RES[0]=0;
RES[2]=0;
RES[3]=0;
RES[4]=0;
RES[5]=0;
RES[6]=0;
RES[7]=0;
RES[8]=0;
RES[9]=0;
TCNT0=0x00;
COUNT=0;
}
void main(void)
{
GLCDINIT_t glcd_init_data;
(настройки портов опустил)
(Настройки Таймеров опустил)
// Global enable interrupts
#asm("sei")
while (1)
{
FREQ=Counter*256+TTT;
sprintf(RES,"%10u",FREQ);
glcd_outtextxyf(0,20,"Fruequency is");
glcd_outtextxy(0,30,RES);
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт авг 30, 2016 11:49:43
lkote68
Привет народ.
Ежели посмотреть ассемблерный код, то можно обнаружить что:
PORTD.5 = 1; раскрывается как
SBI 0x12,5
соответственно
PORTD.5 = 0; раскрывается как
CBI 0x12,5
Кто знает где лежат макросы раскрытия?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт авг 30, 2016 12:46:11
pyzhman
Первым читать до разделительной черты или после?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт авг 30, 2016 13:06:03
lkote68
И до и после черты информативно

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср авг 31, 2016 07:47:46
COKPOWEHEU
lkote68 писал(а):
PORTD.5 = 0; раскрывается как
CBI 0x12,5
Кто знает где лежат макросы раскрытия?
Нигде. Этим занимается компилятор и оптимизатор. Если перевести с cvavr на Си, получится
без оптимизации это выглядит как
Код: Выделить всё
in РОН, PORTD
andi РОН, 0b11011111
out PORTD, РОН
а с оптимизацией эта комбинация меняется на одну ассемблерную команду
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср авг 31, 2016 10:53:22
lkote68
нда, но насколько я в теме codevision по идее компилятора не имеет. Он транслирует С в Аsm а потом его ассемблирует при помощи avrasm2.exe
Вот и выражение PORTD.5 = 0 это сишное предложение codevisiona. По идее его переводить на С нет необходимости. А когда залезаем в xxx.asm
то видим там вместо PORTD.5 = 0 CBI 0x12,5. Я почему спросил мне хочется как то это дело изменить и сделать доступ к пину по индексу типа PORTD[indx] иди как то так
Чтобы написать одну функцию и передавать ей пин и порт как параметр. Вот думал пойти по пути изменения этой лексемы.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср авг 31, 2016 11:01:41
ARV
lkote68 писал(а):Он транслирует С в Аsm а потом его ассемблирует при помощи avrasm2.exe
а вот этим самым разве не компилятор занимается?

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср авг 31, 2016 11:42:21
uk8amk
lkote68 писал(а):мне хочется как то это дело изменить и сделать доступ к пину по индексу типа PORTD[indx] иди как то так
Чтобы написать одну функцию и передавать ей пин и порт как параметр.
Ох уж эта ардуина
https://github.com/watterott/Arduino-Li ... riteFast.h
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср авг 31, 2016 13:41:28
lkote68
Ну в принципе и Вы(ARV) и я правы "Компиля́ция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)"
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср авг 31, 2016 14:33:05
lkote68
uk8amk. Ох уж эта ардуина, зверюга однако - работает

#define SetPortBit(port, bit) port = port|(1UL<<(bit))