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

Подскажите По At2313 В Cvavr И Протеус


cucumber

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

Подскажите пожалуйста, где ошибка.

Программа откомпилирована как она тут есть.

В протеусе без помеченной строчки на выводах порта Б "бегают" сигналы .

#include <tiny2313.h>
void main(void){
PORTB=0x00;
DDRB=0xFF;

PORTD=0b0000000;
DDRD=0b0001111;// с этой строчкой не работает.

TCCR0B=0x01;
TIMSK=0x02;
while (1) {
   PORTB++;
  };
}

если вместо DDRD=0b0001111

написать DDRD.x для каждого бита то выясняется что "виноват" бит PD2

если в протеусе "оторвать" эту ногу то все работает!

может "виновато" иное предназначение ноги?

post-152089-0-55419200-1347642814_thumb.jpg

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

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

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

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

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

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

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

это осталось от основной программы. Недобрый такой прикол.

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

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

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

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

Вообщем мечтаю собрать тахометр или как его правильно для своего малогабаритного токарного станка. Сигнал будет поступать с геркона.Должно отображаться обороты в минуту. Не думал, что столько вопросов будет, потому и не стал создавать тему с тахометром. А наверное надо было бы.

Вот программа. Светодиоды с общим анодом.

Сильно не пеняйте.

Ах да. Теме место в разделе начинающих.

#include <tiny2313.h>

//#include <delay.h>

// Declare your global variables here

bit n1=0, n2=0, n3=0;//вспомогательные переменные

unsigned int s=0, k=0, x=0, c[4], t=0; //0...65535

// s- счетчик количества прерываний

// k- счетчик при некотором значении которого выводится информация на светодиоды

// x - принимает значение 0..3 для динамической индикации

// c[4]- хранит текущие значения разрядов. 0 -младший

// t- для "запоминания " таймера

//процедура прерывания

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

s++;

TIFR |= 1<<1;

if(s>500) {s=0; }// число 500 пока что "от балды"

}

void main(void)

{

// Declare your local variables here

// Crystal Oscillator division factor: 1

// пока не знаю что это такое

#pragma optsize-

CLKPR=0x00;

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

PORTB=0b01000000;

DDRB=0xFF;

PORTD=0b0000000;

DDRD=0b0001111;

TCCR0A=0x00;

TCCR0B=0x02;//

TIMSK=0x02; //

#asm("sei")

while (1){

k++;

// вычисление промежутка времени будет осуществляться между двумя спадами сигнала на PD6

if (PIND.6==1) {

n1=1;

}//end if

if ((PIND.6==0)&(n1==1)) {

t=TCNT0; //"засек" время

n2=1;

}//end if

if ((PIND.6==1)&(n2==1)) {

n3=1;

}//end if

if ((PIND.6==0)&(n3=1)) {

//"засек" время еще раз(перезаписал переменную)

t=TCNT0+(256*s)-t; //вычисление промежутка времени(число колебаний с частотой 500кГц)

t=30000000/t; //перезаписываю для экономии, константа чтобы получилось обороты в минуту

// значения разрядов

c[3]=t/1000;

c[2]=(t-(c[3]*1000))/100;

c[1]=(t-((c[3]*1000)+(c[2]*100)))/10;

c[0]=((t/10)-(t/10))*10;

n1=0;

n2=0;

n3=0;

}

//процедура вывода результата

if(k>500){

k=0;

PORTD.0=0;

PORTD.1=0;

PORTD.2=0;

PORTD.3=0;

PORTD |= 1<<x;

if(c[x]==0) {PORTB=0b01000000;}

if(c[x]==1) {PORTB=0b01111001;}

if(c[x]==2) {PORTB=0b00100100;}

if(c[x]==3) {PORTB=0b00110000;}

if(c[x]==4) {PORTB=0b00011001;}

if(c[x]==5) {PORTB=0b00010010;}

if(c[x]==6) {PORTB=0b00000010;}

if(c[x]==7) {PORTB=0b01111000;}

if(c[x]==8) {PORTB=0b00000000;}

if(c[x]==9) {PORTB=0b00001000;}

x++;

if(x==4){x=0;}//

}

}//end while(1)

}//end main

Порт Б по-моему должен "замереть" с изображением нуля.

А он зараза мигает произвольно.

Где я опять ошибся?

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

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

Получается программа вычисляет все равно значения в массиве с[x].

