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.

atmega8 - przerywa na wyjściu

30 Lis 2010 22:17 1127 8
  • Poziom 11  
    Witam.
    Otóż programowaniem mikrokontrolerów (w moim przypadku programowanie to całkiem mocne słowo) zaintersowałem się kilka dni temu. Zlutowałem programator pod LPT i na początku kombinowałem z zapalaniem diod. Wszystko grało, potem zaprogramowałem mikrokontroler gotowym wsadem, ustawiłem fusebity i w oparciu o ten układ zbudowałem programator na USB (usbasp).
    Tutaj przez pewien czas, też wszystko było ok, natomiast po którejś z kolei próbie wgrania programu zaczeły się schody. A mianowicie ustawiam dla b0 i b1 stany, by zaswiecic (na stałe) diode, a ona owszem, świeci, ale przerywa z dość dużą częstotliwością (mruga). Gdy wgrywam program i chcę by dioda mrugała - wtedy albo świeci na stałe, albo w ogóle nie świeci. Dodam jeszcze, że po tych dziwnych wydarzeniach, zaprogramowalem ten sam mikrokontroler programatorem pod LPT i jeden raz było dobrze. Wróciłem do programowania przez USB i problem znowu sie pojawił. Po nastepnej przesiadce na LPT objawy pozostały takie same i teraz niezależnie poprzez jaki port (programator) zaprogramuje atmega8 to albo szybko mruga, albo w ogole nie swieci.
    Do LPT uzywalem ponyprog2000 natomiast do usbasp nie uzywalem avrdude tylko jakis chinski programik progisp167...

    Sam obstawiam, że padł mikrokontroler(moze jakis fusebit przestawiony?). Może jakies porady, co by zapobiegać takim wydarzeniom ? Na tą chwile nie mam innej sprawnej atmegi co by sprawdzić czy to nie wina programatora...
  • Poziom 11  
    tu nie było skomplikowanych operacji, po prostu działało, a po kilku próbach zmiany portów wyjściowych przestało - jestem na samym początku jeśli chodzi o mikrokontrolery.

    Pierwszy program (bascom) :

    $regfile "m8def.dat"
    config PORTB = &B00000011
    PORTB = &B00000001

    Do
    Loop


    //* tutaj dioda świeciła, wszystko było ok - pierwszy raz programowane poprzez LPT*//

    Drugi program :

    $regfile "m8def.dat"
    $crystal = 1000000

    config PORTB = &B00000011

    Do
    PORTB = &B00000001
    Waitms 250
    PORTB = 0
    Waitms 250
    Loop


    //* też wszystko było ok, kilkakrotnie zmienialem odstepy między mruganiem itd... też na początku programowane na LPT *//


    Po zrobieniu i uruchomieniu Usbasp wgrałem te same programy, zmieniałem wartości, czyściłem pamięć flash itd (po prostu ogarniałem program itd)


    Dodam, że przy ustawieniu dwóch portów wyjsciowych i podpięciu dwóch diod, zaczeło się mruganie. Oby dwie świeciły w odpowiednio podpiętych miejscach, ale mrugały ( a miały świecić na stałe).
    Po tej operacji, cokolwiek wgrałem dioda (diody) na odpowiednich portach swieciły ale mrugały. Raz się zdarzyło, że przy programie z mruganiem diody, świeciła się na stałe. Trzeba zakupić nowego procka ?
  • Moderator Mikrokontrolery Projektowanie
    Nie znam BASCOMa, ale nie widzę abyś ustawił odpowiednie bity portu B jako wyjścia, czyli w rejestrze DDRB, chyba że robi to instrukcja:

    Code:
    config PORTB = &B00000011 


    A jak masz ustawiony zegar i czy czasem nie jest tak, że masz kwarc np. 12MHz a w programie ustawione 1MHz?

    Code:
    $crystal = 1000000 


    tadtal napisał:
    Trzeba zakupić nowego procka ?

    Nie sądzę, raczej wina leży po stronie programu, chyba że przestawiałeś fusbity.

    Dobrze byłoby abyś załączył schemat Twojego rozwiązania.
  • Poziom 11  
    Progam w bascomie był dobry - swiadczy o tym min. to, że na samym początku wszystko działało.
    Zauważyłem, że dioda która ma mrugać (pomijając fakt, że mruga cały czas z dużą częstotliwościa - coś na styl podłączenia żarówki pod napięcie zmienne 10hz) w momencie kiedy powinna nie świecić, leciutko sie ściemnia, a w momencie gdy powinna sie zapalać troche się rozjaśnia... świeci cały czas, ale przygasa i rozjaśnia się w odstępach czasu odpowiednich do pierwotnego mrugania... nic już z tego nie rozumiem...


    Po zakupie nowego mikrokontrolera i wgraniu tych samych wsadów, wszystko jest ok. Programowałem poprzez LPT, wole z tym usbasp nie ryzykowac (przy tamtym procku schody zaczeły się własnie przy używaniu usbasp). Czy jest możliwość, że przez ten dziwny programik tak się działo ?
  • Poziom 38  
    Code:
    PORTB = &B00000001
    
    Waitms 250
    PORTB = 0
    Waitms 250
    Loop



    Nie znam bascoma w ogóle ale z tego co widzę to zapalasz diodę, czekasz 250ms po czym ja gasisz i czekasz 250 ms - taki program napisałeś i dziwisz się, że mruga? :D
  • Poziom 27  
    Code:

    config PORTB = &B00000011

    Zaprogramowałeś pierwsze 2 porty jako wyjścia, resztę jako wejścia.
    Powinno być w zasadzie tak:
    Code:

    config PORTB = &B00000011
              PORTB = &B00000000

    potem
    Code:

    PORTB = &B00000001
    Waitms 250
    PORTB = 0
    Waitms 250
    Loop


    zrób tak:
    Code:

    Do
    PORTB.0 = 1
    Waitms 250
    PORTB.0 = 0
    Waitms 250
    Loop

    Lub tak:
    Code:

    do
    TOGGLE PORTB.0
    Waitms 250
    Loop

    A najlepiej użyj zmiennej do liczenia przerw mrugania, inaczej jeśli coś dopiszesz to może być problem z Waitms xxx
    I oczywiście prędkość programu musi się zgadzać z oscylatorem.