Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
1

Atmega 8A

19.11.2018, 17:59. Просмотров 403. Ответов 21
Метки нет (Все метки)

Собственно есть микроконтроллер Atmega 8A. Нужно нажатием тактовой кнопочки включить устройство, подать лог. и еще раз нажав на кнопку выключить. И так много раз.

Мной написанный код только включает, но не выключает . То есть единичка на выходе появляется но при нажатии на кнопку еще раз 0 не появляется.

Проверял в протеусе.

Один раз код написал он работал, но к сожалению исходники потерял. Старый код на устройстве работает. Понадобилось доработать, изменить.

код

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <mega8.h>
#include <delay.h>
#define XTAL 8000000 
unsigned char i=0; // вводим переменную для счета
 
void main(void)
{
 
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
 
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
 
// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=1 Bit6=1 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
 
while (1)
      {
      delay_ms(30); // пауза для проверки дребезга
      if (PIND.3 == 0 && i == 0) 
      {
       i=i+1;
       PORTB |= (1<<0); //Выставляем 1 в 0 порте.
       delay_ms(1000);
       PORTB |= (1<<1); //Выставляем 1 в 1 порте
               
       while(PIND.3 == 1) { delay_ms(10);}//ждем отпускания кнопки 
      } else
      
       
       
           PORTB |= (0<<0);
           PORTB |= (0<<1);  
           while(PIND.3 == 0){ delay_ms(10);}//ждем отпускания кнопки 
                 
}
}
PD3 - порт сконф. на вход. резистор внеший подтягивающий в реальной схеме есть.
PB0 и PB1 - Два порта - которые через схему управления, в данном случае полевой транзистор включат одно реле, потом втрое
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2018, 17:59
Ответы с готовыми решениями:

