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.

[Atmega8] Zliczanie impulsów i zapis do pliku

pico1 03 Sie 2009 14:15 1903 2
  • #1 03 Sie 2009 14:15
    pico1
    Poziom 14  

    Witam
    Z pomocą jednego kolegi z forum buduję małe urządzenie które za zadnie ma zliczać ilość impulsów z enkodera.Na tą chwilę zamiast enkodera mam zamontowany przycisk.W ramach testu dostałem od niego kod .Zmontowałem płytkę zaprogramowałem procka.I niby wszystko ładnie chodzi,czyli
    1. Naciskam 5 razy przycisk z klawiatury wybieram ,,?'' w hyperterminalu otrzymuję wynik 5
    2. Wciskam ,,R'' otrzymuję 0
    Układ na tym etapie działa tak jak miał działać.Ale niestety urwał mi się kontakt z tym kolegą a ja kompletnie nie znam się na pisaniu programów.Następnym etapem miał być zapis do pliku txt.
    Czy mógłby ktoś dopisać kawałek kodu by wynik zapisywany był do pliku np C:/wynik txt.
    Czyli wciskam 5 razy przycisk -wybieram ,,?'' z klawiatury a wynik jest zapisany do pliku
    Wybieram ,,R'' w pliku txt pojawia się 0
    Oto ten kod który dostałem

    Code:

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

    #define FOSC 11059200
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1

    #define TX_ON (UCSRB |= _BV(UDRIE))
    #define TX_TEST bit_is_set(UCSRB, UDRE)
    #define TX_OFF (UCSRB &= ~_BV(UDRIE))

    volatile char buff[0xf];

    void USART_Init( unsigned int ubrr)
    {
        UBRRH = (unsigned char)(ubrr>>8);
        UBRRL = (unsigned char)ubrr;
        UCSRB = (1<<RXEN)|(1<<TXEN) | (1 << RXCIE);
        UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }

    ISR(USART_RXC_vect) // reciv cmpl
    {
        register char znak;
        if (znak = UDR)
        {
            switch (znak)
            {
                case 'R':
                    TCNT1 = 0;
                    if (!TX_TEST)
                    {
                        itoa(TCNT1, buff, 10);
                        TX_ON;
                    }
                    break;
                case '?':
                    if (!TX_TEST)
                    {
                        itoa(TCNT1, buff, 10);
                        TX_ON;
                    }
                    break;
            }
        }
    }

    ISR(USART_UDRE_vect) // Transfer Complete
    {
        static char cur = 0;
        register char znak = buff[cur];
        buff[cur++] = 0;
        if(znak || cur == (0xF))
        {
            UDR = znak;
        }
        else
        {
            TX_OFF;
            cur = 0;
        }

    }


    int main( void )
    {
        USART_Init(MYUBRR);

        TCCR1B = (1 << CS12) | (1 << CS11);

        sei();
        while(1)
        {
            __asm("nop");
        }
    }

    0 2
  • #2 03 Sie 2009 14:54
    wicy
    Poziom 22  

    Rozumiem, że wynik ma być zpisany do pliku na dysku komputera a nie np. na karcie podłączonej do procesora :)
    Żeby zapisać wynik do pliku powinieneś napisać drugi program działający po stronie PC, obsługujący port com i zapisujący odbierane nim dane. Chyba, że sam hyperterminal ma opcję zpisu zawartości okna (przychodzących danych) do pliku.

    0
  • #3 03 Sie 2009 15:40
    pico1
    Poziom 14  

    Dokładnie.Wynik ma być zapisywany na PC.Jeżeli jest problem z tym aby dodać kawałek kodu by robił to procek nie ma problemu by było to tak :
    Otwieram programik - zapisuje się wynik - zamyka się programik.

    0
  Szukaj w 5mln produktów