собираю мишень с авто подъемом для газобаллонной пневматики

Обсуждаем контроллеры компании Atmel.
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

собираю мишень с авто подъемом для газобаллонной пневматики

Сообщение 0259 »

нужна помощь с кодом на си в code vision AVR
Спойлер#include <mega8.h>
#include <alcd.h>
#include <delay.h>


volatile unsigned char x; /*переменная "результат +1"*/
volatile unsigned char a; /*переменная для вывода на "LCD"*/
void main(void)
{

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0xFF;


TCCR0=0x00;
TCNT0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;

TIMSK=0x00;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;


// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 5
// D5 - PORTB Bit 6
// D6 - PORTB Bit 7
// D7 - PORTB Bit 8
// Characters/line: 4
lcd_init(8);

while (1)
{
if (PINC.0 == 1) { /*нажата кномпа "подение мишени"*/
PORTD.0=1; /*включение матора на "поднятие мишени"*/
a=x++; /*"+ 1" к счету попаданий*/
};
if (PINC.1 == 1) { /*нажата кнопка "мишень установлена"*/
PORTD.0=0; /*реверс матора для убирания подемной дуги*/
PORTD.1=1; /*реверс матора для убирания подемной дуги*/
};
if (PINC.2 == 1) { /*нажата кнопка "подемная дуга на месте"*/
PORTD.1=0; /*остановка матора*/
PORTD.4=1; /*включение светового индикатора"стрелять разрешено"*/
}
else {
PORTD.4=0; /*выключение светового индикатора "стрелять разрешено"*/
};
lcd_init( 16 ); /* инициализация на 16 символов */
lcd_clear( ); /* очистка дисплея */
lcd_gotoxy( 3,0 ); /* верхняя строка, 4 позиция */
lcd_putsf( "POPAL-" ); /* выводим надпись в указанных координатах */
lcd_gotoxy( 9,0 ); /* нижняя строка, 0 позиция */
lcd_putsf( unsigned char a ); /* вывод значения на дисплей*/
lcd_gotoxy( 3,1 ); /* верхняя строка, 4 позиция */
lcd_putsf( "AVTO MICHEN'" ); /* выводим надпись в указанных координатах */






}
}

не могу организовать счетчик
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

ответ нашел сам
Спойлер#include <mega8.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>


