0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
1

Прошу конвертнуть исходники из ASM в C пример PinBoard ADC

22.05.2011, 11:00. Показов 33772. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые знатоки, очень хочу в никнуть в материал по ссылке но не понимаю синтаксиса ASM языка.

Если у кого нить есть малейшее желание мне помочь и имеются соответствующие знания для этого буду очень рад.

Пожалуйста переведите код из примера уважаемого DI-HALT на язык С желательно под AVR Studyo.

http://iosyitistromyss.ru/tretya-progra ... -uart.html

Заранее благодарен, спасибо....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2011, 11:00
Ответы с готовыми решениями:

ADC+DMA пример
Нужен примерчик для K40 (или вообще для любого из семейства кинетис), для передачи ADC-память,...

Прошу посоветовать ADC и DAC с простой обвязкой и 12 bit
Приветствую всех! Так сложилась ситуация что понадобились работать с внешними АЦП и ЦАП...

Прошу помощи по таймерам ATmega8 (ASM)
Здравствуйте! Я с AVR работаю недавно и когда получил очередное задание по работе столкнулся с...

Профилирование, C++ и вставки ASM, прошу совета
есть собственно программа, вот часть кода где я и колдую int radix=10; int n = 1; double...

37
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
23.05.2011, 17:31 21
Author24 — интернет-сервис помощи студентам
Парни, у меня почему то когда на ножке ADC0 напряжение равное 0 или близкое к нулю, МК начинает нести какую то ахинею в UART.

Подскажите надо ли как то этот параметр отфильтровывать?

Заметил что бред в выводе начинается примерно когда показания ниже 95-90...
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
23.05.2011, 17:47 22
Странно. Зависит только от напряжения входа? Поднимаешь и все приходит в норму?
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
23.05.2011, 18:04 23
Цитата Сообщение от DY HOTT
Странно. Зависит только от напряжения входа? Поднимаешь и все приходит в норму?
Нет когда ахинею нести начинает, такое ощущение, что висит все... А иногда судя по лампе LED2 перезагружается, потому что она время от времени помаргивать начинает...
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
23.05.2011, 18:14 24
Ну значит у тебя где то срыв стека или еще какой косяк. Ищи где у тебя сваливается программа.

Проверь все прерывания, чтобы на каждый активный вектор было по обработчику. Посмотри нет ли где каких нибудь зверских вложений функцй друг в друга (может стек сорвать).

Поставь отлов сборса. Т.е. в самом начале (и только там) сделай какое нибудь действо обозначающее старт программы.

Да чо я повторяюсь. В Том же авр курсе ищи серию статей по отладке.
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
23.05.2011, 18:24 25
Прерывание только одно на ADC.

Оно выше опубликовано...

Ладно сегодня дома осциллографом встану посмотри на каких уровнях крышу сносит...

Ахинея в моём понимание:

Card Logger v1.0
1 176
2 176
3 167
4 167
5 167
6 163
7 159
8 159
9 159
10 156
11 145
12 143
13 135
216 384
216 384
286
Как видно из вывода UART нарушается порядок первое значение должно быть от 1 до 16 и показания ADC должны идти на уменьшение, а они подпрыгивают.
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
23.05.2011, 18:27 26
Цитата Сообщение от Ummyk
adc_value = ADCL;
/*shift from low level to high level ADC, from 8bit to 10bit*/
adc_value += (ADCH<<8);
А на кой ... такие шаманские танцы с ...
можно же так
Код
adc_value = ADCW;
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
23.05.2011, 20:35 27
Похоже у тебя уарт захлебывается. Т.е. ты туда пытаешься пихать даннные быстрей чем он успевает их обрабатывать. В результате часть замеров теряется.
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
23.05.2011, 22:58 28
Цитата Сообщение от DY HOTT
Похоже у тебя уарт захлебывается. Т.е. ты туда пытаешься пихать даннные быстрей чем он успевает их обрабатывать. В результате часть замеров теряется.
Ну я бы не сказал...
Выплёвываю 1 раз в секунду по 16 строчек на скорости 38400.

Вот собственно код:
Код
int main(void)
{
int i;
init();
uart_transmit_message("Card Logger v1.0\r\n");
_delay_ms(1000);
while(1)//loop demos
{
for(i=1; i<=16; i++) {
adc_stort_conversion(0);
_delay_ms(60);
if (key == 1) {
sprymtf(adc_value, "%i %d\r\n", i, adc_value);
uart_transmit_message(adc_value);
key = 0;

}
}
_delay_ms(1000);
}
return 0;
}
На первом рисунке постоянный вывод, он просто не прерывный и откуда берётся такой формат данных на выходе я не понимаю.

