• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego nie wyświetla mi się poprawna wartość temperatury?

VPS Starter Arubacloud
0 głosów
117 wizyt
pytanie zadane 9 listopada 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)

Cześć, chcę odczytać wartość pinu PC1 mikrokontrolera Atmega8a. Najpierw próbuję odczytać wartość analogową, a potem zamienić ją na cyfrową i wyświetlić w zmiennej. Dlaczego ten kod tego nie robi tylko wyświetla jakieś liczby, które na pewno nie są temperaturą?

/*
    Program to control Atmega8A
 */
#define F_CPU 8000000L

#include <avr/io.h>
#include <util/delay.h>
#include <hd44780.c>

int ADCsingleREAD(uint8_t adctouse)
{
    int ADCval;

    ADMUX = adctouse;         
    ADMUX |= (1 << REFS0);    
    ADMUX &= ~(1 << ADLAR);   

    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);    
    ADCSRA |= (1 << ADEN);    

    ADCSRA |= (1 << ADSC);    

    while(ADCSRA & (1 << ADSC));      


    ADCval = ADCL;
    ADCval = (ADCH << 8) + ADCval;    

    return ADCval;
}


int main(void)
{
    char buffer[33];
    int temperature;

    // Insert code
    DDRB |= (1 << PB0);
    LCD_Initalize(); 

    while(1)
    {
        temperature = ADCsingleREAD(1);
        itoa(temperature, buffer, 10);
        LCD_Clear();
        LCD_GoTo(2,0);
        LCD_WriteText("Temperatura : ");
        LCD_GoTo(5,1);
        LCD_WriteText(buffer);
        LCD_WriteText(" C");
        _delay_ms(500);

        PORTB |= (1 << PB0);
        _delay_ms(1000);      //  delay 1 second
        PORTB &= ~(1 << PB0);
        _delay_ms(1000);      //  delay 1 second
    }

    return 0;
}

 

komentarz 9 listopada 2020 przez tkz Nałogowiec (42,020 p.)

Dlaczego za każdym razem inicjalizujesz ADC? https://godbolt.org/z/jn14fh

#define F_CPU 16000000UL

#define TRIGPOINT 128

#include <avr/io.h>
#include <util/delay.h>

void init_ADC()
{
    // Configure ADC to be left justified, use AVCC as reference, and select ADC0 as ADC input
    ADMUX = 0b01100000;

    // Enable the ADC and set the prescaler to max value (128)
    ADCSRA = 0b10000111;
}

int get_ADC_value()
{
    // Start an ADC conversion by setting ADSC bit (bit 6)
    ADCSRA = ADCSRA | (1 << ADSC);

    // Wait until the ADSC bit has been cleared
    while (ADCSRA & (1 << ADSC))
        ;
    return ADCH;
}

int main(void)
{
    /* set pin 5 of PORTB for output*/
    DDRB |= _BV(DDB5);

    // Configure PORT C bit 0 to an input
    DDRC = 0b00000000;

    init_ADC();

    while (1)
    {
        if (get_ADC_value < TRIGPOINT)
        {
            // Turn LED on
            PORTB |= _BV(PORTB5);
        }
        else
        {
            // Turn LED off
            PORTB &= ~_BV(PORTB5);
        }
    }
}

Nie wiem, czy będzie działał 1:1, ponieważ jest na 328p.

1
komentarz 9 listopada 2020 przez Oscar Nałogowiec (29,340 p.)
Będzie trochę łatwiej jak podasz jakie wyniki otrzymujesz, czy te wyniki zależą jakoś wyraźnie od temperatury i, jeśli tak, to czy rosną, czy maleją z temperaturą.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 106 wizyt
pytanie zadane 23 listopada 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
2 odpowiedzi 246 wizyt
pytanie zadane 15 stycznia 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
2 odpowiedzi 139 wizyt
pytanie zadane 5 listopada 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)

93,020 zapytań

141,985 odpowiedzi

321,284 komentarzy

62,366 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...