реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 2 байта в AVR, как сранить и обработать 16 разрядов в ATmega?
pimen
сообщение Dec 23 2007, 23:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



Вопрос собственно в следующем:
разработана плата (и что плохо изготовлена), где есть связка Atmega128 и термодатчик MAX6630
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2577/t/al
Выход термодатчика - 13 бит (12+знак) и еще мусор до 2 байт (по spi).
как сравнить и обработать данные в восьмибитном микроконтроллере?
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 24 2007, 00:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



C чем именно сравнить и как обработать ? На каком языке надо ?
Go to the top of the page
 
+Quote Post
arttab
сообщение Dec 24 2007, 02:49
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Организовать хранение 2 Б +
Цитата
мусор до 2 байт


Устроняйте пробел в своих знаниях иначе дальше будет хуже ( у AVR АЦП 10 бит, а разрядность таки 8).


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
MMos
сообщение Dec 25 2007, 08:14
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Расскажи поподробнее, что бы ты делал с данными, если бы они были восьми- (или менее) разрядными.
Тогда можно дать конкретный совет, что делать при большей разрядности. Без этого вопрос очень неконкретный и ответа ждать придётся долго.
Go to the top of the page
 
+Quote Post
pimen
сообщение Dec 25 2007, 11:07
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



первоначально планировал сравнение значения температуры с пороговым значением.
немного поразмыслив, понял,что для этого необходимо сравнить сначала старший байт со старшим байтом опорного значения.
если старшие байты равны, то надо сравнивать младшие.
но потом пришло следующее требование - вывод температуры на знакосегментный индикатор. т.е. для этого надо преобразовать значения в двоично-десятичный код
а как?
работаю avrstudio+winavr на с
Go to the top of the page
 
+Quote Post
Algol
сообщение Dec 25 2007, 11:22
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Попробуйте потестировать в отладчике мою функцию
unsigned int hex2bcd (unsigned char hex)
{
unsigned char i;
unsigned int bcd=0;
for(i=0;i<8;i++) {
if ((bcd & 0x0F) >= 0x05) bcd += 0x03;
if ((bcd & 0xFF) >= 0x50) bcd += 0x30;
bcd <<= 1;
if ((hex & 0x80)==0x80) bcd |= 0x01;
hex <<= 1;
}
return bcd;
}
Писано это около года назад, не помню где то в сети отрыл алгоритм быстрого преобразования hex to bcd, как раз с целью вывода на жки. Сюдя по тому что взято из рабочей проги, должно работать.
Go to the top of the page
 
+Quote Post
arttab
сообщение Dec 26 2007, 01:28
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Довольно странные вопросы. Если пользуетесь Си компилятором, то надо Си знать. Если бы Вы знали Си, то вопрос как хранить более 8 бит не возникло.

Работа программиста не сводиться к поиску готовых решений и скачки их с инета. Требуется понимание предоставляемых Вам возможностей и умение ими пользоваться.

Советую перечитать курс по микропроцессорам, языку Си, доки по AVR, разобраться в выложенным Algol примеры и изучить компилятор.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 26 2007, 01:55
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Algol @ Dec 25 2007, 14:22) *
отрыл алгоритм быстрого преобразования hex to bcd, как раз с целью вывода на жки.

Работает. Только вот как - нифига не понял crying.gif
Go to the top of the page
 
+Quote Post
alexander55
сообщение Dec 26 2007, 05:52
Сообщение #9


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(pimen @ Dec 24 2007, 02:37) *

Если работаете с С используйте для 16 битных данных типы unsigned int и int.
Все Ваши проблемы решит компилятор.
Go to the top of the page
 
+Quote Post
MMos
сообщение Dec 28 2007, 12:01
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Снимаю шляпу перед автором алгоритма. Красота-а-а-а!
На Си попробовать было негде - сваял процедурочку на VBA. Расширил до 16 разрядов. Алгоритм потенциально расширяем на любое количество разрядов. Вы будете смеяться, но я его понял! Правда только после того, как запустил под отладчиком.
В общем СУПЕР! Рекомендую программистам всех времён, народов и языков.
Побежал реализовывать на ассемблере.
Go to the top of the page
 
