В общем, так как мне не удалось запрограммировать атмегу328 (avr910 не дружит с ней(, пришлось переделывать код под атмегу 8. И опять не работает. На 1 индикаторе горит ноль.
С атмегой 328 все прекрасно работало а тут... хз.
код для 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 = 255;// СЧЕТ ДО 50
TIMSK |= (1<<OCIE2); // прерывание по совпадению
sei();
while(1)
{
z0 = readADC(0);
z1 = readADC(1);
z2 = readADC(2);
z3 = readADC(3);
}
}
Новая папка (3).rar