Chip signature mismatch
Read: Byte0=0x00 Byte1=0x03 Byte2=0x05
Must be: Byte0=0x1E Byte2=0x90 Byte2=0x07
так же не могу считать фьюзы с чипа, работает только ресет... прошивал в CVAVR, программатором AVR910, на фьюзах выставил вот такие галочки: CKSEL1, SUT0, SUT1, CKDIV8. Контакты проверял, все нормально все работает.
Вторая проблема. Вроде рассчитал время правильно. Чип от внутреннего генератора 4,8MHz. Настраивал счетчик лопатит на 18,75кГц, указываем значение регистра сравнения равное 0хF0 равно 250, 18750/250=75 в секунду. Задаю в коде 20 секунд, потом включение... в протусе насчитает 20, в железе за 40 переваливает((
код представил ниже, помогите разобраться до конца, что не так сделал с прошивкой тиньки и код, где косяк по отсчету секунд?
Алгоритм следующий, если на улице стемнело, больше указного порога который мы записали в ЕППРОМ, ждем 20 сек, если все так же темно, но включаем прожектор. И наоборот если стало светло, то через 20 сек выключаем свет. Кнопкой на PORTB.0 мы программируем порог включения-отключения света простым нажатием. Светодиод на PORTB2 показывает что якобы записали.
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
unsigned int timer; // наша переменная
unsigned int s; // наша переменная для секунд
int s1=0; // наша переменная флага
eeprom int adc; //объявляем численную переменную, хранящийся в ЕППРОМ
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
timer++;// увеличиваем переменную
if(timer==75) {s++; timer=0;} //75 равно 1 секунде, и обнуляем
TCNT0=0x00; // после выполнения кода счетчик сбрасываем
}
#define ADC_VREF_TYPE 0x00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
void main(void)
{
int i; // переменная хранящаяся в SRAM
int eeprom *adc; // указатель ЕЕПРОМ
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State5=T State4=T State3=T State2=0 State1=0 State0=P
PORTB=0x01;
DDRB=0x06;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 18,750 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 13,653 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0xFA;// 18750/250=75 тиков в сек, FA=250
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);
// ADC initialization
// ADC Clock frequency: 75,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// Global enable interrupts
#asm("sei")
s1=0; //флаг сброшен
i=*adc; //считали значения из памяти по указателю
while(1){
//*************БЛОК ВКЛЮЧЕНИЯ ПРОЖЕКТОРА*************
if((read_adc(2) < i) && (s1 == 0)){//если света меньше заданного порога и флаг сброшен
s1 = 1;//включаем флаг
s = 0;//секунды в ноль
}
if(s1 == 1){//если по прежнему сохраняется условие
if(s == 20){//насчитал больше 20 сек
PORTB.1 = 1;//вкл. прожектор
s1 = 0;}//сбросил флаг
}
//*****************************************************
//************БЛОК ВЫКЛЮЧЕНИЯ ПРОЖЕКТОРА***************
if((read_adc(2) > i) && (s1 == 0)){//если света больше заданного порога
s1 = 2;//меняем флаг
s = 0;//секунды в ноль
}
if(s1 == 2){//условие сохраняется
if(s == 20){//отсчитали 20 сек
PORTB.1 = 0;//выкл. прожектор
s1 = 0;}//флаг сбросили
}
//******************************************************
//***********Запись в ЕЕПРОМ****************************
if (PINB.0==0){//нажали на кнопку
PORTB.2=1;
delay_ms(200);//светодиод моргнул
PORTB.2=0;
delay_ms(2000);//подождали 2 сек
i=read_adc(2);*adc=i;//переменная равна значению АЦП, записываем значение АЦП по указателю в ЕППРОМ
PORTB.2=1;
delay_ms(200);
PORTB.2=0;
delay_ms(500);
PORTB.2=1;
delay_ms(200);//три раза моргнули светодиодом, фигня полнейшая
PORTB.2=0;
delay_ms(500);
PORTB.2=1;
delay_ms(200);
PORTB.2=0;
}
}
}


