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

Jak zmienić ten program? Co zmienić, aby program był poprawnie napisany?

26 Lut 2006 13:37 1856 4
  • Poziom 18  
    Od niedawna uczę się programowania mikrokontrolerów w języku C. Cwiczę na ATMega8, programy piszę w WinAVR, programuję przez USB.
    Języka C do uC uczylem się narazie z krótkiego tutorialu umieszczonego w internecie. Potrafię już sterować silnikiem przez mostek H i PWM, dzisiaj napisalem program wyświetlający multipleksowo na 2 wyświetlaczach LED kolejno liczby od 0 do 99, program jest prowizoryczny i duży, lecz nie mialem problemów z jego napisaniem. Myslę że styl w jakim napisalem program nie jest zbyt porawny, programy jakie widzialem byly napisane w inny sposób, więc jak to można inaczej napisać? Co to zmienić, aby bylo poprawnie? Podkreślam że program dziala.

    #include <avr/io.h>
    #define F_CPU 1000000 /* 1MHz zegar procesora */
    #define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cykli na mikrosekundę */


    /*#define LED_ON sbi(DDRD,PD2);sbi(PORTD,PD2)
    #define LED_OFF sbi(DDRD,PD2);cbi(PORTD,PD2); */



    #define pierwszy_ON sbi(DDRB,PB7); cbi(PORTB,PB7); //pierwszy wyświetlacz
    #define pierwszy_OFF sbi(DDRB,PB7); sbi(PORTB,PB7);
    #define drugi_ON sbi(DDRB,PB6); cbi(PORTB,PB6); //drugi wyświetlacz
    #define drugi_OFF sbi(DDRD,PB6); sbi(PORTB,PB6);

    #define zero sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
    #define jeden sbi(DDRD,PD3);cbi(PORTD,PD3);sbi(DDRD,PD4);cbi(PORTD,PD4);
    #define dwa sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD7);cbi(PORTD,PD7); sbi(DDRD,PD6);cbi(PORTD,PD6);
    #define trzy sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
    #define cztery sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5);
    #define piec sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);
    #define szesc sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
    #define siedem sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4);
    #define osiem sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6); sbi(DDRD,PD7);cbi(PORTD,PD7);
    #define dziewiec sbi(DDRD,PD1);cbi(PORTD,PD1); sbi(DDRD,PD2);cbi(PORTD,PD2); sbi(DDRD,PD3);cbi(PORTD,PD3); sbi(DDRD,PD4);cbi(PORTD,PD4); sbi(DDRD,PD5);cbi(PORTD,PD5); sbi(DDRD,PD6);cbi(PORTD,PD6);



    #define gaszenie sbi(DDRD,PD1);sbi(PORTD,PD1); sbi(DDRD,PD2);sbi(PORTD,PD2); sbi(DDRD,PD3);sbi(PORTD,PD3); sbi(DDRD,PD4);sbi(PORTD,PD4); sbi(DDRD,PD5);sbi(PORTD,PD5); sbi(DDRD,PD6);sbi(PORTD,PD6); sbi(DDRD,PD7);sbi(PORTD,PD7);
    unsigned int k;
    unsigned int dziesiatki;
    unsigned int jednosci;
    unsigned int n;
    void delay(unsigned int us) /* opuznienia procedura */

    { unsigned int delay_loops;
    register unsigned int i;
    delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
    for (i=0; i < delay_loops; i++) {};
    }

    void delayms(unsigned int ms)

    {

    unsigned int i;

    for (i=0;i<ms;i++)

    {

    delay(999);

    asm volatile (

    "WDR"::);

    }

    }

    int main (void)

    {
    k=0; // k to wyswietlana liczba
    n=0;
    jednosci=0;
    dziesiatki=0;
    for(;;)
    {
    gaszenie;
    jednosci=k%10;
    dziesiatki=(k-jednosci)/10;
    if ((n%2)==0)
    {pierwszy_ON; drugi_OFF;
    if (jednosci==0) {zero;};
    if (jednosci==1) {jeden;};
    if (jednosci==2) {dwa;};
    if (jednosci==3) {trzy;};
    if (jednosci==4) {cztery;};
    if (jednosci==5) {piec;};
    if (jednosci==6) {szesc;};
    if (jednosci==7) {siedem;};
    if (jednosci==8) {osiem;};
    if (jednosci==9) {dziewiec;};

    }
    if ((n%2)==1)
    {drugi_ON; pierwszy_OFF;

    if (dziesiatki==1) {jeden;};
    if (dziesiatki==2) {dwa;};
    if (dziesiatki==3) {trzy;};
    if (dziesiatki==4) {cztery;};
    if (dziesiatki==5) {piec;};
    if (dziesiatki==6) {szesc;};
    if (dziesiatki==7) {siedem;};
    if (dziesiatki==8) {osiem;};
    if (dziesiatki==9) {dziewiec;};

    }
    n=n+1;
    if (n==20) {k=k+1; n=0;}
    if (k==100) k=0;
    delayms(5);
    }


    return (0);
    }




    emotikony się pojawily, umieszcze program w zalaczniku
  • Poziom 42  
    Sekwencje wykluczających się warunków IF zamień na CASE, a jak masz dwa wykluczające się warunki IF to używaj ELSE. Program pachnie kompletną nieznajomością składni języka oraz budowania algorytmów.
  • Poziom 18  
    C uczę się już jeden semestr na polibudze, mikrokontrolery programuję od tygodnia, znam skladnie języka C. W internecie jest bardzo malo informacji, kursów programowanie AVR'ów w C, niemam skąd się uczyć. Może znacie jakieś adresy stron internetowych (w języku polskim) lub książki? Co do programu to jak zmienić deklaracje cyfr na początku? Można to inaczej zapisać? Za pomocą ciągu?
  • Poziom 12  
    Sorry pytanie nie na temat. Jak podlaczasz uC pod USB, masz jakis programator czy sam cos "wymodziles"?
  • Poziom 18  
    Mam programator, z usb na rs232 i przez 90S2313 do innych AVR'ów, programator kupilem na allegro za 60zl.

    Co zmienić w programie?