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

Sergey529

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Sergey529

  • Звание
    Участник
    Участник
  1. За ненадобностью продам отладочную плату Atmel EVK1100. В коробке, внутри сама плата, СД-диски, кабель. Цена 4000 р. Возможна личная встреча в Москве, также перешлю почтой в регионы.evk1100 Связаться со мной
  2. ARV, огромное спасибо! Исправил свои ошибки, добавил ваши замечания. Все отлично получилось. Мне это нужно было для формирования задержки в 10 сек между мелодиями - т.е. по окончании проигрывания, запускается ТС1. В итоге закончил программную часть своего устройства - датчика намокания. При намокании датчика, устройство играет выбранную мелодию и мигает номер установленной мелодии на индикаторе (к проекту добавлен вывод номера мелодии на семисегментный индикатор и формирование паузы между мелодиями).
  3. Проверяю. Просто был невнимателен, не посмотрел на "Div. clock by 8". Хотел еще задать вопрос. В вышеописанной программе хотелось бы из main обратиться к переменной STATE, находящейся в sound.c. Т.е. в main проверить то, что state стало равно SOUND_STOP. state = SOUND_STOP;
  4. Тему можно закрывать - контроллер с завода шел c установленным в 0 (enabled) фьюз-битом С - Divide Clock by 8 . Установил его в 1, стало все в порядке. Мелодии проигрываются правильно.
  5. , Вроде бы правильно - пробовал во фьюзах прошивать и RC-цепь 8 МГц, и внешний кварц 8 МГц. Реультат один и тот же. В Makefile указана частота - 8 МГц.. "Где собака порылась?" Сегодня вечером попробую осциллографом посмотреть, что там на ногах кварца. А в коде, в настройках таймера все в порядке?
  6. Имеется готовый проект для проигрывания мелодий из списка. Написан в WinAvr под ATMega8535. Для формирования различных длительностей и интервалов используется таймер-счетчик 2. Скомпилировал под ATMega32 - все отлично работает. Переделал под Т/С0 - тоже работает. Начал переделывать под ATtiny2313 c использованием Т/С0 - не работает.. Точнее мелодии звучат в несколько раз медленнее, и ниже тональностью. Частота тактирования МК - 8МГц. Ссылка на исходник проекта http://chipenable.ru/files/course/sound-li...dAvr-WINAVR.rar . Очень прошу помочь.. Мой код: #include "sound.h" #define LOOP 0xff PROGMEM unsigned int FurElise[] = { 18, 1, n8,e2, n8,xd2, n8,e2, n8,xd2, n8,e2, n8,b1, n8,d2, n8,c2, n4,a1, n8,p, n8,c1, n8,e1, n8,a1, n4,b1, n8,p, n8,e1, n8,xg1, n8,b1, n4,c2, n8,p, n8,e1, n8,e2, n8,xd2, n8,e2, n8,xd2, n8,e2, n8,b1, n8,d2, n8,c2, n4,a1, n8,p, n8,c1, n8,e1, n8,a1, n4,b1, n8,p, n8,e1, n8,c2, n8,b1, n4,a1, 0 }; PROGMEM unsigned int Mozart[] = { 16, 1, n16, xf1, n16, e1, n16,xd1, n16,e1, n4,g1, n16,a1, n16,g1, n16,xf1, n16,g1, n4,b1, n16,c2, n16,b1, n16,xa1, n16,b1, n16,xf2, n16,e2, n16,xd2, n16,e2, n16,xf2, n16,e2, n16,xd2, n16,e2, n4,g2, n8,e2, n8,g2, n32,d2, n32,e2, n16,xf2, n8,e2, n8,d2, n8,e2, n32,d2, n32,e2, n16,xf2, n8,e2, n8,d2, n8,e2, n32,d2, n32,e2, n16,xf2, n8,e2, n8,d2, n8,xc2, n4,b1, 0 }; PROGMEM unsigned int Minuet[] = { 18, 1, n4,d2, n8,g1, n8,a1, n8,b1, n8,c2, n4,d2, n4,g1, n4,g1, n4,e2, n8,c2, n8,d2, n8,e2, n8,xf2, n4,g2, n4,g1, n4,g1, n4,c2, n8,d2, n8,c2, n8,b1, n8,a1, n4,b1, n8,c2, n8,b1, n8,a1, n8,g1, n4,xf1, n8,g1, n8,a1, n8,b1, n8,g1, n4,b1, n2,a1, 0 }; PROGMEM unsigned int Sirene2[] = { 1, LOOP, ms(500), c2, ms(500), g2, 0 }; //-----------------------------звуковой модуль---------------------------------- //указатели на регистры порта #define PIN_SOUND (*(&PORT_SOUND-2)) #define DDR_SOUND (*(&PORT_SOUND-1)) //заглушка - пустая мелодия PROGMEM unsigned int Empty[] = { 1, 1, n4, p, 0 }; PROGMEM unsigned int PROGMEM* melody[] = {Empty, FurElise, Mozart, Minuet, Sirene2}; //переменные звукового модуля volatile static unsigned int *pSong; volatile static unsigned char state = SOUND_STOP; volatile static unsigned int durationNote = 0; volatile static unsigned int toneNote = 0; volatile static unsigned char indexNote = 0; volatile static unsigned char statReg = 0; volatile static unsigned char repeat = 0; #ifndef SOUND_BPM static unsigned char bpm = 0; #endif //флаги #define SOUND_VOLUME 0 #define SOUND_GEN 1 #define SOUND_BPM_SONG 0 #define SOUND_REPEAT_SONG 1 #define SOUND_START_SONG 2 #define SOUND_COUNTER_CAP 256 #define SOUND_PROG_COUNTER 31 //инициализация звукового модуля void SOUND_Init(void) { //настройка вывода мк на выход PORT_SOUND &= ~(1<<PINX_SOUND); DDR_SOUND |= (1<<PINX_SOUND); //настройка таймера T2 TIMSK |= (1<<TOIE0); TCCR0A = (0<<COM0A1)|(0<<COM0A0)|(0<<WGM01)|(0<<WGM00); //режим - нормал, прескалер - TCCR0B = (0<<FOC0A)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); TCNT0 = 0; OCR0A = 0; //инициализация переменных pSong = (unsigned int *)pgm_read_word(&(Empty)); state = SOUND_STOP; durationNote = 0; toneNote = 0; repeat = 0; indexNote = 0; statReg = 0; #ifndef SOUND_BPM bpm = 0; #endif } void SOUND_SetSong(unsigned char numSong) { if (numSong <= SOUND_AMOUNT_MELODY) { pSong = (unsigned int *)pgm_read_word(&(melody[numSong])); } } //обработчик команд звукового модуля void SOUND_Com(unsigned char com) { unsigned char saveSreg = SREG; cli(); switch (com){ /*команда стоп:*/ case SOUND_STOP: state = SOUND_STOP; TIMSK &= ~(1<<OCIE0A); PORT_SOUND &= ~(1<<PINX_SOUND); break; /*команда воспроизведение*/ case SOUND_PLAY: if (state == SOUND_PAUSE){ state = SOUND_PLAY; TIMSK |= (1<<OCIE0A); } else { #ifndef SOUND_BPM bpm = pgm_read_word(&(pSong[SOUND_BPM_SONG])); #endif indexNote = SOUND_START_SONG; repeat = pgm_read_word(&(pSong[SOUND_REPEAT_SONG])); durationNote = 0; state = SOUND_PLAY; TIMSK |= (1<<OCIE0A); } break; /*команда пауза*/ case SOUND_PAUSE: state = SOUND_PAUSE; TIMSK &= ~(1<<OCIE0A); break; default: break; } SREG = saveSreg; } //проиграть мелодию под номером numSong void SOUND_PlaySong(unsigned char numSong) { if (numSong <= SOUND_AMOUNT_MELODY) { pSong = (unsigned int *)pgm_read_word(&(melody[numSong])); } #ifndef SOUND_BPM bpm = pgm_read_word(&(pSong[SOUND_BPM_SONG])); #endif indexNote = SOUND_START_SONG; repeat = pgm_read_word(&(pSong[SOUND_REPEAT_SONG])); durationNote = 0; state = SOUND_PLAY; TIMSK |= (1<<OCIE0A); } inline static void SOUND_Duration(void) { static unsigned char counter = 0; if (state == SOUND_PLAY){ if (durationNote){ counter++; counter &= SOUND_PROG_COUNTER; if (!counter){ durationNote--; } } else { durationNote = pgm_read_word(&(pSong[indexNote])); if (durationNote) { #ifndef SOUND_BPM durationNote = durationNote/bpm; #endif indexNote++; toneNote = pgm_read_word(&(pSong[indexNote])); if (toneNote!=P) { statReg |= (1<<SOUND_VOLUME); } else{ statReg &= ~(1<<SOUND_VOLUME); } indexNote++; TIFR |=(1<<OCF0A); } else{ if (repeat == LOOP){ indexNote = SOUND_START_SONG; durationNote = 0; return; } repeat--; if (!repeat){ state = SOUND_STOP; TIMSK &= ~(1<<OCIE0A); PORT_SOUND &= ~(1<<PINX_SOUND); return; } else{ indexNote = SOUND_START_SONG; durationNote = 0; } } } } } inline static void SOUND_Tone(void) { static unsigned int tone = 0; if (statReg & (1<<SOUND_GEN)){ if (statReg & (1<<SOUND_VOLUME)){ PORT_SOUND ^= (1<<PINX_SOUND); } tone = toneNote; statReg &= ~(1<<SOUND_GEN); } if (tone > SOUND_COUNTER_CAP) { tone -= SOUND_COUNTER_CAP; } else { OCR0A = tone; statReg |= (1<<SOUND_GEN); } } //прерывания таймера Т2_____________________________________ ISR(TIMER0_OVF_vect) { SOUND_Duration(); BUT_Debrief(); } ISR(TIMER0_COMPA_vect) { SOUND_Tone(); } #ifndef SOUND_H #define SOUND_H #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include "buttons.h" //*************************** настройки ************************************* #define SOUND_BPM 24 //если закомментировать длительность нот будет //расчитываться из заданного в мелодии BPM`а #define SOUND_F_CPU 8U //тактовая частота мк #define SOUND_TIM_PRE 1U //зачение предделителя таймера #include "tone.h" //здесь определены частота и длительности нот //пин мк на котором будет генериться звук #define PORT_SOUND PORTD #define PINX_SOUND 0 //количество мелодий #define SOUND_AMOUNT_MELODY 4 //*************************************************************************** //команды звукового модуля #define SOUND_STOP 0 #define SOUND_PLAY 1 #define SOUND_PAUSE 2 //функции звукового модуля void SOUND_Init(void); void SOUND_SetSong(unsigned char numSong); void SOUND_Com(unsigned char com); void SOUND_PlaySong(unsigned char numSong); #endif //SOUND_H
  7. Спасибо большое за код! Напишите пожалуйста комментарии к нему.. Хочу разобраться что к чему.
  8. Если несложно, напишите пожалуйста какой-нибудь вариант кода, в котором можно будет все это организовать...
  9. Имеется плата evk1100 c AT32UC3A. На ней располагается дисплей DIP204. Я еще новичок в Си, и уж тем более впервые сталкиваюсь с 32-разрядными контроллерами. Тем не менее есть поставленная задача... Пишу пока тестовую программу. Благодаря Framework разобрался с индикатором и usart. Вот фрагмент кода: ...... while (1) { a=usart_getchar(EXAMPLE_USART); dip204_printf_string("%c",a); if(a=='1') { usart_write_line(EXAMPLE_USART, "OK"); } if(a=='0') { dip204_clear_display(); } } return 0; Переменная a - некий буфер, куда заносятся символы, приходящие из терминальной программы с ПК. Как организовать вертикаьную прокрутку, на экране, когда все 80 знакомест заполнились?
  10. EVK1100 + bootloader

    Вобщем разобрался несколько дней назад, собираю проект вручную. И еще во вкладке Program, оказывается, в параметре offset надо было указать значение 0x80000000F. Сейчас все работает и прошивается. Vacvvn, спасибо за очередной совет! Как-нибудь попробую! :cheers:
  11. EVK1100 + bootloader

    Добрый вечер! Подскажите кто-нибудь, как залить готовый проект из Framework, например для работы с GPIO, в плату EVK1100? В режим бутлоадера я попал, FLIP установлен. Но когда начал заливать проект, бутлоадер перестал запускаться.. Где-то читал про файл trampoline, который находится в папке ASM проекта. Что с ним делать? Убрать? Вообщем - как корректно запрограммировать проц на плате через бутлоадер? Есть еще 2-я плата, и не хочется запороть загрузчик в ней.. JtagICE mk 2 не скоро получу :( П.с. работаю через AVR32 Studio.
  12. Вроде разобрались :rolleyes: И все-таки, что делать с предупреждением компилятора?
  13. Я прошил программу в процессор - все работает, нажимаю cкнопку и светодиоды поочередно загораются. Может тогда так написать : PORTB |= _BV(i); ? Ааа! Все увидел пост выше... Пропустил |. Кстати далее по программе у меня везде стоит " | ". А почему без него работает? С выводом на дисплей разобрался: LCDclr(); sprintf(array, "LED: %u", i); LCDstring(array, 7); На диплей выводится: "LED: 0" , 1, 2 итд. Но все же как убрать предупреждение компилятора "Pointer targets.." о котором я писал выше? Только вот еще уточнение: в программе написано PORTB |= (1<<i); то зажигаются светодиоды 1,2,3 - 8 И ОСТАЮТСЯ ВСЕ ГОРЯЩИМИ. А мне нужно - горит только 1, потом только 2, потом только 3 итд. И это получается только при команде PORTB = (1<<i); Запутался совсем...
  14. Смысл в том, что имеется 8-светодиодная линейка, подключенная к порту В - и этой командой "сдвигается" единичка в порте B, и соответственно зажигаются светодиоды с 1 по 8 при нажатии кнопки. Но меня очень интересует вывод переменной на lcd.
  15. Добрый вечер! Подниму эту старую тему, т.к. сам начинающий и столкнулся со следующей проблемой. Вот кусок программы, в котором значение переменной i увеличивается от 1 до 7 и всякий раз оно выводится на дисплей: #include <avr/io.h> //подключаем библиотеки #include <avr/delay.h> #include <stdio.h> #include <lcd_lib.h> #define delay _delay_ms(20) #define button_0 (bit_is_clear(PIND,0)) //макрос - нажата кнопка 0 //итд char i=-1; int p=0; unsigned char array[10]; int main(void) { LCDinit(); LCDclr(); LCDcursorOFF(); sprintf(array,"%u",i); LCDstring(array, 10); //10 - взял с запасом while(1) //БЕСКОНЕЧНЫЙ ЦИКЛ ОПРОСА КНОПОК { if(button_0 && p==0) //проверяем нажатие кнопки 0, если нажата и p=0, продолжаем { delay; //антидребезговая задержка if(button_0 && p==0) //повторно проверяем, нажата ли кнопка. Если да, то { if(i<7) //если еще не сдвинуто 7 раз, то продолжить { i++; //увеличить i (номер бита) } else //иначе установить значение бита = 7 { i = 7; } PORTB = (1<<i); //сдвигаем 1 в порте влево на 1 бит (i-номер бита) LCDstring(array, 10); } else continue; //если кнопка не была нажата, то ПРОДОЛЖАТЬ ДАЛЬШЕ ОПРАШИВАТЬ КНОПКИ } //и так далее на разные вариации с переменной i и выводом ее в порт по нажатию кнопки } Компилятор выдает предупреждение pointer targets in passing argument 1 of 'sprintf' differ in signedness. На экране дисплея: 0 и далее в строке разные символы. Работаю в связке WinAVR + AVRStudio4. Прошу заранее не пинать...
×
×
  • Создать...