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

SigmA

Members
  • Постов

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

  • Посещение

Информация

  • Город
    Сумы

Электроника

  • Стаж в электронике
    6-10 лет
  • Сфера радиоэлектроники
    Электрика, аудиотехника, AVR
  • Оборудование
    Осциллограф, паяльная станция, мультик, генератор.

Достижения SigmA

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Конечно можно. Этим завтра я и буду заниматься. Теперь-то я знаю как это делается. Мне главное было решить задачу, которая образовалась изначально.
  2. Это почему же? Два часа усиленного штудирования публикаций о таймерах/счетчиках, прерываниях и т.д, привело к результату. Для меня было открытием, что помимо глобального разрешения прерываний #asm("sei") , есть еще и запрет #asm("cli") , теперь все прекрасно работает))) #include <mega8.h> #include <delay.h> #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0 unsigned char i, s, t=5, tt=200; unsigned char green=255; unsigned char green_b; //переменные, для буферизации значений скважности ШИМ unsigned char count; //переменная- счетчик вызовов обработчика прерываний unsigned char temp=1; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { count++; if (count == 0){ //если счетчик переполнился и принял значение 0 //сохранием значения в буфер green_b = green; //выставляем ноги, отвечающие за ШИМ в логическую 1 GREEN = 1; } //по достижении заданной скважности выводим логический 0 в ножку МК if (green_b == count) { GREEN = 0;} } void main(void) { PORTC=0x0F; //конфигурируем порт DDRC=0x0F; TCCR0=0x01; //настраиваем таймер TCNT0=0x00; TIMSK=0x01; //разрешаем генерацию прерывания по переполнению таймера T0 //глобально разрешаем прерывания while (1) { #asm("sei") if (temp==1) {if (green < 255) green += 1; else temp = 2;} if (temp==2) {if (green > 0) green -= 1; else temp = 3;} if (temp==3) {if (green < 255) green += 1; else temp = 4;} if (temp==4) {if (green > 0) green -= 1; else temp = 5;} if (temp==5) {if (green < 255) green += 1; else temp = 6;} if (temp==6) {if (green > 0) green -= 1; else temp = 7;} if (temp==7) {if (green < 255) green += 1; else temp = 8;} if (temp==8) {if (green > 0) green -= 1; else temp = 9;} if (temp==9) {if (green < 255) #asm("cli"); temp = 10; } delay_ms(t); if (temp==10) {if (green == 0) s=2; for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(tt); PORTC.0=0; PORTC.1=1; delay_ms(tt); PORTC.1=0; PORTC.2=1; delay_ms(tt); PORTC.2=0; PORTC.3=1; delay_ms(tt); PORTC.3=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(tt); PORTC.3=0; PORTC.2=1; delay_ms(tt); PORTC.2=0; PORTC.1=1; delay_ms(tt); PORTC.1=0; PORTC.0=1; delay_ms(tt); PORTC.0=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(tt); PORTC.2=1; delay_ms(tt); ; PORTC.1=1; delay_ms(tt); PORTC.0=1; delay_ms(tt); PORTC.3=0; delay_ms(tt); PORTC.2=0; delay_ms(tt); PORTC.1=0; delay_ms(tt); PORTC.0=0; delay_ms(tt); } for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(tt); PORTC.1=1; delay_ms(tt); ; PORTC.2=1; delay_ms(tt); PORTC.3=1; delay_ms(tt); PORTC.0=0; delay_ms(tt); PORTC.1=0; delay_ms(tt); PORTC.2=0; delay_ms(tt); PORTC.3=0; delay_ms(tt); } for (i=0;i<=s;i++) { PORTC=0x01; delay_ms(tt); PORTC=0x02; delay_ms(tt); PORTC=0x04; delay_ms(tt); PORTC=0x08; delay_ms(tt); PORTC=0x09; delay_ms(tt); PORTC=0x0A; delay_ms(tt); PORTC=0x0C; delay_ms(tt); PORTC=0x0D; delay_ms(tt); PORTC=0x0E; delay_ms(tt); PORTC=0x0F; delay_ms(tt); PORTC=0x07; delay_ms(150); PORTC=0x0B; delay_ms(tt); PORTC=0x03; delay_ms(250); PORTC=0x05; delay_ms(300); PORTC=0x09; delay_ms(350); PORTC=0x01; delay_ms(400); PORTC=0x02; delay_ms(tt); PORTC=0x04; delay_ms(tt); PORTC=0x08; delay_ms(tt); PORTC=0x00; delay_ms(tt); } for (i=0;i<=5;i++) { PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(1000); temp=1; } #asm("sei") } } }
  3. Доброго времени суток всем. Для своей новой жены захотелось мне сделать сердечко на atmega8, с кучей эффектов и т.д. Так вот, разные мигалки-переключалки св-диодов я написал, использовал delay. Но мне этого стало мало и я решил подключить шим программный. Отдельно от всей программы шим работает как нужно, так же и переключалки работают отдельно от шим, но вот когда я соединяю это всё воедино то работает только шим и не переходит дальше по коду.Я так понимаю, что таймеры и delay вместе работать не могут? Но если могут, то как? #include <mega8.h> #include <delay.h> #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0 unsigned char i, s,; unsigned char green=255; unsigned char green_b; //переменные, для буферизации значений скважности ШИМ unsigned char count; //переменная- счетчик вызовов обработчика прерываний unsigned char temp=1; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { count++; if (count == 0){ //если счетчик переполнился и принял значение 0 green_b = green; GREEN = 1; } if (green_b == count) { GREEN = 0;} } void main(void) { PORTC=0x0F; //конфигурируем порт DDRC=0x0F; TCCR0=0x01; //настраиваем таймер TCNT0=0x00; TIMSK=0x01; //разрешаем генерацию прерывания по переполнению таймера T0 #asm("sei") //глобально разрешаем прерывания while (1) { for (i=0;i<3;i++) { if (temp==1) {if (green < 255) green += 1; else temp = 2;} if (temp==2) {if (green > 0) green -= 1; else temp = 1;} delay_ms(1000); }; s=7; for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.0=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.3=1; delay_ms(200); PORTC.3=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.3=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.0=1; delay_ms(200); PORTC.0=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.2=1; delay_ms(200); ; PORTC.1=1; delay_ms(200); PORTC.0=1; delay_ms(200); PORTC.3=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.0=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.1=1; delay_ms(200); ; PORTC.2=1; delay_ms(200); PORTC.3=1; delay_ms(200); PORTC.0=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.3=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC=0x01; delay_ms(200); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x09; delay_ms(200); PORTC=0x0A; delay_ms(200); PORTC=0x0C; delay_ms(200); PORTC=0x0D; delay_ms(200); PORTC=0x0E; delay_ms(200); PORTC=0x0F; delay_ms(200); PORTC=0x07; delay_ms(150); PORTC=0x0B; delay_ms(200); PORTC=0x03; delay_ms(250); PORTC=0x05; delay_ms(300); PORTC=0x09; delay_ms(350); PORTC=0x01; delay_ms(400); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x00; delay_ms(200); } for (i=0;i<=5;i++) { PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(1000); } } }
×
×
  • Создать...