volatile unsigned char x;
volatile unsigned char a;
unsigned char lcd_buffer[16];
void main(void)
{

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0xFF;


TCCR0=0x00;
TCNT0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;

TIMSK=0x00;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;


// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 5
// D5 - PORTB Bit 6
// D6 - PORTB Bit 7
// D7 - PORTB Bit 8
// Characters/line: 4
lcd_init(8);

while (1)
{
if (PINC.0 == 1) { /*нажата кномпа "подение мишени"*/
PORTD.0=1; /*включение матора на "поднятие мишени"*/
a=x++; /*"+ 1" к счету попаданий*/
};
if (PINC.1 == 1) { /*нажата кнопка "мишень установлена"*/
PORTD.0=0; /*реверс матора для убирания подемной дуги*/
PORTD.1=1; /*реверс матора для убирания подемной дуги*/
};
if (PINC.2 == 1) { /*нажата кнопка "подемная дуга на месте"*/
PORTD.1=0; /*остановка матора*/
PORTD.4=1; /*включение светового индикатора"стрелять разрешено"*/
}
else {
PORTD.4=0; /*выключение светового индикатора "стрелять разрешено"*/
};
lcd_init( 16 ); /* инициализация на 16 символов */
lcd_clear( ); /* очистка дисплея */
lcd_gotoxy( 3,0 ); /* верхняя строка, 4 позиция */
lcd_putsf( "POPAL-" ); /* выводим надпись в указанных координатах */
sprintf( lcd_buffer," %u",a );
lcd_gotoxy( 9,0 ); /* нижняя строка, 0 позиция */
lcd_puts( lcd_buffer ); /* вывод значения на дисплей*/
lcd_gotoxy( 3,1 ); /* верхняя строка, 4 позиция */
lcd_putsf( "AVTO MICHEN'" ); /* выводим надпись в указанных координатах */

проверьте пожалуйста я проверяю в протусе а в нем счетчик бежит без останеовки
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение vAv »

Там несколько косяков:
1. все порты настроены на ввод, а D у тебя вывод;
1.1 В связи с этим не понятно что у тебя в схеме: PORTC.1 подтянут к земле резистором? Если нет, то вот тебе и глюки - там Z состояние носится туда-сюда...
2. непонятно что за дисплей: проинициализирован как 8-и символьный и как 16-и...
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

vAv писал(а):Там несколько косяков:

2. непонятно что за дисплей: проинициализирован как 8-и символьный и как 16-и...

дисплей 16 символов протус принял и прописывает на нем всё норм а вот счет не правильный стоит только нажать кнопку pinc.0 и циферки бегут сами по себе
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение vAv »

Схему в студию. Хотя бы кусок где вход и кнопка.
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

vAv писал(а):Схему в студию. Хотя бы кусок где вход и кнопка.

конечно конечно где же мои манеры
Изображение
Изображение
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение vAv »

Ну как я и предполагал:
В связи с этим не понятно что у тебя в схеме: PORTC.1 подтянут к земле резистором? Если нет, то вот тебе и глюки - там Z состояние носится туда-сюда...

Входы притяни резисторами 4,7к на землю.
Soir
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение Soir »

0259 писал(а):конечно конечно где же мои манеры

Да, манеры еще те. Почему бы не дать весь проект? Создавать самому?

По делу.
У Вас проверка PINC.0 в бесконечном цикле, если 1, то счетчик увеличивается. Пока кнопка нажата счетчик работает нон-стоп. Скорость его работы ограничена только временем прохождения цикла. В котором, к слову, зачем-то инициализация дисплея, что собственно и сдерживает счетчик, да еще и приводит к миганию дисплея.
Во вложении вариант с запоминанием срабатывания. Еще не мешало бы туда защиту от дребезга.
Про подтягивающие резисторы уже писали, могу только добавить, что экономнее использовать внутренние МК, а кнопки замыкать на общий провод.
Вложения
Project.zip
(87.05 КБ) 175 скачиваний
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение vAv »

А еще можно сделать так:

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

        lcd_gotoxy( 3,0 ); /* верхняя строка, 4 позиция */
        sprintf( lcd_buffer,"POPAL- %u",a );
        lcd_puts( lcd_buffer ); /* вывод значения на дисплей*/
        lcd_gotoxy( 3,1 ); /* верхняя строка, 4 позиция */
        lcd_putsf( "AVTO MICHEN'" ); /* выводим надпись в указанных координатах */
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

Soir писал(а):
0259 писал(а):конечно конечно где же мои манеры

Да, манеры еще те. Почему бы не дать весь проект? Создавать самому?

По делу.
У Вас проверка PINC.0 в бесконечном цикле, если 1, то счетчик увеличивается. Пока кнопка нажата счетчик работает нон-стоп. Скорость его работы ограничена только временем прохождения цикла. В котором, к слову, зачем-то инициализация дисплея, что собственно и сдерживает счетчик, да еще и приводит к миганию дисплея.
Во вложении вариант с запоминанием срабатывания. Еще не мешало бы туда защиту от дребезга.
Про подтягивающие резисторы уже писали, могу только добавить, что экономнее использовать внутренние МК, а кнопки замыкать на общий провод.

:)) :) боже мой как красиво!!!! спасибо вам буду учиться!!! спасибо! спасибо! искренне!
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

подскажите пожалуйста еще одну штуку как переключить atmegy на внутренний генератор
Soir
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение Soir »

0259 писал(а):подскажите пожалуйста еще одну штуку как переключить atmegy на внутренний генератор

Установить соответствующим образом FUSE. Воспользуйтесь on-line калькулятором.
Есть аналогичные русскоязычные, задайте поиск.
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

Soir писал(а):По делу.
У Вас проверка PINC.0 в бесконечном цикле, если 1, то счетчик увеличивается. Пока кнопка нажата счетчик работает нон-стоп. Скорость его работы ограничена только временем прохождения цикла. В котором, к слову, зачем-то инициализация дисплея, что собственно и сдерживает счетчик, да еще и приводит к миганию дисплея.
Во вложении вариант с запоминанием срабатывания. Еще не мешало бы туда защиту от дребезга.
Про подтягивающие резисторы уже писали, могу только добавить, что экономнее использовать внутренние МК, а кнопки замыкать на общий провод.

насчет дисплей учту больше когда его не буду инсталлировать его в бесконечный цикл а насчет дребезга контактов извините не знаю как это делать программно
могу только схематично решить

----------
и за калькулятор вам огромное спасибо
Soir
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение Soir »

0259 писал(а):насчет дребезга контактов извините не знаю как это делать программно

