Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

LCD 4x20 z przesuwanym i migającym kursorem w 4 wierszu

margas4542 31 Aug 2010 22:47 8612 122
Helukabel
  • #61
    janbernat
    Level 38  
    A gdybyś zmiast:
    #include <HD44780.c>
    Wpisał:
    #include "HD44780.h"
    A HD44780.c dodał do programu w Source Files to byłoby dużo lepiej.
    Add Existing Source File(s).
    Dołączanie przez #include plików z rozrzeżeniem .c jest paskudnym pomysłem.
    Miotanie się od ściany do ściany w pewnym wieku nie przystoi.
    Cierpliwości.
    Program się powoli pisze- może trochę inny niż Twój.
    Ale zaczyna działać.
    Jestem tak samo głupi w C jak Ty- ale bardziej cierpliwy.
    Tu wklejam zaczątki kodu:
    Code:

    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include "HD44780.h"


       volatile uint8_t dol;
       volatile uint16_t gora;
       volatile uint8_t flaga;
       volatile unsigned int napiecie;

    int main(void)
    {   
       sei();
       DDRB=255;
       DDRC=255;
       TIMSK=_BV(TOIE1);//ustawienie licznika T1
       TCCR1B=_BV(CS10)|_BV(CS12);//na przerwanie OVF1 co ok.4s przy 16 MHz
    //  OCR0=250;
       ADMUX = _BV(REFS0)|_BV(REFS1) ;//|_BV(ADLAR)   
        ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);   
       SFIOR=_BV(ADTS1)|_BV(ADTS2);//ustawienie startu przetwarzania ADC po przerwaniu od OVF Timer1
        PORTB=255;
       char *text="Problem z";
       char *text1="przerwaniami";
       LCD_Initalize();
       LCD_WriteText(text);
       LCD_GoTo(0,1);
       LCD_WriteText(text1);      
       _delay_ms(300);
       LCD_GoTo(0,0);
          //itoa(napiecie);
          LCD_WriteText("                ");// to jest szybciej niż LCD_Clear
       char buffer_n[4];
    //   uint16_t napiecie;
    //   static int8_t test1;
      while(1)
       {
          
          
    //      test1=!test1;
    //      PORTC=test1;// to taki debug z braku JTAGa
          if(flaga);
          flaga=0;
          
          dol=ADCL;// odczyt przetwornika ADC
          gora=ADCH;


          napiecie=gora+dol;
    //      napiecie = (gora<<2)*2.56/1024.0;
    //      gora=gora<<2;
          LCD_GoTo(0,0);
          LCD_WriteText(utoa(napiecie,buffer_n,10));
          LCD_GoTo(5,0);
          LCD_WriteText("V");

          // a tu reszta programu-LCD, obliczenia itp.


       }
    }

    ISR(ADC_vect)//a tu przerwanie od ADC- jak wystartował po OVF Timer1 i skończył
    {            //przetwarzanie to tu jest i ustawia flagę


       flaga=1;

    //   static int8_t test;
    //   test=!test;
    //   PORTB=test;// tu też debug
    //   gora=ADCH;
    //   dol=ADCL;
    }

    EMPTY_INTERRUPT(TIMER1_OVF_vect);// a tu puste przerwanie od OVF Timer0

    Wyświetla 230 V zamiast 2.30V i tylko z jednego kanału.
    Ale powoli- dojdziemy.
    Może jeszcze ktoś pomoże.
    A tak mam ustawione końcówki do wyświetlacza:
    Code:

    // Konfiguracja sygnałów sterujących wyświetlaczem.
    // Można zmienić stosownie do potrzeb.
    //
    //-------------------------------------------------------------------------------------------------
    #define LCD_RS_DIR      DDRD
    #define LCD_RS_PORT    PORTD
    #define LCD_RS_PIN      PIND
    #define LCD_RS         (1 << PD0)

    #define LCD_RW_DIR      DDRD
    #define LCD_RW_PORT      PORTD
    #define LCD_RW_PIN      PIND
    #define LCD_RW         (1 << PD6)

    #define LCD_E_DIR      DDRD
    #define LCD_E_PORT      PORTD
    #define LCD_E_PIN      PIND
    #define LCD_E         (1 << PD1)

    #define LCD_DB4_DIR      DDRD
    #define LCD_DB4_PORT   PORTD
    #define LCD_DB4_PIN      PIND
    #define LCD_DB4         (1 << PD2)

    #define LCD_DB5_DIR      DDRD
    #define LCD_DB5_PORT   PORTD
    #define LCD_DB5_PIN      PIND
    #define LCD_DB5         (1 << PD3)

    #define LCD_DB6_DIR      DDRD
    #define LCD_DB6_PORT   PORTD
    #define LCD_DB6_PIN      PIND
    #define LCD_DB6         (1 << PD4)

    #define LCD_DB7_DIR      DDRD
    #define LCD_DB7_PORT   PORTD
    #define LCD_DB7_PIN      PIND
    #define LCD_DB7         (1 << PD5)

    W pliku .h
    Wyświetlacz 2x16.
    Ze sprawdzaniem zajętości- szybciej chodzi.
  • Helukabel
  • #62
    gaskoin
    Level 38  
    mnie się wydaje, że trzeba zacząć jeszcze wolniej :)
  • #63
    margas4542
    Level 16  
    ....no tak angielskiego się nie zna i buble wychodzą...zrobiłem jak poradziłeś z tą biblioteką...mam tylko zagwozdkę z bitem R/W LCD bo na mojej płytce do podłączenia z CPU wyprowadzone są tylko RS,E,D4 do D7, RW oraz D0 do D3 na stałe do masy i musiałbym ciąć ścieżki...za kod bardzo wdzięczny jestem uważnie bo przejrzałem ale muszę najpierw coś zrobić z tym RW...po sprawdzeniu płytki mogę się podłączyć (wstawię dodatkowe 4 piny) na 8 bitów ale bez flagi zajętości bo aby przeciąć ścieżkę musiałbym odlutować złącze...
    i pytanie podstawowe bo za chwilę się okaże że peryferia na portach są źle porozstawiane.
    Co podłączyć pod jaki port;mógłbym już zaprojektować płytkę i obudowę.

    portA - ADC musi być na port A, 4 kanały pomiarowe - reszta w powietrzu ?

    port ? - LDC 4x20, 8 lub 4 bity bez flagi zajętości

    port ? - multiplexer z podtrzymaniem stanu 4 bity BCD (na 10 wyjściach optoizolatory) (4 wykorzystuje program z ustawionymi progami napięć [niskie/wł][wysokie/wył])

    port ? - klawiatura trzy klawisze [na LCD kursor w lewo][wł/wył kanał][na LCD kursor w prawo]

    port ? - czy będzie potrzebna pamięć zewnętrzna I2C 24C02 lub karta SD do przechowywania informacji o włączonych lub wyłączonych kanałach multiplexera.

    port? - uart gdyby kiedyś zaszła potrzeba pogadania z innym urządzeniem
  • Helukabel
  • #64
    PO.
    Level 20  
    Jaaa, fajne niespodzianki wychodzą... Nie no, w sumie "wszystko jedno"... Przypomnij sobie, czy coś jeszcze pominąłeś.

    Tak trudno jest przeciać ścieżkę r/w do masy? I podlutować na pająka? Tnij!
    Lepiej 4bit z r/w niż 8bit bez. Tak naprawdę to drugie tylko dla początkujących wygląda elegancko. 4bit wystarcza do wszystkiego a oszczędzasz pół portu i kłopotu przy prowadzeniu ścieżek na płytce.
    I zostań przy tej prototypowej, powinna wystarczyć do wszystkiego na razie.

    PS: sprawdź przy okazji do czego masz podłaczone vref na płytce...

    PS2: masz pół kilo eepromu wbudowanego, nie wystarczy Ci ;) ?
  • #65
    margas4542
    Level 16  
    ...Vref z CPU zablokowane 100nF do masy...ok załatwię to jakoś z tym RW może jeden pin dołożę do złącza istniejącego i kabelkiem podłącze.... co do pamięci zewnętrznej to wolałem zapytać...jak nie potrzebna to dobrze...więc jeszcze resztę jak rozlokować?..
  • #67
    margas4542
    Level 16  
    ..AVCC pin 30 CPU do +5V ... AREF pin 32 CPU przez kondensator do masy...
  • #68
    gaskoin
    Level 38  
    pinu RW z wyświetlacza nie potrzebujesz mieć podpiętego do mikrokontrolera. Może być do masy pod warunkiem, że w programie uwzględnisz opóźnienia wykonywania komend przez wyświetlacz.

    Ale szybciej jest z RW :P
  • #69
    margas4542
    Level 16  
    ....przerobiłem tą testową płytkę i mam teraz możliwość dowolnej konfiguracji 8 czy 4 bity z flagą zajętości czy bez...więc można tasować porty ale co dać na co;
    portA - ADC musi być na port A, 4 kanały pomiarowe - reszta w powietrzu ?
    port ? - LDC 4x20, 8 lub 4 bity bez flagi zajętości
    port ? - multiplexer z podtrzymaniem stanu 4 bity BCD (na 10 wyjściach optoizolatory) (4 wykorzystuje program z ustawionymi progami napięć [niskie/wł][wysokie/wył])
    port ? - klawiatura trzy klawisze [na LCD kursor w lewo][wł/wył kanał][na LCD kursor w prawo]
    port? - uart wolny gdyby kiedyś zaszła potrzeba wykorzystania go
  • #70
    janbernat
    Level 38  
    margas- zanim będzie Ci UART będzie potrzebny to jeszcze dużo wody w Wiśle upłynie.
    Daj na portd wyświetlacz.
    Poza tym co za cholera mnie podkorciła żeby napisać o R/W.
    Bez tego też by chodziło- no może powoli- "pełzło".
    A tu trochę zmieniony kod:
    Code:

          LCD_GoTo(0,0);
    //      LCD_WriteText(utoa(napiecie,buffer_n,10));
          double napiecie1;
          napiecie1=napiecie;
          napiecie1=napiecie1/100; //a tu dopasować do napięcia wejścowego- żeby wyswietlić wartość z
                         //wejścia układu a nie z wejścia procesora      
          LCD_WriteText(dtostrf(napiecie1,5,2,buffer_n));// to zamiast utoa
          LCD_GoTo(7,0);
          LCD_WriteText("V");

    A, i jeszcze to zmieniłem:
    Code:

       TCCR1B=_BV(CS12);//na przerwanie OVF1 co ok.1s przy 16 MHz

    Teraz przerwanie jest co 1s a nie co 4s.
    I odczyt napięcia oczywiście też co 1s.
    P.S.0.
    Gaskoin- co wolniej?
    Ja się tego C zacząłem uczyć ze dwa miesiące temu- i jeszcze jestem całkiem głupi.
    Jak zwolnię- to predzej zejdę niż się nauczę.
    P.S.1.
    margas- jaką masz płytkę?
    P.S.2.
    Coś jest jeszcze nie tak- źle odczytuje dane przy pewnych położeniach potencjometru.
    Jak by napisał Freddie Chopin- kompilator jest zwalony i funkcja dtostrf jest źle napisana i procesor jest zepsuty.
    Ale powoli sobie z tymi drobnymi problemami poradzimy.
  • #71
    PO.
    Level 20  
    Aref chyba lepiej żeby wisiał przy wykorzystaniu wewnętrznego źródła odniesienia ale poprawcie jeśli się mylę...
    Poświęć jeden pin na flagę, tym bardziej że masz bibliotekę z jej obsługą. Masz? Bo kiedyś Ci coś się wykrzaczy i nawet nie będziesz wiedział, że to przez lcd.
    Wolniej jest dlatego, że musisz uwzględnić jakiś najgorszy scenariusz, czyli zawsze czekasz najdłuższe możliwe opóźnienie.
  • #72
    gaskoin
    Level 38  
    PO. wrote:
    Aref chyba lepiej żeby wisiał przy wykorzystaniu wewnętrznego źródła odniesienia ale poprawcie jeśli się mylę...


    Quote:
    The internal 2.56V reference is generated from the internal bandgap reference (VBG) through an internal amplifier. In either case, the
    external AREF pin is directly connected to the ADC, and the reference voltage can be made
    more immune to noise by connecting a capacitor between the AREF pin and ground.


    z tym wolniej to chodziło mi o margasa :)
  • #73
    janbernat
    Level 38  
    A w tym kodzie gdzieś coś schrzaniłem
    Przy napięciu ok. 1.9V na wejściu wyświetla mi ok. 0.1V.
    A przy 2.50V- dobrze.
    Może ktoś dojrzy.
    Code:

    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include "HD44780.h"


       volatile uint8_t dol;
       volatile uint8_t gora;
       volatile uint8_t flaga;
       volatile uint16_t napiecie;

    int main(void)
    {   
       sei();
       DDRB=255;
       DDRC=255;
       TIMSK=_BV(TOIE1);//ustawienie licznika T1
       TCCR1B=_BV(CS12);//na przerwanie OVF1 co ok.1s przy 16 MHz
    //  OCR0=250;
       ADMUX = _BV(REFS0)|_BV(REFS1) ;//|_BV(ADLAR)   
        ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);   
       SFIOR=_BV(ADTS1)|_BV(ADTS2);//ustawienie startu przetwarzania ADC po przerwaniu od OVF Timer1
        PORTB=255;
       char *text="Problem z";
       char *text1="przerwaniami";
       LCD_Initalize();
       LCD_WriteText(text);
       LCD_GoTo(0,1);
       LCD_WriteText(text1);      
       _delay_ms(300);
       LCD_GoTo(0,0);
          //itoa(napiecie);
          LCD_WriteText("                ");// to jest szybciej niż LCD_Clear
       char buffer_n[5];
    //   uint16_t napiecie;
    //   static int8_t test1;
      while(1)
       {
          
          
    //      test1=!test1;
    //      PORTC=test1;// to taki debug z braku JTAGa
          if(flaga);
          flaga=0;
          
          dol=ADCL;// odczyt przetwornika ADC
          gora=ADCH;


          napiecie=gora+dol;
    //      napiecie = (gora<<2)*2.56/1024.0;
    //      gora=gora<<2;
          LCD_GoTo(0,0);
    //      LCD_WriteText(utoa(napiecie,buffer_n,10));
          double napiecie1;
          napiecie1=napiecie;   //tu jest rzutowanie na double
          napiecie1=napiecie1/100; //a tu dopasować do napięcia wejścowego- żeby wyswietlić wartość z
                         //wejścia układu a nie z wejścia procesora      
          LCD_WriteText(dtostrf(napiecie1,5,2,buffer_n));// to zamiast utoa
          LCD_GoTo(7,0);
          LCD_WriteText("V");
       
          
          // a tu reszta programu-LCD, obliczenia itp.


       }
    }

    ISR(ADC_vect)//a tu przerwanie od ADC- jak wystartował po OVF Timer1 i skończył
    {            //przetwarzanie to tu jest i ustawia flagę


       flaga=1;

    //   static int8_t test;
    //   test=!test;
    //   PORTB=test;// tu też debug
    //   gora=ADCH;
    //   dol=ADCL;
    }

    EMPTY_INTERRUPT(TIMER1_OVF_vect);// a tu puste przerwanie od OVF Timer0
  • #74
    gaskoin
    Level 38  
    janbernat wrote:
    A w tym kodzie gdzieś coś schrzaniłem

    Code:


          dol=ADCL;// odczyt przetwornika ADC
          gora=ADCH;


          napiecie=gora+dol;
    //      napiecie = (gora<<2)*2.56/1024.0;
    //      gora=gora<<2;
          LCD_GoTo(0,0);
    //      LCD_WriteText(utoa(napiecie,buffer_n,10));
          double napiecie1;
          napiecie1=napiecie;   //tu jest rzutowanie na double
          napiecie1=napiecie1/100; //a tu dopasować do napięcia wejścowego- żeby wyswietlić wartość z
                         //wejścia układu a nie z wejścia procesora      
       


    napięcie = góra + dol ?
    dzieląc przez 100 (nie 100.0) automatycznie masz liczbę int
  • #75
    janbernat
    Level 38  
    Oj.
    Dasz sobie uciąć?
    Tym razem piszę to z pewną nieśmiałością.
    napiecie1 jest double.
    napięcie- int- jest podstawiane pod napięcie1.
    Kompilator nie protestuje w tej linijce:
    LCD_WriteText(dtostrf(napiecie1,5,2,buffer_n));
    Więc chyba samo dzielenie napiecie1 przez 100 nie konwertuje w dół.
    Zresztą sprawdziłem dzielenie przez 100.0.
    I tak się przekręca trzy razy.
    Cos schrzaniłem inaczej.
  • #76
    PO.
    Level 20  
    gaskoin wrote:

    napięcie = góra + dol ?


    No to jest megadziwne ;) .
  • #77
    janbernat
    Level 38  
    No to mi wytłumaczcie moją głupotę.
    ADCL- 8 bitów.
    ADCH- 8 bitów.
    Napiecie- uint16_t.
    Dodaję dwie zmienne ośmiobitowe do zmiennej uint16_t.
    Gdzie jest pułapka?
    P.S.
    Już poprawiłem:
    Code:


    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include "HD44780.h"


       volatile uint8_t dol;
       volatile uint8_t gora;
       volatile uint8_t flaga;
       volatile uint16_t napiecie;

    int main(void)
    {   
       sei();
       DDRB=255;
       DDRC=255;
       TIMSK=_BV(TOIE1);//ustawienie licznika T1
       TCCR1B=_BV(CS12);//na przerwanie OVF1 co ok.1s przy 16 MHz
    //  OCR0=250;
       ADMUX = _BV(REFS0)|_BV(REFS1) ;//|_BV(ADLAR)   
        ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);   
       SFIOR=_BV(ADTS1)|_BV(ADTS2);//ustawienie startu przetwarzania ADC po przerwaniu od OVF Timer1
        PORTB=255;
       char *text="Problem z";
       char *text1="przerwaniami";
       LCD_Initalize();
       LCD_WriteText(text);
       LCD_GoTo(0,1);
       LCD_WriteText(text1);     
       _delay_ms(300);
       LCD_GoTo(0,0);
       LCD_WriteText("                ");// to jest szybciej niż LCD_Clear
       char buffer_n[5];

      while(1)
       {
         
         
    //      test1=!test1;
    //      PORTC=test1;// to taki debug z braku JTAGa
          if(flaga);
          flaga=0;
          napiecie=ADC;
          LCD_GoTo(0,0);
    //      LCD_WriteText(utoa(napiecie,buffer_n,10));
          double napiecie1;
          napiecie1=napiecie;   //tu jest rzutowanie na double
          napiecie1=napiecie1/100; //a tu dopasować do napięcia wejścowego- żeby wyswietlić wartość z
                         //wejścia układu a nie z wejścia procesora     
          LCD_WriteText(dtostrf(napiecie1,5,2,buffer_n));// to zamiast utoa
          LCD_GoTo(7,0);
          LCD_WriteText("V");
       
         
          // a tu reszta programu-LCD, obliczenia itp.


       }
    }

    ISR(ADC_vect)//a tu przerwanie od ADC- jak wystartował po OVF Timer1 i skończył
    {            //przetwarzanie to tu jest i ustawia flagę
       flaga=1;
    }

    EMPTY_INTERRUPT(TIMER1_OVF_vect);// a tu puste przerwanie od OVF Timer0

    Ten kompilator sam to robi. :D
  • #78
    tymon_x
    Level 30  
    janbernat wrote:
    No to mi wytłumaczcie moją głupotę.
    ADCL- 8 bitów.
    ADCH- 8 bitów.
    Napiecie- uint16_t.
    Dodaję dwie zmienne ośmiobitowe do zmiennej uint16_t.
    Gdzie jest pułapka?

    Odczytałeś z przetwornika liczbę: 340, binarnie 0b1 0101 0100, hex 0x0154
    ADCH=0x01, ADCL=0x54
    ADCH+ADCL=0b0000 0001 + 0b0101 0100=0b0101 0101=0x0055=85 != 340
    Chyba, że jest to jakaś czarna magia, o której nie mam pojęcia (;
  • #79
    janbernat
    Level 38  
    Sztuczki to ja mogę zrobić ze sprzętem.
    A nie z programem w C.
    To składnia i zasady pisania ze mną robią sztuczki.
    Ale powoli zaczyna działać jak ja chcę.
    A nie jak kompilator chce.

    Dodano po 27 [minuty]:

    Powoli zaczyna działać;
    Code:

    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include "HD44780.h"


       volatile uint8_t dol;
       volatile uint8_t gora;
       volatile uint8_t flaga;
       volatile uint16_t napiecie;

    int main(void)
    {   
       sei();
       DDRB=255;
       DDRC=255;
       TIMSK=_BV(TOIE1);//ustawienie licznika T1
       TCCR1B=_BV(CS12);//na przerwanie OVF1 co ok.1s przy 16 MHz
    //  OCR0=250;
       ADMUX = _BV(REFS0)|_BV(REFS1) ;//|_BV(ADLAR)   
        ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2)|_BV(ADSC);   
       SFIOR=_BV(ADTS1)|_BV(ADTS2);//ustawienie startu przetwarzania ADC po przerwaniu od OVF Timer1
        PORTB=255;
       char *text="Problem z";
       char *text1="przerwaniami";
       LCD_Initalize();
       LCD_WriteText(text);
       LCD_GoTo(0,1);
       LCD_WriteText(text1);     
       _delay_ms(300);
       LCD_GoTo(0,0);
       LCD_WriteText("                ");// to jest szybciej niż LCD_Clear
       char buffer_n[5];

      while(1)
       {
          if(flaga);
          flaga=0;
          napiecie=ADC;
          LCD_GoTo(0,0);
    //      LCD_WriteText(utoa(napiecie,buffer_n,10));
          double napiecie1=napiecie;
          LCD_WriteText(dtostrf(napiecie1=napiecie1/85.9,5,2,buffer_n));// to zamiast utoa
         // to zaczyna być porąbane "wysokie C"- ciekawe czy double napiecie1=napiecie da się tu wstawić 
                   //   można dopasować do napięcia wejściowego- a nie do napięcia na wejściu ADC
          LCD_GoTo(7,0);
          LCD_WriteText("V");
       
         
          // a tu reszta programu-LCD, obliczenia itp.


       }
    }

    ISR(ADC_vect)//a tu przerwanie od ADC- jak wystartował po OVF Timer1 i skończył
    {            //przetwarzanie to tu jest i ustawia flagę
       flaga=1;
    }

    EMPTY_INTERRUPT(TIMER1_OVF_vect);// a tu puste przerwanie od OVF Timer0

    Jeszcze trzeba zrobić tablicę i zapisywać w niej kilka ostatnich pomiarów.
    I wskaźniki do niej.
    I zmieniać kanały.
    Sporo roboty jeszcze.
  • #80
    margas4542
    Level 16  
    ...jak wspomniałem płytka dostosowana do 8 lub 4 bitów z flagą lub bez....skopiowałem ostatni listing zrobiłem compile....i na LCD nie ma nic poza czarnymi prostokątami w wierszu 1 oraz 3....biblioteka radzia 4 bity E, RS , R/W.... złośliwa ta moja atmega.....
  • #81
    PO.
    Level 20  
    To ja wytłumaczę prościej: 2+3 == 5 a nie 23 :) .

    Prawidłowy kod to coś w stylu: pomiar= gora<<8 + dol; zmienne są automatycznie rzutowane na int.
  • #82
    gaskoin
    Level 38  
    janbernat wrote:
    Oj.
    Dasz sobie uciąć?


    tak

    Quote:

    napiecie1 jest double.
    napięcie- int- jest podstawiane pod napięcie1.
    Kompilator nie protestuje w tej linijce:
    LCD_WriteText(dtostrf(napiecie1,5,2,buffer_n));


    A czemu miałby protestować? nawet jak jest tam liczba całkowita to i tak nie zmienia to faktu, że napięcie1 jest typu double

    kompilator nie zaprotestuje nawet jak napiszesz:

    Code:
    int a;
    
    a = (double)(2.876);


    2/5 = 0;
    2/5.0 = 0.4;

    i nie ma znaczenia do czego to przypisujesz możesz to nawet przypisywać do liczby doublefloat a i tak dostaniesz 0
  • #83
    margas4542
    Level 16  
    witam....są postępy jak to widać na tym niezbyt udanym zdjęciu...zrobiłem dodatkową płytkę z paroma przydatnymi rzeczami...i odpaliłem po modyfikacjach program....LCD nie chciał chodzić na porcie D więc chodzi na C...z RW
    LCD 4x20 z przesuwanym i migającym kursorem w 4 wierszu LCD 4x20 z przesuwanym i migającym kursorem w 4 wierszu

    teraz dumam nad przełączaniem kanałów bo teraz wyświetla w dwu miejscach ten sam pomiar...z LCD zrobiłem tak..
    [code]
    //-----LCD pierwszy wiersz pomiar 1
    LCD_GoTo(0,0);
    LCD_WriteText("AKUM");
    LCD_GoTo(5,0);
    LCD_WriteText(dtostrf(aku_v=aku_v/414.0,5,2,buffer_n));//na wejściu ADC
    LCD_GoTo(10,0);
    LCD_WriteText("V");
    //------LCD pierwszy wiersz pomiar 2
    LCD_GoTo(12,0);
    LCD_WriteText(dtostrf(aku_i=aku_i/414.0,5,2,buffer_n));//na wejściu ADC
    LCD_GoTo(17,0);
    LCD_WriteText("A");
    //-----LCD drugi wiersz pomiar 3
    LCD_GoTo(0,1);
    LCD_WriteText("SOL");
    LCD_GoTo(5,1);
    LCD_WriteText(dtostrf(solar_v=solar_v/414.0,5,2,buffer_n));//na wejściu ADC
    LCD_GoTo(10,1);
    LCD_WriteText("V");
    //------LCD drugi wiersz pomiar4
    LCD_GoTo(12,1);
    LCD_WriteText(dtostrf(solar_i=solar_i/414.0,5,2,buffer_n));//na wejściu ADC
    LCD_GoTo(17,1);
    LCD_WriteText("A");
    //-----LCD trzeci wiersz
    LCD_GoTo(20,0);
    LCD_WriteText("0 1 2 3 4 5 6 7 8 9");
    //----LCD czwarty wiersz
    LCD_GoTo(20,1);
    LCD_WriteText(text);
    //----------------------
    }
    }
    ISR(ADC_vect)

    ... niby proste a nie potrafię załapać jak przełączać MUX-y...
  • #84
    PO.
    Level 20  
    Zamykaj pliss znaczniki code bo to się źle czyta.

    Dziwne rzeczy robisz licząc i wyświetlając jednocześnie, trochę nie mogę tego ogarnąć co tam ma być. Jeśli masz jakieś wątpliwości to zawsze(!) sprawdzaj z kartką i ołówkiem :) , no i wyświetlaj sobie gołe dane wejściowe - będziesz wiedział czy są poprawne.
    Może mierzysz na różnych wejściach ale masz na nich to samo?


    Przełączać - w sensie?

    PS: fajna płytka i niegłupi lcd :) . Muszę wreszcie jakąś własną machnąć a nie lecieć ciągle na pająkach... Aha, spróbuj robić zdjęcia w trybie makro jeśli się da, będą ostre.
  • #85
    gaskoin
    Level 38  
    Code:

    void SetADCChannel(unsigned char channel){
            ADMUX = (ADMUX&0xE0) + channel;
    }


    można ją zrobić jako funkcję inline

    Ja też sobie już od dawien dawna wmawiam, że zrobię sobie płytkę a jeszcze nigdy jej nie zrobiłem :P
  • #86
    margas4542
    Level 16  
    ...skorzystałem z ostatniego listingu trochę go modyfikując..i na pierwszy kanale wskazania są prawidłowe drugi prawdopodobnie zasysa dane z pierwszego...mam schemat i projekt takiej dodatkowej płytki w eagle mogę posłać ci na e-mail...
  • #88
    margas4542
    Level 16  
    ..wystarczy wejść tu..
    ftp://margas.homelinux.com/

    pliki na samym dole spakowane zip-em w formacie pdf oraz eagle" target="_blank" rel="noopener nofollow ugc" data-caption="" title="http:// ftp://margas.homelinux.com/

    pliki na samym dole spakowane zip-em w formacie pdf oraz eagle" class="postlink ">Link
  • #89
    gaskoin
    Level 38  
    margas4542 wrote:


    pliki na samym dole spakowane zip-em w formacie pdf oraz eagle


    akurat u mnie to był 2 od góry :P

    Wszystko ładnie pięknie, ale z tego co wrzuciłeś nie domyślę się jak masz podpięty przetwornik :)
  • #90
    margas4542
    Level 16  
    ...wstawiam schemat..
    [img]
    LCD 4x20 z przesuwanym i migającym kursorem w 4 wierszu

    [/img]