Witam.
Ten kawałek kodu ręcznie przepisałem z przykładu pana CEZARY KLIMASZ kod jest na atmegę8 ale zdefiniowałem odpowiednie porty mojej atmegi32 chcąc zapoznać się na tym przykładzie jak napisać program obsługi ADC wprowadzając następnie dwa stałe progi napięć w celu włączanie i wyłączania np; prostownika ładującego akumulator. Niestety, gdzieś jest błąd, którego nie potrafię znaleźć. Linie obsługi wyświetlacza zremowałem szukając błędu w kodzie ADC..
Ten kawałek kodu ręcznie przepisałem z przykładu pana CEZARY KLIMASZ kod jest na atmegę8 ale zdefiniowałem odpowiednie porty mojej atmegi32 chcąc zapoznać się na tym przykładzie jak napisać program obsługi ADC wprowadzając następnie dwa stałe progi napięć w celu włączanie i wyłączania np; prostownika ładującego akumulator. Niestety, gdzieś jest błąd, którego nie potrafię znaleźć. Linie obsługi wyświetlacza zremowałem szukając błędu w kodzie ADC..
//---------------------------------------------------------------
// >>>>>>>>>>>> V O L T O M I E R Z <<<<<<<<<<<<<<<<<
//---------------------------------------------------------------
//################## procesor ATmega 16Mhz ######################
//---------------------------------------------------------------
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <HD44780.c>
// >>>>>>>>>>>>>> definicje stałych i zmiennych <<<<<<<<<<<<<<<<
#define PORT_AD PORTA // port z wejściami analogowymi
#define DDR_AD DDRA //
#define DDR_MPX DDRB // port sterujący multiplexerem kodzie dwójkowym
// >>>>>>>>>>>>>>>>>> main <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
volatile float volt; // obliczanie wartości napięcia
volatile uint8_t counter; // licznik co który pomiar pobierać
volatile float aku_home, solar; // osobny wynik dla każdego pomiaru
// >>>>>>>>> pomiar i monitorowanie dwu anapięć <<<<<<<<<<<<<<<
SIGNAL(SIG_ADC) // przerwanie po zakończeniu
przetwarzania
{
volt=(float)(ADCL | (ADCH<<8))/1024*Vref; // obliczanie napięcia na wejściu
counter++; // zwiększanie licznika
if(counter==30)
{
if(bit_is_set(ADMUX,MUX0)) // w zależności od ustawienia kanału
{
aku_home=volt; // pobranie pomiaru
ADMUX&=~_BV(MUX0); // przełączenie kanału
}
else
{
solar=volt; // pobranie pomiaru
ADMUX=_BV(MUX0); // przełączenie kanału
}
counter=0; // wyzerowanie
licznika
}
// ------------------------------------------------------------------------
void int_adc(void)
{
ADCSR = _BV(REFS0)|_BV(RESFS1); // wewnętrzne napięcie referencyjne
ADCSR = _BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2); // preskaler fcpu/128=125 khz
ADCSR = _BV(ADEN)|_BV(ADSC)|_BCV(ADFR)|_BV(ADIE)|
}
int main(void)
{
int_adc(); // aktywacja ADC
sei(); // zwolnienie
przerwańglobalnych
for(;;) // petla nieskończona
{}
return 0;
}
//--------------------------------------------------------------------------
// >>>>>>>>>>>>>>> sprawdzanie napięcia na ADC 0 <<<<<<<<<<<<<<<
// ustawianie progów napięć min (10.5V / max (14.6V
//--------------------------------------------------------------------------
// >>>>>>>>>>>>>> obsługa LCD 2 x 16 <<<<<<<<<<<<<<<<<<<<<<<<<<<
//{
// LCD_Initalize();
// LCD_Clear();
// {
// LCD_GoTo(0,0); // kursor na 1 lini 1 znak
// LCD_WriteText(aku_home); // wyświetl w 1 lini 1 znak
// LCD_GoTo(8,0); //kursor na 1 lini 9 znak
// LCD_WriteText(solar); // wyświetl w 1 lini 9 znak
// }
// to tylko podgląd czy coś wyświtla
// {
// LCD_GoTo(0,1); // kursor na początek drugiej linii
// LCD_WriteText("MONITOROWAMNIE NAPIEC"); // wyświetl w 2 lini 1 pola
// }
// >>>>>>>>>>>>>>>>>>>>>>>>>END<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 