Смысл в том, чтобы не спешить обрабатывать срабатывание кнопки с первого определения, а через некоторую паузу перепроверить ее состояние, можно для надежности несколько раз, если время позволяет. Если все проверки подтвердили, что контакты кнопки замкнуты, тогда уже обработчик...
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение vAv »

0259 писал(а):насчет дисплей учту больше когда его не буду инсталлировать его в бесконечный цикл а насчет дребезга контактов извините не знаю как это делать программно
могу только схематично решить

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

Мне больше нравится такой вариант с антидребезгом:

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

    key_tmp = key_tmp << 1;
    key_tmp |= key;
    if (key_tmp == 0xFFFF) key_press = 1;
    if (key_tmp == 0) key_press = 0;

где

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

#define key PORTC.0 //например
unsigned int key_tmp;
unsigned char key_press;


И опрашивать лучше в каком-нибудь прерывании таймера и тогда можно и урезать key_tmp до unsigned char.
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

vAv писал(а):
0259 писал(а):насчет дисплей учту больше когда его не буду инсталлировать его в бесконечный цикл а насчет дребезга контактов извините не знаю как это делать программно
могу только схематично решить

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

Мне больше нравится такой вариант с антидребезгом:

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

    key_tmp = key_tmp << 1;
    key_tmp |= key;
    if (key_tmp == 0xFFFF) key_press = 1;
    if (key_tmp == 0) key_press = 0;

где

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

#define key PORTC.0 //например
unsigned int key_tmp;
unsigned char key_press;


И опрашивать лучше в каком-нибудь прерывании таймера и тогда можно и урезать key_tmp до unsigned char.

:cry: не понимаю совсем не чего
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

Soir писал(а):Смысл в том, чтобы не спешить обрабатывать срабатывание кнопки с первого определения, а через некоторую паузу перепроверить ее состояние, можно для надежности несколько раз, если время позволяет. Если все проверки подтвердили, что контакты кнопки замкнуты, тогда уже обработчик...

:idea: через делау мс или
пример

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

if (PINC.0 == 1) {
         if (PINC.0 == 1{)};
         if (!mem_key) {
          mem_key = 1;
           PORTD.0=1; /*включение матора на "поднятие мишени"*/
            a=x++; /*"+ 1" к счету попаданий*/
          };}
         else {
         mem_key = 0;
         }

и я не понимаю что делает вот if (!mem_key) эта строчка?? зачем (!) и как он вообще работает?
Soir
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение Soir »

0259 писал(а):...через делау мс...

Это грубо... но можно и через delay. Пока МК выполняет delay, остальная часть программы без присмотра (кроме прерываний, если они разрешены). В Вашем случае можно установить счетчик вначале цикла, если кнопка нажата он увеличивается, если нет - сбрасывается. По достижении счетчиком некоторой величины программа посчитает, что кнопка нажата. При таком подходе программа "не зависает" в delay, а все время следит за кнопками и т.д. Поскольку цикл в Вашей программе очень короткий, то счетчик должен быть большой. Цикл может иметь разное время прохождения, в зависимости от выполняемых условий, поэтому время достижения счетчиком заданной величины может быть разное. В некоторых случаях это может быть критично. Я обычно делаю опрос кнопок через заданные промежутки времени, которые определяются прерыванием по таймеру. Можно (иногда нужно) делать опрос прямо при обработке прерывания. Если требуется мгновенная реакция на кнопку, то настраиваются прерывания по изменению порта и т.д. Все зависит от конкретно решаемой задачи.
0259 писал(а):не понимаю что делает вот if (!mem_key) эта строчка?? зачем (!) и как он вообще работает?

Проверка бита mem_key на 0. Тоже что и if (mem_key == 0). Этот бит запоминает факт, что кнопка нажата и по этому событию счет уже произвели, не дает счетчику бесконечно (точнее циклично до переполнения, так как у Вас нет ограничений на счет попаданий) увеличиваться при удержании кнопки. Если кнопку отпустить бит сбрасывается в 0 и программа ждет следующее нажатие на кнопку.
0259
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение 0259 »

и еще посоветуйте я разница в частоте мне кажется что мне 4 mhz за глаза и за уши а как думаете вы???
Soir
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Re: собираю мишень с авто подъемом для газобаллонной пневмат

Сообщение Soir »

0259 писал(а):и еще посоветуйте я разница в частоте мне кажется что мне 4 mhz за глаза и за уши а как думаете вы???

Думаю, и 1 МГц за глаза и за уши...
Ответить

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