• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

Поиск по сайту

Результаты поиска по тегам 'си '.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории и разделы

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
    • МК для начинающих
    • AVR
    • PIC
    • STM32
    • Arduino и Raspberry Pi
    • ПЛИС
    • Другие микроконтроллеры и семейства
    • Алгоритмы
    • Программаторы и отладочные модули
    • Периферия и внешние устройства
    • Разное
  • Товары и услуги
    • Коммерческие предложения
    • Продам-Отдам, Услуги
    • Куплю
    • Уголок потребителя
    • Вакансии и разовая работа
    • Наши обзоры и тесты
  • Разное
    • Конкурсы сайта с призами
    • Сайт Паяльник и форум
    • Курилка
    • Технический английский (English)
    • Наши проекты для Android и Web
    • FAQ (Архив)
    • Личные блоги
    • Корзина
    • Вопросы с VK
  • ATX->ЛБП Переделки
  • Юмор в youtube Киловольты юмора
  • Надежность и группы продавцов Радиолюбительская доска объявлений exDIY
  • разные темы Переделки

Блоги

Нет результатов для отображения.

Нет результатов для отображения.

Местоположения

  • Пользователи форума

Группа


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Найдено 10 результатов

  1. Уже есть тема для Бейсика, асм это само сабой, а вот по Си темки нету, поэтому я и решил её создать. В данной теме хотелось бы рассматривать вопросы программирования на языке Си, а т.к компиляторов для этого языка и для PIC-ов довольно много то я предлагаю рассматривать тут два самых распространённых это HI-TEC PICC и microC. Почему именно они, спросит кто-то ? Просто данные компиляторы-среды две полные противоположности и вот в чём заключается их эта противоположность. microC - это то, что нужно для быстрой разработки, куча библиотек на все случаи жизни, ну и самое главное самый лучший мануал на русском языке, который больше похож на пособие для тех кто с нуля начинает программировать на Си для PIC. HI-TEC PICC - это инструмент для тех кто предпочитает всё писать сам, досконально во всём разобравшись, т.к данный компилятор в своём составе имеет минимум уже готовых библиотек и всё надо писать ручками Мануал на него краткий почти без примеров. Короче каждый сам решит для себя, что ему ближе. Мне ближе microC, но сейчас я изучаю и HI-TEC. И так, что нужно тому кто решил освоить программирование на Си для PIC: 1.Желательно иметь сам контроллер, я предлагаю на эту роль избрать PIC16F877 т.к в нём есть вся нужная переферия, русский даташит, но можно и PIC16F628, у него правда нету АЦП, что является всё-таки минусом. 2.Сами компиляторы: microC тут: http://a_sergeevich.nxt.ru/microC.zip в архиве две версии компилятора стандарт и про, а также мануал на русском. Предлагаю всем пользоваться про-версией. HI-TEC PICC берём тут: http://a_sergeevich....CC_V8.05PL1.zip , а мануал тут: http://a_sergeevich....ru/picc_env.pdf 3.Для первого времени ну и вообще желательно иметь Proteus, тут версия 7.5SP3: http://a_sergeevich....teus 7.5SP3.zip внимание некотырые антивирусы ругаются на кряк. Это то, что нужно для начала, всё остальное каждый приобретёт исходя из потребностей. А теперь просьба ко всем, для облегчения дальнейшего общения: 1.Выкладываете свой код, комментируйте его или описывайте, что он делает. Если вопрос касается работы какой-то части кода, которая вам не понятна ( например, если разбираетесь в чужом) то лучше вопрос задать в виде, сначала как сами понимаете,работу данного куска кода, а потом, где ошибка в моих рассуждениях. Всё это ускорит получение помощи по вашему вопросу более компетентными коллегами с форума. Сам я также пока учусь, пробую, всё, что у меня есть по данной теме я выложу, чуть позже, а пока читаем мануалы, выбираем, что по душе, ну и начинаем творить, предлагать какие-то интересные идеи для совместной разработки. Давайте, чтобы у нас как в песне: вместе весело шагать по просторам ну, а песню напевать лучше хором
  2. Извечный вопрос не дает покоя. Кто и на чем все же предпочитает вести работу с контроллерами? Лично я как научился работать на С, так и не могу перейти на Assembler, да и не очень то хочется это делать. Какие все же преимущества и недостатки, окромя понятности и не очень понятности?
  3. Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху Max6675 к Atmega и вывод данных на LCD экран. В архиве прилагаю проект Atme Studio 7 и принт скрин из Протеуса. Ошибка заключается в неправильных показаниях температуры Test1.rar Вот код, чтоб не скачивать проект. #define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include "max6675.h" #include "LCD.h" uint16_t gettemp(void); //Funktionsdeklarationen void initavr(void); //gettemp () returns absolute Temperature in Temp * 4 °C - in 1/4°-steps // uint16_t gettemp(void){ //Temperatur holen. uint8_t bit = 0, bitnr = 12; //Variablen uint8_t foo1 = 0; uint16_t Rohdata = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen bit = 15 - foo1; //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if((bit <= 14) && (bit >= 3)){ //Einfach mal die 12 relevanten von den 16 Bits ausfiltern if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... bitnr--; //zдhlen wir runter... Rohdata |= (1 << bitnr); // und schieben eine 1 an bit x }else{ //WENN dem NICHT so ist, dann... bitnr--; //zдhlen wir runter... Rohdata &= ~(1 << bitnr); //und schieben eine 0 an bit x } }else{ //weis au nimmer, was das soll. bitnr = 12; } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return Rohdata; //Das ist doch mal was ;D } // getTC() returns 0 if Thermocouple is not connected, 255 if thermocuple is connected // (to enable this feature T- must be connected to GND) uint8_t getTC(void){ //Temperatur holen. //Variablen uint8_t TC = 0; uint8_t foo1 = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if(foo1 == 2){ //das 3. bit ist fьr uns relevant. if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... TC = 0; }else{ //WENN dem NICHT so ist, dann... TC = 255; } } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return TC; //Das ist doch mal was ;D } //Initiates the MAX6675 and IO-pins void init_6675(void){ //AVR initialisieren SO_DDR &= ~(1 << SO); CS_DDR |= (1 << CS); SCK_DDR |= (1 << SCK); //IOs setzen SO_Port |= (1<<SO); //Pullups an. (Wichtig fьr MAX6675, der kann nicht anders, hab ich festgestellt... CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. SCK_Port &= ~(1 << SCK); //SCK LO } int main(void) { init_port();// инициализируем порт ЖКИ lcd_init();// инициализируем ЖКИ init_6675(); while (1) { char buffer[8]; int temp; temp = gettemp(); temp /=4; lcd_gotoxy(0,0);//перемещаем курсор в верхний левый угол sprintf(buffer, "t=%i\xdf\C ", temp); // так как тут не плавающая запятая то числа с запятой записываются так %i.%i, код градуса записывается так \xdf lcd_putstring(buffer); } } вставляете код пользуйтесь тегами [CОDE][/CОDE] редактора сообщений, кнопка <>
  4. Прерывание Reset В Си

    нужно ли обрабатывать RESET просто компилятор не видит RESET_vect?
  5. Работа С Eeprom

    Натолкните на мысль пожалуйста.Смысл в следующем.Нужно изменять задержку(Delay) из EEPROM. Контроллер PIC , язык СИ. Как реализовать чтение числа из ипрома ? Если не затруднит, то кусочек кода был бы очень кстати.
  6. Здравствуйте! Недавно начал изучать МК AVR. Читаю книги Белова. Пользуюсь программами CVAVR и Proteus. По урокам, собирал все в железе. По готовым примерам кода конечно же мне легко учиться и все в принципе понятно из описания, хоть и в программировании не силен, но как только начинаешь создавать что то свое - начинаются проблемки. В общем я создаю что то вроде музыкального светильника, который должен включаться от звука (голоса). Датчик звука пытаюсь реализовать на компараторе, плавное включение света - ШИМ, а генерация мелодии (пищалки) благодаря таймеру Т1 и его прерыванию. Куски кода брал из разных чужих самоделок, вот только объединить не удается. В железе работает как будто цветомузыка какая-то. Мелодия не играет, Я думаю это из-за неправильной конфигурации компаратора, а также схемы. Вот это основной вопрос у меня. Ну и собственно основной цикл программы, там я думаю тоже накосячил. Помогите мне разобраться до конца, понять ошибки в коде, мне самому интересно вот только С - язык тяжеловатый на мой взгляд и без помощи знающих не обойтись)) КОД.txt
  7. Продам счетчики бета-гамма излучения новые заводская упаковка Си1Г (79г) 62 шт. 5000р Си21БГ (79г) 49 шт. 350р Си22БГ (79г) 70 шт. 700р Си3БГ (84г) 20 шт. 300р Си3БГ (78г) 46 шт. 250р Си3БГ (77г) 10 шт. 250р Си3БГ (79г) 18 шт. 250р Си3БГ (75г) 10 шт. 200р Си37Г (80г) 40 шт. 400р Си37Г (76г) 24 шт. 350р Си37Г (79г) 16 шт. 350р Си33Г (78г) 28 шт. 450р Си33Г (77г) 15 шт. 450р СБТ13 (78г) 2 шт. 3000р СБТ13 (76г) 3 шт. 2700р СБТ13 (69г) 3 шт 2500р. Си8Б (79г) 1 шт. 2500р Си8Б (78г) 1 шт. 2500р СБТ10 (79г) 3 шт. 4500р 8 (910) 7051241 Евгений bishop-x@yandex.ru
  8. Проблемы С Памятью

    Здравствуйте. не могли бы Вы подсказать, как посмотреть,где именно он пишет в некорректную облать памяти. #include <stdio.h> #include <stdlib.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/eeprom.h> #include <avr/interrupt.h> #include <util/delay.h> #include <inttypes.h> #include "lcd_lib.h" //define R2R port #define R2RPORT PORTA #define R2RDDR DDRA //define button port and dedicated pins #define BPORT PORTD #define BPIN PIND #define BDDR DDRD #define DOWN 0//PORTD #define LEFT 1//PORTD #define START 2//PORTD #define RIGHT 3//PORTD #define UP 4//PORTD //Define Highs Speed (HS) signal output #define HSDDR DDRD #define HSPORT PORTD #define HS 5//PD5 //define eeprom addresses #define EEMODE 0 #define EEFREQ1 1 #define EEFREQ2 2 #define EEFREQ3 3 #define EEDUTY 4 #define EEINIT E2END #define RESOLUTION 0.095367431640625 #define MINFREQ 0//minimum frequency #define MAXFREQ 65534//maximum DDS frequency #define MN_No 5// number of menu items //function prototypes void delay1s(void); void Timer2_Init(void); void Timer2_Start(void); void Timer2_Stop(void); void Main_Init(void); void Menu_Update(uint8_t); void Freq_Update(void); void Timer1_Start(uint8_t); void Timer1_Stop(void); void static inline Signal_OUT(const uint8_t *, uint8_t, uint8_t, uint8_t); //adjust LCDsendChar() function for strema static int LCDsendstream(char c, FILE *stream); //----set output stream to LCD------- static FILE lcd_str = FDEV_SETUP_STREAM(LCDsendstream, NULL, _FDEV_SETUP_WRITE); //Menu Strings in flash //menu 1 const uint8_t MN100[] PROGMEM=" exp \0"; //Array of pointers to menu strings stored in flash const uint8_t *MENU[]={ MN100 //menu 1 string }; //various LCD strings const uint8_t MNON[] PROGMEM="ON \0";//ON const uint8_t MNOFF[] PROGMEM="OFF\0";//OFF const uint8_t NA[] PROGMEM=" NA \0";//Clear freq value const uint8_t CLR[] PROGMEM=" \0";//Clear freq value const uint8_t MNClrfreq[] PROGMEM=" \0";//Clear freq value const uint8_t TOEEPROM[] PROGMEM="Saving Settings\0";//saving to eeprom const uint8_t ONEMHZ[] PROGMEM=" 1MHz \0";//saving to eeprom const uint8_t welcomeln1[] PROGMEM="AVR SIGNAL\0"; const uint8_t RND[] PROGMEM=" Random\0"; //variables to control TDA7313 struct signal{ volatile uint8_t mode; //signal volatile uint8_t fr1; //Frequency [0..7] volatile uint8_t fr2; //Frequency [8..15] volatile int8_t fr3; //Frequency [16..31] volatile uint32_t freq; //frequency value volatile uint8_t flag; //if "0"generator is OFF, "1" - ON volatile uint32_t acc; //accumulator volatile uint8_t ON; volatile uint8_t HSfreq; //high speed frequency [1...4Mhz] volatile uint32_t deltafreq; //frequency step value }SG; //define signals const uint8_t expwave[] __attribute__ ((section (".MySection1")))= //exp wave { 0x00,0x09,0x12,0x1B,0x23,0x2c,0x34,0x3c,0x43,0x4B,0x52,0x59,0x60,0x67,0x6E,0x74, 0x7A,0x80,0x86,0x8C,0x91,0x97,0x9C,0xA1,0xA6,0xAA,0xAF,0xB3,0xB8,0xBC,0xC0,0xC3, 0xC7,0xCB,0xCE,0xD1,0xD4,0xD7,0xDA,0xDD,0xE0,0xE2,0xE4,0xE7,0xE9,0xEB,0xED,0xEF, 0xF0,0xF2,0xF3,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFE,0xFE,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xfa, 0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xee,0xed,0xec,0xea,0xe9,0xe8, 0xe6,0xe5,0xe3,0xe2,0xe0,0xdf,0xdd,0xdb,0xda,0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce, 0xcc,0xca,0xc8,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,0xbb,0xba,0xb8,0xb6,0xb4,0xb2,0xb0, 0xae,0xac,0xaa,0xa8,0xa6,0xa4,0xa2,0xa1,0x9f,0x9d,0x9b,0x99,0x97,0x95,0x93,0x91, 0x8f,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,0x80,0x7e,0x7d,0x7b,0x79,0x77,0x76,0x74, 0x72,0x70,0x6e,0x6d,0x6b,0x69,0x68,0x66,0x64,0x62,0x61,0x5f,0x5d,0x5c,0x5a,0x59, 0x57,0x55,0x54,0x52,0x51,0x4f,0x4e,0x4c,0x4b,0x49,0x48,0x46,0x45,0x44,0x42,0x41, 0x3f,0x3e,0x3d,0x3b,0x3a,0x39,0x37,0x36,0x35,0x34,0x31,0x30,0x2f,0x2e,0x2d,0x2b, 0x2a,0x29,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c, 0x1b,0x1a,0x1a,0x19,0x18,0x17,0x16,0x15,0x15,0x14,0x13,0x12,0x11,0x11,0x10,0x0f, 0x0f,0x0e,0x0d,0x0d,0x0c,0x0b,0x0b,0x0a,0x09,0x09,0x08,0x08,0x07,0x07,0x06,0x06, }; //array of pointers to signal tables const uint8_t *SIGNALS[] ={ expwave }; //adjust LCD stream fuinction to use with printf() static int LCDsendstream(char c , FILE *stream) { LCDsendChar(c); return 0; } //delay 1s void delay1s(void) { uint8_t i; for(i=0;i<100;i++) { _delay_ms(10); } } //initialize Timer2 (used for button reading) void Timer2_Init(void) { TCNT2=0x00; sei(); } //start timer2 void Timer2_Start(void) { TCCR2|=(1<<CS22)|(1<<CS21); //prescaller 256 ~122 interrupts/s TIMSK|=(1<<TOV2);//Enable Timer0 Overflow interrupts } //stop timer 2 void Timer2_Stop(void) { TCCR0&=~((1<<CS22)|(1<<CS21)); //Stop timer0 TIMSK&=~(1<<TOV2);//Disable Timer0 Overflow interrupts } //Initial menu //show initial signal and frequency //generator is off void Menu_Update(uint8_t on) { LCDclr(); CopyStringtoLCD(MENU[(SG.mode)], 0, 0 ); LCDGotoXY(0, 1); if (SG.mode==6) { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.deltafreq); } if (SG.mode==7) { CopyStringtoLCD(CLR, 0, 1 ); CopyStringtoLCD(RND, 0, 1 ); } if (SG.mode==8) { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uMHz", SG.HSfreq); } if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.freq); } if (SG.mode!=6) { if(on==1) CopyStringtoLCD(MNON, 13, 1 ); else CopyStringtoLCD(MNOFF, 13, 1 ); } } //update frequency value on LCD menu - more smooth display void Freq_Update(void) { if (SG.mode==6) { LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.deltafreq); } if (SG.mode==8) { //if HS signal LCDGotoXY(0, 1); printf(" %5uMHz", SG.HSfreq); } if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.freq); } } //External interrupt0 service routine //used to stop DDS depending on active menu //any generator is stopped by setting flag value to 0 //DDs generator which is inline ASM is stopped by setting //CPHA bit in SPCR register ISR(INT0_vect) { SG.flag=0;//set flag to stop generator SPCR|=(1<<CPHA);//using CPHA bit as stop mark //CopyStringtoLCD(MNOFF, 13, 1 ); SG.ON=0;//set off in LCD menu loop_until_bit_is_set(BPIN, START);//wait for button release } //timer overflow interrupt service tourine //checks all button status and if button is pressed //value is updated ISR(TIMER2_OVF_vect) { if (bit_is_clear(BPIN, UP)) //Button UP increments value which selects previous signal mode //if first mode is reached - jumps to last { if (SG.mode==0) { SG.mode=MN_No-1; } else { SG.mode--; } //Display menu item Menu_Update(SG.ON); loop_until_bit_is_set(BPIN, UP); } if (bit_is_clear(BPIN, DOWN)) //Button Down decrements value which selects next signal mode //if last mode is reached - jumps to first { if (SG.mode<(MN_No-1)) { SG.mode++; } else { SG.mode=0; } //Display menu item Menu_Update(SG.ON); loop_until_bit_is_set(BPIN, DOWN); } if (bit_is_clear(BPIN, RIGHT)) //frequency increment { if(SG.mode==6) { if(SG.deltafreq==10000) SG.deltafreq=1; else SG.deltafreq=(SG.deltafreq*10); Freq_Update(); loop_until_bit_is_set(BPIN, RIGHT); } if (SG.mode==8) { //ifhigh speed signal if(SG.HSfreq==8) SG.HSfreq=1; else SG.HSfreq=(SG.HSfreq<<1); Freq_Update(); loop_until_bit_is_set(BPIN, RIGHT); } if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { if ((0xFFFF-SG.freq)>=SG.deltafreq) SG.freq+=SG.deltafreq; Freq_Update(); uint8_t ii=0; //press button and wait for long press (~0.5s) do{ _delay_ms(2); ii++; }while((bit_is_clear(BPIN, RIGHT))&&(ii<=250));//wait for button release if(ii>=250) { do{ if ((0xFFFF-SG.freq)>=SG.deltafreq) SG.freq+=SG.deltafreq; Freq_Update(); }while(bit_is_clear(BPIN, RIGHT));//wait for button release } } } if (bit_is_clear(BPIN, LEFT)) //frequency decrement { if(SG.mode==6) { if(SG.deltafreq==1) SG.deltafreq=10000; else SG.deltafreq=(SG.deltafreq/10); Freq_Update(); loop_until_bit_is_set(BPIN, LEFT); } if (SG.mode==8) { //ifhigh speed signal if(SG.HSfreq==1) SG.HSfreq=8; else SG.HSfreq=(SG.HSfreq>>1); Freq_Update(); loop_until_bit_is_set(BPIN, LEFT); } if ((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { if (SG.freq>=SG.deltafreq) SG.freq-=SG.deltafreq; Freq_Update(); uint8_t ii=0; //press button and wait for long press (~0.5s) do{ _delay_ms(2); ii++; }while((bit_is_clear(BPIN, LEFT))&&(ii<=250));//wait for button release if(ii>=250) { do{ if (SG.freq>=SG.deltafreq) SG.freq-=SG.deltafreq; Freq_Update(); }while(bit_is_clear(BPIN, LEFT));//wait for button release } } } if (bit_is_clear(BPIN, START)) { if(SG.mode!=6) { //saving last configuration SG.fr1=(uint8_t)(SG.freq); SG.fr2=(uint8_t)(SG.freq>>8); SG.fr3=(uint8_t)(SG.freq>>16); if (eeprom_read_byte((uint8_t*)EEMODE)!=SG.mode) eeprom_write_byte((uint8_t*)EEMODE,SG.mode); if (eeprom_read_byte((uint8_t*)EEFREQ1)!=SG.fr1) eeprom_write_byte((uint8_t*)EEFREQ1,SG.fr1); if (eeprom_read_byte((uint8_t*)EEFREQ2)!=SG.fr2) eeprom_write_byte((uint8_t*)EEFREQ2,SG.fr2); if (eeprom_read_byte((uint8_t*)EEFREQ3)!=SG.fr3) eeprom_write_byte((uint8_t*)EEFREQ3,SG.fr3); //Calculate frequency value from restored EEPROM values SG.freq=(((uint32_t)(SG.fr3)<<16)|((uint32_t)(SG.fr2)<<8)|((uint32_t)(SG.fr1))); //calculate accumulator value SG.acc=SG.freq/RESOLUTION; SG.flag=1;//set flag to start generator SG.ON=1;//set ON on LCD menu SPCR&=~(1<<CPHA);//clear CPHA bit in SPCR register to allow DDS //Stop timer2 - menu inactive Timer2_Stop(); //display ON on LCD Menu_Update(SG.ON); } loop_until_bit_is_set(BPIN, START);//wait for button release } } /*DDS signal generation function Original idea is taken from http://www.myplace.nu/avr/minidds/index.htm small modification is made - added additional command which checks if CPHA bit is set in SPCR register if yes - exit function */ void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0) { asm volatile( "eor r18, r18 ;r18<-0" "\n\t" "eor r19, r19 ;r19<-0" "\n\t" "1:" "\n\t" "add r18, %0 ;1 cycle" "\n\t" "adc r19, %1 ;1 cycle" "\n\t" "adc %A3, %2 ;1 cycle" "\n\t" "lpm ;3 cycles" "\n\t" "out %4, __tmp_reg__ ;1 cycle" "\n\t" "sbis %5, 2 ;1 cycle if no skip" "\n\t" "rjmp 1b ;2 cycles. Total 10 cycles" "\n\t" : :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR)) :"r18", "r19" ); } void Timer1_Start(uint8_t FMHz) { switch(FMHz){ case 1: //start high speed (1MHz) signal OCR1A=7; break; case 2: OCR1A=3;//2MHz break; case 4: OCR1A=1;//4MHz break; case 8: OCR1A=0;//8MHz break; default: OCR1A=7;//defauls 1MHz break;} //Output compare toggles OC1A pin TCCR1A=0x40; //start timer without prescaler TCCR1B=0b00001001; } void Timer1_Stop(void) { TCCR1B=0x00;//timer off } //main init function void Main_Init(void) { //stderr = &lcd_str; stdout = &lcd_str; //--------init LCD---------- LCDinit(); LCDclr(); LCDcursorOFF(); //-------EEPROM initial values---------- if (eeprom_read_byte((uint8_t*)EEINIT)!='T') { eeprom_write_byte((uint8_t*)EEMODE,0x00);//initial mode 0 – OUT~~~~; eeprom_write_byte((uint8_t*)EEFREQ1,0xE8);//initial frequency 1kHz eeprom_write_byte((uint8_t*)EEFREQ2,0x03); eeprom_write_byte((uint8_t*)EEFREQ3,0x00); eeprom_write_byte((uint8_t*)EEINIT,'T');//marks once that eeprom init is done //once this procedure is held, no more initialization is performed } //------restore last saved values from EEPROM------ SG.mode=eeprom_read_byte((uint8_t*)EEMODE); SG.fr1=eeprom_read_byte((uint8_t*)EEFREQ1); SG.fr2=eeprom_read_byte((uint8_t*)EEFREQ2); SG.fr3=eeprom_read_byte((uint8_t*)EEFREQ3); SG.freq=(((uint32_t)(SG.fr3)<<16)|((uint32_t)(SG.fr2)<<8)|((uint32_t)(SG.fr1))); SG.acc=SG.freq/RESOLUTION; SG.flag=0; //default 1MHz HS signal freq SG.HSfreq=1; SG.deltafreq=100; //------------init DDS output----------- R2RPORT=0x00;//set initial zero values R2RDDR=0xFF;//set A port as output //-------------set ports pins for buttons---------- BDDR&=~(_BV(START)|_BV(UP)|_BV(DOWN)|_BV(RIGHT)|_BV(LEFT)); BPORT|=(_BV(START)|_BV(UP)|_BV(DOWN)|_BV(RIGHT)|_BV(LEFT)); //---------set ports pins for HS output--------- HSDDR|=_BV(HS);//configure as output //-----------Menu init-------------- SG.ON=0;//default signal is off Menu_Update(SG.ON); //-----------Timer Init------------- Timer2_Init(); //Start Timer with overflow interrupts Timer2_Start(); } int main(void) { //Initialize Main_Init(); while(1)//infinite loop { if (SG.flag==1) { GICR|=(1<<INT0);//set external interrupt to enable stop if (SG.mode==7) { //Noise do { R2RPORT=rand(); }while(SG.flag==1); //set signal level to 0 R2RPORT=0x00; //display generator OFF Menu_Update(SG.ON); //stop external interrupt GICR&=~(1<<INT0); //start timer menu active Timer2_Start(); } /* else if (SG.mode==6) { //freq step while((SG.flag==1)) { //not implemented CopyStringtoLCD(NA, 0, 1 ); } //set signal level to 0 R2RPORT=0x00; //display generator OFF Menu_Update(SG.ON); GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt //start timer menu active Timer2_Start(); }*/ else if (SG.mode==8) { //High speed signal Timer1_Start(SG.HSfreq); while((SG.flag==1)) { //not implemented CopyStringtoLCD(MNON, 13, 1 ); } Timer1_Stop();//timer off //set HS pin to LOW HSPORT&=~(1<<HS); //display generator OFF Menu_Update(SG.ON); GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt //start timer menu active Timer2_Start(); } else { //start DDS Signal_OUT(SIGNALS[sG.mode], (uint8_t)((uint32_t)SG.acc>>16), (uint8_t)((uint32_t)SG.acc>>8), (uint8_t)SG.acc); //set signal level to 0 R2RPORT=0x00; //display generator OFF Menu_Update(SG.ON); GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt //start timer menu active Timer2_Start(); } } } return 0; } ошибка section .MySection1 loaded at [000016ce,000017cd] overlaps section .data loaded at [000016ce,000016f5] Подскажите пожалуйста,где посмотреть, по какой причине он так записывает в память. Гуглила, ничего толкого не нашла. Заранее спасибо.
  9. Итак, после прочтения вводной документации и изучения архитектуры PIC-контроллеров среднего уровня, пришел к выводу, что для применения в радиолюбительской среде и для штучного изготовления устройств, ассемблер имеет мало смысла, т.к. достаточно сложен и запустан по сравнению с Си. У Си есть свои недостатки: это более громоздкая и соответственно более медленная программа, в сравнении с ассемблером, но как я уже сказал, любительское штучное изготовления устройств - это не массовый выпуск, где надо экономить на всем. Не хватило памяти? - не беда, возьмем контроллер побольше, да потолще В общем, решил я, что на Си писать проще, быстрее и комфортнее. В качестве компилятора выбрал ccs (ну просто в книге на его примере рассказывалось о Си). Попробовал сделать на базе контроллера 16F84A свою первую программу типа "hello world", по традиции мигание светодиодами (зеленый горит 2 сек, гаснет, мигает три раза красный и так по кругу), все получилось, с некоторыми оговорками (подробности ниже). Теперь к вопросам. 1. Правильно ли я выбрал компилятор или есть что-то более религиозно верное? 2. Стоит ли использовать специфические конкретно для этого компилятора фичи, вроде #byte, #bit и т.д.? Т.к. многие, как я понял, ругают за использование этого функционала. Сам из минусов я вижу только отсутствие переносимости Си программ между компиляторами, в которых нет таких директив. 3. Как я понял, при написании своей первой программы, Си в контроллерах "не полноценный"? Конкретно столкнулся со следующей проблемой: компилятор ругался на цикл for, говорил, что эта часть кода не будет иметь эффекта, и действительно, после прошивки красный светодиод не моргал, см. скриншот. Т.е. получается чиклы for не поддерживаются? Т.к. после того как заменил его на цикл while - все заработало: #include <main.h> void main() { while(true) { output_high(LED_GREEN); delay_ms(2000); output_low(LED_GREEN); int i = 3; delay_ms(500); while(i > 0){ output_high(LED_RED); delay_ms(500); output_low(LED_RED); delay_ms(500); i--; } } } 4. И последний вопрос. Все же для общего развития хотел попробовать написать эту же программу на асме, пытаюсь создать проект в мплаб, указываю компилятор стандартный (см. 2 скрин) и получаю ошибку как на третьем скрине, что я делаю не так?
  10. Cи В Bascom

    Приветствую уважаемые форумчане. Если кто знает С, пожалуйста, помогите понять код: Код: #define DDR_SPI DDRB #define DD_SS 2 #define DD_MOSI 3 #define DD_MISO 4 #define DD_SCK 5 #define SPE 6 #define MSTR 4 #define SPR0 0 #define SPIF 7 void SPI_MasterInit() { DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//настраиваем на выход SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);//вкл SPI, ведущий, частота fck/16 } //функция передачи байта void SPI_MasterTransmit(char cData) { SPDR = cData;//начинаем передачу while(!(SPSR & (1<<SPIF)));//ждем пока передача завершится } unsigned int ReceiveADC() { unsigned char adcMSB=0; unsigned char adcLSB=0; unsigned int adc=0; PORTB &= ~(1<<DD_SS); SPI_MasterTransmit(0x00); adcMSB=SPDR; SPI_MasterTransmit(0x00); adcLSB=SPDR; PORTB |= (1<<DD_SS); //собираем битовыми операциями наши данные adcMSB &= 0b00011111; adc = adcMSB; adc<<=5; adcLSB>>=3; adc |= adcLSB; return adc; } Т.е. переведу я сам на Bascom, я немогу его понять. Вообще это код управления АЦП MCP3001. Очень надо. Заранее спасибо.