Jump to content

    

Andrew82

Участник
  • Content Count

    12
  • Joined

  • Last visited

Posts posted by Andrew82


  1. Обучение программированию микроконтроллеров удаленно, интересуют пик и атмел. Некоторые знания в программировании есть. Процесс обучения вижу как выдача неких заданий с сылкой на мат часть(книги), немного обучения теории. Оплата веб мани юсд по договоренности. Хотелось бы начать обучение с 1.06.2012. Кто что может предложить?! pet_andrey@list.ru

  2. В протеусе 7.6 sp4 такая связка работает. Ищите в себе.

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

  3. atmega8+ds18b20 проблема в протеусе не работает, есть вопрос, а в живую будет работать кто-нить подскажите?! Написано в кодевижион сильно ногами не пинать только начинаю разбираться подскажите в живую будет работать или нет и какие фьюзы ставить при прошивке от встроенного генератора?!

    #define xtal 1000000L
    #include <mega8.h>
    #asm
       .equ __w1_port=0x12 ; //PORTD     
       .equ __w1_bit=0
    #endasm
    #include <ds18b20.h>
    #include <delay.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define MAX_DEVICES 8
    unsigned char pos=0;
    unsigned char str[4];
    unsigned char st;
    unsigned char mesto[4]={
    0b11110111,
    0b11111011,
    0b11111101,
    0b11111110
    };
    unsigned char rom_codes[MAX_DEVICES][9];
    unsigned char i,devices; 
    int z; 
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    TCNT2=0x00;
    }
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
     TCNT0=0x00;
    switch (str[pos]) 
       {
       case '0':
       i=0b00111111;
       break;
       case '1':
       i=0b00000110;
       break;
       case '2':
       i=0b01011011;
       break;
       case '3':
       i=0b01001111;
       break;
       case '4':
       i=0b01100110;
       break;
       case '5':
       i=0b01101101;
       break;
       case '6':
       i=0b01111101;
       break;
       case '7':
       i=0b00000111;
       break;
       case '8':
       i=0b01111111;
       break;
       case '9':
       i=0b01101111;
       break; 
       case '-':
       i=0b01000000;    // Минус
       break;
       case 'B':
       i=0b01100011;    // Градус
       break;
       case 'C':
       i=0b00000000;   //  пусто
       break;         
       };
    PORTC=mesto[pos];
    PORTB=i; 
    pos++;
    if (pos==4) pos=0;  
    }
    void main(void)
    {
    #asm("cli");
    TIMSK=0b01000001;
    TCCR0=0b00000001;
    TCCR2=0b00000010;
    DDRB=0xFF;
    DDRC=0b00001111;
    DDRD=0x01;
    PORTB=0b01000000;
    PORTC=0b00001111;
    devices=w1_search(0xf0,rom_codes);
    z=ds18b20_temperature(&rom_codes[0][0]);   
    //z=100;
    itoa(z, str);
    
    if (z>=100) str[3]='B';     
    
    if (z==0) {str[0]='C';str[1]='C';str[2]='0';str[3]='B';goto ggg;};      
    if ((z>=10) && (z<100)) 
    {
      str[3]='B';
      str[2]=str[1];
      str[1]=str[0];
      str[0]='C'; 
      goto ggg;
    };  
    if ((z>0) && (z<10)) 
    {
      st=str[0];
    
      str[0]='C';
      str[1]='C';
      str[2]=st;
      str[3]='B';
      goto ggg;
    };     
    if (abs(z)<10)
     {
      str[3]='B';
      str[2]=str[1];
      str[1]=str[0];
      str[0]='C';
      goto ggg;
     };        
    
    if (abs(z)>=10)
     {
      str[3]='B';
    
     }; 
    
    
     ggg: 
    #asm("sei");
    }

  4. Вы были бы хорошим партизаном :wacko:

    Информацию из вас не вытянешь в нужном объеме: вы можете, наконец, ответить подробно, как у вас подключены индикаторы? Ваши данные противоречивы. У вас есть транзисторы на каждую цифру? Еще, если дисплеи с общим анодом, то таблица знакогенератора не может быть такой как у вас.

     

    Измените набивку буфера, там ошибка. Разве компилятор на это не ругался?

    Bufer[0]=Dig[sec%10];
    Bufer[1]=Dig[sec/10];
    Bufer[2]=Dig[hour%10];
    Bufer[3]=Dig[hour/10];

     

    Прерывание вы зря поменяли, так будет меньше время свечения и соотв.яркость. Лучше даже так:

    interrupt [TIM0_COMP] void inc_delay_counter()
    {
    tick++;
    if (++MilliSecCnt >= 5)   // 5 ms past
        {
        unsigned char dignum = SegmentNum;
    
        MilliSecCnt = 0;
        PORTC = 0xF0;               // All segments off
        PORTD = Bufer[dignum];      // Write next digit
        PORTC = AnodeCod[dignum];   // Next segment on
        SegmentNum = (dignum + 1)&0x03;
        }
    }

    ух е маё внимательность прежде всего, да бум учитбься благодарю пошел штудировать дальше.Я думаю с точки зрения языка написал то я правильно вот компил и не ругался.

     

    все получилось гуд с вашей помошью, пошел разбираться с дс18б20 подскажите его обработку тоже лучше сделать в прерываниии или в теле майин, и след вопрос обработку кнопок как сделать в теле майн или в прерывании? полный ответ с примером не давайте хочется самому попариться, если не получиться тогда буду спрашивать(хочется изучить а не как мартышка по примерам шпарить?!) Заранее благодарю.у мя нет транзисторов на прямую к выходам (пока не сгорели) но как доберусь то обязаловка куплю транзисторы (суть такова что если на общий индикатора подаю - то цифры видны) извините не та спецуха по образованию инж. зоотехник к сожалению, а не электронщик или что еще, все это получено путем чтения книг и тока не давно буквально месяца два как есть нет , знаю англ язык сносно(могу общаться с иностранцами к нам приезжали и я с ними вел беседу) так что строго в знании программирования строго не судите.

  5. Ну, так вы так и не написали, как у вас подключены индикаторы и какого они типа :07:

    А мой пример программы базируется именно на моих предположениях, высказанных выше. Так что, или предоставьте нужные данные, или никто вам ничего сказать не сможет.

     

    Это просто счетчик от 0 до 3. Если вам такая запись непонятна, можно написать по-другому:

    SegmentNum++;
    if (SegmentNum >= 4) SegmentNum = 0;

     

    Спрашивайте, конечно, кто-нибудь да ответит. Только не утаивайте технические подробности, необходимые для ответа.

    да проблема следующая теперь на индикаторе все вроде как показывает только вот загвоздка там где единицы секунд там пусто, там где десятки должны отображаться там отображаются единицы, что с этим делать?

    общие аноды подключены на pin7-4анод pin6-3анод,pin5-2анод,pin4-1анод.(4анод отвеч за единицы секунд, 3 анод за десятки сек) в чем гемор?

    interrupt [TIM0_COMP] void inc_delay_counter()

    {

    tick++;

    if (++MilliSecCnt >= 5) // 5 ms past

    {

    MilliSecCnt = 0;

    PORTC = 0xF0; // All segments off

    SegmentNum = (SegmentNum + 1)&0x03;

    PORTD = Bufer[segmentNum]; // Write next digit

    PORTC = AnodeCod[segmentNum]; // Next segment on

     

    }

    }

  6. Еще уточнения. О чем вы умолчали, но мне так кажется. У вас индикаторы с общим анодом, подключенные через PNP ключи, т.е. всё включается нулем. Знакогенератор при этом нужен инверсный вашему:

    const unsigned char Dig[10] = {~0x3F;~0x06;~0x5B;~0x4F;~0x66;~0x6D;~0x7D;~0x07;~0x7F;~0x6F;}

    сенкс пойду проверять.

     

    Еще уточнения. О чем вы умолчали, но мне так кажется. У вас индикаторы с общим анодом, подключенные через PNP ключи, т.е. всё включается нулем. Знакогенератор при этом нужен инверсный вашему:

    const unsigned char Dig[10] = {~0x3F;~0x06;~0x5B;~0x4F;~0x66;~0x6D;~0x7D;~0x07;~0x7F;~0x6F;}

     

    сенкс пойду проверять.

    хм что-то не пляшет в общем знакогенератор нужен как я и написал тоесть прямой, когда ввел ваш текст и просимулировал в протеусе то вижу только три первых разряда(ну это может быть глюк симуляции) в живую еще не прошивал, обьясните мне что делает вот эта строка из вашего листинга SegmentNum = (SegmentNum + 1) & 0x03; что дает &0x03? обьясните новичку плз. и в дальнейшем я хочу из этого сделать блок управления аквариумом могу ли я у вас дальше это все спрашивать?!

  7. Вы бы для начала в паре слов описали, что у вас получилось на дисплее с этой программой.

    После беглого просмотра программы:

    void display() написана не правильно.

    Для динамической индикации нужно выводить на дисплей в одно время одну цифру и держать ее горящей некоторое время. У вас вышел непрерывный вывод с временем горения меньшим времени различных накладных расходов. Вообще, рефреш индикации лучше делать в прерывании.

     

    з.ы. Таблицу констант можно хранить в памяти программ:

    const unsigned char Dig[10] = {0x3F;0x06;0x5B;0x4F;0x66;0x6D;0x7D;0x07;0x7F;0x6F;}

    да блин я сам типо понимаю тока вот занимаюсь авр наверное неделю вторуюю и вот ваши замечания не смогли мне помочь в индикации, а на индикаторе херня типо могет быть и 6 и 8 и от времени ни как не зависит, не могли бы помочь с примером более менее развернутым типо пояснения и б уже подогнал к себе

  8. индикация без всяких лишних микрух, ибо не смогу ни где купить микрухи вот тут написал прогу и не могу допеткрить как выводить все символы на семисегментный индикатор.подскажите кто

    Все писалось на кодевижионе.

     

    #include "Mega16.h"

    #define WGM01 3

    #define CS00 0

    #define CS01 1

    #define OCIE0 1

     

    short int i = 1;

    char sec,min,hour; //переменные для времени

    unsigned char j, k = 0;

    //long int counter = 0; //счетчик временных интервалов

    long int tick = 0; //счетчик часов

    unsigned char Dig[10],Bufer[4]; // Массив, в котором хранятся числа, которые нужно

    // вывести через порт на индикатор, чтобы он показал цифру, равную номеру

    // элемента массива. Числа зависят только от макросов.

    void io_init()

    {

    DDRD = 0xFF; // К порту D подключен индикатор

    PORTD = 0xFF;

    DDRC |= (1 << 4) | (1 << 5) | (1 << 6) |(1 << 7);//к порту С подключены аноды индикаторов

    PORTC = 0xF0;

    Bufer[1]=Bufer[2]=Bufer[3]=Bufer[4]=0;

    }

    void timer0_init()

    {

    #asm("sei");

    OCR0 = 124; // Таймер срабатывает каждые 64 такта. Прерывание каждые 125*16 тактов.

    TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS01); //

    TIMSK |= (1 << OCIE0);

    }

    void clock()

    {

    if (tick>999)

    {

    tick=0;

    sec++;

    }

    if (sec>59)

    {

    sec=0;

    min++;

    }

    if (min>59)

    {

    min=0;

    hour++;

    }

    if (hour>23)

    {

    hour=0;

    }

    }

    void Dig_init()

    {

    Dig[0] = 0x3F;

    Dig[1] = 0x06;

    Dig[2] = 0x5B;

    Dig[3] = 0x4F;

    Dig[4] = 0x66;

    Dig[5] = 0x6D;

    Dig[6] = 0x7D;

    Dig[7] = 0x07;

    Dig[8] = 0x7F;

    Dig[9] = 0x6F;

    }

    void convert()

    {

    Bufer[1]=Dig[sec%10];

    Bufer[2]=Dig[sec/10];

    Bufer[3]=Dig[hour%10];

    Bufer[4]=Dig[hour/10];

    }

    void display()

    {

    for (k=0; k<=20;k++)

    {

    PORTC=0;

    PORTC=(0<<7);

    PORTD=Bufer[1];

    }

    for (k=0; k<=20;k++)

    {

    PORTC=0;

    PORTC=(0<<6);

    PORTD=Bufer[2];

    }

     

     

    }

     

    void main()

    {

    io_init();

    timer0_init();

    Dig_init();

    while(1)

    {clock();

    convert();

    display();

    }

    }

    interrupt [TIM0_COMP] void inc_delay_counter()

    {

    tick++;

    }

  9. [---skipped---]

     

     

    void timer0_init()

    {

    #asm("sei");

    OCR0 = 16; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов.

    TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02); //

    TIMSK |= (1 << TOIE0);

    } так я понимаю будет правильно да? указываю что прерываение по переполнению TOIE0 это 0 бит

    переделанный исходник в архиве, кодевижион компилятор и чип мега 16

     

     

    Moderator to

    Andrew82: избегайте бездумного цитирования постов.

    seg.zip

  10. Начал изучать авр и не могу разобраться с таймерами к авр на порт д подключен семисегментный индикатор раз в сек он должен увеличивать цифру т.е. от 0 до девяти и так далее в чем ошибка подскажите? Симулирую на протеусе все файлы в архиве. Помогите и подскажите.

    seg.zip