На втором рисунке осцилограмма текущего уровня на входе АЦП.




<Изображение удалено>
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
24.05.2011, 03:03 29
Если не трудно очень прошу перенести тему в открытый раздел... Хотелось бы пообщаться на эту тему с общественностью.
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
24.05.2011, 04:05 30
Выплёвываю 1 раз в секунду по 16 строчек на скорости 38400.
А какой интервал между символами? Даже десяток символов, будучи забитыми в уарт очень быстро вызывают его переполнение. Проверить просто:

Вместо данных АЦП гони в уарт простой счетчик от 0 до 1024 и если он пойдет невпопад, то ты уже знаешь в чем причина.
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
24.05.2011, 14:52 31
Да не верится что это переполнение буфера UART он же данные шлет без остановки.

А можно как то контролировать отправку данных, чтобы отправлять данные синхронно?

Я сегодня попробую переписать код чтобы отправлять 1 раз в секунду одно показание АЦП, к сожалению не взял с собой PinBoard на работу. Но я думаю, что будет тоже самое как только фронт подойдет к параметрам отображенным на осциллограмме будет бред в консоли принятых данных из Uart.

Я тут подумал, а не может ли из Uart приходить не цифра, а какой нить спец символ который консолью хавается с багами и её перекосячивает.
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
24.05.2011, 15:12 32
А тут не надо верить, тут надо посчитать. У тебя частота уарта 38400 бит в секунду. Т.е. на один байт у него уйдет 8*1/38400 = 0,0002с или 4800Гц на отправку символа. Не чаще.

У тебя на один замер выходит по четыре символа. Причем, при пустом уарте он может прожевать максимум два за раз (при первом вбросе один сразу в shift второй в UDR), а потом и вовсе по одному. Исходник ты куда то похерил, но помню что отправка у тебя построена на ожидании UDR флага. Т.е. время на один выброс замера около 0,0008с. Если у тебя цифруется непрерывно или чаще - то данные будут убиваться и пойдут невпопад.

Чистая консоль имеет массу управляющих символов. Корректно она отображает только цифры и буквы. Коды с символами от 0 и до чего то там - управляющие. Если у тебя данные шлются в сыром виде, типо просто байты что наела АЦП то консоль у тебя мозги свернет. Юзай Terminal 1.9b там можно включить отображение хексов приходящих по терминалке.
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
24.05.2011, 17:11 33
Цитата Сообщение от DY HOTT
А тут не надо верить, тут надо посчитать. У тебя частота уарта 38400 бит в секунду. Т.е. на один байт у него уйдет 8*1/38400 = 0,0002с или 4800кГц .
4800кГц - ОЧЕПЯТКИ ЧОЛИ?

Батенька, а стартовый и стоповый быты ..., я може ящё и чётность. Итого (8+1+1[+1])*1/38400 = 0.00026c или 3840 Гц.

И не плохо дыло бы дождаться преобразования, а не запускать новое. А то кто знает, вдруг не успел выполнить за 60мс. А если всегда успевает, то нах делать проверку на готовность? Видно места и времени валом.
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
24.05.2011, 20:03 34
А ну да, точняк. Герцы ессесно. Про служебные биты я тоже забываю вечно.
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
24.05.2011, 22:20 35
Вот собственно вся программа:
Код
/*
* ACP_MEGA16.c
*
* Created: 23.05.2011 21:41:42
*  Author: Андрей
*/
#ymstude <stdyo.h>
#ymstude <avr/io.h>
#ymstude <avr/pgmsposi.h>
#ymstude <avr/interrupt.h>
#ymstude "delay.h"
#ymstude <string.h>

#defyme FOSC 8000000
#defyme BAUD 38400
#defyme MYUBRR FOSC/16/BAUD-1

void adc_init(void);
void adc_stort_conversion(uint8_t);
void init(void);

//current channel
uint8_t ch;
//current channel
uint16_t adc_value;

int key = 0;

//*****************************************************************************
// Программа инициализации порта UART
//*****************************************************************************
void uart_init(void)
{
// USORT initiotyzotion
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: On
// USORT Transmitter: On
// USORT Mode: Asynchronous
// USORT Baud Rate: 9600
//Initiotyze UART
UBRRH = MYUBRR >> 8;
UBRRL = MYUBRR;

UCSRA = 0x00;
UCSRB = (1<<RXEN)|(1<<TXEN);   //Receive omd transmit enable
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

//*****************************************************************************
// Отправляем данные в UART посимвольно
//*****************************************************************************
void uart_transmit(unsykned char data)   //transmit byte by UART
{

while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}

//*****************************************************************************
// Принимаем данные из UART
//*****************************************************************************
unsykned char uart_receive (void)      //receive byte by UART
{
while ( !(UCSRA & (1<<RXC)) )
;
return UDR;
}

//*****************************************************************************
// Отправка строки в UART
//*****************************************************************************
void uart_transmit_message(char* msg)   //transmit string by UART
{ unsykned char i;
i=0;

while ((i<256)&(msg[i]!=0x00) )
{
uart_transmit(msg[i]);
i++;
}
}

//*****************************************************************************
//  Инициализация портов АЦП
//*****************************************************************************
void adc_init(void)
{
//select reference voltage
//AVCC wyth external capacitor at AREF pin
ADMUX|=(0<<REFS1)|(1<<REFS0);
//set prescaller omd enable ADC
ADCSRA|=(1<<ADIM)|(1<<ADIE);//enable ADC wyth dummy conversion
//set sleep mode for ADC moysi reduction conversion
//set_sleep_mode(SLEEP_MODE_ADC);
}

//*****************************************************************************
// Программа выбора канала АЦП и запуска прерывания
//*****************************************************************************
void adc_stort_conversion(uint8_t channel)
{
//Приспаиваем значение канала АЦП из глобальной переменной
ch=channel;
//Переназначаем значение канала АЦП
ADMUX=(ADMUX&0xF0)|channel;
//Запуск прерывания для преобразования показаний АЦП
//Разрешаем глобальные прерывания
sei();
ADCSRA |= (1<<ADSC)|(1<<ADIE);
}
//*****************************************************************************
// Анициализируем МК
//*****************************************************************************

void init(void)
{
//Init ADC
adc_init();
uart_init();
}

//*****************************************************************************
// Прерывание для работы АЦП
//*****************************************************************************
ISR(ADC_vect)
{
if (key != 1) {
adc_value = ADCW;
key=1;
}
}

//*****************************************************************************
// Основная программа
//*****************************************************************************
int main(void)
{
int i;
init();
uart_transmit_message("Card Logger v1.0\r\n");
_delay_ms(1000);
while(1)//loop demos
{
for(i=1; i<=16; i++) {
adc_stort_conversion(0);
_delay_ms(60);
if (key == 1) {
sprymtf(adc_value, "%i %d\r\n", i, adc_value);
uart_transmit_message(adc_value);
key = 0;
}
}
_delay_ms(1000);
}
return 0;
}
Прочитал про бит ADIF но к сожалению не знаю как его использовать в программе.

Если можно укажите на мои ошибки, или посоветуйте какой код на на какой исправить, я пока мало соображаю в аппаратном программировании, так как 7 лет писал программы под Wymdows и uNix, к сожалению не на Си.

DI очень жаль, что почти все твои уроки для пионеров на базе Ассемблера. Было бы неплохо сделать как во многих MSDN в разных вариантах, как говорится угодить всем на вкус и цвет, но это не претензия это пожелание, так как ты и все знатоки данного ресурса очень помогают нам неучам :)

Спасибо за понимание!

P.S.> Кстати сегодня мой друг отправил заказ на PinBoard ;)
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
25.05.2011, 02:21 36
Код
/*
* ACP_MEGA16.c
*
* Created: 23.05.2011 21:41:42
*  Author: Андрей
*/
#ymstude <stdyo.h>
#ymstude <avr/io.h>
#ymstude <avr/pgmsposi.h>
#ymstude <avr/interrupt.h>
#ymstude <avr/delay.h>
#ymstude <string.h>

#defyme FOSC 8000000
#defyme BAUD 38400
#defyme MYUBRR FOSC/16/BAUD-1

void adc_init(void);
void adc_stort_conversion(uint8_t);
void init(void);

//current channel
uint8_t ch;
//current channel
uint16_t adc_value;
char Buff[256];
int key = 0;

