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

Temig88

Members
  • Постов

    9
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Temig88

  1. Нашел решение

    //AtMega8A
    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    void presets()
    {
    DDRC=0x00; //порт настроен на вход
    PORTC=0xFF;// подтягивающие сопротивленеи включено
    DDRB=0xFF; //порт настроен на выход
    PORTB=0x00; //низкий уровень порта
    }
    int main(void)
    {
    presets();
    int stat_button=0; // переменная состояния кнопки
    while(1)
    {
     if (!(PINC&(1<<0))&(stat_button==0))
     {
      PORTB=0xFF;
      stat_button=1;
      _delay_ms(20);
     }
     else if (!(PINC&(1<<0))&(stat_button==1))
     {
      PORTB=0x00;
      stat_button=0;
      _delay_ms(20);
     }
    }
    }
    

    Если поставить в условии знак логического отрицания if (!(PINC&(1<<0)), то работает как положено. Объясните пожалуйста почему так?

  2. где защитный резистор на светодиоде?

    Попробуйте так

    #include <avr/io.h>
    int main(){
    DDRC=0x00;
    PORTC=0xFF;
    DDRB=0xFF;
    while(1){
    PORTB=PINC;
    }
    }
    

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

    Ну и на счет платы. Нельзя ли снять беспаечную часть и перевернуть ее на 180 градусов вокруг вертикальной оси, а источник питания оставить как есть? На первый взгляд это несложно.

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

    Этот код тоже не работает. Может я не правильно поставил вопрос? Тут дело не в коде, Дело в том что порт не ставится на вход регистром DDRC=0x00; , а ставиться на вход регистром DDRC=0xFF;. Как это исправить? Месяц назад на таком же кристалле, с кодом:

    [/color]
    [color=#000000]//AtMega8A
    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    void presets()
    {[/color]
    [color=#000000]DDRC=0x00;
    PORTC=0xFF;
    DDRB=0xFF;
    PORTB=0x00;
    }[/color]
    [color=#000000]int main(void)
    {
    presets();[/color]
    [color=#000000]while(1)
    {
    if (PINC&(1<<PC0))
    {
    PORTB=0xFF;[/color]
    
    [color=#000000]}
    else {
    PORTB=0x00;
    }
    }
    }[/color]
    [color=#000000]

    Все работало как положено!

  3. Это уже на сегодня второй вопрос с аналогичной проблемой.

    http://forum.cxem.ne...opic=150904&hl=

    А как у вас с питанием? По наружной стороне макетки конечно понять сложно, но на фото получается, что вывод VCC (7 нога) идет на общую шину (-). Туда же подключен второй вывод кнопки. А с плюсовой шины черный провод идет на GND (8 нога)

    С виду выглядит действительно так))), но на самом деле китайцы криво спаяли плату питания, поэтому полярность на макетке наоборот, т.е. плюс это минус и соответственно минус это плюс. Так что с питанием точно все нормально.

  4. Что-то я не вижу подтягивающего резистора для кнопки на вашей макетке, возможно вход кнопки ловит помехи от соседской микроволновки

    Пробовал и с подтягивающим резистором, толку 0. Эффект есть только когда меняешь направление порта кнопки на выход.

  5. Я собрал все на макетной плате, рисунок снизу. Написал банальный код как в уроках.

    //AtMega8A
    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    void presets()
    {
    
    DDRC=0x00;
    PORTC=0xFF;
    DDRB=0xFF;
    PORTB=0x00;
    }
    
    int main(void)
    {
    presets();
    
    while(1)
    {
    if (PINC&(1<<PC0))
    {
    PORTB=0xFF;
    
    }
    else {
    PORTB=0x00;
    }
    }
    }
    

    При настройках порта DDRC=0x00; PORTC=0xFF: светодиод вообще горит постоянно, если изменить настройки данного порта на противоположные, то все работает как надо, нажимаешь кнопку светодиод загорается. Пробовал на двух контроллерах. Эффект один и тот же. В протеосе все нормально. Что я не так делаю?

    post-189746-0-36528300-1431782566_thumb.jpg

  6. Помогите пожалуйста начинающему! Имеется следующий код:

    //AtMega8A
    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    void presets()
    {
    
    DDRC=0xFF; //касяк ???????
    PORTC=0x00;
    DDRB=0xFF; //порт настроен на выход
    PORTB=0x00; //низкий уровень порта
    }
    
    int main(void)
    {
    presets();
    int stat_button=0; // переменная состояния кнопки
    while(1)
    {
    if (PINC&(1<<PC0)&(stat_button==0))
    {
    PORTB=0xFF;
    stat_button=1;
    _delay_ms(20);
    }
    else if (PINC&(1<<PC0)&(stat_button==1))
    {
    PORTB=0x00;
    stat_button=0;
    _delay_ms(20);
    }
    }
    }
    

    Суть данного кода, чтобы при нажатии на кнопку загорались светодиоды, при повторном нажатии на кнопку потухали. Пользуюсь Atmel Studio 6.2. При вышеупомянутом коде все работает как надо на живом кристалле. Если же заменить DDRC=0xFF; PORTC=0x00; на DDRC=0x00; и PORTC=0xFF; соответственно, то светодиоды начинают просто мигать. Ведь судя по урокам регистр DDR отвечает за направление порта, если 0, то на вход, единица на выход. В Протеусе работает и так и сяк. Подскажите, что происходит и в чем мой косяк?

    post-189746-0-75422600-1431730277_thumb.png

×
×
  • Создать...