Не Работает Схема В Протеусе

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
igorek1999
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт май 26, 2011 10:32:58
Откуда: украина,харьков

Не Работает Схема В Протеусе

Сообщение igorek1999 »

Здравствуйте. Внезапно перестала работать программа. До этого несколько раз загружал прошивку и все работало отлично. Сейчас на индикаторе нечего не отображается. Сейчас могут очень быстро мигнуть какие то сегменты (раз в 10-20 секунд) и все.
Что делает программа: постоянно в режиме реального времени выводит значение на четырехразрядный семисегментник. Каждая цифра выставляется отдельно с помощью переменников через ацп. МК атмега-328п
Спасибо.

Код: Выделить всё

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//#include <avr/interrupt.h>

unsigned char razryad = 1;
int adc = 0;
int z1 = 0;
int z2 = 0;
int z3 = 0;
int z4 = 0;


void log()
{
	short zyfra[] =
	{
		0b00111111, //0
		0b00000110, //1
		0b01011011, //2
		0b01001111, //3
		0b01100110, //4
		0b01101101, //5
		0b01111101, //6
		0b00000111, //7
		0b01111111, //8
		0b01101111  //9
	};
	if (adc <= 102) { PORTD = zyfra[0];} else {
		if ((adc > 102)&&(adc <=204)) { PORTD = zyfra[1];} else {
			if ((adc > 204)&&(adc <=306)) { PORTD = zyfra[2];} else {
				if ((adc > 306)&&(adc <=408)) { PORTD = zyfra[3];} else {
					if ((adc > 408)&&(adc <=510)) { PORTD = zyfra[4];} else {
						if ((adc > 510)&&(adc <=612)) { PORTD = zyfra[5];} else {
							if ((adc > 612)&&(adc <=714)) { PORTD = zyfra[6];} else {
								if ((adc > 714)&&(adc <=816)) { PORTD = zyfra[7];} else {
									if ((adc > 816)&&(adc <=918)) { PORTD = zyfra[8];} else {
										if ((adc > 918)&&(adc <=1023)) { PORTD = zyfra[9];} 
										}
									}
								}
							}
						}
					}
				}
			}
		}
}
void timer ()  // инициалияция таймера 0;
{     
TCCR0A = 0b00000010; // режим подсчета импульсов (сброс при совпадении);
TCCR0B = 0b00000100; // установка режима тактирования - тактовый генератор CLK/256;
TIMSK0 = 0b00000010; // разрешение прерывания при совпадении с А ;
OCR0A = 50;           // счетный регистр;
}
void ACP ()
{
	ADMUX = 0b01001111; // источник опорного напряжения - напряжение питания, аналоговые входы подключить на землю
	ADCSRA = 0b10000110; // включить ацп, делитель частоты 64
}
ISR( TIMER0_COMPA_vect)
{  
asm("cli");
switch (razryad)
{
	case 1:
	   ADMUX = 0b01000000;
	   ADCSRA = 0b11000110; //запускаем преобразование
	   ADCSRA = 0b10000110; // завершаем преобразование
	   adc = ADCW;	   	   
	   PORTB =~0b00000001;
	     log();
		 z1 = PORTD;
	   break;
	   
	   
	case 2:
	ADMUX = 0b01000001;
	ADCSRA = 0b11000110; //запускаем преобразование
	ADCSRA = 0b10000110; // завершаем преобразование
	   adc = ADCW;
	   PORTB =~0b00000010;	
	     log();
		  z2 = PORTD;
	   break;
	   
	   
	case 3:
	ADMUX = 0b01000010;
	ADCSRA = 0b11000110; //запускаем преобразование
	ADCSRA = 0b10000110; // завершаем преобразование
	   adc = ADCW;
	   PORTB =~0b00000100;	
	    log(); 
		 z3 = PORTD;
	   break;
	   
	   
	case 4:
	ADMUX = 0b01000011;
	ADCSRA = 0b11000110; //запускаем преобразование
	ADCSRA = 0b10000110; // завершаем преобразование
	   adc = ADCW;
	   PORTB =~0b00001000;
	   	 log(); 
		  z4 = PORTD;
	   break;
	   asm("sei");
}
razryad++;
if (razryad > 4)   
{razryad = 1;}
}
void preset(){   //инициализация портов;
	          DDRD = 0b11111111;
	          PORTD = 0b11111111;
	          DDRB = 0b11111111;
	          PORTB = 0b00000000;
			  DDRC = 0b00000000;
			  }
int main(void)
{   preset();                      
	timer();
	ACP();                             
	asm("sei"); 
			while(1) 
	        {    
		        
	                  while(1) 
	                          {   
								  
				                  asm("nop");
				                  if (z1 == 109) {break;} 
				
			                  }
							  //на PORTD.7 устанавливается 1
				  
							    
	         }
			 
			 
}            
Вложения
999.JPG
(246.55 КБ) 311 скачиваний
проект испр.rar
(24.21 КБ) 125 скачиваний
игорь
Реклама
Аватара пользователя
igorek1999
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт май 26, 2011 10:32:58
Откуда: украина,харьков

Re: Не Работает Схема В Протеусе

Сообщение igorek1999 »

