Andrew82
Участник-
Постов
12 -
Зарегистрирован
-
Посещение
Весь контент Andrew82
-
Обучение программированию микроконтроллеров
Andrew82 опубликовал тема в Образование в области электроники
Обучение программированию микроконтроллеров удаленно, интересуют пик и атмел. Некоторые знания в программировании есть. Процесс обучения вижу как выдача неких заданий с сылкой на мат часть(книги), немного обучения теории. Оплата веб мани юсд по договоренности. Хотелось бы начать обучение с 1.06.2012. Кто что может предложить?! [email protected] -
atmega8+ds18b20
Andrew82 ответил Andrew82 тема в MCS51, AVR, PIC, STM8, 8bit
не могли бы выслать проект на протеусе может я что не так делаю? протеус сейчас закачаю у меня показывает на индикаторе все девятки -
atmega8+ds18b20
Andrew82 опубликовал тема в MCS51, AVR, PIC, STM8, 8bit
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"); } -
индикация
Andrew82 ответил Andrew82 тема в В помощь начинающему
ух е маё внимательность прежде всего, да бум учитбься благодарю пошел штудировать дальше.Я думаю с точки зрения языка написал то я правильно вот компил и не ругался. все получилось гуд с вашей помошью, пошел разбираться с дс18б20 подскажите его обработку тоже лучше сделать в прерываниии или в теле майин, и след вопрос обработку кнопок как сделать в теле майн или в прерывании? полный ответ с примером не давайте хочется самому попариться, если не получиться тогда буду спрашивать(хочется изучить а не как мартышка по примерам шпарить?!) Заранее благодарю.у мя нет транзисторов на прямую к выходам (пока не сгорели) но как доберусь то обязаловка куплю транзисторы (суть такова что если на общий индикатора подаю - то цифры видны) извините не та спецуха по образованию инж. зоотехник к сожалению, а не электронщик или что еще, все это получено путем чтения книг и тока не давно буквально месяца два как есть нет , знаю англ язык сносно(могу общаться с иностранцами к нам приезжали и я с ними вел беседу) так что строго в знании программирования строго не судите. -
индикация
Andrew82 ответил Andrew82 тема в В помощь начинающему
да проблема следующая теперь на индикаторе все вроде как показывает только вот загвоздка там где единицы секунд там пусто, там где десятки должны отображаться там отображаются единицы, что с этим делать? общие аноды подключены на 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 } } -
индикация
Andrew82 ответил Andrew82 тема в В помощь начинающему
Еще уточнения. О чем вы умолчали, но мне так кажется. У вас индикаторы с общим анодом, подключенные через PNP ключи, т.е. всё включается нулем. Знакогенератор при этом нужен инверсный вашему: const unsigned char Dig[10] = {~0x3F;~0x06;~0x5B;~0x4F;~0x66;~0x6D;~0x7D;~0x07;~0x7F;~0x6F;} сенкс пойду проверять. хм что-то не пляшет в общем знакогенератор нужен как я и написал тоесть прямой, когда ввел ваш текст и просимулировал в протеусе то вижу только три первых разряда(ну это может быть глюк симуляции) в живую еще не прошивал, обьясните мне что делает вот эта строка из вашего листинга SegmentNum = (SegmentNum + 1) & 0x03; что дает &0x03? обьясните новичку плз. и в дальнейшем я хочу из этого сделать блок управления аквариумом могу ли я у вас дальше это все спрашивать?! -
индикация
Andrew82 ответил Andrew82 тема в В помощь начинающему
да блин я сам типо понимаю тока вот занимаюсь авр наверное неделю вторуюю и вот ваши замечания не смогли мне помочь в индикации, а на индикаторе херня типо могет быть и 6 и 8 и от времени ни как не зависит, не могли бы помочь с примером более менее развернутым типо пояснения и б уже подогнал к себе -
индикация
Andrew82 опубликовал тема в В помощь начинающему
индикация без всяких лишних микрух, ибо не смогу ни где купить микрухи вот тут написал прогу и не могу допеткрить как выводить все символы на семисегментный индикатор.подскажите кто Все писалось на кодевижионе. #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++; } -
Проблема с авр
Andrew82 ответил Andrew82 тема в В помощь начинающему
Все всем спасибо все во внеминательности я то хотел по сравнению, а не по переполнению, спасибо всем откликнувшимся, пойду дальше изучать. -
Проблема с авр
Andrew82 ответил Andrew82 тема в В помощь начинающему
[---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 -
Проблема с авр
Andrew82 ответил Andrew82 тема в В помощь начинающему
void main() { io_init(); timer0_init(); Dig_init(); PORTD = Dig[0]; #asm("sei"); // тут глобально разрешил прерывания while(1) {} } но в протеусе все равно не вижу то что хочется подскажите чуть развернутее -
Проблема с авр
Andrew82 опубликовал тема в В помощь начинающему
Начал изучать авр и не могу разобраться с таймерами к авр на порт д подключен семисегментный индикатор раз в сек он должен увеличивать цифру т.е. от 0 до девяти и так далее в чем ошибка подскажите? Симулирую на протеусе все файлы в архиве. Помогите и подскажите. seg.zip