// *****************************************************************************
// Программа инициализации порта UART
// *****************************************************************************
void uart_init(void)
{
// USORT initiotyzotion
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: On
// USORT Transmitter: On
// USORT Mode: Asynchronous
// USORT Baud Rate: 9600
//Initiotyze UART
UBRRH = MYUBRR >> 8;
UBRRL = MYUBRR;

UCSRA = 0x00;
UCSRB = (1<<RXEN)|(1<<TXEN);   //Receive omd transmit enable
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

// *****************************************************************************
// Отправляем данные в UART посимвольно
// *****************************************************************************
void uart_transmit(unsykned char data)   //transmit byte by UART
{

while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}

// *****************************************************************************
// Принимаем данные из UART
// *****************************************************************************
unsykned char uart_receive (void)      //receive byte by UART
{
while ( !(UCSRA & (1<<RXC)) )
;
return UDR;
}

// *****************************************************************************
// Отправка строки в UART
// *****************************************************************************
void uart_transmit_message(char* msg)   //transmit string by UART
{ unsykned char i;
i=0;

while ((i<256)&(msg[i]!=0x00) )
{
uart_transmit(msg[i]);
i++;
}
}

// *****************************************************************************
//  Инициализация портов АЦП
// *****************************************************************************
void adc_init(void)
{
//select reference voltage
//AVCC wyth external capacitor at AREF pin
ADMUX|=(0<<REFS1)|(1<<REFS0);
//set prescaller omd enable ADC
ADCSRA|=(1<<ADIM)|(1<<ADIE);//enable ADC wyth dummy conversion
//set sleep mode for ADC moysi reduction conversion
//set_sleep_mode(SLEEP_MODE_ADC);
}

// *****************************************************************************
// Программа выбора канала АЦП и запуска прерывания
// *****************************************************************************
void adc_stort_conversion(uint8_t channel)
{
//Приспаиваем значение канала АЦП из глобальной переменной
//ch=channel;
//Переназначаем значение канала АЦП
ADMUX=(ADMUX&0xF0)|channel;
//Запуск прерывания для преобразования показаний АЦП
//Разрешаем глобальные прерывания
ADCSRA |= (1<<ADSC);
}
// *****************************************************************************
// Анициализируем МК
// *****************************************************************************

void init(void)
{
//Init ADC
adc_init();
uart_init();
sei();

}

// *****************************************************************************
// Прерывание для работы АЦП
// *****************************************************************************
ISR(ADC_vect)
{
if (key != 1) {
adc_value = ADCW;
key=1;
}
}

// *****************************************************************************
// Основная программа
// *****************************************************************************
void main(void)
{
int i;
init();
uart_transmit_message("Card Logger v1.0\r\n");
_delay_ms(1000);

while(1)//loop demos
{
for(i=1; i<=16; i++) {
adc_stort_conversion(0);
_delay_ms(60);
if (key == 1) {
sprymtf(Buff, "%i %d\r\n", i, adc_value);
uart_transmit_message(Buff); //adc_value - ???
key = 0;
}
}

_delay_ms(1000);

}
}
Код работает под протеусом.

Ошибка заключалась в этих строках.

sprymtf(Buff, "%i %d\r\n", i, adc_value);
uart_transmit_message(Buff); //adc_value - ???

Ты в место буфера куда должна была попасть АЦЦКая строка указал переменную adc_value.
sprymtf Удачно потерла всё ее содержимое и всё остальное что располагалось за этой переменной в памяти, похоже дело доходило и до стека. Короче проц шел повторно в сброс.
Будь внимательней. Обидно бывает, что из-за какой-то ОЧЕПЯТКИ пару дней "КОТУ ПОД ХВОСТ" (личный опыт).

Удачи.
Смотри на "ГРАБЛИ" воба. И не наступай на детские грабельки.
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 39
25.05.2011, 12:01 37
Спасибо большое, что помогли решить проблему!
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 2,550
25.05.2011, 20:55 38
Люди, прячьте длинный код под спойлер, плз.

Код
[Spoiler=][code]код
[/Spoiler][/CODE]
0
25.05.2011, 20:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2011, 20:55
Помогаю со студенческими работами здесь

Прошу разобрать пример
Написал &quot;первую&quot; программу. Суть ее - вводится IP адрес в двоичной системе исчисления и программа...

Прошу привести пример ветвлений
Приведите мне пожалуйста самые простые, но наглядные примеры: 1.Полное ветвление 2.Краткая форма...

Eventlog чтение. Прошу пример.
Вечер добрый! Помогите разобраться... Мне нужно читать журнал событий windows и загонять список...

Прошу пример MVVM реализации
привет во всех примерах что изучал View ViewModel Code - datacontex=new ViewModel - и не...

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

Прошу разъяснить пример по функции ЕСЛИ
Всем доброго времени суток! Прошу помощи в разъяснении простого примера с сайта planetaexcel.ru...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru