logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

attiny13 - kod SOS język C

gandzia 17 Kwi 2011 00:23 1838 23
REKLAMA
  • #1 9409245
    gandzia
    Poziom 12  
    Witam dopiero zaczynam przygodę z programowaniem, napisałem sobie programik który powinien wysyłać sygnał SOS. Ale program zapętla się w nieskończoność. Procek to attiny13. A oto nieszczęsny kod
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 9409265
    gandzia
    Poziom 12  
    układ jest spięty na płytce prototypowej, elementem wykonawczym jest dioda led wpięta w piny PB0 i PB1 (w pb0 jest anoda) dioda miga, ale czasy są niepoprawne, i ta pętla, program wykonuje się cały czas.
  • REKLAMA
  • #4 9409269
    dondu
    Moderator na urlopie...
    Czy wiesz co się dzieje po wykonaniu instrukcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    gandzia napisał:
    układ jest spięty na płytce prototypowej, elementem wykonawczym jest dioda led wpięta w piny PB0 i PB1. Nic więcej.

    To znaczy konkretnie jak jest wpięta?
  • REKLAMA
  • #5 9409271
    gandzia
    Poziom 12  
    Zwracana jest wartość funkcji 0? czy to ma jakiś związek z wykonywaniem programu, skoro funkcja jest typu void?
  • #6 9409275
    dondu
    Moderator na urlopie...
    Innymi słowy dochodzisz do końca funkcji głównej main() i zapewne procesor rozpoczyna pracę od początku. A ty chciałeś aby sygnał wygenerował się tylko raz, czy tak?

    Odpowiedz jeszcze na pytanie dot LED.
  • #7 9409277
    gandzia
    Poziom 12  
    No tak chciałbym by program wykonał się raz, tyle że bez return program wykonuje się ciągle, brak postępów.
  • #8 9409281
    dondu
    Moderator na urlopie...
    Nie odpowiedziałeś na moje pytanie:
    dondu napisał:
    gandzia napisał:
    układ jest spięty na płytce prototypowej, elementem wykonawczym jest dioda led wpięta w piny PB0 i PB1. Nic więcej.

    To znaczy konkretnie jak jest wpięta?



    Zamiast return 0 wstaw:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 9409283
    nsvinc
    Poziom 35  
    Zapewne procesor niestety nie wykonuje programu od początku, tylko idzie na szubienicę.
    Pisząc kod nie pracujący pod OSem (i ochroną pamięci) nie wolno pod żadnym pozorem return-nąć się z funkcji main.
    W pewnych okolicznościach można, ale wtedy robi się to celowo, dokładnie wiedząc, co procesor wykona trafiając na ten return!
  • #10 9409285
    dondu
    Moderator na urlopie...
    nsvinc napisał:
    Zapewne procesor niestety nie wykonuje programu od początku, tylko idzie na szubienicę.

    Ale jak pisze autor w jego przypadku jednak wykonuje się od ponownie i w kółko - tak mu się trafiło :)
  • #11 9409289
    gandzia
    Poziom 12  
    Program nadal wykonuje się w pętli (pewnie nieskończonej) wykonuje wciąż jakieś błyski niepotrzebne, bez związku z programem.
  • REKLAMA
  • #13 9409303
    gandzia
    Poziom 12  
    Odpowiedź dt podłączenia diod zamieściłem w wcześniej edytowanym poście.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Nawet ten program wpada w pętlę nieskończoną, nigdzie się nie zatrzymuje.
  • #14 9409306
    dondu
    Moderator na urlopie...
    Wiem, że umieściłeś ale chcę się upewnić, jak dokładnie jest podłączona. Dioda ma anodę i katodę. To co zrobiłeś jest nietypowym podłączeniem , dlatego opisz to dokładnie, bo to może być także problemem, a nie tylko program.

    Miałeś dać zamiast return 0, a nie w dwóch miejscach.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 9409311
    gandzia
    Poziom 12  
    anodę do PB0 katodę do PB1, teraz program się zatrzymuje na pętli while. Wielkie dzięki za podpowiedzi. Zacznę program pisać od nowa ale dopiero rano, napisze jak postępy. Może macie jakieś wskazówki jak to najłatwiej i najprościej napisać?
  • #16 9409312
    nsvinc
    Poziom 35  
    Parę uwag:
    - Ten program WPADNIE w pętlę nieskończoną, bo mu ją wpisałeś ( while(1);, nawiasy {} nie są potrzebne - polecam "biblię" - Kernighan&Ritchie "ANSI C"), tyle, że w tej pętli nic konkretnego nie będzie robił.

    Co do returna z main - AVR gdy trafi na niedozwoloną lub niezdefiniowaną instrukcję (a na to prędzej czy później trafi jak się return-nie z main), skacze pod reset vector i defaultuje wszystkie rejestry robocze i SFR. Stąd "wrażenie", że program wykonuje się w kółko. Ale ta metoda na reset jest jedną z gorszych :(
  • #17 9409317
    gandzia
    Poziom 12  
    Cytat:
    DDRB = 0b00000011;
    // PORT B bity 1 oraz 2 jako wyjściowe
  • #19 9409321
    dondu
    Moderator na urlopie...
    To niepotrzebnie skomplikowane podłączenia i w dodatku zużywa 1 pin za dużo. Nie wiem jaką masz diodę ale powinieneś mieć jeszcze w szereg z nią rezystor np. 470R by nie upalić portu procesora.

    Podłącz tak:

    attiny13 - kod SOS język C

    i steruj logicznym zerem.


    Co do programu:
    - najlepiej użyć tablicy, a w niej parametry mrugania diody.
    - za dużo zmiennych stosujesz w pętlach.
  • #20 9409327
    gandzia
    Poziom 12  
    Z tą tablicą to jak? W jaki sposób miała by pamiętać mrugnięcia?
  • #21 9409332
    dondu
    Moderator na urlopie...
    tablica nie ma pamiętać mrugnięcia tylko masz z niej pobierać kolejne ilości mrugnięć i czasu przerw.
    Zobacz, tutaj kiedyś pomagałem w podobnej sprawie:
    https://www.elektroda.pl/rtvforum/topic1964581.html

    A tutaj teoria wykorzystania tablic: http://www.java2s.com/Tutorial/C/0140__Array/Catalog0140__Array.htm
  • #23 9410056
    McMonster
    Poziom 32  
    Koledze wyżej błąd się wkradł, "KRÓTKO".
  • #24 11386545
    gandzia
    Poziom 12  
    Kod pod ATtiny2313
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Temat pytanie - uważam za rozwiązany dziękuję kolegom za pomoc.
REKLAMA