Значит срабатывает условие if ((PIND.6==0)&(n3=1)) хотя не должно. мне думается что я неправильно написал логическое "и" - &. попробовал &&. все равно вычисляет. а не должно. должно отображать по умолчанию - "0".резисторы переставил на порт Б

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

ураааааа!))) с вашей то помощью заработало кажется.

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

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

  • 2 недели спустя...

Вообщем выкладываю прогу тахометра на 2313 -может кто увидит -что не так.

Спаял, прошил, фьюзы cksel0, cksel1, sut1 поставил галочки.

С фьюзами кстати еще не разобрался до конца.

Подключил генератор на 561 лн2, примерно 1 гц. Индикация есть,

но примерно раз в две секунды значение меняется как бы по произвольному закону и естественно оно неверное. должно "замереть" со значением примерно 60. В протеусе тоже самое. Если гену отключить то покажет нули, здесь хоть работает)

#include <tiny2313.h>

// Declare your global variables here

bit n1=0, n2=0, n3=0;//вспомогательные переменные

unsigned int s=0, k=0, x=0, c[4]; //0...65535

unsigned long int t=0;

// s- счетчик количества прерываний

// k- счетчик при некотором значении которого выводится информация на светодиоды

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

s++;

TIFR |= 1<<1;

if(s>20000) {s=20000; }// число пока что "от балды"

}

void main(void)

{

// Declare your local variables here

// Crystal Oscillator division factor: 1

#pragma optsize-

CLKPR=0x00;

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

PORTB=0b00101000;

DDRB=0xFF;

PORTD=0b0000000;

DDRD=0b0001111;

TCCR0A=0x00;

TCCR0B=0b00000001;//___4МГц

TIMSK=0b00000010; //прерывания по переполнению таймера возможны

#asm("sei")// вкл глобально прерывания

while (1){

k++;

// вычисление промежутка времени будет осуществляться между двумя спадами сигнала на PD6

if (PIND.6==1) {n1=1;}

if ((PIND.6==0)&&(n1==1)) {

t=TCNT0; //"засек" время

s=0;

n2=1;

}

if ((PIND.6==1)&&(n2==1)) {

n3=1;

}

if ((PIND.6==0)&&(n3==1)) {

//"засек" время еще раз(перезаписал переменную)

t=TCNT0+(256*s)-t; //вычисление количества колебаний с частотой // 4МГц за период входного сигнала

t=24000000/t; //перезаписываю для экономии, константа чтобы ..получилось обороты в минуту

// значения разрядов

c[3]=t/1000; // значение старшего разряда

c[2]=(t-(c[3]*1000))/100;

c[1]=(t-((c[3]*1000)+(c[2]*100)))/10;

c[0]=(t-((t/10)*10));

s=0;

n1=0;

n2=0;

n3=0;

}

//процедура вывода результата

if(k>300){

k=0;

PORTD.0=0;

PORTD.1=0;

PORTD.2=0;

PORTD.3=0;

if(c[x]==0) {PORTB=0b00101000;} //DEGF,CBA

if(c[x]==1) {PORTB=0b11111001;}

if(c[x]==2) {PORTB=0b00011100;}

if(c[x]==3) {PORTB=0b01011000;}

if(c[x]==4) {PORTB=0b11001001;}

if(c[x]==5) {PORTB=0b01001010;}

if(c[x]==6) {PORTB=0b00001010;}

if(c[x]==7) {PORTB=0b11111000;}

if(c[x]==8) {PORTB=0b00001000;}

if(c[x]==9) {PORTB=0b01001000;}

PORTD |= 1<<x;

x++;

if(x==4){x=0;}

}

}//end while(1)

}//end main

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

Учти, что цикл While(1) успеет прокрутиться много раз пока выполняется условие (например) if ((PIND.6==0)&&(n1==1)). Поэтому не забывай "закрывать дверь" после разового прохода, т.е. сбрасывать флаги n1, n2, n3. За тебя МК этого не сделает и будет крутить эти условия пока сигнал имеет данный уровень.

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

получается видимо чот программа проверяет условие if ((PIND.6==0)&&(n1==1)) несколько раз и каждый раз записывает в переменную t разные значения TCNT0. Видимо надо менять подход в построении алгоритма. пошел думать дальше)

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

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

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

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

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

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

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

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

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

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

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