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

Regulacja PWM atmega 8 (bascom)

ogor11 28 Mar 2012 20:09 4158 9
  • #1 28 Mar 2012 20:09
    ogor11
    Poziom 13  

    Witam jestem początkujący w dziedzinie procesorów i potrzebuje pomocy w dopisaniu kodu do regulacji pwm.

    Mam zamiar zrobić zegar binarny kolegi "joboo" https://www.elektroda.pl/rtvforum/viewtopic.php?t=648151&highlight=zegar+binarny&sid=dfb7c719877b7c38e251edbc95fd7396 Lub kolegi "hubertfab" https://www.elektroda.pl/rtvforum/viewtopic.php?t=1474649&highlight=zegar+binarny&sid=dfb7c719877b7c38e251edbc95fd7396

    I proszę o dopisanie kodu do gotowego programu, tak by była możliwość regulacji jasności diod. Najlepiej było by za pośrednictwem potencjometru, ale na przyciskach też może być

    Zegar kolegi joboo

    Code:
    zegar binarny joboo
    

    $regfile = "m8def.DAT"
    $crystal = 16000000

    Dim Sekjed As Byte , Sekdzies As Byte , Minjed As Byte , Mindzies As Byte , Maxi As Byte
    Dim Godzjed As Byte , Godzdzies As Byte , Wyswietl As Byte , Migaj As Bit , Uniwersalny As Byte

    Config Portd = 255
            Portd = &B255
    Config Portc = &B0000000
            Portc = &B0000000
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Portb.4 = Output

    Config Timer0 = Timer , Prescale = 64
    Config Timer1 = Timer , Prescale = 256
    Enable Interrupts
    Enable Timer0
    Enable Timer1
    On Timer0 Co4ms
    On Timer1 Co1s
    Sekjed = 9 : Sekdzies = 5 : Minjed = 9 : Mindzies = 5 : Godzjed = 3 : Godzdzies = 2
    Uniwersalny = 6 : Maxi = 100

    Do
    Loop
    End



    Co1s:                                                       ' przerwanie co 1 sek
    Timer1 = 3036
    Incr Sekjed
    Toggle Migaj
    Return

    Co4ms:                                                      'przerwanie co 4 mili sek
    Decr Uniwersalny                                            'obsluga wyswietlaczy i przyciskow
    If Pinb.3 = 0 And Pinb.2 = 1 Then                           'przycisk s1 nacisniety
       If Uniwersalny = 0 Then
       Uniwersalny = Maxi : Incr Minjed : Sekjed = 0 : Sekdzies = 0




       Maxi = Maxi - 8
       If Maxi < 8 Then Maxi = 8                                'coraz szybciej
       End If
       End If

    If Pinb.2 = 0 And Pinb.3 = 1 Then                           'przycisk s2nacisniety
       If Uniwersalny = 0 Then
       Uniwersalny = Maxi : Incr Godzjed
       Maxi = Maxi - 8                                          'coraz szybciej
       If Maxi < 12 Then Maxi = 12
       End If
    Else                                                        'oba nacisniete lub zwolnione
    If Uniwersalny = 0 Then
    Uniwersalny = 6
    Maxi = 100
    End If
    End If

    'co 4ms korygujemy stany licznikow
    If Sekjed = 10 Then
    Sekjed = 0
    Incr Sekdzies
    End If

    If Sekdzies = 6 Then
    Sekdzies = 0
    Incr Minjed
    End If

    If Minjed = 10 Then
    Minjed = 0
    Incr Mindzies
    End If

    If Mindzies = 6 Then
    Mindzies = 0
    Incr Godzjed
    End If

    If Godzjed = 10 Then
    Godzjed = 0
    Incr Godzdzies
    End If

    ' co 4ms sprawdzamy czy nie jest polnoc jesli tak skracamy cykl

    If Godzdzies = 2 And Godzjed = 4 Then
    Godzdzies = 0
    Godzjed = 0
    End If

    'wyswietlamy
    Wyswietl = Uniwersalny And &B111
    Portc = &B0000000

    Select Case Wyswietl                                        ' obsluga wyswietlacza

    Case 1:                                                     ' wyswietl zawart. licznika jedn min
    Portd = Lookup(sekjed , Tabela )
    Portc.0 = 1

    Case 2:                                                     ' zawart licz. dzies min
    Portd = Lookup(sekdzies , Tabela)
    Portc.1 = 1

    Case 3:                                                     ' jedn godz
    Portd = Lookup(minjed , Tabela)
    Portc.2 = 1
    'Portb.4 = Migaj

    Case 4:                                                     ' dzies godz
    Portd = Lookup(mindzies , Tabela)
    Portc.3 = 1

    Case 5:
    Portd = Lookup(godzjed , Tabela)
    Portc.4 = 1

    Case 6:
    Portd = Lookup(godzdzies , Tabela)
    Portc.5 = 1

    End Select
    Return

    Tabela:
    'Data 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9                      'w negatywie
    Data 255 , 254 , 253 , 252 , 251 , 250 , 249 , 248 , 247 , 246


    Zegar kolegi hubertfab
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Portb = Output : Portb = 255
    Config Portc = Output : Portc = 255
    Config Portd = Input : Portd = 255

    K1 Alias Portc.0
    K2 Alias Portc.1
    K3 Alias Portc.2
    K4 Alias Portc.3
    K5 Alias Portc.4
    K6 Alias Portc.5

    Dim Dg As Byte
    Dim Jg As Byte
    Dim Dm As Byte
    Dim Jm As Byte
    Dim Ds As Byte
    Dim Js As Byte

    Dim A As Byte

    Dim Nr_wys As Byte

    Config Timer0 = Timer , Prescale = 8
    On Timer0 Multipleks

    Config Clock = Soft
    Time$ = "23:59:55"

    Enable Timer0
    Enable Interrupts
    Load Timer0 , 100


    For A = 1 To 6
    Jg = 8
    Jm = 8
    Js = 8
    Dg = 8
    Dm = 8
    Ds = 8
    Waitms 70
    Jg = 12
    Jm = 12
    Js = 12
    Dg = 12
    Dm = 12
    Ds = 12
    Waitms 70
    Jg = 14
    Jm = 14
    Js = 14
    Dg = 14
    Dm = 14
    Ds = 14
    Waitms 70
    Jg = 15
    Jm = 15
    Js = 15
    Dg = 15
    Dm = 15
    Ds = 15
    Waitms 70
    Next
    Do
    ' godziny
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    If _hour < 10 Then
    Jg = _hour
    Dg = 0
    End If

    If _hour > 9 And _hour < 20 Then
    Dg = 1
    Jg = _hour - 10
    End If

    If _hour >= 20 And _hour < 30 Then
    Dg = 2
    Jg = _hour - 20
    End If
    'minuty
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    If _min < 10 Then
    Jm = _min
    Dm = 0
    End If

    If _min > 9 And _min < 20 Then
    Dm = 1
    Jm = _min - 10
    End If

    If _min > 19 And _min < 30 Then
    Dm = 2
    Jm = _min - 20
    End If

    If _min > 29 And _min < 40 Then
    Dm = 3
    Jm = _min - 30
    End If

    If _min > 39 And _min < 50 Then
    Dm = 4
    Jm = _min - 40
    End If

    If _min > 49 And _min < 60 Then
    Dm = 5
    Jm = _min - 50
    End If
    'sekundy
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    If _sec < 10 Then
    Js = _sec
    Ds = 0
    End If

    If _sec > 9 And _sec < 20 Then
    Ds = 1
    Js = _sec - 10
    End If

    If _sec > 19 And _sec < 30 Then
    Ds = 2
    Js = _sec - 20
    End If

    If _sec > 29 And _sec < 40 Then
    Ds = 3
    Js = _sec - 30
    End If

    If _sec > 39 And _sec < 50 Then
    Ds = 4
    Js = _sec - 40
    End If

    If _sec > 49 And _sec < 60 Then
    Ds = 5
    Js = _sec - 50
    End If
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    If Pind.0 = 0 Then
    Waitms 30
    If Pind.0 = 0 Then
    Bitwait Pind.0 , Set
    _hour = _hour + 1
    If _hour > 23 Then _hour = 23
    End If
    End If

    If Pind.1 = 0 Then
    Waitms 30
    If Pind.1 = 0 Then
    Bitwait Pind.1 , Set
    If _hour = 0 Then _hour = 1
    _hour = _hour - 1
    End If
    End If

    If Pind.2 = 0 Then
    Waitms 30
    If Pind.2 = 0 Then
    Bitwait Pind.2 , Set
    _min = _min + 1
    If _min > 59 Then _min = 59
    End If
    End If

    If Pind.3 = 0 Then
    Waitms 30
    If Pind.3 = 0 Then
    Bitwait Pind.3 , Set
    If _min = 0 Then _min = 1
    _min = _min - 1
    End If
    End If


    Loop
    End

    Multipleks:
    Load Timer0 , 100

    Portc = 255

    Select Case Nr_wys
    Case 0:
    Portb = 255 - Dg
    K1 = 0
    Case 1:
    Portb = 255 - Jg
    K2 = 0
    Case 2:
    Portb = 255 - Dm
    K3 = 0
    Case 3:
    Portb = 255 - Jm
    K4 = 0
    Case 4:
    Portb = 255 - Ds
    K5 = 0
    Case 5:
    Portb = 255 - Js
    K6 = 0

    End Select


    Incr Nr_wys
    If Nr_wys = 6 Then Nr_wys = 0

    Return


    Jeszcze nie mam pojęcia który wykonam, dlatego proszę kolegów którzy wiedzą o co chodzi o zmodyfikowanie tych dwóch kodów,

    Z góry dziękuje

    0 9
  • #2 31 Mar 2012 13:21
    ogor11
    Poziom 13  

    Widzę że nikt mi chyba nie pomoże. Chociaż by ktoś mnie jakoś naprowadził, albo napisał o co chodzi i jak to zrealizować i czy w ogóle jest taka możliwość.

    0
  • #3 31 Mar 2012 14:02
    sorex86
    Poziom 15  

    Marcin Wiazania, programowanie w BASCOM.
    Zainteresuj sie ta ksiazka ;) Tam masz ladnie wszystko opisane odnosnie PWM.

    Teraz popatrz ile jest wyjsc w mikrokontrolerze, ktory umozliwiaja generacje sprzetowego PWM, a ile potrzebujesz w tym projekcie... - chociaz zawsze mozesz to zrobic programowo, a nie sprzetowo :) Wtedy nasuwa sie kolejne pytanie czy tranzystor zdarzy zareagowac na tak szybki sygnal. Jak nie wiesz jak to wyliczyc, to po prostu sprawdzic to! Wez plytke stykowa i sprawdz :) Jak sie bardzo chce to wszystko sie da. Jednak czasem lepiej zaprojektowac i napisac kod samemu.

    0
  • #4 21 Gru 2012 09:07
    guest666
    Poziom 12  

    Witam
    Jak zdefiniować trzeci kanał PWM a procku atmega644p.
    Mam teraz:
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

    Pwm1a = 0
    Pwm1b = 0

    a trzeci PWM?? poniżej nota atmega644p
    http://www.atmel.com/images/doc8011.pdf

    A wogóle , czy w/w procek ma 3 pwm, a może więcej??

    0
  • #5 21 Gru 2012 09:32
    sorex86
    Poziom 15  

    1 strona:

     Peripheral Features
    – Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes
    – One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
    – Real Time Counter with Separate Oscillator
    Six PWM Channels
    – 8-channel, 10-bit ADC
    Differential mode with selectable gain at 1×, 10× or 200×
    – Byte-oriented Two-wire Serial Interface
    – Two Programmable Serial USART
    – Master/Slave SPI Serial Interface
    – Programmable Watchdog Timer with Separate On-chip Oscillator
    – On-chip Analog Comparator
    – Interrupt and Wake-up on Pin Change

    Odpal PDF, daj ctr + f, wpisz PWM i wszystko ladnie Ci bedzie pokazywac, znajdziesz bez problemu jakie piny i ile ich jest.

    0
  • #7 21 Gru 2012 10:32
    guest666
    Poziom 12  

    Tak...ale jak to wpisać w bascoma??

    0
  • #8 21 Gru 2012 11:28
    piotrva
    Moderator na urlopie...

    Wszystko jest opisane w helpie:

    Code:

    Config Timer(n) = Pwm , (Pwm = 8 , [ten fragment tylko dla timera 16-bit]) Compare (X) Pwm = Clear Up , (...tu ewentualnie taki fragment dla litery B, C, ...) , Prescale = 1

    Na prawdę nie wiem dlaczego nie zajrzałeś do plików pomocy i potem nawet metodą prób i błędów można do tego dojść w 2 minuty.

    0
  • #9 21 Gru 2012 11:41
    guest666
    Poziom 12  

    Pierwszy raz korzystam z PWM i nie rozumiem składni configu...
    Ale trudno...dzięki za pomoc...dalej będę się męczył..

    Tak jak pisałem.
    Mam:
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

    Pwm1a = 0
    Pwm1b = 0

    gdzie Pwm1a oraz Pwm1b to są dwa pwm procka, a trzeci jak wpisać???

    0
  • #10 21 Gru 2012 11:47
    Mundi1970
    Poziom 24  

    Spróbuj tak (nie testowane:)):


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0