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

[podstawy] Atmega8: Dlaczego dioda LED nie miga w Bascom-AVR?

musznik 29 Gru 2007 00:17 5818 12
REKLAMA
  • #1 4634645
    musznik
    Poziom 11  
    Posty: 38
    Ocena: 1
    Witam

    Jestem mega poczatkujacym w tej sprawie ;)

    Posiadam kupioną Atmege8 + zbudowany programator pod PonyProg'a
    Problem polega na prostym symulowaniu migajacej diody ( standardowe zapalanie ,gaszenie,0/1 ).

    Bascom-AVR :
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Portb = Output
     Do
        Waitms 5
        Portb.0 = 0
        Waitms 5
        Portb.0 = 1
     Loop
    End
    

    zrzucam do pliku hex, wgrywam "Write program memory Flash"
    lecz to nie działa,rezulatatem jest ciagle swiecaca sie dioda...

    wczesniej zastosowalem
    
    Config Portb = &B11111111  
               Portb = &B11111111  
    Config Portd = &B1111100   
               Portd = &B1111111  
    Do                                                   
        If Pind.0 = 0 Then Portb.0 = 0                                      
        If Pind.1 = 0 Then Portb.0 = 1                                                
    Loop                                              
    End                          
    

    i działało :) tlumaczyc chyba nie bede :)

    Przejrzalem forum,widzialem 2 posty z moim problemem lecz bez odpowiedzi... co robic?
  • REKLAMA
  • #2 4634858
    magik128
    Poziom 22  
    Posty: 654
    Pomógł: 20
    Ocena: 27
    witam

    Ustawiasz czas opóźnienia 5ms (waitms 5) Co daje częstotliwość migania diody 200Hz :) Twoje oko nie jest aż tak szybkie żeby to zobaczyć.Człowiek widzi miganie do około 25Hz ,powyżej daje to efekt ciągłego świecenia ( w twoim wypadku pewnie z połową jasności diody)

    Sprawdź to:
    $regfile = "m8def.dat" 
    $crystal = 1000000 
    Config Portb = Output 
     Do 
        Waitms 250
        Portb.0 = 0 
        Waitms 250
        Portb.0 = 1 
     Loop 
    End 
    


    Na pewno masz rezonator 10MHz ?
  • REKLAMA
  • Pomocny post
    #3 4635423
    mkul
    Poziom 18  
    Posty: 344
    Pomógł: 21
    Ocena: 8
    po $crystal podawana jest częstotliwość w Hz, więc 1000000 jest ok dla domyślnie skonfigurowanej atmegi8. Z resztą to lepiej ustawiać w opcjach kompilatora.

    Aha i zamiast pisać:

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


    wystarczy

     Do 
        Waitms 250 
        Toggle Portb.0
     Loop 
    


    a to, że pierwszy listing działał wynika chyba z tego, że za każdym razem sprawdzane są obydwa warunki i wykonywane polecenie po jednym z nich co zajmuje trochę czasu i widać, że dioda mruga.

    Pozdrawiam
  • #4 4635540
    musznik
    Poziom 11  
    Posty: 38
    Ocena: 1
    Wszystko działa idealnie.
    Problemem były czasy oczekiwania ( Waitms,Wait ).

    A jeżeli już jesteśmy przy diodach led - to teraz jak zrobić odpowiedni efekt gaszenia diody na PWM

    Wiem ze mozna zastosowac timery..
    
    $regfile = "m8def.dat"
    $crystal = 10000000
    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
    Config Timer2 = Pwm , Pwm = On , Prescale = 64 , Compare Pwm = Clear Down
    
    Do
    nop
    Loop
    


    jedynie co uzyskuje to dziwne miganie diody,przerwy,zapalanie,itp..
    jak napisac to poprawnie, sugreuje podanie konkretnego gotowego przykladu :), niekoniecznie z wyjsanieniem
  • REKLAMA
  • #5 4635718
    k4be
    Poziom 31  
    Posty: 2129
    Pomógł: 102
    Ocena: 333
    Nie lepiej używać czegoś jaśniejszego (najprostszy jest C) w miejsce tego, co myśli za człowieka (skoro człowiek sam myśleć potrafi)?
    W tym kodzie (o ile go rozumiem, nie znam tego języka), oba układy pwm są włączane z różnymi współczynnikami wypełnień, a potem nic ich nie zmienia. Czy mam rację?
  • #6 4635734
    magik128
    Poziom 22  
    Posty: 654
    Pomógł: 20
    Ocena: 27
    witam

    W przykładzie podanym przez Ciebie ustawiasz tylko liczniki do pracy jako PWM. Aby zmieniać współczynnik wypełnienia należy wpisać do odpowiedniego rejestru ,który będzie odzwierciedlał współczynnik wypełnienia.

    
    $regfile = "m8def.dat"
    $crystal = 10000000
    Config pinb.1=output
    config pinb.2=output
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    do
    Pwm1a = 10
    Waitms 200
    Pwm1a = 20
    Waitms 200
    Pwm1a = 30
    Waitms 200
    Pwm1a = 40
    Waitms 200
    Pwm1a = 50
    Waitms 200
    Pwm1a = 60
    Waitms 200
    Pwm1a = 70
    Waitms 200
    Pwm1a = 80
    Waitms 200
    
    
    
    pwm1b=100
    loop
    end
    


    Program ten co 200ms zwiększa jasność diody,a potem wraca do początku. Jasność jest zależna od liczby jaką wpiszesz do rejestru "Pwm1a"
    dioda podłączona do portb.1
  • #7 4635870
    musznik
    Poziom 11  
    Posty: 38
    Ocena: 1
    Dioda została podłączona (rezystor 350ohm, dioda 5mm ) , układ zaprogramowany.

    Dioda nie zapala sie płynnie, jedynie co widze to migotanie, chwilowe przerwy w dzialaniu i ponowne migotanie.

    Lecz po chwili obserwacji widac jakies powolne rozjasnianie... mimo tego przez wiekszosc czasu nic sie nie dzieje albo migota chwilke..
  • Pomocny post
    #8 4635948
    magik128
    Poziom 22  
    Posty: 654
    Pomógł: 20
    Ocena: 27
    Dioda płynnie się zapala,kiedy uzyka maksymalną jasność gaśnie i program sie powtarza.100% dobry program

    wersja dla wewnętrzengo rezonatora RC 1MHZ

    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Dim I As Byte
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    Do
    If I = 255 Then
    I = 0
    End If
    
    Incr I
    Pwm1a = I
    Waitms 10
    Loop
    End
    


    Wersja dla rezonatora 10MHz

    $regfile = "m8def.dat"
    $crystal = 10000000
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Dim I As Byte
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    Do
    If I = 255 Then
    I = 0
    End If
    
    Incr I
    Pwm1a = I
    Waitms 10
    Loop
    End
    
  • #9 4636044
    musznik
    Poziom 11  
    Posty: 38
    Ocena: 1
    Ok ,thx , program wyglada calkiem obiecujaca i na bank działa dobrze.

    Jest problem, dioda wpewnych mometach widac ze zapalac sie plynnie, ale przez wiekszosc czasu migocze ...mruga... gasnie...wszystko jakby losowo..

    Co jest nie tak?

    +5 -- [rezystor 300ohm] -- Dioda >|| -- Pb.1
  • #10 4636099
    magik128
    Poziom 22  
    Posty: 654
    Pomógł: 20
    Ocena: 27
    Może masz cały czas podpięte isp (programator),a komputer cos używa na LPT ? Sprawdź jeszcze jaka jest częstotliwość zegara procesora ustawiona (fusebity). Podłączenie diody jest ok,u mnie w fabrycznej płytce testowej jest 470Ω dla czerwonych ledów.
  • #11 4636158
    musznik
    Poziom 11  
    Posty: 38
    Ocena: 1
    kto by pomyslał :D to wina programatora:) ...
    wszystko inne działało ..ale jednak pwm nie :)
    thx;)

    ( lenistwo, :P )
  • REKLAMA
  • #12 4796125
    Patryk987
    Poziom 17  
    Posty: 343
    Pomógł: 4
    Ocena: 20
    witam
    napisałem kod coś w rodzaju pwm na 3 diody
    ale nie chce mi to działać
    może ktoś był by tak dobry i rzucił na to okiem ;)
    pozdrawiam

     $crystal = 4000000
    Config Portd = &B11111000
    Dim R As Byte
    Dim G As Byte
    Dim B As Byte
    Dim Rp As Byte
    Dim Gp As Byte
    Dim Bp As Byte
    Dim L As Byte
    Dim Rm As Byte
    Dim Gm As Byte
    Dim Bm As Byte
    R = 1
    G = 1
    B = 1
    Rp = 0
    Gp = 0
    Bp = 0
    Rm = 0
    Bm = 0
    Gm = 0
    L = 0
    Portd = &B1111111
    Do
    Rm = 255 - R
    Bm = 255 - B
    Gm = 255 - G
    If R = 254 Then
    Rp = 255
    Elseif R = 5 Then
    Rp = 4
    Elseif G = 254 Then
    Gp = 255
    Elseif G = 5 Then
    Gp = 4
    Elseif B = 254 Then
    Bp = 255
    Elseif B = 5 Then
    Bp = 4
    End If
    If R > Rp Then
    R = R + 1
    Rp = Rp + 1
    Elseif R < Rp Then
    R = R - 1
    Rp = Rp - 1
    End If
    If G > Gp Then
    G = G + 1
    Gp = Gp + 1
    Elseif G < Gp Then
    G = G - 1
    Gp = Gp - 1
    End If
    If B > Bp Then
    B = B + 1
    Bp = Bp + 1
    Elseif B < Bp Then
    B = B - 1
    Bp = Bp - 1
    End If
    Do
    L = L + 1
    Portd = &B1111011
    Waitus R
    Portd = &B1111111
    Waitus Bm
    Loop Until L = 255
    L = 0
    Do
    L = L + 1
    Portd = &B1111101
    Waitus G
    Portd = &B1111111
    Waitus Gm
    Loop Until L = 255
    L = 0
    Do
    L = L + 1
    Portd = &B1111110
    Waitus B
    Portd = &B1111111
    Waitus Bm
    Loop Until L = 255
    L = 0
    Loop 
  • #13 5866951
    przemorl
    Poziom 11  
    Posty: 9
    No dobra - podejście drugie.
    Poprzedniego posta usunąłem, ponieważ nie było odpowiedzi napiszę jeszcze raz o co mi chodzi w przystępniejszej formie.

    Jest program:
    $regfile = "m8def.dat"                      'najpierw określamy typ proca
    $crystal = 1000000       'definiujemy z jakim taktowaniem będzie pracował
    Config Portb = &B11111101
    Portb = &B11111111
    
    Do
        'Waitms 200
        If Pinb.1 = 1 Then Portb.0 = 0
        'Waitms 200
        If Pinb.1 = 1 Then Portb.0 = 1
    Loop
    End


    Według mnie powinien mrugać diodą podłączoną do Portb.0, nie zależnie od żadnych przycisków - ot po prostu po włączeniu zasilania ma mrugać i tyle.
    Dlaczego w symulacji bascom "krok po kroku" to nie działa?
    Waitms 200 specjalnie "wychaszowałem" dla wygody symulacji.
    A może mógłby to ktoś sprawdzić na żywym układzie, bo ja na razie nie mam możliwości?

    Edit:
    No co jest chłopy?
    Nikt nic nie wie?

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z migającą diodą LED podłączoną do mikrokontrolera Atmega8 programowanego w Bascom-AVR. Początkowy kod z bardzo krótkim czasem opóźnienia (5 ms) powodował efekt ciągłego świecenia diody, ponieważ częstotliwość migania była zbyt wysoka, by oko mogło ją dostrzec. Zalecano zwiększenie czasu Waitms do około 250 ms lub użycie polecenia Toggle Portb.0 dla prostszego kodu. W dalszej części poruszono temat sterowania jasnością diody za pomocą PWM i timerów, gdzie podano przykładowe konfiguracje Timer1 i Timer2 oraz sposób zmiany współczynnika wypełnienia przez rejestry Pwm1a i Pwm1b. Problemy z migotaniem diody podczas PWM okazały się wynikać z podłączonego programatora ISP, który zakłócał sygnał. Podano także przykładowe, działające programy do płynnego ściemniania i rozjaśniania diody. W dyskusji pojawiły się także pytania o symulację i poprawne ustawienia fusebitów oraz taktowania (częstotliwość rezonatora). Wskazano, że dla Atmegi8 z wewnętrznym rezonatorem RC 1 MHz należy odpowiednio ustawić $crystal i preskaler timera. Poruszono również kwestie podłączenia diody z rezystorem (300-470 Ω) do portu mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA