Jump to content

    

Andrew82

Участник
  • Content Count

    12
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Обучение программированию микроконтроллеров удаленно, интересуют пик и атмел. Некоторые знания в программировании есть. Процесс обучения вижу как выдача неких заданий с сылкой на мат часть(книги), немного обучения теории. Оплата веб мани юсд по договоренности. Хотелось бы начать обучение с 1.06.2012. Кто что может предложить?! pet_andrey@list.ru
  2. не могли бы выслать проект на протеусе может я что не так делаю? протеус сейчас закачаю у меня показывает на индикаторе все девятки
  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. ух е маё внимательность прежде всего, да бум учитбься благодарю пошел штудировать дальше.Я думаю с точки зрения языка написал то я правильно вот компил и не ругался. все получилось гуд с вашей помошью, пошел разбираться с дс18б20 подскажите его обработку тоже лучше сделать в прерываниии или в теле майин, и след вопрос обработку кнопок как сделать в теле майн или в прерывании? полный ответ с примером не давайте хочется самому попариться, если не получиться тогда буду спрашивать(хочется изучить а не как мартышка по примерам шпарить?!) Заранее благодарю.у мя нет транзисторов на прямую к выходам (пока не сгорели) но как доберусь то обязаловка куплю транзисторы (суть такова что если на общий индикатора подаю - то цифры видны) извините не та спецуха по образованию инж. зоотехник к сожалению, а не электронщик или что еще, все это получено путем чтения книг и тока не давно буквально месяца два как есть нет , знаю англ язык сносно(могу общаться с иностранцами к нам приезжали и я с ними вел беседу) так что строго в знании программирования строго не судите.
  5. да проблема следующая теперь на индикаторе все вроде как показывает только вот загвоздка там где единицы секунд там пусто, там где десятки должны отображаться там отображаются единицы, что с этим делать? общие аноды подключены на 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;} сенкс пойду проверять. хм что-то не пляшет в общем знакогенератор нужен как я и написал тоесть прямой, когда ввел ваш текст и просимулировал в протеусе то вижу только три первых разряда(ну это может быть глюк симуляции) в живую еще не прошивал, обьясните мне что делает вот эта строка из вашего листинга SegmentNum = (SegmentNum + 1) & 0x03; что дает &0x03? обьясните новичку плз. и в дальнейшем я хочу из этого сделать блок управления аквариумом могу ли я у вас дальше это все спрашивать?!
  7. да блин я сам типо понимаю тока вот занимаюсь авр наверное неделю вторуюю и вот ваши замечания не смогли мне помочь в индикации, а на индикаторе херня типо могет быть и 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. Все всем спасибо все во внеминательности я то хотел по сравнению, а не по переполнению, спасибо всем откликнувшимся, пойду дальше изучать.
  10. [---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
  11. void main() { io_init(); timer0_init(); Dig_init(); PORTD = Dig[0]; #asm("sei"); // тут глобально разрешил прерывания while(1) {} } но в протеусе все равно не вижу то что хочется подскажите чуть развернутее
  12. Начал изучать авр и не могу разобраться с таймерами к авр на порт д подключен семисегментный индикатор раз в сек он должен увеличивать цифру т.е. от 0 до девяти и так далее в чем ошибка подскажите? Симулирую на протеусе все файлы в архиве. Помогите и подскажите. seg.zip