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

Rzeczywiste opóźnienia inne niż w kodzie programu.

Modecom601 20 Sie 2011 23:39 1686 13
  • #1 20 Sie 2011 23:39
    Modecom601
    Poziom 13  

    Witam!
    Pisząc przykładowe programy na atmegę8 nie moge uporać się z problemem dot. opóźnień. Gdy w pętli sprawdzam warunek "zatrzymuję" działanie programu na np. 1 sekundę, podczas gdy po wrzuceniu kodu do atmegi opóźnienia są wielokrotnie dłuższe.
    Pisząc program na początku ustawiam częstotliwosc pracy avr'a tą linijką

    Code:
    #define F_cpu 1000000L

    Rownież w burn o macie przez który wrzucam kod do avr'a ustawiam czestotliwosc pracy na 1 Mhz i niestety zamiast opóźnienia 1 sekundy mam +/- 8 sekund. Przestawiałem w burn o macie na wyższe czestotliwosci, lub w kodzie wpisywałem
    8000000L i niestety, ale opóźnienia nie są zgodne z moimi założeniami. Jedyne co narazie zauwazyłem, że dzieje się to tylko, gdy program jest wstrzymywany w warunku, który jest w pętli. Po opóźnieniu wstawiałem break; i mimo to nie dawało to poprawnego efektu. Nie sądzę, żeby atmega była uszkodzona, skasowałem nawet jej zawartośc "doctorem" - bez zmian.

    Za wszelkie odpowiedzi będę bardzo wdzięczny.

    Pozdrawiam

    0 13
  • Arrow Multisolution Day
  • #3 20 Sie 2011 23:53
    Modecom601
    Poziom 13  

    Tutaj mam programik, który chciałem wrzucic do pojazdu, co prawda śmieszyc może co niektórych, ale kazdy się kiedys uczył :)

    Code:
    #define F_cpu 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h>
    int main(void)
    {
      DDRD  = 0xff;//wyjscia na silniki
      DDRC  = 0x00;//pc0,pc1 podlaczone do vcc
      PORTC = 0x03;

      while(1)//petla
     
      {
        PORTD = 0x05;// JEDZ DO PRZODU
       
               while(!(PINC & 0x01)) //1 sensor
       {
       PORTD = 0x02;
       _delay_ms(1000);
               break;
       }
       
               while(!(PINC & 0x02))//2 sensor
       {
       PORTD = 0x80;
       _delay_ms(1000);
               break;
       }
      }
    }

    Nie zdziwie sie, jesli sie okaże, że robię coś źle.

    0
  • Pomocny post
    #4 20 Sie 2011 23:53
    blue_17
    Poziom 32  

    Spróbuj tym

    http://sklep.atnel.pl/pl/p/MkAvrCalculator/4


    Darmową wersją obsługuje atmege8 więc ustaw fusy

    W zakładce programator AVR klikniesz na Programator AVR klikniesz na zapis zaptaszkujesz fuse bity potem wykonaj i gotowe

    Przed tym oczywiście wybierzesz programator mniemam ze to usbasp :)

    0
  • Arrow Multisolution Day
  • #5 20 Sie 2011 23:56
    Modecom601
    Poziom 13  

    Tak, usbasp Fischl.de
    Czy jesli potraktowałem moja atmege doctorem i w burn o macie ustawiłem reset to default to jest to to samo co w mkavrcalc domyślne ustawienie fusów?

    0
  • Pomocny post
    #6 21 Sie 2011 00:00
    blue_17
    Poziom 32  

    Nie mogę jednoznacznie odpowiedzieć na to pytanie wystarczy sprawdzić wartości fuse bitów po tej operacji w obydwóch programach

    0
  • Pomocny post
    #7 21 Sie 2011 00:19
    Bartek.k.k
    Poziom 21  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Podłącz diodę pod PORTC 2 i sprawdź czy będzie się co 1 sek. zapalać i gasnąć.

    0
  • Pomocny post
    #8 21 Sie 2011 04:10
    dondu
    Moderator Mikrokontrolery Projektowanie

    Twoim problemem jest wielkość liter:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    F_CPU musi być pisane dużymi literami.

    Ale problem ten masz dlatego, że ignorujesz warningi: http://mikrokontrolery.blogspot.com/2011/04/bledy-kompilacji-programu.html

    Rzeczywiste opóźnienia inne niż w kodzie programu.

    I dlatego stoisz na stopniu nr 10: http://mikrokontrolery.blogspot.com/2011/04/pieklo-poczatkujacych.html

    A swoją drogą definiuj zegar w opcjach projektu (o czym także przeczytasz w pierwszym linku.

    0
  • Pomocny post
    #9 21 Sie 2011 07:32
    mirekk36
    Poziom 42  

    dondu napisał:
    Twoim problemem jest wielkość liter:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    F_CPU musi być pisane dużymi literami.


    Dokładnie - a poza tym to jest jeden z najlepszych przykładów na elektrodzie - DLACZEGO DEFINIOWANIE F_CPU w kodzie programu prowadzi do różnych błędów.

    Nigdy nie używaj takiego #define w kodzie programu i nie jest to ważne tylko dlatego że możesz się pomylić i napisać małymi literami. Mogą cię spotkać jeszcze bardziej przykre niespodzianki gdy zaczniesz pisać wieloplikowe projekty. Dlatego taktowanie ustawiaj tylko w opcjach projektu albo w samym pliku makefile jeśli działasz w zwykłym WinAVR. A jeśli z kolei działasz w AVR Studio5 i tam nie wiesz gdzie są te opcje projektu - to odpuść sobie tą wersję AVR Studio i wróć do 4.xx albo przejdź na Eclipse. Bo AVRS5 jeszcze innymi babolami cię z kolei zaskoczy niedługo.

    0
  • Pomocny post
    #10 21 Sie 2011 11:13
    maly_elektronik
    Poziom 23  

    a nie powinno być F_CPU 1000000UL z tą literką U :?:

    0
  • Pomocny post
    #11 21 Sie 2011 11:16
    dondu
    Moderator Mikrokontrolery Projektowanie

    maly_elektronik napisał:
    a nie powinno być F_CPU 1000000UL z tą literką U :?:

    przy wartości 1 miliona nie ma to znaczenia ponieważ typ Long jest znacznie większy:
    L- oznacza Long
    U - unsigned

    Oczywiście dla pewności powinieneś stosować UL, tak jak na zrzucie ekranu który przygotowałem dla ciebie powyżej.

    Ale najważniejsze jest nie olewanie warningów!
    bo "tu jest pies pogrzebany" w Twoim przypadku.

    0
  • #12 21 Sie 2011 11:49
    Modecom601
    Poziom 13  

    Witam Wszystkich.
    Od poczatku zdziwiło mnie troszke, że listing podany przez Bartka k. nie ma ustawienia częstotliwosci zegara. Sprawdziłem na swoim przykładowym programie, gdyż w/w listing nie działał(mi). Generalnie sprawdzałem na rozmaite sposoby:
    - Napisałem bez #define, a w Burn o macie różny zakres częstotliwości 1 - 8 Mhz, dopiero na 8 Mhz sekunda była zblizona do rzeczywistej sekundy(cała tarcze zegara z paska zadan przeczekałem - szybciej o 2 sekundy)
    - Rowniez pisałem #define z zakresu miliona do ośmiu, w programie wstawiajac tez rozne wartosci, minuta nie była prawdziwą minutą.
    Jedyne ostrzeżenie jakie wystapiło
    warning: "F_CPU" redefined
    Nowa czestotliwośc zegara, no bo zmieniałem :)
    Sprawdze jeszcze te kombinacje na attinie, ale już z duzych liter deklaracja F_CPU.

    @dondu
    dziekuję za linki, czytnę wiecej przy dłuższej chwili wolnego czasu, mniemam, że strona jest Twojego autorstwa, i jeśli mógłbym się odwdzięczyć to znalazłem błąd w zdaniu, nie ortograficzny, tylko jedno zdanie nie brzmi po polsku.

    @mirku winavr makefile + programmers notepad + burn o mat. na avr studio za wcześnie, z motyką na słońce mi nie spieszno, wpierw tak jak widzisz musze nauczyć się znajdować swoje błedy, banalne lub nie, ale destabilizowały moje układy.
    Niestety ale jeszcze dam głos.
    Dziekuję za wszystkie odpowiedzi.

    0
  • #13 21 Sie 2011 12:22
    maly_elektronik
    Poziom 23  

    Jeśli nie chcesz się porywać z motyką na słońce to spróbuj pracy w Eclipse (z odpowiednimi pluginami) :)

    Jeśli dobrze pamiętam to widziałem w rozdziałach książki mirkka36 opis co należy zrobić żeby wszystko działało :)

    Jeśli nie to poczytaj TUTAJ

    0
  • #14 21 Sie 2011 13:29
    Bartek.k.k
    Poziom 21  

    Modecom601 napisał:
    Witam Wszystkich.
    Od poczatku zdziwiło mnie troszke, że listing podany przez Bartka k. nie ma ustawienia częstotliwosci zegara.


    Nie ma, ponieważ nigdy nie ustawiam częstotliwości w taki sposób. Piszę w eclipse i we właściwościach projektu ustawiam model mikrokontrolera oraz taktowanie. Pozdrawiam Bartek!

    0