Atmega16 помогите разобратся
- Реклама
- Сообщения: 60
- Зарегистрирован: Чт окт 29, 2009 23:22:03
- Сообщения: 60
- Зарегистрирован: Чт окт 29, 2009 23:22:03
с проблемой с запятой разобрался,включил функцию float и все заработало.Но столкнулся с следуюющей проблемой хочу что-бы на ЛСД одновременно отбражались результаты с двух каналов АЦП
#include <mega16>
#include <stdio>
#include <delay>
#include <string>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>
float result1;
char lcd_buffer[31];
float result2;
float a;
float r;
float c;
void init(void)
{
DDRC=0xFF;
PORTC=0xFF;
GICR|=0xC0;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0xC0;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
lcd_init(16);
#asm("sei")
}
void main(void)
{
init();
ADMUX=0;
result1= ADCW/204.6*3;
ADMUX=1;
result2= ADCW/204.6*3;
sprintf(lcd_buffer,"U=%.3fU2=%.3f ", result1 , result2 );//
lcd_clear(); // очищаем жки
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer) ; // теперь выводим в него
delay_ms(5 );
while (1)
{
};
};
#include <mega16>
#include <stdio>
#include <delay>
#include <string>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>
float result1;
char lcd_buffer[31];
float result2;
float a;
float r;
float c;
void init(void)
{
DDRC=0xFF;
PORTC=0xFF;
GICR|=0xC0;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0xC0;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
lcd_init(16);
#asm("sei")
}
void main(void)
{
init();
ADMUX=0;
result1= ADCW/204.6*3;
ADMUX=1;
result2= ADCW/204.6*3;
sprintf(lcd_buffer,"U=%.3fU2=%.3f ", result1 , result2 );//
lcd_clear(); // очищаем жки
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer) ; // теперь выводим в него
delay_ms(5 );
while (1)
{
};
};
Если просто вывести значение в LCD То можно сделать так, добавить
Добавляем еще один буфер
В тексте программы добавляем
Если надо обновить только "значение", просто делаем так
Вместо "*****" надо поставить пустые знаки(пробелы) в количестве равном максимальному диапазону знакомест занимаемым выводимым числом. Вообщем просто очищаем место под следующую цифру.
Код: Выделить всё
#include <stdlib>// посмотрите в хелпе компилятора
char lcd_buffer0[31],lcd_buffer1[31];В тексте программы добавляем
Код: Выделить всё
lcd_clear(); // очищаем жки
//itoa читаем в хелпе компилятора
itoa(result1, lcd_buffer0); lcd_gotoxy(0,0); lcd_puts(lcd_buffer0) ; // теперь выводим в него
itoa(result1, lcd_buffer1); lcd_gotoxy(0,1); lcd_puts(lcd_buffer1) ; // теперь выводим в него
Код: Выделить всё
itoa(result1, lcd_buffer0);lcd_gotoxy(0,0);lcd_putsf("***"); lcd_gotoxy(0,0); lcd_puts(lcd_buffer0);
itoa(result2, lcd_buffer1);lcd_gotoxy(0,1);lcd_putsf("***"); lcd_gotoxy(0,1); lcd_puts(lcd_buffer1);
- Реклама
И тут еще , человек идею предлогает по поводу вывода...
http://radiokot.ru/forum/viewtopic.php?p=346493#346493
http://radiokot.ru/forum/viewtopic.php?p=346493#346493
- Сообщения: 60
- Зарегистрирован: Чт окт 29, 2009 23:22:03
Доброго времени суток!
Уважаемые у меня парочка вопросов:
1.Правильно ли реализовано переключение каналов ADC
2.Будет ли работать МК в режиме снижения шумов ADC
3.Всем огромное спасибо.
#include <mega16>
#include <stdio>
#include <delay>
#include <string>
#include <stdlib>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>
#define ADC_VREF_TYPE 0x00;
float result1;
float lcd_buffer[32] ;
float lcd_buffer2[32] ;
float result2;
float a;
float r;
// External Interrupt 0 service routine
interrupt [ADC_INT] void adc_isr(void){
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
}
// External Interrupt 1 service routine
void lsd(void )
{
lcd_gotoxy(0,0);
ADCSRA=0b11011111; ADMUX=0b00000000;
result1=((ADCW )/68.2) ;
a=(result1-result2)/0.5 ;
r=result2/a;
sprintf(lcd_buffer2,"U%.2fU2=%.3f\nA=%.3fR=%.3f ",result1, result2,a,r,);
lcd_puts(lcd_buffer2);
delay_ms(5);
ADCSRA=0b11011111; ADMUX=0b00000001;
result2=((ADCW+0.5)/68.2)-0.02;
#asm ("sleep");
}
// ADC interrupt service routine
void diode ( )
{
}
void main( )
{
lcd_init(32);
DDRC=0xFF;
PORTC=0xFF;
GICR|=0xC0;
MCUCR=0b00100000;
MCUCSR=0x00000000;
GIFR=0xC0;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
#asm ("sei");
while (1)
{
lsd( );
}
}
Уважаемые у меня парочка вопросов:
1.Правильно ли реализовано переключение каналов ADC
2.Будет ли работать МК в режиме снижения шумов ADC
3.Всем огромное спасибо.
#include <mega16>
#include <stdio>
#include <delay>
#include <string>
#include <stdlib>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>
#define ADC_VREF_TYPE 0x00;
float result1;
float lcd_buffer[32] ;
float lcd_buffer2[32] ;
float result2;
float a;
float r;
// External Interrupt 0 service routine
interrupt [ADC_INT] void adc_isr(void){
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
}
// External Interrupt 1 service routine
void lsd(void )
{
lcd_gotoxy(0,0);
ADCSRA=0b11011111; ADMUX=0b00000000;
result1=((ADCW )/68.2) ;
a=(result1-result2)/0.5 ;
r=result2/a;
sprintf(lcd_buffer2,"U%.2fU2=%.3f\nA=%.3fR=%.3f ",result1, result2,a,r,);
lcd_puts(lcd_buffer2);
delay_ms(5);
ADCSRA=0b11011111; ADMUX=0b00000001;
result2=((ADCW+0.5)/68.2)-0.02;
#asm ("sleep");
}
// ADC interrupt service routine
void diode ( )
{
}
void main( )
{
lcd_init(32);
DDRC=0xFF;
PORTC=0xFF;
GICR|=0xC0;
MCUCR=0b00100000;
MCUCSR=0x00000000;
GIFR=0xC0;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
#asm ("sei");
while (1)
{
lsd( );
}
}
Уважаемые котярики. Вот столкнулся с проблемой - начались морозы и глюкавит система. Система состоит из 9 контроллеров температуры на базе Atmega16. Я здесь по поводу моих контроллеров не первый раз. С понижением температуры перестали мои контроллеры отвечать. Лазил лазил и увидел такой эффект. Длина сети RS485 1метр. Контроллер не отвечает. Кладешь палец ему на бошку, прогрелся и отвечает. При этом по сбросу всегда выполняет свои функции на отлично холодный или прогретый.... Стоит у меня Atmega 16PU а в даташите я такой не нашел. Кто подскажет ее температурный диапазон и где можно это увидеть.


