Перейти к содержанию

Прошу Помощи В Отладке Проги Для Avr


avtogen112

Рекомендуемые сообщения

Всем добрых суток. В первый раз столкнулся с микропроцессорами и их программированием. Суть проблемы устройство готово и даже почти работает, кроме маленького нюанса: после выполнения всей последовательности событий переменная BUT обнуляется, причем при отладке в Протеусе или AVR Studio все хорошо и как надо BUT сохраняет значение, а в реальной железке увы. Перепробывал все варианты по настройке компилятора CodeVision, играл с типами данных переменной BUT, перемещал из глобальной в область подпрограмм, играл квалификатором переменной (volatile, static и др.), ввел доп переменную Х (от безвыходности, хотя она вообще там не нужна) реакции никакой. Помогите кто может , а то у меня уже руки начинают опускаться от этих танцев с бубном. Заранее всем благодарен.

/*****************************************************

This program was produced by the

CodeWizardAVR V2.04.1 Evaluation

Automatic Program Generator

© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

Project :

Version :

Date : 20.10.2015

Author : Freeware, for evaluation and non-commercial use only

Company :

Comments:

Chip type : ATmega8

Program type : Application

AVR Core Clock frequency: 8.000000 MHz

Memory model : Small

External RAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega8.h>

#include <delay.h>

#pragma opt- //оптимизация выключена

bit KL=0;

bit KR=0;

bit KS=0;

bit KER=0;

bit KEL=0;

unsigned char BUT;

unsigned char x;

unsigned char read_adc(unsigned char adc_input)

{

ADMUX=adc_input | (ADMUX&0b11110000);

// Delay needed for the stabilization of the ADC input voltage

delay_us(10);

// Start the AD conversion

ADCSRA|=0x40;

// Wait for the AD conversion to complete

while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

return ADCW;

}

void PR3(void)//П-цикл на лево 3-0 4-1

{ if (PINC.2==0) // проверить "0" на линии 2 порта C нажатие кнопки СТАРТ в лево

{KL=1;

delay_ms(20);

};

if (PINC.3==0) // проверить "0" на линии 3 порта C нажатие кнопки СТАРТ в право

{KR=1;

delay_ms(20);

};

if (PINC.4==0) // проверить "0" на линии 4 порта C кнопка СТОП

{KS=1;

KL=0;

KR=0;

delay_ms(20);

};

if (PINC.5==0) // проверить "0" на линии 5 порта C конечник левого положения

{KEL=1;

KER=0;

delay_ms(40);

};

if (PIND.2==0) // проверить "0" на линии 2 порта D конечник правого положения

{KER=1;

KEL=0;

delay_ms(40);

};

while (!PINB.0&BUT<100) // увеличить скорость

{delay_ms (1);

BUT++;

read_adc(0);

OCR1A=254-(ADCH+BUT);//для инверсии входа ACD---- (255-ADCH)

};

while (!PINB.3&BUT>0) // уменьшить скорость

{delay_ms (1);

BUT--;

read_adc(0);

OCR1A=254-(ADCH+BUT);//для инверсии входа ACD---- (255-ADCH)

};

if (KER==1&KL==1)

{read_adc(0);

OCR1A=254-(ADCH+BUT);//для инверсии входа ACD---- (255-ADCH)

}

else

{};

if (KER==1&KL==1&KS==0)

{PORTD=0b00011101; // установить "1" (высокий уровень) на выводе PD0

x=254-(ADCH+BUT);

}

else

{};

if (KER==0&KL==1&KEL==1)

{

OCR1A=250;

}

else

{};

if (KEL==1&KR==0&KS==0)

{PORTD=0b00011110; // установить "1" (высокий уровень) на выводе PD1

KL=0;

while (OCR1A>0)

{delay_ms (5);

OCR1A--;

}

}

else

{};

if (KER==1&KL==0)

{PORTD=0b00011100; // установить "0" (низкий уровень) на выводе PD0 и PD1

KR=0;

KER=0;

KEL=0;

KS=0;

OCR1A=x;

delay_ms(20);

}

else

{};

if (KS==1)

{PORTD=0b00011100;

KR=0;

KL=0;

KER=0;

KEL=0;

KS=0;

}

else

{};

};

void main(void)

{

// Port B initialization

PORTB=0b00001001;

DDRB=0b00000010;

// Port C initialization

PORTC=0b00111100;

DDRC=0b00000000;

// Port D initialization

PORTD=0b00011100;

DDRD=0b00000011;

TCCR1A=0b10000001;

TCCR1B=0b00001001;// xxxxxCS12-CS10

//000-нет источника (таймер выключен)

//001-CLK

//010-CLK/8

//011-CLK/64

//100-CLK/256

//101-CLK/1024

//110-Внешний источник тактирования на Т1. Падающий фронт

//111-Внешний источник тактирования на Т1. Растущий фронт

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// ADC initialization

//инициализация регистра ADMUX

//00xxxxxx AREF

//01xxxxxx AVcc, с внешним конденсатором на AREF

//10xxxxxx Резерв

//11xxxxxx Внутренний 2.56В источник, с внешним конденсатором на AREF

// xxADLARxxxxx

// ADLAR = 0 в ADCH записываются два старших бита (2 MSB), а остальные в ADCL.

// ADLAR = 1 в ADCH записываются 8 старших битов (8 MSB), а два младших (2 LSB) в ADCL.

// Это удобно, если для точности ваших измерений достаточно 8-ми старших бит преобразования.

//xxx-(MUX) номер входа в двоичной системе

ADMUX=0b11110000;

//инициализация регистра ADSRA

//ADENxxxxxxx Разрешение АЦП.0 – АЦП выключен 1 – АЦП включен

//xADSCxxxxxx Запуск преобразования (в режиме однократного преобразования)

//0 – преобразование завершено

//1 – начать преобразование

//xxADFRxxxxx Выбор режима работы АЦП

//0 – режим однократного преобразования

//1 – режим непрерывного преобразования

//xxxADIFxxxx Флаг прерывания от АЦП. Бит устанавливается, когда преобразование закончено

//xxxxADIExxx Разрешение прерывания от АЦП Прерывание от АЦП генерируется (если разрешено) по завершении преобразования.

//0 – прерывание запрещено

//1 – прерывание разрешено

//xxxxxADPS ADPS2:ADPS0. Тактовая частота АЦП

// 000 СК

//001 СК/2

//010 СК/4

//011 СК/8

//100 СК/16

//101 СК/32

//110 СК/64

//111 СК/128

ADCSRA=0b10001100;

while (1)

{

if (PIND.3==0&PIND.4==1)

{PR3();//П-цикл на лево

delay_ms(20);

};

};

}

Изменено пользователем avtogen112
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

определил так:

начальные условия для pr3: KER замкнут, все остальные разомктнуты.

Нажимаем "СТАРТ в лево" , включатся реле хода в лево, увиличиваем скорость, стол перемещается с заданной стабильной скоростью до конечника KEL, затем

двигатель останавливается, включается реле хода в право, плавно увеличивается скорость вращения с нуля до максимальной и стол возвращается до конечника правого положения, пр его замыкании реле хода отключается. Цикл закончен. При следующем нажатии "СТАРТ в лево" цикл должен повториться с той же скоростью что была выставлена в первый раз. Так вот, все работает как описано кроме сохранения заранее заданной скорости. При нажатии "СТАРТ в лево" необходимо опять увеличивать скорость. При debuging в Протеусе и AVR Studio, не происходит переполнения OCR1A т.к. использую только старший байт ADCW (8 битов байта ADCH) и OCR1AH всегда равен нулю. И при старте нового цикла скорость в протеусе сохраняется.

Изменено пользователем avtogen112
Ссылка на комментарий
Поделиться на другие сайты

BUT++;
 read_adc(0);
 OCR1A=254-(ADCH+BUT);

Может быть проблема в том, что функция не передает параметры? Как-то вхолостую она вызывается.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

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

if (KER==0&KL==1&KEL==1)

{

OCR1A=250;

}

else

{};

if (KEL==1&KR==0&KS==0)

{PORTD=0b00011110; // установить "1" (высокий уровень) на выводе PD1

KL=0;

while (OCR1A>0)

{delay_ms (5);

OCR1A--;

}

}

else

{};

а без него слишком большая нагрузка на привод

Ссылка на комментарий
Поделиться на другие сайты

Может косяк здесь

unsigned [b]char[/b] read_adc(unsigned char adc_input)
{
...return [b]ADCW[/b];

?

(Всю программу не рассматривал - глаза наперекосяк).

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...