Вячеслав_НС
Members-
Постов
15 -
Зарегистрирован
-
Посещение
Информация
-
Пол
Мужчина
-
Город
Апатиты
Электроника
-
Стаж в электронике
1-2 года
-
Сфера радиоэлектроники
микроконтроллеры
-
Оборудование
dso138
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения Вячеслав_НС
-
#define F_CPU 8000000UL #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/ void TWI_Init(void) { // Установка тактовой частоты F_scl = 100 кГц TWBR =32; TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); TWCR |= (1 << TWEN); // Разрешение работы TWI-модуля } /*** ЗАПУСК TWI ***/ void TWI_Start(void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); TWDR = 0x90; // передача адреса модуля PCF8591 в шину TWI TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } /*** ОСТАНОВКА TWI ***/ void TWI_Stop(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(TWCR & (1<<TWSTO)); // Ожидание завершения передачи условия СТОП } /***ПЕРЕДАЧА ДАННЫХ В TWI***/ void TWI_WriteByte(uint8_t data) { TWDR = data; // Загрузка данных в TWDR TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи данных } int main(void) { TWI_Init(); while (1) { TWI_Start(); // Запуск TWI //_delay_ms(50); TWI_WriteByte(0x40); //включаем цап //_delay_ms(50); TWI_WriteByte(0x80); // запись в ЦАП значения 100 //_delay_ms(50); TWI_Stop(); } } -------------------------------------------------------------------------------- вот рабочий код.изначально взял готовый с инета.вернее с разных примеров. конкретно - 1) убрал : void PCF8591_get(void) { TWI_Start(); // Запуск TWI TWI_WriteByte(0x40); //включаем цап TWI_WriteByte(100); // запись в ЦАП значения 100 TWI_Stop(); // Остановить TWI } //перенес все это в главный цикл программы: int main(void) { TWI_Init(); while (1) { TWI_Start(); // Запуск TWI //_delay_ms(50); TWI_WriteByte(0x40); //включаем цап //_delay_ms(50); TWI_WriteByte(0x80); // запись в ЦАП значения 100 //_delay_ms(50); TWI_Stop(); } } 2) поправил эту строчку : TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI //адрес обращения к микросхеме PCD8591 переправил с 1001000 (он же в 16 битном виде -0x48) на 10010000 или 0x90 (0x90 содержит 8 бит для управления режимом чтения-1 или записи -0 в PCD8591) 3)для того , чтоб в протеусе нормально работал модуль i2c debugger , желательно дополнить задержками основной цикл (//_delay_ms(50);) ********************************************* а вообще схема такая - энкодером (есть рабочий код) через atm8 управляю по шине i2c ЦАП PCD8591...ну это не еще вся схема.растет по тихоньку о бог данного форума ! извините тупое быдло ( начинающего с нуля изучать программирование на СИ и микро контролеры авр ) за те ошибки , которые я делаю изучая примеры , выкладываемые некоторыми божествами в инете ... трудновато написать свой код,когда в инете столько "грамотеев".странно,вроде форум для помощи начинающим.но я еще ни разу ее не получил...пока только оскорбления.
-
помогите разобраться с кодом .(послать значение по шине TWI на ЦАП PCF8591) не работает в протеусе ... #define F_CPU 8000000UL #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/ void TWI_Init(void) { // Установка тактовой частоты F_scl = 100 кГц TWBR =32; TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); TWCR |= (1 << TWEN); // Разрешение работы TWI-модуля } /*** ЗАПУСК TWI ***/ void TWI_Start(void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } /*** ОСТАНОВКА TWI ***/ void TWI_Stop(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(TWCR & (1<<TWSTO)); // Ожидание завершения передачи условия СТОП } /***ПЕРЕДАЧА ДАННЫХ В TWI***/ void TWI_WriteByte(uint8_t data) { TWDR = data; // Загрузка данных в TWDR TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи данных } /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/ void PCF8591_get(void) { TWI_Start(); // Запуск TWI TWI_WriteByte(0x40); //включаем цап TWI_WriteByte(100); // запись в ЦАП значения 100 TWI_Stop(); // Остановить TWI } int main(void) { TWI_Init(); while (1) { PCF8591_get; _delay_ms(50); } }
-
#define F_CPU 8000000UL #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/ void TWI_Init(void) { // Установка тактовой частоты F_scl = 100 кГц TWBR =32; TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); TWCR |= (1 << TWEN); // Разрешение работы TWI-модуля } /*** ЗАПУСК TWI ***/ void TWI_Start(void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } /*** ОСТАНОВКА TWI ***/ void TWI_Stop(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(TWCR & (1<<TWSTO)); // Ожидание завершения передачи условия СТОП } /***ПЕРЕДАЧА ДАННЫХ В TWI***/ void TWI_WriteByte(uint8_t data) { TWDR = data; // Загрузка данных в TWDR TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи данных } /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/ void PCF8591_get(void) { TWI_Start(); // Запуск TWI TWI_WriteByte(0x40); //включаем цап TWI_WriteByte(100); // запись в ЦАП значения 100 TWI_Stop(); // Остановить TWI } int main(void) { TWI_Init(); while (1) { PCF8591_get; _delay_ms(50); } }
- 3 ответа
-
- библиотека i2c
- avr
-
(и ещё 1 )
C тегом:
-
не получилось с твоей библиотекой , извиняюсь , ну начинающий , что поделать . можешь подсказать по этому коду ?(франки штейн...из кусков разных примеров собран ) --> #define F_CPU 1000000 #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //#define PCF8591 0x48 // адр 000 //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/ void TWI_Init(void) { // Установка тактовой частоты F_scl //F_scl = F_cpu/(16 + 2* TWBR* 4^TWPS) = 1000000/(16+2*2*4^3) = 1000000/272 = 3,7кГц TWBR = 2; TWSR = (1 << TWPS1)|(1 << TWPS0); //TWSR = ((0 << TWPS0)|(0 << TWPS1)); TWCR |= (1 << TWEN); // Разрешение работы TWI-модуля } /*** ЗАПУСК TWI ***/ void TWI_Start(void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); } /*** ОСТАНОВКА TWI ***/ void TWI_Stop(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(TWCR & (1<<TWSTO)); // Ожидание завершения передачи условия СТОП } uint8_t TWI_WriteByte(uint8_t data) { TWDR = data; // Загрузка адресов или данных в TWDR TWCR = (1 << TWEN) // Включение TWI |(1 << TWINT); // Сброс флага TWINT (!!!) while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи данных } /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ НА ЦАП ***/ void PCF8591_get(void) { TWI_Start(); // Запуск TWI TWI_WriteByte(0x48); // Передача адреса устройства TWI_WriteByte(0x40); //включаем цап TWI_WriteByte(0xA); // Записать в цап - "10" TWI_Stop(); // Остановить TWI _delay_ms(50); } int main(void) { TWI_Init(); while (1) { PCF8591_get; _delay_ms(50); } }
- 3 ответа
-
- библиотека i2c
- avr
-
(и ещё 1 )
C тегом:
-
какую библиотеку использовать для i2c в atmel studio 7
Вячеслав_НС опубликовал тема в Песочница (Q&A)
Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7 . задача - управлять atmega8 по i2c , цап PCF8591T . понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .- 3 ответа
-
- библиотека i2c
- avr
-
(и ещё 1 )
C тегом:
-
пожалуйста поделитесь программкой на СИ для Atmega 8 ( пользуюсь Atmel Studio 7.0 )для вывода изображения ( любой текст либо графика ) на lcd x320240co с контролером RA8835 ( если не ошибаюсь , аналог - SED1335 ).в режиме i8080 . библиотеки RA8835 ( SED1335 ) в интернете нашел . но вот готовой программки на СИ , как пример - нет .
-
Если кому то интересно ... решил проблему с запуском atmega8 от внешнего кварца ( в частности 8 Мгц ) , я просто убрал нагрузочные емкости . по схеме - 22pF . более опытные люди подсказали - в МК могут присутствовать свои , внутренние ( подтягиваются настройками фьюзов ).
-
поправка , я имел ввиду - небольшое расхождение с номиналом на проверочной емкости , а не погрешность ( моя схемка ни в коем случае не претендует на калибровочное профессиональное оборудование ). я только начал осваивать СИ и МК . к слову - не всегда удается запустить МК от внешнего кварца , как и в данном случае . так что точность измерения емкости , конечно не высокая . проверял разными емкостями - от 27pF до 680nF . на емкости 91pF показания - 91 pF !!! если не ошибаюсь , этот тип емкости довольно точный и термостабильный (4я с лева ). другое дело - схема с использованием АЦП , там измерение не завязано на частоту ( при работе АЦП до 200кГц ). получилась вполне приемлемая точность измерения . шкала измерения от - 10.5 кПа до + 10.5 кПа ... калибровал свою схемку по цифровому манометру ( у него погрешность y±0.005%) расхождение в показаниях начинается на сотых долях кПа (0.0х).
-
как всегда , простые вещи упускаю из виду ... не "Lcd_prints " надо было использовать , а "Lcd_printf ". Прошу прощения . похоже тему зря создал . пока ковырялся в сложном , допустил простую ошибку . Простите мужики , лоханулся . да и подходящий пример для себя уже нашел в инете . но все равно - спасибо . вообще я хотел написать прошивку не совсем для частотомера . там нужно подставить формулу (F = 0,48/(R1×C1) расчета емкости по частоте ( генератор на обычной k561лн2 . из двух элементов . резистор на 350 кОм и собственно - измеряемая емкость ) . получается измеритель емкости .просто есть куча плат с СМД детальками .сопрухи подписаны , емкости -нет .думаю измерение в пределах ~ 20 pF - 800nF мне хватит . подходящий пример прошивки нашел . формулу вставил . все работает .погрешность не большая . единственное , там используется двухстрочный дисплей 1602 , а не нокиа-5110 .
-
не понимаю как правильно вывести показания таймера(счетчика) на LCD . если написать так ... Lcd_prints(10,2,FONT_1X,( unsigned char ) PSTR("Hz")); то программа воспринимает без ошибок . вот я и прошу...пожалуйста подскажите некоторые моменты в написании программки . в частности - как оформить вывод на экран значение из счетчика TCNT1 в бесконечном цикле . учусь по готовым примерам . с АЦП сам разобрался , с таймерами засел . не все понимаю . нужен простой пример .очень простой . либо подсказка . за ранее благодарен .
-
Здравия всем ! Пожалуйста помогите разобраться . Пытаюсь написать прошивку для Atmega8 на С в Atmel Studio 7.0 . Программка простая ( небольшая ) ... по сути - частотомер ( только для небольшого диапазона частот ... примерно - от нескольких Гц , до нескольких десятков кГц ) . Импульсы считать со входа T0 ( PD4 ) ...микр-ра Atmega8a ( 28 pin ) . Использовать TCNT1 (16 bit) . Полученное число выводить на Lcd - nokia5110 . Как я понимаю прерывания не нужны , алгоритм простой : 1) инициализация дисплея и счетчика 2) остановить (запретить счет) счетчик AVR - ( CS12,CS11,CS10-прописать нули ) 3) обнулить ( отчистить) буфер дисплея и счетчика ( AVR ) 3) запустить бесконечный цикл : а) разрешить считать импульсы с T0 ( PD4 ) - ( CS12,CS11,CS10-прописать единицы ) б) задать паузу ( надеюсь правильно рассчитал - 10 мсек ) в) запретить считать - ( CS12,CS11,CS10-прописать нули ) г) вывести полученное значение со счетчика на дисплей ( СИЛЬНО НЕ СМЕЙТЕСЬ ... Я НАЧИНАЮЩИЙ . с АЦП AVR разобрался удачно , собрал схемку в протеусе , написал прошивку , спаял ... все работает . а вот с таймером завис надолго . есть много примеров в инете , но все слишком навороченные для меня . запутался . ) вот примерно что получилось с таймером ... упрощал как мог ...в общим не получается . подскажите где косяк .(только просьба - без лишних наворотов и по возможности с комментариями ... задача - не повторить чужую программу ... а разобраться самому ) //Atmega8A #define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "n5110.h" void presets(){ Lcd_init(); Lcd_clear(); TCCR1B =0x00; TCNT1=0000; TCCR0 |= (1 << CS01); } int main(void) { presets(); while (1) { TCNT1=0000; TCCR1B|=(1<<CS12)|(1<<CS11)|(1<<CS10); _delay_ms(10); TCCR1B &=~(1<<CS12)|(1<<CS11)|(1<<CS10); Lcd_prints(5,2,FONT_1X,(TCNT1)PSTR("Hz")); // КОМПИЛЯТОР РУГАЕТСЯ НА ЭТУ СТРОЧКУ Lcd_update(); } }