Страница 256 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 17, 2013 09:24:19
a_skr
по формуле из таблицы "Table 74. Equations for Calculating Baud Rate Register Setting" или из таблицы "Table 85. Examples of UBRR Settings for Commonly Used Oscillator Frequencies" в datasheet получить значение 3 для UBRR, только учесть, что ошибка скорости будет 8.5%.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 17, 2013 17:15:45
servo
спасибо

вроде разобрался ..
т.е подбором кварца можно снизить ошибку до нуля

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 17, 2013 18:20:05
ibiza11
Эта ошибка важна только в случае обмена микроконтроллера и компьютера. Если общаются два микроконтроллера, то не важно, соответствует ли скорость стандарту или нет.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт апр 19, 2013 22:28:46
olya0704
Здравствуйте люди добрые. Помогите новичку в этом деле. Есть интересное задание "Устройство контроля температуры в двух помещениях. Температурные датчики обоих помещений подключены по интерфейсу 1-Wire к одному микроконтроллеру. Как только температура на каком-либо датчике превышает порог, на дисплее должны отобразиться номер помещения и температура. Также следует предусмотреть световую сигнализацию и возможность регулировки порога.". Вот то, что уже получилось...
Спойлер
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include "lcd.h"
// 1 Wire Bus interface functions
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS18b20 8
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char devices;
unsigned char LcdBuffDevices[20];
unsigned char RomCode[2][9];
unsigned char LcdBuff1[20];
unsigned char LcdBuff2[20];
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds1820_rom_codes[MAX_DS18b20][9];
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=2
#endasm
void main( void )
{
lcd_init( 20 );
lcd_clear( );
devices=w1_search( DS18B20_SEARCH_ROM_CMD, RomCode ); //поиск датчиков на линии 1-wire
if( devices )
{
ds18b20_init( &RomCode[0][0], 30, 60, DS18B20_12BIT_RES ); //инициализация первого датчика
ds18b20_init( &RomCode[1][0], 30, 60, DS18B20_12BIT_RES ); //инициализация второго датчика
// Alphanumeric LCD functions
#include <alcd.h>
//Оъявляем глобальные переменные
unsigned char lcd_buffer[20], numb;
unsigned char temp1, temp2, tmin = 25;
#asm("sei")
// Прерывание по переполнению таймера/счетчика 0 (в теле прерывания прописываем обработку нажатия кнопок)
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(!PINC.4) {
delay_ms(100);
if(!PINC.4) {
tmin++;
sprintf(lcd_buffer, "tmin=%d", tmin);
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}
}
if(!PINC.3) {
delay_ms(100);
if(!PINC.3) {
tmin--;
sprintf(lcd_buffer, "tmin=%d", tmin);
// Place your code here
}
// Declare your global variables here
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=Out Func0=In
// State6=P State5=0 State4=P State3=P State2=T State1=0 State0=T
PORTC=0x58;
DDRC=0x22;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 187,500 kHz
TCCR0=0x03;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// 1 Wire Bus initialization
// 1 Wire Data port: PORTC
// 1 Wire Data bit: 2
// Note: 1 Wire port settings are specified in the
// Project|Configure|C Compiler|Libraries|1 Wire menu.
w1_init();
// Глобальное разрешение прерываний
#asm("sei")
// Основной цикл программы
while (1)
{temp1=ds18b20_temperature( &RomCode[0][0] ), temp2=ds18b20_temperature( &RomCode[1][0] ); // Считываем температуру с датчиков ds13b20
if (temp1 > tmin, temp2 > tmin)
{lcd_init(20);
sprintf(lcd_buffer, "tmin=%d", tmin); // Формируем строку
lcd_gotoxy(0,1); // Помещаем курсор на 0-й символ нижней строкм
lcd_puts(lcd_buffer); // Вывод строки
continue;}
else {
// Сравниваем температуру с порогом, включаем или выключаем обогреватель
if (temp1 > tmin) {PORTC.0 = 0,PORTC.5 = 1;
lcd_init(20);
sprintf(lcd_buffer, "1 комната, t=%d", temp1); // Формируем строку
lcd_gotoxy(0,1); // Помещаем курсор на 0-й символ нижней строкм
lcd_puts(lcd_buffer);} // Вывод строки
else {PORTC.0 = 1,PORTC.5 = 0,temp2=ds18b20_temperature( &RomCode[1][0] );
if (temp2 > tmin) {PORTC.1=0, PORTC.5=1;
lcd_init(20);
sprintf(lcd_buffer, "2 коьната, t=%d", temp2); // Формируем строку
lcd_gotoxy(0,1); // Помещаем курсор на 0-й символ нижней строкм
lcd_puts(lcd_buffer);} // Вывод строки
else {PORTC.1=1, PORTC.5=0};}
};
}
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
}
}}}}}
тут есть ряд ошибок, особенно в конце, но незнание правил пунктуации языка не дает шансов это исправить...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 20, 2013 13:13:01
unalex
olya0704 писал(а):Вот то, что уже получилось...
смотреть страшно и анализировать влом
я вижу в этом винегрете куски кода, взятые из разных источников(чередование стилей форматирования) тупо накинутые на шаблон
я бы на вашем месте либо начал бы с более простых проектов, либо если так поджимает - отработал бы по отдельности каждый кусок, а потом бы лепил программу
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс апр 21, 2013 15:09:40
MS24
Ребят а кто нибудь работал c FatFS от мистера чана на codevidion? Я никак не могу разобраться как воткнуть его библиотеку в codevidion. Как я понимаю она только под winavr работает?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс апр 21, 2013 15:16:54
Apparatchik
По моиму в последних версиях она уже "воткнута" осталось только юзать.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс апр 21, 2013 17:34:50
MS24
MS24 писал(а):Ребят а кто нибудь работал c FatFS от мистера чана на codevidion? Я никак не могу разобраться как воткнуть его библиотеку в codevidion. Как я понимаю она только под winavr работает?
Я знаю, что там есть какая-то библиотека, а это fat fs что ли???
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт апр 26, 2013 17:27:30
Импульс
Здравствуйте!
РАзбираю динамическую индикацию с применением прерывания по переполнению таймера
Timer 0
по книги: М.С.Голубцов Микроконтроллеры AVR от простого к сложному.
стр 131.
В этой книге расписан пример без особого пояснения,и при компилировании
вылетают ошибки:
can't open #include file: HG.h
undefined symbol 'HG12'
undefined symbol 'N'
undefined symbol 'init_HG'
помогите разобрать.
Книга есть в архиве с исходником.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт апр 26, 2013 18:16:29
FreshMan
Импульс, вникать в чужой код это дело муторное....., лично я делаю так, что и вам советую:
юзаю Atmega 8, тактирую от внутреннего генератора на 8МГц
использую второй таймер
вот его настройки:
Код: Выделить всё
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2|= (1 << WGM20) | (1 << WGM21); // Fast PWM mode
TCCR2|= (1 << CS22); // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)
TCNT2=0x00;
OCR2=0x00;
в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды
вот такой простой алгоритм
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 27, 2013 20:06:46
Импульс
FreshMan писал(а):Импульс, вникать в чужой код это дело муторное....., лично я делаю так, что и вам советую:
юзаю Atmega 8, тактирую от внутреннего генератора на 8МГц
использую второй таймер
вот его настройки:
Код: Выделить всё
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2|= (1 << WGM20) | (1 << WGM21); // Fast PWM mode
TCCR2|= (1 << CS22); // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)
TCNT2=0x00;
OCR2=0x00;
в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды
вот такой простой алгоритм
в моём коде ,расписаны все строчки(регистры,переменные и тд.)

