AVR Atmega8 ADC输入导致崩溃

时间:2015-08-25 22:10:09

标签: avr avr-gcc atmega

我正在尝试通过我的ATmega8的ADC0读取电压电平,因为查询了1针4x4矩阵键盘。问题是,每当我向ADC施加高于GND的电压时,Atmega就会停止工作。 PWM输出仍然有效,但无法通过i2c进行通信,LCD清晰。 我的布线很简单,AREF& AVCC设置为5V,GND设置为GND,PC0设置为输入。有什么我没注意到的吗?谢谢您的帮助。 这是我的代码:

void Initialisierung(void)
{
char text [2];
lcd_init();
cli();
//### TWI
init_twi_slave(SLAVE_ADRESSE);          //TWI als Slave mit Adresse slaveadr starten 
sei();
lcd_setcursor( 0, 1 );
lcd_string(">Booting...");
lcd_setcursor( 0, 2 );
    itoa (SLAVE_ADRESSE,text,16);
lcd_string("I2C Adress=0x");
    lcd_string(text);
    for (int Index=0; Index<85; ++Index) {
        rxbuffer[Index] = 0x20;
    }
    rxbuffer[81]=0xFF;
    rxbuffer[82]=0xFF;
    rxbuffer[83]=0xFF;
    rxbuffer[84]=0xFF;
}
//update LCD
void lcd_update(void){
for (int o=1;o<=4; o++)
for (int i=1; i<=20; i++){
    lcd_setcursor( i-1, o );
    lcd_data(rxbuffer[i+((o-1)*20)]);
}
}

这是主要功能:

int main(void)
{
DDRC &= ~(1 << PC0);
PORTC &= ~(1 << PC0);
Initialisierung();
DDRB = (1 << DDB1) | (1 << DDB2);
OCR1A = eeprom_read_word(&brightness); // PWM einstellen,
OCR1B = eeprom_read_word(&contrast);
ICR1 = 1000;  // TOP-wert

TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); // 2-Kanal "non-inverting"
TCCR1B = (1<<WGM13)|(1<<WGM12) | (1<<CS11);

//Initialize ADC
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);
ADMUX=0x00;
unsigned int adc_value=0; // Variable to hold ADC result

char text[2];
while(1)
{
    ADCSRA |= (1<<ADSC); // Start conversion
    while (ADCSRA & (1<<ADSC)); // wait for conversion to complete
    adc_value = ADCW; //Store ADC value
    itoa (adc_value,text,16);
    lcd_setcursor( 0,4 );
    lcd_string(text);
    for (int Index=0; Index<85; ++Index) {
        txbuffer[Index] = rxbuffer[Index];
    }
    uint16_t brightness_i2c=0;
    uint16_t contrast_i2c=0;

    brightness_i2c=(rxbuffer[81]<<8)|(rxbuffer[82]);
    contrast_i2c=(rxbuffer[83]<<8)|(rxbuffer[84]);
    if (rxbuffer[0]==1){
                 lcd_update();
        rxbuffer[0]=4;
    }else if(brightness_i2c!=eeprom_read_word(&brightness) && brightness_i2c!=0xFFFF){
    eeprom_write_word(&brightness,brightness_i2c);
        OCR1A = eeprom_read_word(&brightness);

    }else if (contrast_i2c!=eeprom_read_word(&contrast) && contrast_i2c!=0xFFFF){
        eeprom_write_word(&contrast,contrast_i2c);
        OCR1B = eeprom_read_word(&contrast);

    }else{
         for (uint8_t i=0; i<50; i++) _delay_ms(10);
        lcd_setcursor( 19, 4 );
        lcd_data(0xFF);


       for (uint8_t i=0; i<50; i++) _delay_ms(10);

        lcd_setcursor( 19, 4 );
        lcd_data(0x20);

    }

} 
}

0 个答案:

没有答案