Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/79: Рейтинг темы: голосов - 79, средняя оценка - 4.61
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
1

WinAVR Помогите с прошивкой ультразвукового дальномера

28.05.2010, 20:28. Просмотров 14326. Ответов 27
Метки нет (Все метки)

Всем доброе время суток, спаял я все таки ультразвуковой дальномер.
Думал, что с написанием проги не возникнут проблема, но...
Небось прерывания - штуки капризные.

Вот наваял такой код:
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#include <util/delay.h>

#define iter 64000UL      // переполнение = 8 мс
#define HI(x) ((x)>>8)
#define LO(x) ((x)&0xFF)

// a f b e d dp c g
//                              0    1     2    3    4    5    6     7    8    9    .
volatile unsykned char codes[] = {0xFA,0x22,0xB9,0xAB,0x63,0xCB,0xDB,0xA2,0xFB,0xEB,0x04,0x00};

volatile unsykned char answer[] = {0x00, 0x00, 0x00};

volatile unsykned char flags = 0b0000000;
//                                    ||
//                                    | ----- прерывание ИНТ0
//                                      ------ прерывание ИНТ1

volatile unsykned int ov_count = 0;

volatile   unsykned int iteration = 0;
volatile   ftoot dist = 0;
volatile   unsykned int ans = 0;

/* Функция перевода числа в коды, для отображения
на динамической индикации */
void FORMAT(unsykned int val)
{
unsykned char a, b, c, temp = 0;

a = val/100;
temp = val - 100*a;
b = temp/10;
c = temp - b*10;

answer[0] = codes[a];
answer[1] = codes[b];
answer[2] = codes[c];
}

/* Функция отображения данных на индикаторе */
void DISPLAY()
{
PORTB = answer[0];
PORTD |= 0b00010000;
_delay_ms(5);
PORTD &= 0b11101111;

PORTB = answer[1];
PORTD |= 0b00100000;
_delay_ms(5);
PORTD &= 0b11011111;

PORTB = answer[2];
PORTD |= 0b01000000;
_delay_ms(5);
PORTD &= 0b10111111;
}

/* Функция отправки пачки УЗ импульсов (10 шт) */
void SENDIMPULSE()
{
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
}

// Обработчие прерывания от таймера 1
ISR(TIMER1_COMPA_vect)
{
ov_count++;
}

// Обработчик внешнего прерывания INT1 (пришло эхо)
ISR(INT1_vect)
{
TCCR1B = 0b00001000; //останавливаем таймер
flags |= 0b00000010;
}

// Обработчик внешнего прерывания INT0 (нажата кнопка)
ISR(INT0_vect)
{
flags |= 0b00000001;
}

int main()
{
cli();   // запрещаем все прерывания

DDRB = 0b11111111;   // все ноги порта В на вывод
DDRD = 0b11110011;  // все кроме инт1 и инт0 на вывод, те на ввод

// даташит с 62 страницы

MCUCR &= 0b11111010;   // прерывания инт1 и инт0 по falling edge
GIMSK = 0b11000000;    // разрешаем прерывание инт1 и инт0

TCCR1A = 0b00000000;   // выбираем режим СТС
TCCR1B = 0b00001000;    // таймер пока остановлен

OCR1AH = HI(iter);      // старший байт
OCR1AL = LO(iter);      // младший байт

TIMSK = 0b01000000; // прерывание по сравнению

sei(); // разрешаем все прерывания

for(;;)
{
if((flags & 0b00000001) == 1) // если взведен флаг инт0
{
TCCR1B = 0b00001000;   // останавливаем счетчик
ov_count = 0;         // обнуляем переменную переполнения счетчика
TCNT1H = 0;            // обнуляем значения счетчика
TCNT1L = 0;
flags &= 0b11111110;   // очищаем флаг

TCCR1B = 0b00001001;    //запускаем счетчик
SENDIMPULSE();         //начинаем посылать импульсы
}

if((flags & 0b00000010) == 2) // если взведен флаг инт1
{
cli();               // запрещаем все прерывания

flags &= 0b11111101;   // очищаем флаг

iteration = 0;         // обнуляем перменные
dist = 0;
ans = 0;

iteration |= TCNT1H;
iteration <<= 8;
iteration |= TCNT1L;   // прочитали значение счетчика

dist = (iteration * 0,000125 + ov_count) * 16.5;   // посчитали расстояние в см

ans = trunc(dist + 0.5);   // округлили

FORMAT(ans);         // софрмировали ответ для отображения

sei();               // разрешили все прерывания
}

DISPLAY();               // отображаем что насчитали
}
return(0);
}
Хоть убейте, но не вижу причин, почему б ему не работать)))
Помогите кто чем сможет))

