Всем, опять большой привет!!!
Проверил я работоспособность программы в CVAVR - тоже самое

Proteus пишет всё тоже - в реальном времени симулировать не возможно.
Вот рабочий код от Vov123
Код: Выделить всё
#include <mega8535.h>
#include <stdio.h> //для sprintf
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void main(void)
{
unsigned int a;//отображаемая переменная
char ss[30]; //буфер для LCD(размер зависит от длины отображаемой строки)
ADCSRA=0b10000111; //настройкаа АЦП.Включен АЦП,прескалер максимальный
ADMUX=0b01000011; //опорное напряжение от питания,выравнивание в право(10бит),ручное преобразование,вход на ADC3
// LCD module initialization
lcd_init(20);
while (1)
{
ADCSRA.6=1; //запускаем преобазование
while(ADCSRA.6==1){}; //ждём пока идёт преобразование(пустой цикл)
a=ADCW; //результат преобразования сохраняется в регистре ADCW
sprintf(ss,"%u",a);
lcd_gotoxy(0,0); //положение в строке/номер строки(0-3)
lcd_puts(ss);
delay_ms(500);
lcd_clear();
};
}
Писал тоже самое для ATmega16 работает

.
Но странно, всё работает не смотря даже на то, что бит ADIE всегда 0Proteus не ругается, всё работает зашибись.
Пишу код вида (уже выкладывал его)
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "LCM.h"
#include "ADC.h"
#define k 202
#define b -580
unsigned char ADCresult1 = 0, ADCresult2 = 0, ADCresult = 0;
unsigned char temperatura;
void main()
{
unsigned long t;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
PORTC = 0;
PORTD = 0;
PORTB = 1;
LCMinit();
ADCinit();
SetLCMPosition(2,5);
ShowChar('V');
SREG |= (1 << 7); // прерывания разрешены
while(1)
{
t = ((((ADCresult2 << 8) + ADCresult1) * k) >> 8) + b;
temperatura = (unsigned char) t;
SetLCMPosition(1,0);
ShowChar(temperatura);
}
}
// Инициализация АЦП
void ADCinit()
{
ADMUX = (1 << 6); //АЦП работает от Vcc, прием данных по A0
ADCSRA = (1 << 7) | (1 << 6) | (1 << 3) | (1 << 2) | (1 << 1);
}
ISR (SIG_ADC)
{
ADCresult1 = ADCL;
ADCresult2 = ADCH;
ADCSRA &= ~(1 << ADIF);
ADCSRA |= (1 << 6);
}
Работает, но Proteus ругается. Это с WinAVR.
Вставляю включение/выключение прерывания
Код: Выделить всё
ADCSRA &= ~(1 << ADIE);
ADCSRA |= (1 << ADIE);
Перестаёт работать.

Если пытаюсь просто выводить символ на экран + делая инициализируя АЦП так:
Код: Выделить всё
// Инициализация АЦП
void ADCinit()
{
ADMUX = (1 << 6); //АЦП работает от Vcc, прием данных по A0
ADCSRA = (1 << 7) | (1 << 2) | (1 << 1);
}
Proteus перестаёт ругаться. Только дописываю
Код: Выделить всё
ADCSRA = (1 << 7) | (1 << 6) | (1 << 3) | (1 << 2) | (1 << 1);
Опять проблемы.
Как я понимаю какие-то проблемы в прерывании.
Надеюсь кто-нибудь меня понял, я тут такого нагородил.
Есть ли в WinAVR аналог функции sprintf? А если я библиотеку <stdio.h> перенесу в из CVAVR в WinAVR заработает?
В общем я запутался, всё конец........