Макетная плата для Atmega 32?atmega 8
Здравствуйте !Уважаемые мастера нужна помощь (а именно нужна схема макетной платы для меги 32 и...

atmega
Здравствуйте. Использую USORT для общения 2 мег. Нужно объеденить RX и TX в одну линию....

Atmega 16
Ребят, только начинаю работать в ассемблере, очень тяжело дается(( время поджимает, поэтому...

Atmega 16 и C
Вопрос: есть ли транслятор с Си на асемблер для этого контроллера? Это может ускорить процесс...

Прошивка ATMEGA 88
здравствуйте уважаемые форумчане. столкнулся со следующей проблемой. не могу прошить МК ATMEGA 88....

21
i8085
1994 / 1384 / 267
Регистрация: 11.09.2009
Сообщений: 4,903
19.11.2018, 18:00 2
Цитата Сообщение от DmKorneev Посмотреть сообщение
Мной написанный код только включает, но не выключает
Потому что для установки выхода надо использовать значение переменной "i". Эта переменная содержит состояние, в которое надо установить.
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
19.11.2018, 18:08  [ТС] 3
Не правильно перенес код

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <mega8.h>
#include <delay.h>
#define XTAL 8000000 
unsigned char i=0; // вводим переменную для счета
 
void main(void)
{
 
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
 
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
 
// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=1 Bit6=1 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
 
while (1)
      {
      delay_ms(30); // пауза для проверки дребезга
      if (PIND.3 == 0 && i == 0) 
      {
       i=i+1;
       PORTB |= (1<<0); //Выставляем 1 в 0 порте.
       delay_ms(1000);
       PORTB |= (1<<1); //Выставляем 1 в 1 порте
               
       while(PIND.3 == 1) { delay_ms(10);}//ждем отпускания кнопки 
      } else
      {
      if (PIND.3 == 1 &&  i == 1) 
          { 
           PORTB |= (0<<0);
           PORTB |= (0<<1);  
           while(PIND.3 == 0){ delay_ms(10);}//ждем отпускания кнопки 
          }
            
}
}
}
В чем ошибка?
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
20.11.2018, 06:29 4
C
1
2
PORTB |= (0<<0);
PORTB |= (0<<1);
Если там 1, то 0 не сможет записаться. Вы же, я надеюсь, понимаете, что 1 | 0 = 1.

Добавлено через 2 минуты
Тем не менее я не уверен, что заработает после доведения до ума этого куска, бо алгоритм ппц (не стал даже забивать себе голову).
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
20.11.2018, 09:15  [ТС] 5
Что не нравится в алгоритме?.
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
20.11.2018, 09:42 6
То, что сделано не так, как делаю я.
0
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
20.11.2018, 10:23 7
Цитата Сообщение от DmKorneev Посмотреть сообщение
#define XTAL 8000000
это нужно задавать в настройках проекта или makefile, на случай если будет много исходников. Чтобы частоты в разных не отличались.
Цитата Сообщение от DmKorneev Посмотреть сообщение
void main(void)
ошибка: main должен возвращать int.
Цитата Сообщение от DmKorneev Посмотреть сообщение
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
Это стоило бы подчистить прежде чем выкладывать на форум. Какая-то каша из бесполезных комментариев и не менее бесполезных настроек нулей.
C
1
DDRB = (1<<1 | 1<<0);
Так выглядит гораздо нагляднее
Цитата Сообщение от DmKorneev Посмотреть сообщение
PIND.3
В Си такого нет. Старайтесь не использовать нестандартные вещи без особой необходимости. Здесь такой необходимости, разумеется, нет.
Цитата Сообщение от DmKorneev Посмотреть сообщение
PORTB |= (0<<0);
Вы же понимаете, что эта строчка не делает ничего?
Цитата Сообщение от DmKorneev Посмотреть сообщение
подать лог.
логическое что? Или лог статуса? Но зачем тогда точка как у сокращения? И через что тогда передавать?
.
А еще отформатируйте и прокомментируйте код по-человечески.
0
ValeryS
Модератор
7407 / 5604 / 711
Регистрация: 14.02.2011
Сообщений: 19,069
Завершенные тесты: 1
20.11.2018, 13:35 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это стоило бы подчистить прежде чем выкладывать на форум. Какая-то каша из бесполезных комментариев и не менее бесполезных настроек нулей.
судя по стилю это CodeVision сгенерировал
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
20.11.2018, 14:10 9
C
1
delay_ms(1000);
А если во время ожидания приспичит отключить нагрузку?
0
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
20.11.2018, 14:44 10
Цитата Сообщение от ValeryS Посмотреть сообщение
судя по стилю это CodeVision сгенерировал
Да, похоже на то. Но все равно, подчистить за автоконфигуратором стоит. Даже если пишет для себя, не говоря уж о том, чтобы выкладывать на всеобщее обозрение.
Надо признать, cvavr немного эволюционировал. Раньше он вообще использовал магические числа вроде PORTB = 3; с километровыми комментариями какой режим используется. Форматирование он тоже, кстати, не использовал. Выглядело это даже хуже чем сейчас.
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
23.11.2018, 08:49  [ТС] 11
Переписал код. В симуляторе работает, можно ли его улучшить?. Пока без прерываний, учусь.
Не нужно выключать устройство по середине, то есть когда одно реле сработала. Мы либо включились полностью, или нет.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <mega8.h>    // частота CP 8мгц. 
#include <delay.h>
unsigned char n = 0;
 
void main(void) 
{               
DDRD = 0b11110111; // Настроили PD3 на вход
PORTD = 0x00; // Не подключаем подтягивающие резисторы
DDRB = 0b00000011; // Порт PB0 и PB1 на выход
PORTB = 0x00; // Лог. 0 на выходе
 
while(1) 
{  // главный цикл 
if (PIND.3==0 && n==0)
{  delay_ms(10);
  while(PIND.3==0) ;
  PORTB.0=1;
  delay_ms(1500);
  PORTB.1=1; 
  n++;
 }          
 
else 
if (PIND.3==0 && n==1)  
 { delay_ms(10);
  while(PIND.3==0)
  {PORTB.0=0;
  PORTB.1=0;
  n=0;}
  }
           
}
}
0
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
23.11.2018, 10:07 12
Форматирования как не было, так и нет. Весь main() чуть ли не одним столбцом. Хотя нет, в прошлой версии форматирование было чуть лучше.
Объявление main() как было неправильным, так и осталось. Хотя нет, в прошлой версии правильная запись встречалась, в этой - нет.
Ересь вроде PIND.3 как была, так и осталась
Настройки портов как были кривыми, так и остались. Точнее, они были кривыми в одну сторону, стали - в другую.
Осмысленных комментариев с прошлой версии убавилось.
Результат: стало еще хуже, чем было.
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
23.11.2018, 10:14  [ТС] 13
Можно подробнее?
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
23.11.2018, 12:29 14
Как вариант:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <mega8.h>
#include <delay.h> //  в свойствах мк указать тактовую частоту
 
bit oldButton, Button; // предыдущее и текущее состояния кнопок
 
 
void main(void)
{
DDRD.3= 0; // настраиваем PD3 на вход
PORTD.3= 1; // подтягиваем к питанию
DDRB|= 0x03; // настраиваем РВ0 и РВ1 на выход
PORTB&= 0xFC; // сбрасываем РВ0 и РВ1
 
Button= PIND.3; // первый опрос кнопки
 
while(1) // вечно тут крутимся
{
delay_ms(10); // задержка 10 мсек для подавления дребезга
 
oldButton= Button; // предыдущее состояние кнопки
Button= PIND.3; // текущее состояние кнопки
 
if(oldButton && !Button) // момент нажатия на кнопку
    {
    if(PORTB.0) // если порт взведен
        {
        PORTB.0= 0; // то сбрасываем
        PORTB.1= 0;
        }
    else
        {
        PORTB.0= 1; // иначе взводим
        delay_ms(1000);
        PORTB.1= 1;
        }
    }
}
}
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
23.11.2018, 12:34  [ТС] 15
Спасибо. Немного изменил код, так как кнопка срабатывала 1 раз и все. Работает
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
23.11.2018, 12:34 16
Покажите изменения.
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
23.11.2018, 12:35  [ТС] 17
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <mega8.h>
#include <delay.h> //  в свойствах мк указать тактовую частоту
int num=0;
 
bit oldButton, Button; // предыдущее и текущее состояния кнопок
 
 
void main(void)
{
DDRD.3= 0; // настраиваем PD3 на вход
PORTD.3= 1; // подтягиваем к питанию
DDRB|= 0x03; // настраиваем РВ0 и РВ1 на выход
PORTB&= 0xFC; // сбрасываем РВ0 и РВ1
 
Button= PIND.3; // первый опрос кнопки
 
while(1) // вечно тут крутимся
{
delay_ms(10); // задержка 10 мсек для подавления дребезга
 
oldButton= Button; // предыдущее состояние кнопки
Button= PIND.3; // текущее состояние кнопки
 
if(oldButton && !Button) // момент нажатия на кнопку
    {
    if(PORTD.3 && num==0) // если порт взведен
        {
        PORTB= 0b00000001; // то сбрасываем
        delay_ms(1000);
        PORTB= 0b00000011;
        num++;
        }
    else
        {
        PORTB= 0b00000000; // иначе взводим
        num=0;
        }
    }
}
}
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
23.11.2018, 12:42 18
C
1
PORTD.3 && num==0
Такое ощущение, что вы пишете наудачу. Ну ничего, опыт дело наживное.
0
DmKorneev
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 10
23.11.2018, 12:43  [ТС] 19
pyzhman, Почему так делать нельзя? Я конечно учусь.
0
pyzhman
786 / 481 / 65
Регистрация: 15.05.2012
Сообщений: 2,728
23.11.2018, 13:00 20
Посмотрите дизассемблер этой конструкции и проанализируйте.

Добавлено через 1 минуту
Меня больше интересует отчего у вас не работает
C
1
if(PORTB.0) // если порт взведен
0
23.11.2018, 13:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2018, 13:00

atmega на 3.3в и частота
смотрю документацию - везде указано что при низком напряжении рабочая частота падает и ничего не...

atmega spi
Итак, есть проект на Attiny2313 http://we.iosyitistromyss.ru/Lifelover/tcp-http-i-tinka.html. Я...

Осциллограф на Atmega 8
Все доброго дня. Решил я по этой статье собрать осциллограф. Мегу взял в дип корпусе. Вытравил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru