Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 30 cze 2026, o 01:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 9 lis 2015, o 23:22 
Offline
Nowy

Dołączył(a): 18 lip 2014
Posty: 5
Pomógł: 0

Witam,
chciałem zrobić cykliczny odczyt wartości napięcia na mikrokontrolerze ATmega32.
Kod PRAWIE działa, aby odświeżyć pomiar muszę wgrać panownie program do ATmegi.
Gdzie może być problem?

Kod:
#include<avr/io.h>
#include<util/delay.h>
#include"HD44780.h"

volatile int a=0;
volatile float wynikV=0;
volatile int calosc=0;
volatile int reszta;
char wynik[4];
char wynik2[4];

int main(void)
{

ADMUX|=(1<<REFS0);
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<MUX0)|(1<<MUX2);
ADCSRA|=(1<<ADSC);
   LCD_Initalize();   //inicjalizacja LCD


   LCD_GoTo(0, 0);      //Ustawienie kursora w pozycji (0,0)
   LCD_WriteText("Napiecie : ");
   LCD_GoTo(16,0);
   LCD_WriteText("Volt");
   LCD_GoTo(12,0);
   LCD_WriteText(",");



   while(1)
   {
            a=(0b00000011&ADCH)*256+ADCL;
            wynikV=a*5;
            wynikV=wynikV/1023;
            calosc=wynikV;
            reszta=wynikV*100-calosc*100;

            itoa(calosc,wynik,10);
            itoa(reszta,wynik2,10);
            LCD_GoTo(11,0);
            LCD_WriteText(wynik);

            LCD_GoTo(13,0);
            LCD_WriteText(wynik2);
           _delay_ms(500);
}
return 0;
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2015, o 00:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Przede wszystkim wstaw kod wg tej instrukcji topic7402.html

Ta linia włącza pomiar
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A gdzie się ona znajduje w twoim programie? Na początku funkcji main przed pętlą główną. Czyli po starcie programu następuje jednorazowy pomiar, potem program przechodzi do pętli głównej, w której nie ma polecenia dokonania pomiaru.

Polecam obejrzenie tych poradników
http://mirekk36.blogspot.com/2013/06/pr ... acych.html
http://mirekk36.blogspot.com/2013/06/pr ... sc-02.html
http://mirekk36.blogspot.com/2013/06/pr ... sc-03.html
http://mirekk36.blogspot.com/2013/06/pr ... sc-04.html
http://mirekk36.blogspot.com/2013/07/pr ... sc-05.html
http://mirekk36.blogspot.com/2013/12/pr ... sc-06.html
http://mirekk36.blogspot.com/2014/02/av ... filtr.html

Trochę tego jest ale warto. Na pewno wiele ci się wyjaśni.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2015, o 09:10 
Offline
Nowy

Dołączył(a): 18 lip 2014
Posty: 5
Pomógł: 0

Nawet gry umieściłem ADCSRA |= (1<<ADSC) w pętli while to i tak nie pomogło ;-/

------------------------ [ Dodano po: 50 minutach ]

Próbowałem też coś takiego :
Kod:
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // podzial F_cpu przez 128, ma być 50-200KHz
ADMUX |= ((1 << REFS0)|(0<< REFS1));
ADMUX |= (0 << ADLAR);
ADMUX |= ((0 << MUX1)|(0<< MUX2)|(0 << MUX3)|(0<< MUX4)|(0<<MUX1));
ADCSRA |= (1 << ADATE);
ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADSC);

Ale też nie działa

Może problem jest w innym miejscu z kodzie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2015, o 19:30 
Offline
Nowy

Dołączył(a): 18 lip 2014
Posty: 5
Pomógł: 0

Rozwiązałem problem

ustawienia ADC :
Kod:
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); //Podział 8MHz przez 64 (zakres musi byc miedzy 50kHz a 200kHz)
ADMUX |= ((1 << REFS0)|(0<< REFS1)); //Vref to napięcie zasilania
ADMUX |= (0 << ADLAR); // wynik przesuniety do lewej, caly wynik znaczacy w ADCH, ostatnie bity (po przecinku) w ADCL
ADMUX |= ((0 << MUX1)|(0<< MUX2)|(0 << MUX3)|(0<< MUX4)|(0<<MUX1)); //Ustawiamy ADC0 jako aktywne
ADCSRA |= (1 << ADATE); // to wlacza przetwornik w tryb dzialania ciaglego
ADCSRA |= (1 << ADEN); // to wlacza przetwornik
ADCSRA |= (1 << ADSC); // start przetwarzania od tego momentu adc mierzy w kolko


zmieniłem kod
Kod:
a=(0b00000011&ADCH)*256+ADCL
na
Kod:
a=ADCW
, choć nie wiem co to za różnica

dodatkowo zmieniłem opóźnienie z 500 ms na 1 ms i wszystko zaczęło pięknie działać



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO