Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?)

-nobile- 23 Lut 2010 15:36 6057 46
  • #1 23 Lut 2010 15:36
    -nobile-
    Poziom 16  

    Witam, mam wielki problem bo murze wykonać projekt do szkoły na najbliższy poniedziałek a wszystko jak na złość nie chce mi działać.
    Musze wykonać klawiaturę dotykowa (touchscreen-a SE P1).

    W takim wypadku trzeba użyć przetwornika ADC w atmedze.
    nie dość ze mój program nie działa to jeszcze nawet program ze strony projektu nie chce sie również uruchomić http://www.voytek.tkdami.net/programy/adc/Przetwornik_AC.html

    Próbowałem ten z wyświetlaniem wyniku na diodach LED ( za każdym razem dostawałem inny wynik - bardzo duża rozbieżność)

    Próbowałem również projekt z wyświetlaczem 2x16 (również wyświetlacz nie reaguje - świeci pierwsza linia)

    Z problemme zmagam sie juz od 4-5 dni i czuje sie już zrezygnowany. Układ łączyłem od nowa jakieś 3-5 razy próbowałem na 3 różnych Atmegach (jednej 8 i dwóch 16)

    Wszystko łączone na płytce stykowej, programowanie USBASP, kompilowane w WinAVR.

    Jeśli uważacie ze układy z tej strony którą podałem sa na 100% poprawne to wykonam ostatecznie płytkę drukowaną i wlutuje wszystkie elementy.

    Miałem odczytać pomiary przez RS232 na komputerze (MAX232) ale skoro nie chce mi wyświetlić wyniku na diodach to nie ma mowy o przesłaniu do kompa -.-'

    Podajcie jakiś projekt który na 100% zadziała.

    Bardzo proszę was o pomoc, chciałbym w końcu uruchomić ten przetwornik AC w atmedze.

    Jeśli ktoś zechce pomóc mi indywidualnie (GG, Skype co kolwiek) oddam wszytskie punkty(mam ich nie wiele) ostatecznie nawet zaplace.

    0 29
  • Mitronik
  • #2 23 Lut 2010 16:04
    wdogli
    Poziom 18  

    Witam.
    Chętnie Ci pomogę ale napisz proszę co tak na prawdę chcesz zrobić. Co to jest za klawiatura którą chcesz uruchomić i na jakiej zasadzie działa. W projektach które przytaczasz nie ma żadnej klawiatury tylko jest pojedyńczy przycisk który wyzwala działanie czyli odczyt z przetwornika.
    Pozdrawiam

    0
  • #3 23 Lut 2010 16:13
    -nobile-
    Poziom 16  

    W projektach które podałem jest obsługa przetwornika AC (którego właśnie nie mogę uruchomić). I na razie tylko to mnie interesuje, bo jeśli pomiar napięcia będzie działał to już z napisaniem programu do obsługi dotykowej klawiatury (czyt dotykowego wyświetlacza) chyba sobie poradzę.

    Nie wiem jakie jeszcze dane mogę wam podać bo nawet na fotce układu nie za bardzo będzie widać co i jak połączone.

    [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?)

    przez przypadek jeden kabelek jest wypięty na zdjęciu, ale jak jest podłączony nie ma żadnych zmian.

    Dołączam również zdjęcia dotyku (klawiatury) jesli ktoś nie wie o co mi chodzi. Ale jak wcześniej wspomniałem problem tkwi w niedziałającym przetworniku ADC

    [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?) [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?)

    0
  • #4 23 Lut 2010 16:51
    wdogli
    Poziom 18  

    Z tego co widzę stosujesz chyba Atmegę16.
    Wklej jeszcze proszę program który napisałeś dla tej atmegi i dodaj jakieś kondensatory filtrujące na poszczególnych napięciach.
    Pozdrawiam

    0
  • #5 23 Lut 2010 16:59
    -nobile-
    Poziom 16  

    Program dla atmegi 16 jest ten sam co dla 8 tylko zmieniłem ustawienia w pliku makefile.

    Myślę ze nawet pomimo braku kondensatorów filtrujących na wyświetlacz powinien zadziałać...
    Na atmedze 8 sprawa wyglądała tak samo, tyle ze tutaj podłączyłem układ do 16 która nie była używana aby mieć pewność ze jest 100% sprawna.

    program który wgrałem.

    Code:

    /*
    ************************************************************************ 
      Nazwa pliku -  ADC_przyk3.c
      Autor - Wojciech Chojnacki.
      http://www.tkdami.net/~voytek/
      voytek(malpa)tkdami.net
      Data -  24-04-2005
      Procesor Atmel ATmega 
      Przykład serii konwersji wyzwalanej przyciskiem. Obliczenie średniej.
      Wynik wyświetlany na LCD.
      Licencja - GPL
      Wykorzystuje biblioteki Petera Fleury     
      http://homepage.sunrise.ch/mysunrise/peterfleury/index.html
      Modyfikowany -
    ************************************************************************
    */

    #include <avr/io.h>
    #include <stdlib.h>
    #include "lcd.h"

    // Zdefiniowanie uzywanych portów.
    #define PORT_AD PORTC      // Port z wejściami analogowymi
    #define DDR_AD DDRC         
    #define PORT_F PORTB      // Port do którego przyłączony jest przycisk. Bit 4 tego portu
                         // jest wykorzystany jako flaga naciśnięcia klawisza
    #define DDR_F DDRB
    #define PIN_F PINB

    unsigned int licznik;      // Zmienna do zliczania obiegów pętli
    unsigned int pomiar;      // Zmienna do przechowywania wyniku pomiaru
    unsigned char i;         // Ilośc pomiarów dokonywanych po nacisnięciu przycisku
    unsigned int wynik;         // Zmienna do liczenia średniej z wyników pomiaru
    char buffer_n[5];           // Bufor do przechowywania wyniku konwersji z "unsigned int" na ASCII


    void Inicjalizacja(void)
    {
       DDR_AD=0x00;      // Port jako wejścia
       PORT_AD=0x00;      // Port C wejścia bez podciągania
       DDR_F=0xF0;         // Młodsza połowa portu jako wejścia starsze cztery bity jako wyjścia
       PORT_F=0xFF;      // Wejścia z podciąganiem wyjścia w stanie wysokim
       
    // Inicjalizacja LCD 
       lcd_init(LCD_DISP_ON);         // Inicjalizacja wyswietlacza




          
    // Wybranie wewnętrznego żródła napięcia odniesienia   
       ADMUX |= _BV(REFS0);      
       ADMUX |= _BV(REFS1);
    //   Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
       ADMUX |= _BV(ADLAR);      
    // Zezwolenie na konwersję   
       ADCSRA |= _BV(ADEN);      
    // Wybranie częstotliwości dla taktowania przetwornika  (1/8 częstotliwosci zegara kontrolera)
       ADCSRA |= _BV(ADPS0);   
       ADCSRA |= _BV(ADPS1);   //
       
    }


    int main(void)
    {
       Inicjalizacja();  // Inicjalizacja kontrolera
       lcd_clrscr();
       lcd_puts("Wcisnij przycisk\n");
       
       while(1)
       {
          licznik++;        // Liczenie obiegów pętli (tłumienie drgań styków przycisku)
          if (licznik==3200) 
          {
             licznik=0;    // Zerowanie licznika obiegów pętli
             PORT_F=PORT_F |= _BV(4);  //
          }

          if ((bit_is_set(PORT_F, 4))&&(bit_is_clear(PIN_F, 2)))  // Jesli naciśnięto przycisk i
                               // flaga przycisnięcia klawisza nie jest wyzerowana to:
          {
             PORT_F &= ~_BV(4);        // Wyzerowanie flagi naciśnięcia klawisza
             wynik=0;
             i=9;
             while(i)
             {   
                ADCSRA |= _BV(ADSC);         // Rozpoczęcie przetwarzania
                while(bit_is_set(ADCSRA,ADSC))   // Oczekiwanie na zakończenie przetwarzania
                {};   
                pomiar=ADCH;              // Zapisanie starszych 8 bitów wyniku konwersji do
                                     // zmiennej "pomiar"
                wynik=wynik+pomiar;          // Sumowanie wyników pomiarów dokonywanych w serii
                i--;
             }
             wynik=wynik/9;      // Wyliczenie średniej
             lcd_clrscr();         // Czyszczenie wyświetlacza LCD
             lcd_puts("Wynik pomiaru: \n");   
             utoa(wynik, buffer_n, 10);  // Konwersja liczby unsigned int do asci
             lcd_puts(buffer_n);          // Wysłanie na ekran LCD wyniku konwersji
             lcd_puts(" Jedn. umownych");
          }
          
          if (bit_is_clear(PIN_F, 2))  // Sprawdzenie czy klawisz jest wcisnięty
          {
             licznik=0;
          }
       }
    }

    0
  • Mitronik
  • #6 23 Lut 2010 16:59
    tmf
    Moderator Mikrokontrolery Projektowanie

    Pokaz kod do obslugi ADC, ktory ci nie dziala. Atmel wypuscil tez note aplikacyjna gdzie jest omowione i pokazana na przykladzie obsluga touch panela za pomoca ADC. Twoj panel jest 4 przewodowy?

    0
  • #7 23 Lut 2010 17:03
    -nobile-
    Poziom 16  

    Tak jak widać na zdjęciu - panel jest 4 przewodowy.

    Będę wdzięczy za programy (i schematy) którymi mógł bym sprawdzić, uruchomić przetwornik adc. Wypróbuje każdy który zaproponujecie. Osobiście nie mogłem znaleźć nic do przetestowania.
    Jeśli macie jakieś swoje sprawdzone projekty, to wykonam płytkę drukowana, aby tylko to zadziałało.

    0
  • #8 23 Lut 2010 17:06
    atom1477
    Poziom 43  

    A z kondensatorami to chyba żartujesz?

    0
  • #9 23 Lut 2010 17:28
    -nobile-
    Poziom 16  

    Proszę bardzo, podłączyłem wszystko tak jak trzeba (łącznie z kondensatorami)
    Wziąłem następną NÓWKĘ atmege (żeby nie było ze coś w tamtej mogło się uszkodzić)

    Efekt ten sam (oczywiście kompilacja i wgranie programu przebiegło bezproblemowo)

    [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?)

    0
  • #10 23 Lut 2010 17:51
    wdogli
    Poziom 18  

    Sprawdź jeszcze w fuse-bitach czy masz ustawione taktowanie atmegi na 1MHz.

    0
  • #11 23 Lut 2010 18:03
    -nobile-
    Poziom 16  

    Proszę bardzo...
    (wszystko widać w załącznikach)

    [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?) [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?)

    0
  • #12 23 Lut 2010 18:28
    czmi3l
    Poziom 13  

    Drogi kolego
    Zmień sobie defina na:
    #define PORT_AD PORTA
    #define DDRD_AD DDRA

    Miałeś: PORTC i DDRC -> według pdfa przetwornik jest na porcie A, nie C:-)

    Całkowity koszt usługi 0zł ;P

    0
  • #13 23 Lut 2010 21:11
    -nobile-
    Poziom 16  

    No tu racje(dzięki ze zwróciłeś na to uwagę) , możliwe ze atmega odczytuje wynik (podłączyłem teraz napięcie mierzone pod PA0), tylko ze nadal wyświetlacz nie reaguje...

    Zaraz podłącze może diody i na nich niech wyświetla wynik. (chociaż wolał bym żeby ten wyświetlacz tez pokazywał wynik)

    Macie jeszcze jakieś propozycje?

    Dodano po 2 [godziny] 26 [minuty]:

    Podłączylem tak aby wyświetlał wynik pomiaru na diodach

    Program:

    Code:

    /*
    ************************************************************************ 
      Nazwa pliku -  ADC_przyk2.c
      Autor - Wojciech Chojnacki
      http://www.tkdami.net/~voytek/
      voytek(malpa)tkdami.net
      Data -  21-04-2005
      Procesor Atmel ATmega 
      Przykład serii konwersji wyzwalanej przyciskiem. Obliczenie średniej.
      Wynik wyświetlany na ośmiu diodach.
      Licencja - GPL
      Modyfikowany -
    ************************************************************************
    */

    #include <avr/io.h>
    // Zdefiniowanie uzywanych portów.
    #define PORT_AD PORTA      // Port z wejściami analogowymi
    #define DDR_AD DDRA         
    #define PORT_OUT PORTB      // Port do którego przyłączone są diody LED
    #define DDR_OUT DDRB      
    #define PORT_F PORTD      // Port do którego przyłączony jest przycisk. Bit 4 tego portu
                   // jest wykorzystany jako flaga naciśnięcia klawisza
    #define DDR_F DDRD
    #define PIN_F PIND

    unsigned int licznik;      // Zmienna do zliczania obiegów pętli
    unsigned int pomiar;      // Zmienna do przechowywania wyniku pomiaru
    unsigned char i;         // Ilośc pomiarów dokonywanych po nacisnięciu przycisku
    unsigned int wynik;         // Zmienna do liczenia średniej z wyników pomiaru



    void Inicjalizacja(void)
    {
       DDR_AD=0x00;      // Port jako wejścia
       PORT_AD=0x00;      // Port C wejścia bez podciągania
       DDR_OUT=0xFF;      // Port jako wyjścia
       PORT_OUT=0xFF;      // Wyjścia w stanie wysokim
       DDR_F=0xF0;         // Młodsza połowa portu jako wejścia starsze cztery bity jako wyjścia
       PORT_F=0xFF;      // Wejścia z podciąganiem wyjścia w stanie wysokim
          
    // Wybranie wewnętrznego żródła napięcia odniesienia   
       ADMUX |= _BV(REFS0);      
       ADMUX |= _BV(REFS1);
    //   Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
       ADMUX |= _BV(ADLAR);      
    // Zezwolenie na konwersję   
       ADCSRA |= _BV(ADEN);      
    // Wybranie częstotliwości dla taktowania przetwornika  (1/8 częstotliwosci zegara kontrolera)
       ADCSRA |= _BV(ADPS0);   
       ADCSRA |= _BV(ADPS1);   //
    }


    int main(void)
    {
       Inicjalizacja();  // Inicjalizacja kontrolera
       
       while(1)
       {
          licznik++;        // Liczenie obiegów pętli (tłumienie drgań styków przycisku)
          if (licznik==3000) 
          {
             licznik=0;    // Zerowanie licznika obiegów pętli
             PORT_F=PORT_F |= _BV(4);  //
          }

          if ((bit_is_set(PORT_F, 4))&&(bit_is_clear(PIN_F, 2)))  // Jesli naciśnięto przycisk i
                               // flaga przycisnięcia klawisza nie jest wyzerowana to:
          {
             PORT_F &= ~_BV(4);        // Wyzerowanie flagi naciśnięcia klawisza
             wynik=0;
             i=9;
             while(i)
             {   
                ADCSRA |= _BV(ADSC);         // Rozpoczęcie przetwarzania
                while(bit_is_set(ADCSRA,ADSC))   // Oczekiwanie na zakończenie przetwarzania
                {};   
                pomiar=ADCH;              // Zapisanie starszych 8 bitów wyniku konwersji do
                                     // zmiennej "pomiar"
                wynik=wynik+pomiar;          // Sumowanie wyników pomiarów dokonywanych w serii
                i--;
             }
             wynik=wynik/9;      // Wyliczenie średniej
             PORT_OUT=~wynik;   // Wyświetlenie średniej z wyników pomiarów
          }
          
          if (bit_is_clear(PIN_F, 2))  // Sprawdzenie czy klawisz jest wcisnięty
          {
             licznik=0;
          }
       }
    }



    Film z działania:



    Film jest jaki jest (fatalny program do zmiany formatu)

    0
  • #14 23 Lut 2010 22:03
    wdogli
    Poziom 18  

    Ciekawe o co chodzi w tym filmie ??
    Wydaje mi się że o to że ten program i ustrojstwo które zbudowałeś nie działa.
    Pozdrawiam

    0
  • #15 23 Lut 2010 22:12
    atom1477
    Poziom 43  

    No gościo wciska misroswitche i diody migają. Też nie rozumiem o co tutaj chodzi.

    0
  • #16 23 Lut 2010 22:33
    -nobile-
    Poziom 16  

    heh.. ok, na początku pisałem ale ok napisze jeszcze raz, jest to program uruchomiony ze strony http://www.voytek.tkdami.net/programy/programy.html (przetwornik AC )

    "Wyświetlenie wyniku na diodach" którego nie mogę uruchomić.
    schemat: http://www.voytek.tkdami.net/programy/adc/ADC_przyk1/adc_led_atm8.png

    program jest wyżej.

    Chce tylko abyście pomogli mi to uruchomić, bo dopiero zaczynam w tym temacie.

    0
  • #17 24 Lut 2010 13:33
    czmi3l
    Poziom 13  

    Cześć,
    spróbuj zmienić tą linijkę:

    Code:
    while(bit_is_set(ADCSRA,ADSC))
    
    {};

    na
    Code:

    while(bit_is_clear(ADCSRA,ADIF));  // czekaj na koniec konwersji
    ADCSRA |= _BV(ADIF);  // skasuj flagę wpisując 1 :)

    według dokumentacji to ADIF mówi o końcu przetwarzania.

    0
  • #18 24 Lut 2010 13:34
    wdogli
    Poziom 18  

    Witam.
    Panie Kolego tak się po prostu nie da. Ty sam musisz wykazać się logicznym myśleniem i zadbać o wszystkie detale związane z projektem który chcesz uruchomić.
    Po pierwsze powinieneś przeanalizować sposób podłączeń wyświetlacza oraz poszczególnych elementów do mikrokontrolera użyj multimetra do sprawdzenia czy wszystkie połączenia są w 100% dobre.
    Po drugie przeanalizuj program który pobrałeś ze strony i zastanów się czy wszystko w nim jest tak jak być powinno (deklaracje portów, załączane biblioteki) . Zapoznaj się z dokumentacją poszczególnych elementów na przykład atmegi16 oraz zawartego w niej przetwornika oraz jego rejestrów i sposobu zapisu danych do tych rejestrów oraz odczytu danych z nich. Następnie zastanów się jak te odczyty przeliczyć i przedstawić za pomocą cyfr na wyświetlaczu. Jak będziesz już miał gotowy program to zobacz jak on działa na przykład w AVRStudio i czy w ogóle działa.
    Po trzecie jeśli chcesz uruchomić jakiś projekt to realizuj go w 100% a nie tak trochę bo przecież to czy tamto jest ci nie potrzebne. Nie musisz do niego od razu robić płytki drukowanej taka płytka uruchomieniowa też się do tego nadaje bardzo dobrze.
    Jak sam widzisz pracy jest naprawdę sporo. Nikt jej za ciebie nie zrobi. My możemy ci jedynie doradzić na co powinieneś zwrócić uwagę bo przecież nikt nie będzie specjalnie dla ciebie u siebie w domu budował takiego układu żeby Ci napisać gotowy program.
    A jeśli zamieszczasz nam takie filmiki to sorry ale na nim nic nie widać przyciskasz przycisk a tu zapala ci się dioda. To ja takie urządzenie mogę zrealizować bez udziału atmegi ;)
    Jeśli jesteś początkującym to może zacznij od czegoś prostego.
    Pozdrawiam

    P.S.
    Tak dla pewności dołączasz do projektu te bibliotekę ??

    Code:
    #include "lcd.h"

    Masz ją na swoim komputerze przy kompilacji ?? To jest biblioteka odpowiedzialna za obsługę wyświetlacza.

    0
  • #19 24 Lut 2010 15:14
    -nobile-
    Poziom 16  

    Tak załączam potrzebne biblioteki (biblioteki dodaje w załączniku)

    (sprawdzałem wszystkie połączenia miernikiem i nie ma żadnych przerw itp)

    Dzięki kolego wdogli za rade ale gdyby termin mnie nie gonił na spokojnie bym sobie poszukał gdzie jest błąd choć by to miało mi zająć 2 tygodnie. Nie mam jeszcze praktycznie żadnego doświadczenia z AVR-ami a dostałem projekt do wykonania na poniedziałek / wtorek.
    Na filmiku chciałem pokazać ze nie chce mi działać przetwornik AC w atmedze i zamiast zapisać wynik na porcie zaświeca się właśnie tylko jedna dioda.

    Był bym jednak bardzo wdzięczny jak by ktoś z doświadczeniem uruchomił u siebie ten układ i powiedział co jest nie tak (tylko ten jedyny raz, bo od tego zależy moja ocena na koniec tej szkoły, myślałem ze nie będzie większych problemów z uruchomieniem przetwornika AC ale jak widać jest inaczej.).

    W wolnej chwili z pewnością przeanalizuje wszelkie karty katalogowe i niezbędne dokumentacje ale potrzebuje pomocy teraz.


    czmi3l napisał:
    Cześć,
    spróbuj zmienić tą linijkę:


    Zmieniłem i dalej wyświetlacz nie odpowiada :/

    W załączniku biblioteki biblioteki Petera Fleury http://homepage.hispeed.ch/peterfleury/
    LCD HD44780

    0
  • #20 24 Lut 2010 18:39
    skynet_2
    Poziom 26  

    Może najpierw LCD, do wyświetlaczy hd44780 używam biblioteki radzia Link.

    W nagłówku czyli pliku .h musisz ustawić na których pinach będzie podłączony wyświetlacz.

    sprawdzić czy wszystko działa możesz tak

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

    int main() {
       LCD_Initalize();
       LCD_Clear();
       LCD_WriteText("test");
       while(1)
       {
          ;
       }
       return 0;
    }

    0
  • #21 24 Lut 2010 20:40
    -nobile-
    Poziom 16  

    No niby wyświetlacz sprawny, działa bez problemu

    (w programie tylko zapomniałeś o: #include "HD44780.c" )

    [Atmega 8/16] [C]Nie moge uruchomic układu (pole siłowe?)

    0
  • Pomocny post
    #22 24 Lut 2010 21:21
    skynet_2
    Poziom 26  

    -nobile- napisał:
    (w programie tylko zapomniałeś o: #include "HD44780.c" )
    Cóż faktycznie, mam inny makefile, ale mniejsza o to.

    Teraz ADC

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

    uint16_t getVoltage() {
       ADCSRA |= (1 << ADSC);//rozpoczęcie konwersji
       while (ADCSRA & (1 << ADSC))
          ;
       uint16_t v = (ADCH << 8) | (ADCL);
       return v;
    }

    int main() {
       LCD_Initalize();
       LCD_Clear();
       char bufor[16];
       ADMUX |= (1 << REFS1) | (1 << REFS0);// źródło napięcia referencyjnego str 211 pdf
       ADMUX |= (0 << ADLAR);// zmiana kolejności ADCL, ADCH str 211 pdf
       ADMUX |= (0 << MUX2) | (0 << MUX1) | (0 << MUX0);//wybranie wejścia str 212 pdf
       //wybranie preskalera, dzieli F_CPU do zalecanych 50kHz do 200kHz pracy ADC
       //0 [000] 2
       //1 [001] 2
       //2 [010] 4
       //3 [011] 8
       //4 [100] 16
       //5 [101] 32
       //6 [110] 64
       //7 [111] 128
       ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
       ADCSRA |= (1 << ADEN);// włączenie ADC
       //ADCSRA &= ~(1 << ADEN);// wyłączenie ADC
       while (1) {
          _delay_ms(100);
          itoa(getVoltage(), bufor, 10);
          LCD_Clear();
          LCD_WriteText(bufor);
       }
       return 0;
    }


    Jeżeli się nie pomyliłem to 10x na sekundę program będzie wyświetlał na lcd zmierzone napięcie na 1 pinie portu A.

    funkcję itoa powinieneś mieć w bibliotece, dlatego zakomentowałem.

    0
  • #23 24 Lut 2010 22:04
    -nobile-
    Poziom 16  

    CHYBA DZIAŁA! O.O
    Ogromne podziękowania dla wszystkich a szczególnie dla ciebie skynet_2 ze poświęciłeś swój cenny czas aby mi pomóc.

    Jeśli to już mi działa jak trzeba to biorę się za pisanie programu do obsługi dotyku (mam nadzieje ze podołam).

    Obiecuje ze teraz będę dokładnie analizował karty katalogowe :)

    Jeszcze raz wielkie dzięki.

    0
  • #24 24 Lut 2010 22:23
    skynet_2
    Poziom 26  

    W datasheecie masz prawie zawsze wszystko opisane, tylko jak trzeba coś szybko zrobić to przestaje być czytelne ;).

    btw. nie musiałeś przesyłać wszystkich punktów, wystarczyło by zwykłe dziękuje :D

    0
  • #25 24 Lut 2010 22:35
    -nobile-
    Poziom 16  

    Punkty punktami (będą nowe) liczy się ze w końcu zadziałało bo już wątpiłem.

    Zmagam sie jeszcze z tym ze robi jeden odczyt na początku i cały czas go wyświetla (podaje kolejne pomiary ale nawet po zmienię wartości na wejściu wynik na LCD pozostaje bez zmień). Dopiero ustawienie innej wartości i ponowne uruchomienie układu spowoduje wyświetlenie poprawnego wyniku.

    Przy kompilacji wyrzuca mi jeszcze:

    lcd.c:7: warning: function declaration isn't a prototype
    lcd.c:15: warning: function declaration isn't a prototype
    lcd.c: In function 'main':
    lcd.c:27: warning: implicit declaration of function 'itoa'

    dla tego programu (zamieszczam ponownie zeby bylo wiadomo o które linie chodzi bo mam dopisaną jedna)

    Code:
    #include <avr/io.h>
    
    #include <util/delay.h>
    #include "HD44780.h"
    #include "HD44780.c"
    //#include "itoa.h"

    uint16_t getVoltage() {
       ADCSRA |= (1 << ADSC);//rozpoczęcie konwersji
       while (ADCSRA & (1 << ADSC))
          ;
       uint16_t v = (ADCH << 8) | (ADCL);
       return v;
    }

    int main() {
       LCD_Initalize();
       LCD_Clear();
       char bufor[16];
       ADMUX |= (1 << REFS1) | (1 << REFS0);// źródło napięcia referencyjnego str 211 pdf
       ADMUX |= (0 << ADLAR);// zmiana kolejności ADCL, ADCH str 211 pdf
       ADMUX |= (0 << MUX2) | (0 << MUX1) | (0 << MUX0);//wybranie wejścia str 212 pdf

       ADCSRA |= (1 << ADEN);// włączenie ADC
       //ADCSRA &= ~(1 << ADEN);// wyłączenie ADC
       while (1) {
          _delay_ms(100);
          itoa(getVoltage(), bufor, 10);
          LCD_WriteText(bufor);
       }
       return 0;
    }

    0
  • #26 24 Lut 2010 23:16
    skynet_2
    Poziom 26  

    Code:
    lcd.c:27: warning: implicit declaration of function 'itoa'

    znaczy że nie masz funkcji itoa, więc proszę:

    Code:
    /**
    
     * C++ version 0.4 char* style "itoa":
     * Written by Lukás Chmela
     * Released under GPLv3.
     */

    char* itoa(int value, char* result, int base) {
        // check that the base if valid
        if (base < 2 || base > 36) {
            *result = '\0';
            return result;
        }

        char* ptr = result, *ptr1 = result, tmp_char;
        int tmp_value;

        do {
            tmp_value = value;
            value /= base;
            *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
        } while (value);

        // Apply negative sign
        if (tmp_value < 0) *ptr++ = '-';
        *ptr-- = '\0';
        while (ptr1 < ptr) {
            tmp_char = *ptr;
            *ptr-- = *ptr1;
            *ptr1++ = tmp_char;
        }
        return result;
    }


    Nie jest ona jakoś specjalnie wydajna ale działa.
    I przed LCD_WriteText zapomniałem dopisać " LCD_Clear();", już poprawiłem.
    Dorzuciłem jeszcze kilka poprawek Link

    0
  • #27 25 Lut 2010 08:04
    -nobile-
    Poziom 16  

    Znalazłem na necie tą funkcje itoa ale jakaś inna była (dlatego mi nie chciała działać).

    Chyba jest jakiś błąd w bloku przetwarzania bo na wyświetlaczu pokazuje poprawny wynik ale jeśli po zmianie wartości napięcia mierzonego nie uruchomię ponownie procesora to cały czas jest wyświetlana ta sama wartość.

    Musze z tym pokombinować...

    0
  • #28 25 Lut 2010 09:17
    Cubaza
    Poziom 14  

    Cytat:
    Chyba jest jakiś błąd w bloku przetwarzania bo na wyświetlaczu pokazuje poprawny wynik ale jeśli po zmianie wartości napięcia mierzonego nie uruchomię ponownie procesora to cały czas jest wyświetlana ta sama wartość.

    A masz ustawioną w programie ciągłą konwersję(Free running mode)? Czy pojedynczy pomiar? Bo jak pojedynczy pomiar to bez restartu procka albo wyzwolenia pomiaru nie zmieni Ci wyniku.
    BIT:
    Cytat:
    ADFR - Jeśli ten bit jest ustawiony, wówczas przetwornik pracuje w trybie, w którym ciągle obywa się próbkowanie, przetwarzanie i zapisywanie wyniku (Free Running mode). Wyzerowanie ADFR przerywa ten tryb pracy.

    W rejestrze: ADCSRA

    Pozdrawiam :)

    0
  • #29 25 Lut 2010 09:18
    skynet_2
    Poziom 26  

    Przydało by się sprawdzić co jest nie tak.
    gdzieś na początku DDRD |= 1<<PA1;
    do tej pętli while w main dorzuć PORTA ^= 1<<PA1;
    pod PORTA1 wrzuć diodę jak mruga znaczy że pętla chodzi.

    Cubaza w mega16 nie ma ADFR za to jest ADATE, też myślałem nad "Free Running mode" ale przecież trzeba najpierw ustawić ADATE a później ADTS[2:0] więc to nie o to chodzi.

    0
  • #30 25 Lut 2010 09:51
    loocasm
    Poziom 14  

    Więc skoro nie jest ustawione Free Running Mode to chyba wypada kasować bit ADIF w ADCSRA zanim wyzwoli się kolejny pomiar. Zeruje się go wpisując do niego 1 :)

    Poza tym, jak już chyba ktoś wspominał, do czekania na koniec przetwarzania sprawdza się w pętli właśnie ADIF a nie ADSC.

    0