В общем, так как мне не удалось запрограммировать атмегу328 (avr910 не дружит с ней(, пришлось переделывать код под атмегу 8. И опять не работает. :( На 1 индикаторе горит ноль. Сейчас собрал в железе - то же самое(
С атмегой 328 все прекрасно работало а тут... хз. Подскажите, пожалуйста, где ошибка. :dont_know:
код для 328, работает:

Код: Выделить всё

/*
* projektatmega328.c
*
* Created: 07.03.2016 23:16:47
* Author: игорь
*/

//mega328
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int z0,z1,z2,z3,count;
//----------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9--
//unsigned char seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //общий анод
unsigned char seg[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //общий катод
void pereschet(unsigned int adc){
if (adc <= 102) { PORTD = seg[0];}
if ((adc > 102)&&(adc <=204)) { PORTD = seg[1];}
if ((adc > 204)&&(adc <=306)) { PORTD = seg[2];}
if ((adc > 306)&&(adc <=408)) { PORTD = seg[3];}
if ((adc > 408)&&(adc <=510)) { PORTD = seg[4];}
if ((adc > 510)&&(adc <=612)) { PORTD = seg[5];}
if ((adc > 612)&&(adc <=714)) { PORTD = seg[6];}
if ((adc > 714)&&(adc <=816)) { PORTD = seg[7];}
if ((adc > 816)&&(adc <=918)) { PORTD = seg[8];}
if ((adc > 918)&&(adc <=1023)) { PORTD = seg[9];}
}
ISR( TIMER0_COMPA_vect){
PORTB |= (1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0);
if(count==0){PORTB &=~(1<<PB0); pereschet(z0);}
if(count==1){PORTB &=~(1<<PB1); pereschet(z1);}
if(count==2){PORTB &=~(1<<PB2); pereschet(z2);}
if(count==3){PORTB &=~(1<<PB3); pereschet(z3);}
count++;
if(count == 4){count=0;}
}
int readADC(unsigned int ch){
switch (ch){
case 0: ADMUX &= ~((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));break;
case 1: ADMUX |= ((0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0));break;
case 2: ADMUX &=~(1<<MUX0); ADMUX|=(1<<MUX1);break;
case 3: ADMUX |= (1<<MUX0);break;
}
_delay_us(10);
ADCSRA |= (1<<ADSC);//запуск преобразования
while ((ADCSRA &(1<<ADSC)));//ожидание окончания преобразов.
return ADC;}
int main(void)
{
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
PORTB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3);
DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6);
PORTD &=~(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6);

ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADMUX |= (1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0);

TIMSK0 |= (1<<OCIE0A);
TCCR0A |= (1<<WGM01);
TCCR0B |= (1<<CS02)|(0<<CS01)|(1<<CS00);
OCR0A = 50;

sei();

while(1)
{
z0=readADC(0); z1=readADC(1); z2=readADC(2); z3=readADC(3);
}
}



код для атмеги 8, не работает:

Код: Выделить всё

/*
* projektatmega8.c
*
* Created: 08.03.2016 0:02:05
* Author: игорь
*/

//mega8
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int z0,z1,z2,z3,razryad;
unsigned char seg[] =
{ 0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4
0b01101101, //5
0b01111101, //6
0b00000111, //7
0b01111111, //8
0b01101111 //9
};

void pereschet(unsigned int adc){
if (adc <= 102) { PORTB= seg[0];}
if ((adc > 102)&&(adc <=204)) { PORTB = seg[1];}
if ((adc > 204)&&(adc <=306)) { PORTB = seg[2];}
if ((adc > 306)&&(adc <=408)) { PORTB = seg[3];}
if ((adc > 408)&&(adc <=510)) { PORTB = seg[4];}
if ((adc > 510)&&(adc <=612)) { PORTB = seg[5];}
if ((adc > 612)&&(adc <=714)) { PORTB = seg[6];}
if ((adc > 714)&&(adc <=816)) { PORTB = seg[7];}
if ((adc > 816)&&(adc <=918)) { PORTB = seg[8];}
if ((adc > 918)&&(adc <=1023)) { PORTB = seg[9];}
}
ISR( TIMER2_COMP_vect)
{
PORTD|=(1<<PD3)|(1<<PD2)|(1<<PD1)|(1<<PD0);
if (razryad == 0){PORTD&=~(1<<PD0); pereschet(z0);}
if (razryad == 1){PORTD&=~(1<<PD1); pereschet(z1);}
if (razryad == 2){PORTD&=~(1<<PD2); pereschet(z2);}
if (razryad == 3){PORTD&=~(1<<PD3); pereschet(z3);}
razryad++;
if (razryad == 4) {razryad = 0;}
}
int readADC(unsigned char mux)
{
switch (mux)
{
case 0: ADMUX &= ~((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));break;
case 1: ADMUX |= ((0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0));break;
case 2: ADMUX &=~(1<<MUX0); ADMUX|=(1<<MUX1);break;
case 3: ADMUX |= (1<<MUX0);break;
}
_delay_us(10);
ADCSRA |= (1<<ADSC);//запуск преобразования
while((ADCSRA &(1<<ADSC))); // ждем завершения преобразования
return ADC;
}
int main(void)
{
DDRB = 0b11111111;
PORTB = 0b00000000;
DDRD = 0b11111111;
PORTD = 0b11111111;

ADMUX |= (0<<REFS1)|(1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0);//ион - напряжение питания, ножки входа ацп подключить к земле
ADCSRA |= (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADC|= ~(1<<ADLAR); // делитель для ацп - делитель на 128

TCCR2 |= (1<<WGM21)|(0<<WGM20)|(1<<CS22)|(1<<CS21)|(1<<CS20); // сброс при совпадении и делитель на 1024
OCR2 = 65;//
TIMSK |= (1<<OCIE2); // прерывание по совпадению
sei();

while(1)
{
z0 = readADC(0);
z1 = readADC(1);
z2 = readADC(2);
z3 = readADC(3);
}
}
Вложения
проект.rar
(67.86 КБ) 124 скачивания
атмега328.JPG
(247.82 КБ) 384 скачивания
игорь
Реклама
Ответить

Вернуться в «AVR»