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

Klasa STRING a AVR studio

desmo999 07 Wrz 2008 22:22 5456 11
  • #1 07 Wrz 2008 22:22
    desmo999
    Poziom 12  

    Witam .Mam pytanie dotyczące klasy string AVR studio;
    a mianowicie . Napisałem prosty programik w Dev C++ który może wyświetlać określony znak z łańcuch znaków:

    Code:

    #include <iostream>
    #include <string>
    using namespace std;


    int main()
    {
    string imie;
    char pierwsza_litera, druga_litera;
    cout<<"Podaj imie";
    cin>>imie;
    pierwsza_litera=imie[0];
    druga_litera=imie[1];
    cout<<druga_litera;
    char c;
    cin>>c;
    return 0;
    }


    i teraz mam pytanie co zrobić by to zaczeło mi działać w AVR studio i dzięki temu w bardzo prosty sposób mógłbym wyświetlać sobie całe wyrazy na LCD.Kolejne pytanie czy istnieje jakaś możliwość zintegrowania Dev ++ z mikrokontrolerem??

    Pozdrawiam

    0 11
  • #2 07 Wrz 2008 22:26
    Przemo1268
    Poziom 19  

    Do programowania AVR-ów w C polecam WinAVR lub avr-gcc. Ja używam avr studio 4.13 oraz WinAVR - po zainstalowaniu WinAVR można w avr studio pisać programy w C pod AVR (WinAVR korzysta z AVR-GCC)

    0
  • #3 07 Wrz 2008 22:30
    Pituś Bajtuś
    Poziom 28  

    DevC++ łatwo można dostosować do współpracy z gcc dla mikrokontrolerów, kiedyś w EP nawet był opis jak to zrobić na przykładzie msp-gcc.
    A co do stosowania C++ dla mikrokontrolerów jest to troche poroniony pomysł.

    0
  • #4 07 Wrz 2008 22:43
    desmo999
    Poziom 12  

    No stosuję AVR studio ale nie wiem dlaczego nie działa mi klasa string??

    Dodano po 5 [minuty]:

    Oto mój programik na AVR w AVR studio;

    Code:
    #include <avr/io.h>
    
    #include <avr/interrupt.h>
    #include <stdlib.h>

    unsigned char wiersz=0;
    unsigned char kolumna=0;
    #include <string.h>

    #define cbi(sfr, bit)   (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit)   (_SFR_BYTE(sfr) |= _BV(bit))

    #define LCD_PORT   PORTB
    #define lcd_rs 2
    #define lcd_e 3
    #define CR 0x0a




    void czekaj(unsigned long pt)  ///petla opozniajaca


     {
       #define tau 10.38
             
           unsigned char tp1;
             for(;pt>0;pt--)
          
           {
              for(tp1=255;tp1!=0;tp1--)
                {
                  asm ("nop");
                  }       
         }
          
      }

    void instrukcja(unsigned char instr)

      {
       cbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|(instr&0xf0);
       sbi (PORTB,lcd_e);
       asm("nop");
       asm("nop");
       asm("nop");
       
     
       
       czekaj(10L);
       cbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|((instr&0x0f)<<4);
       sbi (PORTB,PB3);
       asm("nop");
       asm("nop");
       asm("nop");

       cbi(PORTB,lcd_e);
       czekaj(10L);
    }


    void dane(unsigned char instr)

      {
       sbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|(instr&0xf0);
       sbi (PORTB,lcd_e);
       asm("nop");
       asm("nop");
       asm("nop");




       
     
       
       czekaj(15L);
       sbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|((instr&0x0f)<<4);
       sbi (PORTB,lcd_e);
       czekaj(50*tau);
       asm("nop");
       asm("nop");
       asm("nop");

      czekaj(15);
    }





    int main(void)
    {


    char pojedynczy_znak;
    unsigned char i;
    string napis;
    char pierwsza_litera;

    pierwsza_litera=napis[0]




    PORTB=0x03;   //pb0-pb3 - podciągniecia
    DDRB=0xff;    //portb-wyjscie

    czekaj(45*tau);   //stabilizowanie napiecia





    for (i=0;i<3;i++)
       {
     
         cbi(PORTB,lcd_rs);
         cbi(PORTB,lcd_e);
        PORTB=(PORTB&0x00)|0x20;
        sbi(PORTB,PB3);
         asm("nop");
        asm("nop");
        asm("nop");
        cbi(PORTB,lcd_e);
        czekaj(50);
                     }

    instrukcja(0x28);  //interfejs 4 bitowy , 2 linie,znak 5x7
    instrukcja(0x08);  //wylacz LCD,wylacz kursor,wylacz mruganie
    instrukcja(0x01);  //czysc lcd
    instrukcja(0x01);
    instrukcja(0x0f);
    czekaj(2*tau);

     while(1)

     {
      dane('pierwsza_litera')
      }
    }


    myślałem że jeśli programik działa bez problemu w DEV c++ to i zadziała mi w win avr a jednak tak do konca nie jest??

    0
  • #5 07 Wrz 2008 23:02
    acid12
    Poziom 21  

    ehh, AVR Studio czy DEV-C++ to środkowiska, bądź w tym przypadku interfejsy.
    ten kod który napisałeś, kompilujesz w DEV-C++ przy użyciu gcc (kompilator języka C++)

    ale

    dla mikrokontrolerów ten kompilator się nie nadaje !
    napisano inny kompilator C (pliki .cpp tez obsługuje) a mianowicie AVR-GCC

    wszystkie projekty pisane dla mikrokontrolerów opierają się na tzw pliku wykonawczym (makefile), który to plik trzeba dołączyc do projektu (są wnim informacje jak kompilator ma łączyć dane, jakie pliki etc)

    Najprościej zainstaluj WINAVR, jest to kompleksowe środowisko do pisania programów dla mikrokontrolerów w C pod windowsem.

    jest tam 'programmers notepad' czyli GUI użytkownika w którym pisze się program, kompilator avr-gcc, programator avrdude.

    Ja zamiast pisać w PN, wykorzystuje MS Visual Studio 2008.

    Przy wyborze projektu daje "Make File Project"
    komenda dla
    build: make (F7) (kompiluj)
    clean: make clean
    rebuild: make program (CTRL+F7) (programuj)

    dzięki czemu nie muszę używac osobneg GUI programatora aby przesłąć program do procka tylko naciskam CTRL+F7

    po tym wprowadzeniu w rozne kompilatory i środowiska, odpowiedz na Twoje pytanie czemu w AVR Studio nie działa string?
    bo takiej biblioteki nie obsługuje avr-gcc, Ty piszesz program dla środowiska windows (dla procesora w PC) a masz pisac dla procesora w mikrokontrolerze.

    z Twojego programu do uC nadaje się:
    #include
    int main(){
    char ...
    return 0;
    }

    Troche informacji:
    http://freefm.pluton.one.pl/mike/avr/wstep.html
    http://mikrokontrolery.net/avr.htm
    http://avr.elektroda.eu/?q=node/8

    elektroda.pl, wikipedia i google ;)


    BTW, DEV-C++ nie jest najlepszym wyjściem, nawet dla początkujących.
    kompilują się w nim kody które nie powinny, później ludzie się tak uczą a jak przychodzi zrobić duży projekt to szukaj winnych i czemu to nie działa.

    0
  • #6 07 Wrz 2008 23:13
    desmo999
    Poziom 12  

    ehh troche chyba zle to napisałem i źle kolego ACid mnie zrozumiałeś:Ten drugi program tzn:

    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>

    unsigned char wiersz=0;
    unsigned char kolumna=0;
    #include <string.h>

    #define cbi(sfr, bit)   (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit)   (_SFR_BYTE(sfr) |= _BV(bit))

    #define LCD_PORT   PORTB
    #define lcd_rs 2
    #define lcd_e 3
    #define CR 0x0a




    void czekaj(unsigned long pt)  ///petla opozniajaca


     {
       #define tau 10.38
             
           unsigned char tp1;
             for(;pt>0;pt--)
           
           {
              for(tp1=255;tp1!=0;tp1--)
                {
                  asm ("nop");
                  }       
         }
           
      }

    void instrukcja(unsigned char instr)

      {
       cbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|(instr&0xf0);
       sbi (PORTB,lcd_e);
       asm("nop");
       asm("nop");
       asm("nop");
       
     
       
       czekaj(10L);
       cbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|((instr&0x0f)<<4);
       sbi (PORTB,PB3);
       asm("nop");
       asm("nop");
       asm("nop");

       cbi(PORTB,lcd_e);
       czekaj(10L);
    }


    void dane(unsigned char instr)

      {
       sbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|(instr&0xf0);
       sbi (PORTB,lcd_e);
       asm("nop");
       asm("nop");
       asm("nop");
       
     
       
       czekaj(15L);
       sbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|((instr&0x0f)<<4);
       sbi (PORTB,lcd_e);
       czekaj(50*tau);
       asm("nop");
       asm("nop");
       asm("nop");

      czekaj(15);
    }





    int main(void)
    {


    char pojedynczy_znak;
    unsigned char i;
    string napis;
    char pierwsza_litera;

    pierwsza_litera=napis[0]




    PORTB=0x03;   //pb0-pb3 - podciągniecia
    DDRB=0xff;    //portb-wyjscie

    czekaj(45*tau);   //stabilizowanie napiecia





    for (i=0;i<3;i++)
       {
     
         cbi(PORTB,lcd_rs);
         cbi(PORTB,lcd_e);
        PORTB=(PORTB&0x00)|0x20;
        sbi(PORTB,PB3);
         asm("nop");
        asm("nop");
        asm("nop");
        cbi(PORTB,lcd_e);
        czekaj(50);
                     }

    instrukcja(0x28);  //interfejs 4 bitowy , 2 linie,znak 5x7
    instrukcja(0x08);  //wylacz LCD,wylacz kursor,wylacz mruganie
    instrukcja(0x01);  //czysc lcd
    instrukcja(0x01);
    instrukcja(0x0f);
    czekaj(2*tau);

     while(1)

     {
      dane('pierwsza_litera')
      }
    }


    śmigał w AVR Studio do czasu aż wstawiłem tę wstawkę z string napis i potem chciałem wyświetlać kolejne znaki z wyrazu za pomocą : dane('pierwsza litera');. Chodzi mi o to by nie wpisywać koleno literek tylko za pomocą petli wysłać cały wyraz na LCD.Napisałem więc sobie ten programik w DEV C++
    Code:

    #include <iostream>
    #include <string>
    using namespace std;


    int main()
    {
    string imie;
    char pierwsza_litera, druga_litera;
    cout<<"Podaj imie";
    cin>>imie;
    pierwsza_litera=imie[0];
    druga_litera=imie[2];
    cout<<druga_litera;
    char c;
    cin>>c;
    return 0;
    }


    i spełnia on omoje oczekiwania i nie wiem co zrobićby mi ta składnia zaczęła także działać w AVR studio.

    pozdrawiam

    0
  • #7 07 Wrz 2008 23:41
    acid12
    Poziom 21  

    masz racje, źle zrozumiałem, ale z mojego postu itak można wyczytać odpowiedz.

    avr-gcc nie obsługuje typu string !! mimo że jest biblioteka string.h to nie ma w niej deklaracji typu 'string' !

    musisz użyć tablicy char'ów (jak sie nie pisało w C tylko odrazu w C++ to to przejście może być bolesne ;) bo albo deklarujesz od razu rozmiar tablicy, albo sie trudzisz później z dynamiczną alokacją, która nie wiem czy działa w avr-gcc bo nie probowałem :P )

    char napis[100];
    char *napis;

    btw: zapomniałeś dać średnika w kilku miejscach ;)

    0
  • #8 08 Wrz 2008 22:52
    desmo999
    Poziom 12  

    Witam

    Zmieniłame trochę kod jednak niestety nadal nie chce mi prgram wyświetlać kolejnych literek z wyrazu.Może ma ktoś jakieś sugestie??

    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>

    unsigned char wiersz=0;
    unsigned char kolumna=0;
    #include <string.h>

    #define cbi(sfr, bit)   (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit)   (_SFR_BYTE(sfr) |= _BV(bit))

    #define LCD_PORT   PORTB
    #define lcd_rs 2
    #define lcd_e 3
    #define CR 0x0a




    void czekaj(unsigned long pt)  ///petla opozniajaca


     {
       #define tau 10.38
             
           unsigned char tp1;
             for(;pt>0;pt--)
          
           {
              for(tp1=255;tp1!=0;tp1--)
                {
                  asm ("nop");
                  }       
         }
          
      }

    void instrukcja(unsigned char instr)

      {
       cbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|(instr&0xf0);
       sbi (PORTB,lcd_e);
       asm("nop");
       asm("nop");
       asm("nop");
       
     
       
       czekaj(10L);
       cbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|((instr&0x0f)<<4);
       sbi (PORTB,PB3);
       asm("nop");
       asm("nop");
       asm("nop");

       cbi(PORTB,lcd_e);
       czekaj(10L);
    }


    void dane(unsigned char instr)

      {
       sbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|(instr&0xf0);
       sbi (PORTB,lcd_e);
       asm("nop");
       asm("nop");
       asm("nop");
       
     
       
       czekaj(15L);
       sbi (PORTB,lcd_rs);
       cbi (PORTB,lcd_e);
       PORTB=(PORTB&0x0f)|((instr&0x0f)<<4);
       sbi (PORTB,lcd_e);
       czekaj(50*tau);
       asm("nop");
       asm("nop");
       asm("nop");

      czekaj(15);
    }





    int main(void)
    {

    int i;
    char tab[10]={"'abcd"};
    char* p=tab;

    char pierwsza_litera;






    PORTB=0x03;   //pb0-pb3 - podciągniecia
    DDRB=0xff;    //portb-wyjscie

    czekaj(45*tau);   //stabilizowanie napiecia





    for (i=0;i<3;i++)
       {
     
         cbi(PORTB,lcd_rs);
         cbi(PORTB,lcd_e);
        PORTB=(PORTB&0x00)|0x20;
        sbi(PORTB,PB3);
         asm("nop");
        asm("nop");
        asm("nop");
        cbi(PORTB,lcd_e);
        czekaj(50);
                     }

    instrukcja(0x28);  //interfejs 4 bitowy , 2 linie,znak 5x7
    instrukcja(0x08);  //wylacz LCD,wylacz kursor,wylacz mruganie
    instrukcja(0x01);  //czysc lcd
    instrukcja(0x01);
    instrukcja(0x0f);
    czekaj(2*tau);

     while(1)

     {
      dane(p[0]);
      }
    }


    a i pytanie do Acid12 czy w tym MS Visual kody z C++ przechodzą i działaja na AVR bo może łatwiej mi będzie zmienić kompilator:)
    Pozdrawiam

    0
  • #9 08 Wrz 2008 23:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    omg... tragedia...

    1. napisac funkcje, ktora wyswietla na LCD jeden znak, ktora bedzie wygladac tak:
    void LCD_print_char(char character);

    2. napisac funkcje, ktora wyswietla stringi, ktora bedzie wygladac i dzialac tak:
    void LCD_print_string(char* string_ptr)
    {
    while(*string_ptr)
    LCD_print_char(*string_ptr++);
    }

    tak, to jest naprawde takie proste... w koncu to sa podstawy C o ktorych pisze ... no gdzie? w ksiazkach! w necie! wszedzie...

    4\/3!!

    0
  • #10 08 Wrz 2008 23:27
    acid12
    Poziom 21  

    desmo999 napisał:

    a i pytanie do Acid12 czy w tym MS Visual kody z C++ przechodzą i działaja na AVR bo może łatwiej mi będzie zmienić kompilator:)
    Pozdrawiam


    przeczytaj ze zrozumieniem mój poprzedni post bo nie chce mi się jeszcze raz tłumaczyć różnicy między środowiskiem, kompilatorem, językiem programowania, interfejsem, systemem etc ...

    0
  • #11 09 Wrz 2008 10:25
    Dr.Vee
    VIP Zasłużony dla elektroda

    Witam,

    Kody nigdzie nie przechodzą, bo nie mają nóżek ;)

    desmo999, zdecyduj się, czy chcesz pisać w C czy C++. Istnieje kompilator avr-g++, ale biblioteki C++ (takie jak STL, iostream itd.) nie są dostępne, jedynie biblioteka standardowa C (avr libc).

    Oczywiście nic nie stoi na przeszkodzie (no może oprócz dostępnej pamięci ;) ), żeby skompilować odpowiednie biblioteki i ich używać w programach na AVR - być może ktoś już to nawet zrobił - wystarczy poszukać :)

    Pozdrawiam,
    Dr.Vee

    0
  • #12 09 Wrz 2008 11:15
    chudybyk
    Poziom 28  

    Zgadzam się z przeciwnikami C++ na AVR. Można używać składni i niektórych mechanizmów, ale znacznie więcej kłopotów sprawiają ograniczenia:
    1. Wspomniana dynamiczna allokacja. Niby działa, ale pamięci w procku jest niewiele i jak braknie, to się posypie cały wielki program.
    2. Klasy - konstruktory, destruktory, dziedziczenie - to co ułatwia programowanie na kompie, to tylko niepotrzebnie obciąża i spowalnia procek. Analizowanie kodu wynikowego też zaczyna nastręczać problemy.
    3. Biblioteki są w C, więc obiektowe będzie tylko to, co sami napiszemy.
    Podsumowując: na dzień dzisiejszy moim zdaniem szkoda zachodu. Lepiej się przyłożyć do C i machnąć ręką na obiekty. Strukturalny C jest wydajniejszy, stabilniejszy i dobrze zaimplementowany.
    Pozdrawiam!
    Leszek

    0