Четверг, 01.10.2020, 03:56
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Форум » Микроконтроллеры » Вопросы по статьям » Вопросы (Вопросы по МК, фюзы, прошивки...)
Вопросы
LeonДата: Понедельник, 21.09.2009, 23:28 | Сообщение # 31
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
int i=0;

switch (i)

{case 1: prog1; coun++; break;
case 2: prog2; count++; break;
default 0: ;
}
if (count==3)
{count=0;}

Добавлено (21.09.2009, 23:28)
---------------------------------------------
waw а как это сделать ? ну с pwm по software?

Сообщение отредактировал Leon - Суббота, 12.09.2009, 17:16
 
UpgraderДата: Пятница, 06.11.2009, 19:36 | Сообщение # 32
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 1
Статус: Offline
Очень интересно как программно ШИМ реализовать.
Кстати, нет ли вдруг специальных МК с кучей аппаратных ШИМ?
 
Viktor_63Дата: Суббота, 12.02.2011, 18:45 | Сообщение # 33
Рядовой
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
Народ! нужна помощ. В программировании не силён. Пытаюсь создать проект "Программатор для управления котлом"
За основу взял статьи "Делаем точные часы с календарем на DS1307 + LCD + ATMEGA8, с меню и будильником." и "Получение от датчика DS18B20 точности в 0.1 градус."
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 11.02.2011
Author : F4CG
Company : F4CG
Comments:

Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#include <stdio.h>

// I2C Bus functions
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// 1 Wire Bus functions
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=5
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds18b20.h>

// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS18b20 2
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds18b20_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 ds18b20_rom_codes[MAX_DS18b20][9];

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

float temper_1d;
int temper_int_1d,temper_fl_1d,mi_s_1d=0;
char lcd_buffer[33];
unsigned char hour,min,sek; //часы, минуты, секунды
unsigned char day,month,year,day_n; //день, месяц, год, день недели
unsigned char inf=0; // переменная меню
bit alm=0; // будильник вкл/выкл
unsigned char a_hour,a_min; // переменные где храняться время срабатывания будильника

void temperature(void) // функция по работе с термо-датчиком
{
M1: temper_1d=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int_1d=temper_1d; // отбор целой части от температуры
if(temper_1d<0) // при отрицательной температуре
{
temper_fl_1d=(temper_1d-temper_int_1d-0.0625)*10; // дробная часть
temper_int_1d=-((temper_int_1d*10)+temper_fl_1d); // температура*10
if(temper_int_1d<500)goto M1; //Если ошибка измерения повторить измерение
mi_s_1d=1; // минус
}
else // при положительной
{
temper_fl_1d=(temper_1d-temper_int_1d)*10; // дробная часть
temper_int_1d=(temper_int_1d*10)+temper_fl_1d;// температура*10
if(temper_int_1d>1500)goto M1; //Если ошибка измерения повторить измерение
mi_s_1d=0; // плюс
}

}

void rtc_get_date_n(unsigned char *date_n)
{
i2c_start();
i2c_write(0xd0);
i2c_write(3);
i2c_start();
i2c_write(0xd1);
day_n=i2c_read(0);
i2c_stop();
}

void rtc_set_date_n(unsigned char date_n)
{
i2c_start();
i2c_write(0xd0);
i2c_write(3);
i2c_write(day_n);
i2c_stop();
}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (inf==1)sek=0;//Обноление секунд по нажатию кнопки RES
}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0x00;
TCNT1L=0x01;

}

// Declare your global variables here

void main(void)
{
// 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=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTC=0x7F;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=T State4=T State3=T State2=P State1=T State0=T
PORTD=0x04;
DDRD=0x80;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x01;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим

// LCD module initialization
lcd_init(16);

/*// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif */

// Global enable interrupts
#asm("sei")

while (1)
{
char text[16];

temperature(); // вызываем функцию температуры

lcd_clear(); // очищаем LCD

if(mi_s_1d==1) // если минус
{
lcd_gotoxy(4,1);
sprintf(text,"T=-%u.%u\xdfC",temper_int_1d/10,temper_int_1d%10); //вывод отрицательной температуры
}
else
{
lcd_gotoxy(4,1);
sprintf(text,"T=%i.%d\xdfC",temper_int_1d/10,temper_int_1d%10); // вывод положительной
}
lcd_puts(text); // вывод на дисплей
//***************************************************************************
//delay_ms(750);
rtc_get_time(&hour,&min,&sek); //считать время
rtc_get_date(&day,&month,&year); //считать дату
rtc_get_date_n(&day_n); //считать день недели

lcd_gotoxy(0,0);
/*Sunday
Monday
Tuesday
Environment
Thursday
Friday
Saturday*/

if (PINC.0==0) // если нажата первая кнопка
{
delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
inf++; // к значению минуты добавляем еденицу
}
if (inf==0)
{
sprintf(text,"%u%u:%u%u:%u%u",hour/10,hour%10,min/10,min%10,sek/10,sek%10);
lcd_puts(text);
lcd_gotoxy(11,0);
sprintf(text,"%u%u-%u%u",day/10,day%10,day_n/10,day_n%10);
lcd_puts(text);
}
//**************************************
if (inf==1)
{

lcd_clear();
lcd_gotoxy(4,0);
lcd_putsf("Set Time");
lcd_gotoxy(4,1);
sprintf(text,"%u%u:%u%u:%u%u",hour/10,hour%10,min/10,min%10,sek/10,sek%10);
lcd_puts(text);

/*//lcd_putsf("Set Time");
lcd_gotoxy(0,1);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);*/
if (PINC.1==0) // если нажата вторая кнопка
{
delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
min++;
}
if (PINC.2==0) // если нажата третья кнопка
{
delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
min--;
}
if (PINC.3==0) // если нажата четвёртая кнопка
{
delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
hour++;
}
if (PINC.4==0) // если нажата пятая кнопка
{
delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
hour--;
}

if (min==60||min==255) // если мин = 60 или 255
{
min=0; // зануляем переменную "минута"
}
if (hour==24||hour==255) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
}
rtc_set_time(hour,min,sek); // установка времени
};

}
}

почему чистый экран? sad

 
ajaxДата: Воскресенье, 25.09.2011, 15:58 | Сообщение # 34
Рядовой
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
вопрос по статье Извлекаем звук из МК (Еще одно обновление 22.12.2010)
может у вас есть похожие схемы но вместь ММС 24Схх?
 
HiSERДата: Воскресенье, 25.09.2011, 20:26 | Сообщение # 35
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
ответил в комментарии к статье.
 
Dominik21Дата: Пятница, 04.11.2011, 15:18 | Сообщение # 36
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
HiSER,
Подскажите пожалуйста, не могу вывести переменную на экран!!!

#include <tiny2313.h>
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#asm
.equ __lcd_port=0x18
#endasm

char lcd_buffer[3]; //масив с данными для экрана
int temp;
void main(void)
{

lcd_init(8); //инициилизация LCD, и говорим что он на 8 символов

while(1) //бесконечный цикл
{
for(temp=0;temp<=255;temp++){
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%d",temp); //записуемв масив для экрана
lcd_clear(); //чистим дисплей перед выводом
lcd_puts(lcd_buffer); //выводим масив на LCD
delay_ms(1000); //ждём 1000мс
}
}
};
 
HiSERДата: Пятница, 04.11.2011, 15:36 | Сообщение # 37
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
А вообще что нибудь выводится? lcd_buffer должен быть 7 байт т.к. int -32768 - 32767 и плюс нулевой байт.
 
Dominik21Дата: Пятница, 04.11.2011, 15:59 | Сообщение # 38
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Экран пустой, что я только не перепробовал, уже грешу на неисправную библиотеку stdio.h, моделирую не в Proteuse, а на железке.... В чем беда?
 
HiSERДата: Пятница, 04.11.2011, 20:54 | Сообщение # 39
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Проверь правильность подключения, резистор на контрастность поставил?
 
Dominik21Дата: Суббота, 05.11.2011, 11:04 | Сообщение # 40
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Экран запросто выводит например lcd_putsf( "OK" ); но не получается выводить символы с переменной с помощью

sprintf(lcd_buffer,"%d",temp);
lcd_puts(lcd_buffer);
 
Форум » Микроконтроллеры » Вопросы по статьям » Вопросы (Вопросы по МК, фюзы, прошивки...)
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск:

Хостинг от uCoz