автор книги не писал я думаю тяп-ляп -но в итоге ошибок куча.
Код то не большой,может мне надо библиотеки подгрузить ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 27, 2013 20:09:29
Импульс
.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 27, 2013 20:10:42
Импульс
.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб апр 27, 2013 20:11:28
Импульс
Спойлер
#include <90s2313.h>
#include <HG.h>
interrupt [TIM0_0VF]void timer0_ovf_isr(void)
{
TCNTO=0xFF;
HG12();
}
interrupt [TIM1_0VF]void timer1_ovf_isr(void)
{
TCNT1H=0xf0;
TCNT1L=0xbe;
N++;
if(N==20) N=0;
}
void main(void)
{
unsigned int temp,temp1,temp2;
PORTB=0x00;
DDRB=0xFF;
PORTD=0x00;
DDRD=0x00;
//Timer/Counter 0 initialization
//Clock source: System Clock
//Clock value: 3906 kHz
//Mode: Output Compare
//OCD output: Disconnected
TCCR0=0x05;
TCNT0=0xFF;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xf0;
TCNT1L=0xbe;
OCR1H=0x00;
OCR1L=0x11;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x82;
ACSR=0x80;
#asm("sei")
init_HG();
N=0;
while (1)
{};}
FreshMan писал(а):
в перывании по совпадениют мы выводим нужную нам цифру и зажигаем нужный катод или анод
в перерывании по переполнению мы тушим наши катоды или аноды
Подскажите ,для запуска совпадения ,прерывания и переполнения нужны импульсы внешних или внутренних источников.
Здесь не могу понять...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 29, 2013 15:47:00
Импульс
Скажите пожалуйста :
как проще организовать динамическую индикацию-по переполнению счетчика, или нужно обязательно использовать прерывания?
Есчо прочитал про :
Таймеры-счетчики могут генерировать прерывания по трём видам событий:
- "захват" события;
- сравнение с заданной величиной;
- переполнение.
собираю сам информацию для понимания процесса.
Я только учусь ,не судите строго.

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 29, 2013 16:56:28
FreshMan
прерывание нужно оспользовать обязательно......, в том то и весь смысл чтобы зажигать разряды с определенной частотой
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 29, 2013 17:23:33
Импульс
Код: Выделить всё
TCCR2|= (1 << CS22); // clk/256 - делим основную частоту МК на 256 (предделидель для таймера)
У вас FreshMan ,ошибка, в даташите такого бита нет:CS22
есть бит CS02

или я не прав ...
Хочу без пробелов разбиратся.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 29, 2013 17:30:24
Импульс
сейчас напишу простой код как я раньше динамическую индикацию выводил!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 29, 2013 17:32:10
FreshMan
это ты смотрел для Т0, а теперь посмотри для Т2
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 29, 2013 17:53:22
Импульс
FreshMan писал(а):это ты смотрел для Т0, а теперь посмотри для Т2
точно
Спойлер
Регистр TCCR2:
•bit7 FOC2 - принудительное изменение уровней на выводе ОС2
•bit6 WGM20 - бит настройки режима генератора. Работает в паре с bit3
•bit5 COM21 - бит управления контактом ОС2 (PB3). Работает в паре с bit4
•bit4 COM20 - бит управления контактом ОС2 (PB3). Работает в паре с bit3
•bit3 WGM21 - бит настройки режима генератора. Работает в паре с bit6
•bit2 CS22 - бит настройки предделителя
•bit1 CS21 - бит настройки предделителя
•bit0 CS20 - бит настройки предделителя
•bit6 WGM20 - бит настройки режима генератора. Работает в паре с bit3
•bit3 WGM21 - бит настройки режима генератора. Работает в паре с bit6///для чего нужно задействовать эти биты ?