Страница 1 из 1

помогите написать программу для МЕГИ-8

Добавлено: Вт янв 15, 2008 13:34:45
m1sh
у меня есть АВР студио и WinAvr

есть примерная схема устройства..

http://pics.binary.ru/full/newg-1.gif

в зависимости от входного напряжения, на индикаторе должен отображатся параметр входного сигнала

перед выводом параметра, кратковременно показывать соркащенное наименование параметра..

сигналы 0-5 волт - каждый со свей таблицей преобразования

переключения между параметрами - кнопкой...

Назовите тему нормально! Aheir

Добавлено: Вт янв 15, 2008 20:54:21
mr.Kirill
А на Электрониксе тебе отказались разве помогать? Там тему уж раздули будь здоров, думаю там и дальше получил бы ответ :)

Добавлено: Ср янв 16, 2008 07:48:41
m1sh
да не - неотказались - но там половино темы мерянье что у кого круче...
большое спасибо AVR! с его помощью и получилась такая схема..
а насчет написания = просто наверно там все профессионалы..
и оченьпросто сказать- смотри там примеры - там всё понятно...
а я сильно начинающий - и мне трудно начать написание программы с "0", без всего.
под Микроконтроллеры я особо не программировал - так, подправлял готовые проги, либо заливал уже кем-то написанные..

Добавлено: Ср янв 16, 2008 20:46:38
mr.Kirill
Так может для начала выучить кое-какие основы и уже приступать, а потом по мере возникновения вопросов задавать их?

Добавлено: Чт янв 17, 2008 05:24:48
Mamonth
Я у себя на сайте выкладывал самые начальные сведения по АЦП Меги8. С индикацией. Ты почитай - может поможет. Смотри под кнопкой www.

Добавлено: Пт янв 18, 2008 11:10:47
m1sh

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

#define F_CPU 8000000UL     // Тактовая частота.
#include <avr>           
#include <util>             
#include "include.h"

//PINC = 0x20; // кнопка - PC5
//PINC = 0x01; //pc0 АЦП1
//PINC = 0x02; //pc1   ацп2
//PINC = 0x04; //pc2   ацп3
//PINC = 0x08; //pc3   ацп4
//PINC = 0x10; //pc4   ацп5

int main(void)                           // Основная функция.

{
DDRD = 0xff;                           
DDRB = 0xff;
DDRC&=0x01; // делаем входа ??
DDRC&=0x02;
DDRC&=0x04;
DDRC&=0x08;
DDRC&=0x10;
PORTC|= 0x20; //подтяжку на кнопку ????
char bin2bcd[]={                         //массив букв и цифр
  a+b+c+d+e+f,      // 0 - 0
  b+c,              // 1 -1
  a+b+d+e+g,        // 2- 2
  a+b+c+d+g,        // 3 -3
  b+c+f+g,          // 4 -4
  a+c+d+f+g,        // 5 -5
  a+c+d+e+f+g,      // 6 -6
  a+b+c,            // 7 -7
  a+b+c+d+e+f+g,    // 8
  a+b+c+d+f+g,      // 9
  a+b+c+f+e+g,      // A -10
  f+e+g+d+c,        // b - 11
  a+f+e+d,          // c - 12
  e+g+d+c+b,        // d - 13
  a+f+e+d+g,        // e - 14
  a+f+e+g+a,        // f - 15
  g,            // g - 16
  f+e+d+g,         //t    - 17
  dot,            // dot - 18
  f+a+b+e+g,       //P - 19
  };

while (1) {

PORTD = bin2bcd[1];
 }

}  // конец программы



вот пока что получилось только..
как теперь динамическую индикацию реализовать??
читал на коте - но там на ассемблере написано...

Добавлено: Пт янв 18, 2008 12:11:26
ARV
ассемблер или Си - какая разница? главное - алгоритм, а он одинаков:
1. Настроить таймер, разрешить прерывания от него
2. Завести переменную B1, которая хранит номер разряда индикатора, массив переменных D[] "дисплей" (каждый элемент соответствует изображению на индикаторе)
3. написать обработчик прерывания от таймера, в котором сначала погасить все индикаторы соответствующим выводом в нужный порт, затем сделать B1++ и проверить, не стало ли B1 больше, чем может быть индикаторов. Если стало - обнулить В1. Потом выводим в порт D[B1], т.е. светящиеся сегменты "следующего" индикатора, после чего выводим в порт "зажигания" разряда бит (1<<B1)
4. в основном цикле в массив D[] занести нужные "символы" - см. твой массив bin2bcd - и на индикаторе все засветится :)

алгоритм примерный, только для того, чтобы ты уловил идею.

Добавлено: Пт янв 18, 2008 12:32:46
Mamonth
m1sh писал(а):как теперь динамическую индикацию реализовать??
читал на коте - но там на ассемблере написано...


Плохо искал. Я выкладывал статью о термометре на Си, где организована динамическая индикация.

Добавлено: Пн янв 21, 2008 09:36:15
m1sh
c прерыванием кое что понял...
непонятно во что..
на индикатор вывожу так
PORTD = bin2bcd[m]; // m - это номер элемента массива, которому соответсвует буква или цифра

как записать, на какой индикатор из 3-х выводить в данный момент??

компилятор WINAVR...

Добавлено: Пн янв 21, 2008 11:13:29
Mamonth
Смотря как ты схему сделал.
Если так как у меня, то выводом в соответствующий порт единички в нужный разряд.

Добавлено: Пн янв 21, 2008 12:19:22
m1sh
с этим тоже разобрался...
только вот в протеусе на симуляции цыфры носятся как бешеные..

Добавлено: Пн янв 21, 2008 12:49:56
m1sh
замерил частотомеом в протеусе - частота 10 гц.... :shock:

Добавлено: Вт янв 22, 2008 08:47:26
Mamonth
m1sh писал(а):с этим тоже разобрался...
только вот в протеусе на симуляции цыфры носятся как бешеные..


Просто Протеус работает с графикой, и мерцание - нормальное явление.

10 Гц - это частота чего? Мерцания индикатора? Если да - то этого мало. Нужно минимум 60 Гц. Иначе глаз видит мерцание боковым зрением, а это плохо влияет...

Добавлено: Вт фев 12, 2008 13:06:07
m1sh
c помощью ARV (большое ему спасибо за ответы на мои глупые вопросы) уже со многим разобрался...

теперь по нажатию на кнопук прога переключает заголовки показаний..

осталось теперь сделать 5 каналов АЦП и вывести всё это на индикатор :))