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

attiny2313 nie działa timer0...

hanibal0 01 Lut 2011 00:29 1989 7
REKLAMA
  • #1 9085546
    hanibal0
    Poziom 11  
    Próbuje nauczyć się obsługi timerów ale nawet taki prosty programik mi nie działa, co jest nie tak, jakiś błąd w kodzie czy może coś innego. Teoretycznie przerwanie powinno wystąpić co 0,26sek, x 10 (incr I) = 2,6sek powinna dioda zmienić stan na portb.4. Przerwanie liczyłem na kalkulatorze przerwań a program po wgraniu nie działa, dioda ani się nie zaświeci ani nie zgaśnie

    $regfile "attiny2313.dat"
    $crystal = 1000000
    
    Config Portb.4 = Output
    
    Dim I As Byte
    
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Przerwanie
    Start Timer0
    Enable Interrupts
    
    Do
    
    Loop
    
    
    Przerwanie:
     Incr I
       If I > 10 Then
          Toggle Portb.4
          I = 0
       End If
    Return
  • REKLAMA
  • #2 9085643
    szafarz
    Poziom 20  
    A możesz z tego zrobić assembler? Tam będzie jasno widać co się dzieje.
  • REKLAMA
  • Pomocny post
    #3 9085716
    piotrva
    VIP Zasłużony dla elektroda
    $regfile "attiny2313.dat"
    $crystal = 1000000
    
    Config Portb.4 = Output
    
    Dim I As Byte
    
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Przerwanie
    'Start Timer0' nie potrzebne
    Enable Timer0' zezwolenie na przerwanie timera
    Enable Interrupts
    
    Do
    
    Loop
    
    
    Przerwanie:
     Incr I
       If I > 10 Then
          Toggle Portb.4
          I = 0
       End If
    Return
  • #4 9085776
    hanibal0
    Poziom 11  
    piotrva dzięki, teraz działa ;)
  • REKLAMA
  • #5 9085807
    piotrva
    VIP Zasłużony dla elektroda
    Zawsze pamiętaj taki schemat, odblokowanie przerwania, określenie akcji przy przerwaniu, odblokowanie globalnego systemu przerwań
  • #6 9085920
    hanibal0
    Poziom 11  
    Teraz chyba wreszcie zrozumiałem te timery, wreszcie zaczęło to mieć sens i działa tak jak ja chcę. Myślałem że użycie prescalera automatycznie powinno wystartować timer a włączenie globalnych przerwań załatwi sprawę, nie wiedziałem że trzeba jeszcze osobno włączyć timer.

    Ps. chciałbym jeszcze nauczyć się tworzyć i wykorzystywać tablice, tzn. chciałbym aby np przerwanie sterowało wyświetlaczem 7-mio segmentowym, każde przerwanie to zwiększenie cyfry. Jak mogę takie coś zrobić, chodzi mi o to aby nie musieć za każdym razem określać który port w jakim stanie.
  • #7 9087740
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #8 9090078
    hanibal0
    Poziom 11  
    Koledzy potrzebuję pomocy, siedzę cały dzień nad programem i nie mogę sobie poradzić. Chodzi o to aby program działał tak jak ten który napisałem, tylko potrzebuję dopisać do niego procedurę kodowania zmiennych A i B. Konkretnie chodzi mi o to aby np po wciśnięciu przycisku SW i SW1 przez około 5 sekund, żeby program skoczył do podprogramu np PROGRAMUJ, gdzie w jakiś sposób zakoduję zmienne A i B, następnie wróci do pętli głównej. Co istotne, chciałbym aby programowane zmienne wpisane zostały do eeprom a w pętli głównej żeby były odczytywane z eepromu.

    Zasada działania programu:
    - Wciśkam SW = dioda zaświeca się co około 1 sek
    - po trzech zaświeceniach diody1 następuje reset diody2
    - po pięciu zaświeceniach diody1 i w tym momencie wciśnięciu SW1 = zaświecenie dioda2

    program działa jednak chciałbym mieć możliwość kodowania po ilu zaświeceniach diody1 można wcisnąć SW1 aby zaświecić diodę2


    Config Pinb.1 = Input
    Pinb.1 = 1
    Pinb.2 = 1
    
    Sw Alias Pinb.2
    Sw1 Alias Pinb.1
    
    Dioda1 Alias Portb.3
    Dioda2 Alias Portb.4
    
    
    Dim Ptimer1 As Byte                                         'deklaracje zmiennych
    Dim I As Byte
    Dim A As Byte
    Dim B As Byte
    A = 8                                                       ' przypisanie wartości zmiennych
    B = 10
    
    Config Timer0 = Timer , Prescale = 1024                     'konfiguracja timer0
    On Timer0 Przerwanie                                        'właczenie Przerwanie
    Enable Timer0                                               'włączenie timer0
    Enable Interrupts                                           'uruchomienie globalnych przerwań
    
    
    Do
    
       If Sw = 0 Then                                           'jeżeli przycisk Sw jest wciśnięty, mruga dioda1 co okolo 1sek
          If Ptimer1 = 0 Then
          Ptimer1 = 2
          Toggle Dioda1
          Incr I                                                'z każdym mrugnięciem (zaświeceniem diody) zwiększa zmienną I
          End If
       Else
          Reset Dioda1
          I = 0
       End If
    
       If I > 4 And I < 6 Then                                  'jeżeli dioda1 zaświeci 3x to wyłączy dioda2
          Reset Dioda2
       End If
    
    
       If I > A And I < B Then                                  '
          If Sw1 = 0 Then
          Set Dioda2
          End If
       End If
    
       If Sw1 = 0 Then                                          'warunek nie pozwalający zapalić dioda2 w innej sytuacji niż I>A and I<B
          If I < A Then
          I = 0
          End If
       End If
    Loop
    
    End
    
    
    Przerwanie:
       If Ptimer1 > 0 Then Decr Ptimer1                         'odmierzenie około 1sek
    Return
REKLAMA