Цифровой одометр на Atmega8

Обсуждаем контроллеры компании Atmel.
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Re: Цифровой одометр на Atmega8

Сообщение s64 »

все кнопки управления на одну ногу АЦП.
Реклама
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Помогите пожалуйста вот с этим кодом он был сначала на два сегмента я сделал на 3 сегмента, но не получается чтобы при счете 1 сегмент считал как положено, скорее всего делю число не правильно :) Писалось в CodeVisionAVR

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

#include <mega8.h>
#include <delay.h>

unsigned char number[] = 
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3   
  0x66, //4
  0x6d, //5 
  0x7d, //6
  0x07, //7   
  0x7f, //8
  0x6f  //9    
};

//числа для вывода на индикатор
volatile unsigned char data1 = 0;
volatile unsigned char data2 = 0;
volatile unsigned char data3 = 0;
void main( void )
{
 //порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;
  
 //порт, к которому подкл. катод
  PORTD = 0;
  DDRD |= (1<<2)|(1<<1)|(1<<0); 
  
  //инициализация таймера Т0 
  TIMSK = (1<<TOIE0);
  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
  TCNT0 =  0xb2;
    
  #asm("sei");
  while(1){
    //программный счетчик секунд
    data3++;
    if (data3 == 10){ 
        data3 = 0;
        data2++;
        if (data2 == 1) data2 = 0;
        data1++;
        if (data1 == 10) data1 = 0; 
      }
    delay_ms(100);    
 }    
}
         

//прерывания таймера Т0 - вывод на индикатор
interrupt [TIM0_OVF] void Timer0Ovf(void)
{
  static unsigned char count = 0;
  TCNT0 = 0xb2;
  
  //гасим оба разряда
   PORTD &= ~((1<<2)|(1<<1)|(1<<0));
   
   //зажигаем следующий разряд
    if (count == 2) {
      PORTB = number[data3];
      PORTD |= (1<<2);
   }
   if (count == 0) {
      PORTB = number[data2];
      PORTD |= (1<<1);
   }
   if (count == 1) {
      PORTB = number[data1];
      PORTD |= (1<<0);
   }
  count++;   
    if (count == 3) count = 0;
}
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

еее сделал :))) ща все норм работает поставил {} тут они как я понял операторными скобками являются :)

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

#asm("sei");
  while(1){
    //программный счетчик секунд
    data3++;
    if (data3 == 10){ 
        data3 = 0;
         data1++; 
        if (data1 == 10) {data1 = 0;  
         data2++;
        if (data2 == 10){ data2 = 0; 
      } }} 
    delay_ms(100);    
 }   
}
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

такк вроде с индикацией разобрался а вот с опросом клавиш нет :( может кто буть поможет :oops:
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

КРУТЬЬЬ и с кнопочками разобрался :))) блин не радовался так еще никогда как ща :))
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста :)
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Цифровой одометр на Atmega8

Сообщение ploop »

От видно сразу программиста! :) Я тоже за пару дней втянулся, остаются вопросы только касаемо периферии, которой в современных МК полно.
Реклама
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Re: Цифровой одометр на Atmega8

Сообщение s64 »

yur4ik писал(а):КРУТЬЬЬ и с кнопочками разобрался :))) блин не радовался так еще никогда как ща :))
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста :)
так задавай вопросы конкретнее, тогда и ответы будут.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

s64 писал(а):
yur4ik писал(а):КРУТЬЬЬ и с кнопочками разобрался :))) блин не радовался так еще никогда как ща :))
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста :)
так задавай вопросы конкретнее, тогда и ответы будут.
ВСе уже не надо разобрался сам :)
Посмотрите. Организовал на данный момент только суточник. Все пока проверял в proteuse

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

#include <mega8.h>
//#include <delay.h>

unsigned char number[] = 
{
  0x3f, //0
  0x06, //1
  0x5b, //2
  0x4f, //3   
  0x66, //4
  0x6d, //5 
  0x7d, //6
  0x07, //7   
  0x7f, //8
  0x6f  //9    
};
//числа для вывода на индикатор
volatile unsigned char data1 = 0;
volatile unsigned char data2 = 0;
volatile unsigned char data3 = 0;
volatile unsigned char data4 = 0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
data4++; 
    if (data4 == 10){ data4 = 0;  
     data3++;
    if (data3 == 10){ data3 = 0;
     data1++; 
    if (data1 == 10) {data1 = 0;  
     data2++;
    if (data2 == 10){ data2 = 0; 
     } }}}  
}

void main(void){
//порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;
//кнопка сброса
  PORTC=0xFF;
  DDRC=0x00; 
 
//порт, к которому подкл. катод
  PORTD = 0;
  DDRD |= (1<<5)|(1<<4)|(1<<1)|(1<<0); 
  
//  //инициализация таймера Т0 
//  TIMSK = (1<<TOIE0);
//  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
//  TCNT0 =  0xb2; 
GICR|=0xC0;
MCUCR=0x0A;
GIFR=0xC0;


//разрешаем прерывания
#asm("sei")
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
static unsigned char count = 0;
TCNT0 = 0xb2;
//гасим оба разряда
   PORTD &= ~((1<<5)|(1<<4)|(1<<1)|(1<<0));
//зажигаем следующий разряд
    if (count == 3) {
      PORTB = number[data4];
      PORTD |= (1<<5);
   }
    if (count == 2) {
      PORTB = number[data3];
      PORTD |= (1<<4);
   }
   if (count == 0) {
      PORTB = number[data2];
      PORTD |= (1<<1);
   }
   if (count == 1) {
      PORTB = number[data1];
      PORTD |= (1<<0);
   }
  count++;   
    if (count == 4) count = 0;
if (PINC.0==0){
data1 = 0;
data2 = 0;
data3 = 0;
data4 = 0;
}   
}
если вывод инфорамции засунуть в цикл то загрузка проца составляет 100%(на вход не подаем импульсы), а так подаем на второй внешний прерыватель импульсы и загрузка где-то 10-15%, скорее всего я выбрал не самое хорошее решение, поэтому может кто-то скажет как лучше :)
Модель в proteuse прилагаю.
Модель в proteuse.rar
Модель в proteuse
(16.34 КБ) 254 скачивания
Нельзя всё знать, достаточно понимать.
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Re: Цифровой одометр на Atmega8

Сообщение s64 »

с протеусом не работаю, предпочитаю отлаживать на железке. Слишком много всего делается в прерывании, лучше в прерывании выставлять флажек и обрабатывать его в основной программе.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Появилось два вопроса:
1. А как осуществляется в codevisionavr запись в епром?
2. А почему в проутосе когда меняю инвентор на транзистор на катодах экрана то цифры дергаются происходит не понятно что :(
пример на суточнике 1 цифра км 5 а на втором индикаторе вывелась 8 и держится на протяжении всего замера
Безимени-1.jpg
(159.08 КБ) 449 скачиваний
вернул обратно инвентор то сразу все пришло в норму

Щас сделал еепром все записывает но блин если на вход поступают импульсы свыше 90Гц экран начинает моргать как можно от такого избавиться?

А запись делал вот так

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

eeprom volatile unsigned char data1;
eeprom volatile unsigned char data2;
eeprom volatile unsigned char data3;
eeprom volatile unsigned char data4;
eeprom volatile unsigned char dataa1;
eeprom volatile unsigned char dataa2;
eeprom volatile unsigned char dataa3;
eeprom volatile unsigned char dataa4;
eeprom volatile unsigned char dataa5;
eeprom volatile unsigned char dataa6;
eeprom volatile unsigned char dataa7;
объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
Нельзя всё знать, достаточно понимать.
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Re: Цифровой одометр на Atmega8

Сообщение s64 »

yur4ik писал(а): объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
даташит 1-я страница.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

s64 писал(а):
yur4ik писал(а): объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
даташит 1-я страница.
100000 циклов стирания/записи
блин это не так уж и много :( а как я организовал запись в еепром эт ваще быстро выйдет :( покажите пожалуйста как лучше будет с еепром работать :oops:
Нельзя всё знать, достаточно понимать.
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Re: Цифровой одометр на Atmega8

Сообщение s64 »

контролировать напряжение перед 5v стабилизатором, как только упало ниже 11 вольт, записывать нужные данные в EEPROM.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

s64 писал(а):контролировать напряжение перед 5v стабилизатором, как только упало ниже 11 вольт, записывать нужные данные в EEPROM.
хмм... у меня в распоряжении всего одна ножка осталась я скорее всего не так сделаю, а вот так
на + аккумулятора повешу транзистор он будет все время пока есть аккумулятор соединять ножку мк с корпусом машины но как только пропадет это соединение то писать в еепром.
Подтяжка из резистора ком в 10 пойдет?
люди че за фигня в проутосе аа? Вот так запитываю индикатор то горят нули и моргают Схема в разрезе VT3 и инвентора вставил сопротивление 1ком, но если убрать всю конструкцию и соединить напрямую аноды индикатора к мк а катод через инвентор на мс то все нормально работает? кто может объяснить????
выдает во время исполнения вот эту ошибку
Безимени-1.jpg
ошибка
(126.71 КБ) 473 скачивания
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

люди помогите разобраться с проутеской фигней и все вроде проект готов :)
блин походу это не проутес а прошивка... катоды должны инверсированными уже управляться сигналами :)
да дело было за прошивкой, щас написал для общего анода все норм работает осталось для общего катода и все :)
дааа все таки проутес эт не показатель убил 4 часа на поиск ошибки в прошивке, а оказался во всем вина проутес... :(
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Хочу узнать а если вот так включить транзистор то мк ничего не будет?
Изображение
просто когда так цепляю то проутосе загрузка проца сразу под 100% подпрыгивает а если напрямую все подключаю выше 50% не бывает
Вложения
Безымянный.JPG
(4.61 КБ) 1245 скачиваний
Нельзя всё знать, достаточно понимать.
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Re: Цифровой одометр на Atmega8

Сообщение s64 »

поставь IRLML6402 и убери резистор. Так как ты нарисовал делать нельзя, нужен p-n-p транзистор, эмиттером на плюс, но тогда на базе и соответственно на МК будет попадать 12 вольт.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

s64 писал(а):поставь IRLML6402 и убери резистор. Так как ты нарисовал делать нельзя, нужен p-n-p транзистор, эмиттером на плюс, но тогда на базе и соответственно на МК будет попадать 12 вольт.
ахахахха вернулась старая проблема :( циферки дергуются зажигаются разные сегменты ппппццц :cry: я просто такое решение видел в проутосе в каком то проекте, IRLML6402 в проутосе нету :( есть irlml6401TR
щас просто взял и поставил pnp и соеденил коллектор на корпус а эмитер на вывод анода все работает :))) но загрузка серовно 90-100% а значит так делать нельзя
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

вот листинг где че я не правильно сделал?

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

#include <mega8.h>
//#include <delay.h>

unsigned char number[] = 
{
0b11000000,
0b11111001,
0b10100100,
0b10110000,
0b10011001,
0b10010010,
0b10000010,
0b11111000,
0b10000000,
0b10010000
};
//числа для вывода на индикатор
eeprom volatile unsigned char data1 = 0 ;
eeprom volatile unsigned char data2 = 0;
eeprom volatile unsigned char data3 = 0;
eeprom volatile unsigned char data4 = 0;
eeprom volatile unsigned char dataa1= 0;
eeprom volatile unsigned char dataa2= 0;
eeprom volatile unsigned char dataa3= 0;
eeprom volatile unsigned char dataa4= 0;
eeprom volatile unsigned char dataa5= 0;
eeprom volatile unsigned char dataa6= 0;
eeprom volatile unsigned char dataa7= 0;
volatile unsigned char dat1 = 0 ;
volatile unsigned char dat2 = 0;
volatile unsigned char dat3 = 0;
volatile unsigned char dat4 = 0;
volatile unsigned char dataaa1= 0;
volatile unsigned char dataaa2= 0;
volatile unsigned char dataaa3= 0;
volatile unsigned char dataaa4= 0;
volatile unsigned char dataaa5= 0;
volatile unsigned char dataaa6= 0;
volatile unsigned char dataaa7= 0;
//число импульсов с датчика
volatile unsigned char imp= 0 ;
volatile unsigned char i= 0 ;
volatile unsigned char im= 0 ;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
im++;
}
void main(void){
//порт, к которому подкл. сегменты
  PORTB = 0xff;
  DDRB = 0xff;

//порт, к которому подкл. катод
  PORTC = 0;
  DDRC |= (1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0); 

 PORTD = 0;
 DDRD |= (1<<5)|(1<<4)|(1<<1)|(1<<0); 

//  //инициализация таймера Т0 
  TIMSK = (1<<TOIE0);
  TCCR0 = (0<<CS02)|(1<<CS01)|(0<<CS00);
  TCNT0 =  0xb2;
GICR|=0xC0;
//MCUCR=0x0A;
//GIFR=0xC0;
if(i<=1){
dat1=data1;
dat2=data2;
dat3=data3;
dat4=data4;
dataaa6=dataa6;
dataaa1=dataa1;
dataaa2=dataa2;
dataaa3=dataa3;
dataaa4=dataa4;
dataaa5=dataa5;
dataaa6=dataa6;
dataaa7=dataa7;
}else{i++;}
//разрешаем прерывания
#asm("sei");
while(1){
if (im==1){
im=0;
if (imp==0){
imp=0;
dat4++; 
    if (dat4 == 10){ dat4 = 0;  
     dat3++;                        
    if (dat3 == 10){ dat3 = 0;
     dat1++; 
    if (dat1 == 10) {dat1 = 0;  
     dat2++;
    if (dat2 == 10){ dat2 = 0; 
    }}}}
dataaa7++; 
    if (dataaa7 == 10){ dataaa7 = 0; 
     dataaa6++; 
    if (dataaa6 == 10){ dataaa6 = 0;  
     dataaa5++;
    if (dataaa5 == 10){ dataaa5 = 0;
     dataaa4++; 
    if (dataaa4 == 10) {dataaa4 = 0;  
     dataaa3++;
    if (dataaa3 == 10){ dataaa3 = 0; 
     dataaa2++; 
    if (dataaa2 == 10){ dataaa2 = 0;  
     dataaa1++;
    if (dataaa1 == 10){ dataaa1 = 0;  
  }}}}}}}  
}else imp++; }
}
}
//interrupt [EXT_INT1] void ext_int1_isr(void)
//{
interrupt [TIM0_OVF] void Timer0Ovf(void)
{
static unsigned char count1 = 0;
TCNT1 = 0xb2;
 PORTD &= ~((1<<5)|(1<<4)|(1<<1)|(1<<0)); 
 PORTC &= ~((1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0));  
//зажигаем следующий разряд

    if (count1 == 9) {
      PORTB = number[dat4];
      PORTD |= (1<<5);
   }  
   if (count1 == 8) {
      PORTB = number[dat3];
      PORTB.7=0;
      PORTD |= (1<<4);
   } 
   if (count1 == 7) {
      PORTB = number[dat2];
      PORTD |= (1<<1);
   }  
   if (count1 == 6) {
      PORTB = number[dat1];
      PORTD |= (1<<0); 
   }
   if (count1 == 5) {
      PORTB = number[dataaa6];
      PORTC |= (1<<5);
   }
   if (count1 == 4) {
      PORTB = number[dataaa5];
      PORTC |= (1<<4);
   }  
    if (count1 == 3) {
      PORTB = number[dataaa4];
      PORTC |= (1<<3);
   } 
   if (count1 == 2) {
      PORTB = number[dataaa3];
      PORTC |= (1<<2);
   }     
   if (count1 == 1) {
      PORTB = number[dataaa2];
      PORTC |= (1<<1);
   } 
   if (count1 == 0) {
      PORTB = number[dataaa1];
      PORTC |= (1<<0);
   } 
  count1++;   
    if (count1 == 10) count1 = 0;      
if (PIND.6==0)
{
dat1 = 0;
dat2 = 0;
dat3 = 0;
dat4 = 0;
}   
if (PIND.7==0)
{
data1=dat1;
data2=dat2;
data3=dat3;
data4=dat4;
dataa1=dataaa1;
dataa2=dataaa2;
dataa3=dataaa3;
dataa4=dataaa4;
dataa5=dataaa5;
dataa6=dataaa6;
dataa7=dataaa7;
}
}
Последний раз редактировалось yur4ik Сб фев 12, 2011 17:36:29, всего редактировалось 1 раз.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

вот схема
Одометр.JPG
(148.7 КБ) 600 скачиваний
Модель в проутосе
Модель в proteuse.rar
(19.25 КБ) 222 скачивания
Вот теперь прошу вашей помощи форумчане! помогите пожалуйста избавиться от самовключения сегментов при установке транзисторов. :oops:
Нельзя всё знать, достаточно понимать.
Ответить

Вернуться в «AVR»