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

Programowanie w C - czemu wpisany czas nie działa?

B_R_U_T_U_S 07 Mar 2013 13:42 2280 11
  • #1 07 Mar 2013 13:42
    B_R_U_T_U_S
    Poziom 8  

    Witam, mam problem, a mianowicie zaczynam zabawę z mikroprocesorami i mam już zonka na samym początku?
    z programowaniem miałem kontakt pisząc w Delphi, ale nigdy z C.

    Czemu poniższy kod nie działa, a raczej nie utrzymuje wpisanego czasu, a zmiana "zapalanie się diody" następuje po około 5 sekundach.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 11
  • Deimic One - Szkolenia
  • Pomocny post
    #2 07 Mar 2013 13:55
    perlon
    Poziom 19  

    Jakie środowisko? Czyste WinAVR + plik make czy może jakieś inne IDE?
    Prawdopodobnie konflikt deklaracji F_CPU. Wywal to z kodu i sprawdź ewentualnie ustaw we właściwościach globalnych projektu plik make lub ustawienia we właściwościach projektu w IDE. Sprawdź fusbity czy faktycznie masz 1MHz bo może mega chodzi na innym zegarze.

    0
  • Deimic One - Szkolenia
  • #3 07 Mar 2013 14:04
    B_R_U_T_U_S
    Poziom 8  

    WinAVR + plik make

    taktowania nie zmieniałem chodzi na wewnętrznym czy jakoś tak
    Jak sprawdzić fusbity
    ps nie ważne czy dam _delay_ms(2000); czy _delay_ms(2000000); i tak trwa 5sekund
    jestem początkujący i robiłem według kursu wszystko z pewnej strony ale chciałem zmienić troszkę kod i nie daje mi spokoju ten czas zmiany świecenia diody ps:


    jak wyglądał by kod do :
    pod pin [2] i [3] atmegi8 podłączone w kolejności micro switch-masa pod pin14 rezystor - dioda -masa czyli układ typowy

    a rozchodzi mi o kod w którym po naciśnieciu 1 micro switch zapalała by się dioda po naciśnięciu drugiego micro switch gasła

    0
  • #5 07 Mar 2013 15:02
    perlon
    Poziom 19  

    Najpierw opanuj miganie bez switch'y a nie wchodź w następne tematy nie rozwiązując bieżących problemów.
    Wywal F_CPU z kodu i ustaw go w pliku make
    Fusbity odczytasz programem AVRDude i ewentualnie nakładki GUI : wersja darmowa MKAvrCalculator kolegi mirek36 lub BurnOMat. Wszystko dostępne w sieci.

    0
  • #7 07 Mar 2013 22:00
    perlon
    Poziom 19  

    Albo Eclipse z pluginem do AVR. WinAVR może zostać ewentualnie ściągnij nowy toolchain z Atmela ale wtedy Eclipsa trzeba nieco dopieścić.

    0
  • #8 08 Mar 2013 11:14
    B_R_U_T_U_S
    Poziom 8  

    Proszę o pomoc co zrobić by

    po tym jak i bedzie większe niż 5 -->> PORTB ^= (1<<PD1); zapalał się "wprowadzał stan wysoki ale nie gasł po chwili gdy petla przechodzi do kolejnej czynności -- czyli jak zablokować jego stan ... mam nadzieje że rozumiecie chodzi o fragment pogrubiony




    /* "led.c" - programik do testowania środowiska WinAVR */
    /* układ ATmega 1MHz */
    /* PB0,PB1 - diody LED; PD0 - przycisk */

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)
    {

    DDRB |= (1<<PD0); /// wprowadzenie stanu wysokiego +5
    DDRB |= (1<<PD2);
    DDRB |= (1<<PD1);
    DDRD &= ~(1<<PD0); ///
    PORTD |= (1<<PD0) ;///
    DDRD &= ~(1<<PD1); ///
    PORTD |= (1<<PD1) ;///sw

    int a;
    int b;
    int i;


    while (1)

    {




    //if (!(PIND & (1<<PD0)) )

    //a=1;

    //if (!(PIND & (1<<PD1)) )
    //b=1;




    for( i=0 ; i<15 ; i++)
    {

    if ( i > 5 )
    PORTB ^= (1<<PD1);




    PORTB ^= (1<<PD0); /// włączenie diody
    _delay_ms(500);
    PORTB &= ~ (1<<PD0); /// wyłaczenie
    _delay_ms(500);


    PORTB ^= (1<<PD2); /// włączenie diody
    _delay_ms(500);
    PORTB &= ~ (1<<PD2);
    _delay_ms(500);

    }}}

    0
  • #9 08 Mar 2013 12:15
    perlon
    Poziom 19  

    1. Stosuj znaczniki kodów
    2. Rozumiem że to początki ale PORTB |= (1<<PD1) co to ma być? Dlaczego nie PORTB |= (1<<PB1)?
    3. DDRB |= (1<<PD0); /// wprowadzenie stanu wysokiego +5 to nie jest wprowadzenie stanu wysokiego tylko ustalenie kierunku portu na wyjście. Uwaga jw.
    4. Generalnie kod załączony do pytania to masakra z kupą zakomentowanych śmieci. Tak się nie zadaje pytań bo za chwilę nie będzie chętnych, żeby odpowiadać na taki bałagan. Recepta - zwięzłe i jasne pytanie oraz krótki fragment kodu bez śmieci umieszczony w znacznikach.

    Czyli co. przy pierwszym wejściu do main i doliczeniu w pętli for() i == 5 przerzucić stan PORTB1 na wysoki i ma tak zostać? Bo widzę że później nic z PORTB1 nie robisz

    zamiast

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ustaw
    Kod: c
    Zaloguj się, aby zobaczyć kod


    PORTB1 zmieni stan na wysoki chwilę po resecie. Nie jestem pewien czy o to ci chodziło, ale to samo uzyskasz jak przeniesiesz pętlę for() przed while(1).
    Chyba jednak chodziło ci o coś w tym stylu
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 08 Mar 2013 14:47
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli już, to raczej "if (i == 5)"...

    0
  • #12 26 Mar 2013 20:49
    B_R_U_T_U_S
    Poziom 8  

    Ok mam kolejny problem kod poniżej ..
    jak włączę to na wyświetlaczu zamiast
    Liczba _ A 0

    mam

    Liczba _ A 4110 //// skąd się to bierze przed pętlą główną mam A==0 // czyli na starcie powinno być 0 nie jakieś 4110


    LCD + 2 przyciski {PLUS i MINUS}

    oraz 2 zmienne

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    W głównej pętli :

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    ////////////////


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [godziny] 30 [minuty]:

    zauważyłem że zmienne również zmieniają mi się gdy wyświetlę temperature na LCD czujnik do DS18B20 już mi ręce opadają jak nie wyświetlam temperatury to wszystko działa jak wyśwoetle na moment a potem wyświetlam zmienne to zmienne szaleją

    0