+Quote Post
MMos
сообщение Dec 29 2007, 09:08
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Ниже приведена ассемблерная реализация алгоритма для MSC-51 (в AVR пока не силён).
В примере преобразуется десятичное число 23456.
Удлинняет код та особенность, что "полезные" операции можно выполнять только с аккумулятором.
При попытке перевести реализацию на AVR столкнулся с проблемой - не могу найти операцию двоично-десятичной коррекции (в нижеприведеном коде это команда DA). Это мне так не повезло или такой операции у AVR вообще нет?

start:
mov r3,#0 ; результат старший байт
mov r4,#0 ; результат средний байт
mov r5,#0 ; результат младший байт
mov r6,#05bh ; исходные данные старший байт
mov r7,#0a0h ; исходные данные младший байт
mov r0,#16 ; счётчик циклов
cycle:
mov a,r7
rlc a
mov r7,a
mov a,r6
rlc a
mov r6,a
mov a,r5
addc a,r5
da a
mov r5,a
mov a,r4
addc a,r4
da a
mov r4,a
mov a,r3
addc a,r3
da a
mov r3,a
djnz r0,cycle

Сообщение отредактировал MMos - Dec 29 2007, 09:11
Go to the top of the page
 
+Quote Post
pimen
сообщение Jan 2 2008, 23:35
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



Всех с наступившим Новым Годом!
написал прогу к вышесказанному

#include <avr/io.h>//mega128

char U,L;

void SPI_read(void)
{
SPCR=0x50;
SPDR=0xaa;
while(SPSR==0x00)
{ }
U=SPDR;

SPDR=0xaa;
while(SPSR==0x00)
{ }
L=SPDR;
SPCR=0x00;
}

void main(void)
{ PORTB&=0xDF;//spi fpga
SPI_read();
PORTB|=0x20;

//...сравнение значений температур с пороговым

PORTB&=0xEF;//spi rf
SPI_read();
PORTB|=0x10;
}

здесь сначала читается первый байт, потом второй байт из цифровых термометров
если я пишу это в переменную типа int, то все равно могу записать только 1 байт:
т.к. регистр spi расчитан на байт информации, то требуется новый запуск модуля spi для чтения информации с датчиков
при последующем чтении из регистра и записи информации в переменную предидущии данные естественно удаляются
как дописать данные в туже переменную?
или может подскажите идею или другую программную реализацию
жду ответов
--------------------------------------------------
щас читаю 3 книги: 2 по авр и по с....

Сообщение отредактировал pimen - Jan 2 2008, 23:52
Go to the top of the page
 
+Quote Post
vooon
сообщение Jan 3 2008, 11:41
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401



прочитать например так:
(старший байт первый)

Код
/**
* Отправить \a send по SPI
* \return принятое по SPI значение
*/
unsigned char spi(unsigned char send);

....
{
  int temp;
  int porog;
...
  temp = spi(0);
...
...
  temp = (temp<<8)|spi(0);
...
  if (temp == porog)
  {
...
  }
...
}
Go to the top of the page
 
+Quote Post
slanted
сообщение Jan 3 2008, 11:51
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768



Цитата(pimen @ Dec 24 2007, 03:37) *
Вопрос собственно в следующем:
разработана плата (и что плохо изготовлена), где есть связка Atmega128 и термодатчик MAX6630
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2577/t/al
Выход термодатчика - 13 бит (12+знак) и еще мусор до 2 байт (по spi).
как сравнить и обработать данные в восьмибитном микроконтроллере?

Для этого придуман флаг переноса и соответствующие инструкции, учитывающие его (sub/sbc, cp/cpc).
Go to the top of the page
 
+Quote Post
pimen
сообщение Jan 3 2008, 14:57
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



Цитата(slanted @ Jan 3 2008, 14:51) *
Для этого придуман флаг переноса и соответствующие инструкции, учитывающие его (sub/sbc, cp/cpc).

а как это реализуется/используется на С в AVRstudio?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016