Witam,
stworzyłem program, który za zadanie ma odczytywać wartość temperatury z czujnika LM35 podłączonego do portu ADC0 i wyświetlać ją na wyświetlaczu LED. Czujnik działa na +5V, Vout idzie przez rezystor 1k. Na samym początku przez przypadek podłączyłem odwrotnie bieguny czujnika, czy przez to mógł zostać on lub ADC ATMegi uszkodzony? Wyświetlacz podłączony jest do portów D i B, poza tym podłączony jest kwarc zegarkowy, gdyż mam zamiar także zaimplementować odmierzanie czasu. Kod wygląda tak:
Mimo to na wyświetlaczu co sekundę wyświetlają się losowo kosmiczne wartości, skokowo od 10 do 90 itp., nawet po odłączeniu czujnika LM35 (jak gdyby nic on nie dawał). Czy to coś nie tak w kodzie, czy sprzęcie?
stworzyłem program, który za zadanie ma odczytywać wartość temperatury z czujnika LM35 podłączonego do portu ADC0 i wyświetlać ją na wyświetlaczu LED. Czujnik działa na +5V, Vout idzie przez rezystor 1k. Na samym początku przez przypadek podłączyłem odwrotnie bieguny czujnika, czy przez to mógł zostać on lub ADC ATMegi uszkodzony? Wyświetlacz podłączony jest do portów D i B, poza tym podłączony jest kwarc zegarkowy, gdyż mam zamiar także zaimplementować odmierzanie czasu. Kod wygląda tak:
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <string.h>
const unsigned char cyferki[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
const unsigned char ledy[] = {0x02,0x01};
unsigned char led;
unsigned int tick;
uint16_t temp;
int text[8];
void StartADC(void)
{
ADMUX = (1<<REFS0);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
uint16_t CzytajADC(uint8_t ch)
{
ch=ch&0b00000111;
ADMUX|=ch;
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
return(ADC);
}
SIGNAL (SIG_OUTPUT_COMPARE2)
{
if (++tick == 512)
{
temp = CzytajADC(0);
itoa(temp, text, 10);
}
led++;
if (led == 2) led = 0;
PORTB = 0x03;
PORTD = cyferki[atoi(text[led])];
PORTB = ledy[led];
}
void StartLED(void)
{
DDRB=_BV(PB0)|_BV(PB1);
DDRD=_BV(PD0)|_BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4)|_BV(PD5)|_BV(PD6)|_BV(PD7);
ASSR=_BV(AS2);
TCNT2=0;
OCR2=7;
TCCR2=_BV(WGM21)|_BV(CS21);
while (ASSR&(_BV(TCN2UB)|_BV(OCR2UB)|_BV(TCR2UB)));
TIMSK=_BV(OCIE2);
}
int main(void)
{
//INICJACJA WYŚWIETLACZA LED
StartLED();
//ODPALANIE TERMOMETRU
StartADC();
//OBSŁUGA PRZERWAŃ
sei();
//SLEEP MODE - LED WYŚWIETLACZ
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
//PĘTLA
while(1) sleep_mode();
return 0;
}
Mimo to na wyświetlaczu co sekundę wyświetlają się losowo kosmiczne wartości, skokowo od 10 do 90 itp., nawet po odłączeniu czujnika LM35 (jak gdyby nic on nie dawał). Czy to coś nie tak w kodzie, czy sprzęcie?