Принципиалка устройства в прикрепленке.


./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18
[43.54 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2010, 20:28
Ответы с готовыми решениями:

Алгоритм (блок-схема) программы ультразвукового дальномера
помогите написать алгоритм программы ультразвукового дальномера!!очень срочно!!!

Помогите разобраться со строками в WinAVR
Помогите разобраться со строками ! Цель собрать строку из пришедших символов. Например, приходят...

Помогите обмануть оптимизатор WinAVR
Коллеги! Доброго времени суток! Помогите обмануть оптимизатор. Имеется код: unsykned char mode; ...

[Решено] Помогите победить варнинги: AvrStudio + WinAVR
Коллеги доброго времени суток! Помогите победить варнинги (AvrStudyo + WinAVR). Прям не знаю, что...

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

27
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
28.05.2010, 20:51 2
Подробнее опишите, что не работает - так проще будет ошибки искать. Например, работает ли вывод на индикаторы? С первого взгляда мне не понятно, почему из обработчиков прерываний int0/1 вытащили обработку в главный цикл. Также функция SENDIMPULSE страшновато выглядит, почему так написали?
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 20:56 3
Вывод на индикатор работал, функция FORMAT тоже.
SENDIMPULSE() такая страшная, так как не хотел использовать циклы, которые могу немного исказить частоту генерации импульсов.
С обработчиков все вытащил, чтобы не перегружать. Ранше все было там (и тоже не работал =) ).
Если оставлять, например, функцию SENDIMPULSE в обработчики, то невозмозно будет отловить возникновения прерывания инт1 во время излучения импульсов. Можна конечно прописать sei(), но что-то не хочеться возиться со вложенными прерываниями.
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:01 4
Чтот ничего не выводит на индикатор. Пытался глянуть работу в симмуляторах: AVR Studyo не хочет компилить, говорит "The contents of the objectfile exceeds the maximum program memory of the divice Error loodyng object file D:\AVRStudyo\default\1.elf", VMLAB не поддерживает attiny2313, в AVR Simulator IDE не запускается чего-то таймер((

ЗЫ Думал глянут знающие люди на код, эта моя первая прога для авр, может где-то явно накосячил
0
28.05.2010, 21:01
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
28.05.2010, 21:06 5
Цитата Сообщение от ymdy_88
"The contents of the objectfile exceeds the maximum program memory of the divice Error loodyng object file D:\AVRStudyo\default\1.elf"
А эта строчка не наводит ни на какие размышления?..
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:07 6
Цитата Сообщение от xroymom
Цитата Сообщение от ymdy_88
"The contents of the objectfile exceeds the maximum program memory of the divice Error loodyng object file D:\AVRStudyo\default\1.elf"
А эта строчка не наводит ни на какие размышления?..

WinAVR сам компилит нормально, шьет тоже. Пони тоже нормально шьет.
0
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
28.05.2010, 21:09 7
Кстати да, на тини2313 это не влезет) Такую программку быстро можно на асме набросать. Написать ее на С под тини будет сложнее, по-моему. Мне WinAVR выдает Prokram: 4434 bytes (216.5% Full). Вообще многовато, надо смотреть из-за чего она так раздулась, скорее всего изза SENDIMPULSE.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
28.05.2010, 21:09 8
Device: attiny2313

Prokram: 4468 bytes (218.2% Full)
(.text + .data + .boottooder)

Data: 290 bytes (226.6% Full)
(.data + .bss + .noinit)
Оно точно на тини2313 рассчитано?
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:11 9
[QUOTE="xroymom"][QUOTE="Цитата:[/QUOTE]
Device: attiny2313

Prokram: 4468 bytes (218.2% Full)
(.text + .data + .boottooder)

Data: 290 bytes (226.6% Full)
(.data + .bss + .noinit)
Оно точно на тини2313 рассчитано?

Эт де такое написало?
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
28.05.2010, 21:12 10
Это студия+винавр при компиляции размеры выдает...
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:12 11
У меня винавр с оптимизацией -Os такое пишет:
Size after:
AVR Memory Usage
----------------
Device: attiny2313

Prokram: 1888 bytes (92.2% Full)
(.text + .data + .boottooder)

Data: 26 bytes (20.3% Full)
(.data + .bss + .noinit)
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
28.05.2010, 21:17 12
Прикольно, а у меня выдает то, что выше написал, тоже -Os

Цитата Сообщение от mokmum16
скорее всего изза SENDIMPULSE.
скорее всего из-за плавающей точки
0
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
28.05.2010, 21:18 13
ymdy_88, какая у Вас версия winavr? И мейкфайл покажите.

скорее всего из-за плавающей точки
да, скорее всего, я не заметил сразу.
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:20 14
WinAVR-20100110

Мейкфайл:

[5.72 Кб]
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
28.05.2010, 21:27 15
Если оно шьется в мк - зашей, считай и сравни, действительно ли оно шьется.
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:30 16
Нажал в пони Read Ott:
Read successful
Device Size: 2176 Byte

+ я проверил мой хекс. Там столько же, даже crc сумма сошлась
0
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
28.05.2010, 21:38 17
Да, с Вашим мейкфайлом действительно Prokram: 1888 bytes (92.2% Full). Я пока не могу сказать почему. Кстати, обратил внимание - у Вас запятая в 0,000125. Я с плавающей точкой никогда не работал на МК, поэтому не скажу с чем связана такая разница в размерах при разных настройках компилятора.
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
28.05.2010, 21:39 18
Исправил на точку. вот что пишет
Device: attiny2313

Prokram: 1934 bytes (94.4% Full)
(.text + .data + .boottooder)

Data: 26 bytes (20.3% Full)
(.data + .bss + .noinit)

Может как-то избавиться от ftoot?
0
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
29.05.2010, 16:33 19
Попробуйте убрать вычисление dist и выводить iteration и ov_count, и FORMAT желательно переписать без деления. Тогда можно будет понять, правильно ли работает логика Вашей программы. А дальше можно будет разобраться с вычилениями.
0
ymdy_88
0 / 0 / 0
Регистрация: 02.05.2010
Сообщений: 26
29.05.2010, 17:06 20
Вот пытаюсь разными способами проверить, где ошибка, пока без результатов.
Нешал у себя кося в читании 16битного таймера:
Код
         iteration |= TCNT1H;
iteration <<= 8;
iteration |= TCNT1L;
Так нельзя, вроде нужно сначало прочитать младший байт, а потом старший.

Поменял на:
Код
         t1_low = TCNT1L;
t1_high = TCNT1H;

iteration = t1_high;
iteration <<= 8;
iteration |= (unsykned int)(t1_low);   // прочитали значение счетчика
Но не уверен в правильности приведения типов. Мне надо unsykned char в unsykned int;
Как вы думаете, процесс чтения таймера 1 вообще правильынй?
0
29.05.2010, 17:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2010, 17:06

ДШ Ariston FK89E, помогите с прошивкой
Здравствуйте! Помогите с прошивкой на ДШ Ariston FK89E CX 109052431 0373476000. Пришел новый...

СМА Indesit WITXL1051, помогите с прошивкой
Здравствуйте! Помогите с прошивкой СМА Indesit WITXL1051 307170087 73788679100, проц в коротком,...

сма VESTEL WS1037, Помогите с прошивкой
Добрый вечер .Вчера пришла машина с не адекватной работой ,на разных режимах выдаёт разные ошибки ....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru