Цифровой одометр на Atmega8
Re: Цифровой одометр на Atmega8
все кнопки управления на одну ногу АЦП.
- Реклама
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
Помогите пожалуйста вот с этим кодом он был сначала на два сегмента я сделал на 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
еее сделал
ща все норм работает поставил {} тут они как я понял операторными скобками являются
Код: Выделить всё
#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
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
КРУТЬЬЬ и с кнопочками разобрался
блин не радовался так еще никогда как ща 
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста
Нельзя всё знать, достаточно понимать.
- Реклама
Re: Цифровой одометр на Atmega8
От видно сразу программиста!
Я тоже за пару дней втянулся, остаются вопросы только касаемо периферии, которой в современных МК полно.
Re: Цифровой одометр на Atmega8
так задавай вопросы конкретнее, тогда и ответы будут.yur4ik писал(а):КРУТЬЬЬ и с кнопочками разобралсяблин не радовался так еще никогда как ща
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
ВСе уже не надо разобрался сам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;
}
}
Модель в proteuse прилагаю.
Нельзя всё знать, достаточно понимать.
Re: Цифровой одометр на Atmega8
с протеусом не работаю, предпочитаю отлаживать на железке. Слишком много всего делается в прерывании, лучше в прерывании выставлять флажек и обрабатывать его в основной программе.
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
Появилось два вопроса:
1. А как осуществляется в codevisionavr запись в епром?
2. А почему в проутосе когда меняю инвентор на транзистор на катодах экрана то цифры дергаются происходит не понятно что
пример на суточнике 1 цифра км 5 а на втором индикаторе вывелась 8 и держится на протяжении всего замеравернул обратно инвентор то сразу все пришло в норму
Щас сделал еепром все записывает но блин если на вход поступают импульсы свыше 90Гц экран начинает моргать как можно от такого избавиться?
А запись делал вот так
объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
1. А как осуществляется в codevisionavr запись в епром?
2. А почему в проутосе когда меняю инвентор на транзистор на катодах экрана то цифры дергаются происходит не понятно что
пример на суточнике 1 цифра км 5 а на втором индикаторе вывелась 8 и держится на протяжении всего замеравернул обратно инвентор то сразу все пришло в норму
Щас сделал еепром все записывает но блин если на вход поступают импульсы свыше 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;Нельзя всё знать, достаточно понимать.
Re: Цифровой одометр на Atmega8
даташит 1-я страница.yur4ik писал(а): объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
100000 циклов стирания/записиs64 писал(а):даташит 1-я страница.yur4ik писал(а): объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
блин это не так уж и много
Нельзя всё знать, достаточно понимать.
Re: Цифровой одометр на Atmega8
контролировать напряжение перед 5v стабилизатором, как только упало ниже 11 вольт, записывать нужные данные в EEPROM.
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
хмм... у меня в распоряжении всего одна ножка осталась я скорее всего не так сделаю, а вот такs64 писал(а):контролировать напряжение перед 5v стабилизатором, как только упало ниже 11 вольт, записывать нужные данные в EEPROM.
на + аккумулятора повешу транзистор он будет все время пока есть аккумулятор соединять ножку мк с корпусом машины но как только пропадет это соединение то писать в еепром.
Подтяжка из резистора ком в 10 пойдет?
люди че за фигня в проутосе аа? Вот так запитываю индикатор то горят нули и моргают Схема в разрезе VT3 и инвентора вставил сопротивление 1ком, но если убрать всю конструкцию и соединить напрямую аноды индикатора к мк а катод через инвентор на мс то все нормально работает? кто может объяснить????
выдает во время исполнения вот эту ошибку
Нельзя всё знать, достаточно понимать.
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
люди помогите разобраться с проутеской фигней и все вроде проект готов 
блин походу это не проутес а прошивка... катоды должны инверсированными уже управляться сигналами
да дело было за прошивкой, щас написал для общего анода все норм работает осталось для общего катода и все
дааа все таки проутес эт не показатель убил 4 часа на поиск ошибки в прошивке, а оказался во всем вина проутес...
блин походу это не проутес а прошивка... катоды должны инверсированными уже управляться сигналами
да дело было за прошивкой, щас написал для общего анода все норм работает осталось для общего катода и все
дааа все таки проутес эт не показатель убил 4 часа на поиск ошибки в прошивке, а оказался во всем вина проутес...
Нельзя всё знать, достаточно понимать.
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
Хочу узнать а если вот так включить транзистор то мк ничего не будет?

просто когда так цепляю то проутосе загрузка проца сразу под 100% подпрыгивает а если напрямую все подключаю выше 50% не бывает
просто когда так цепляю то проутосе загрузка проца сразу под 100% подпрыгивает а если напрямую все подключаю выше 50% не бывает
- Вложения
-
- Безымянный.JPG
- (4.61 КБ) 1245 скачиваний
Нельзя всё знать, достаточно понимать.
Re: Цифровой одометр на Atmega8
поставь IRLML6402 и убери резистор. Так как ты нарисовал делать нельзя, нужен p-n-p транзистор, эмиттером на плюс, но тогда на базе и соответственно на МК будет попадать 12 вольт.
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
ахахахха вернулась старая проблемаs64 писал(а):поставь IRLML6402 и убери резистор. Так как ты нарисовал делать нельзя, нужен p-n-p транзистор, эмиттером на плюс, но тогда на базе и соответственно на МК будет попадать 12 вольт.
щас просто взял и поставил pnp и соеденил коллектор на корпус а эмитер на вывод анода все работает
Нельзя всё знать, достаточно понимать.
- yur4ik
- Вымогатель припоя
- Сообщения: 613
- Зарегистрирован: Сб окт 17, 2009 18:56:05
- Откуда: РФ, Башкортостан г.Сибай
- Контактная информация:
Re: Цифровой одометр на Atmega8
вот листинг где че я не правильно сделал?
Код: Выделить всё
#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
вот схема
Модель в проутосе
Вот теперь прошу вашей помощи форумчане! помогите пожалуйста избавиться от самовключения сегментов при установке транзисторов. 
Нельзя всё знать, достаточно понимать.


