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

bascom [attiny2313] problem z użyciem eeprom, prośba o pomoc

hanibal0 02 Lut 2011 11:57 1010 2
REKLAMA
  • #1 9091475
    hanibal0
    Poziom 11  
    Mam prośbę o pomoc w ukończeniu programu, otórz założeniem programu jest aby zaświecić dioda1 po określonej ilości mrugnięć dioda2 i w odpowiednim momencie wciśnięciu SW1. Program działa bezbłędnie jeśli ręcznie określę mu zmienne A i B, natomiast zaczynają się schody jeśli chcę dodać możliwość programowania zmiennych A i B, zapisując je w pamięci eeprom. Przejście do podprogramu PROGRAMUJ działa prawidłowo, natomiast chodzi mi o samo zaprogramowanie zmiennych A i B za pomocą SW i SW1, kombinacja przycisków nie jest tak bardzo istotna, chociaż chciałbym aby będąc w podprogramie PROGRAMUJ, każde naciśnięcie SW zmieniało docelowo A o wartość 1, a w momencie np przytrzymania SW1 przez 3 sek powodowało powrót do pętli głównej, w której wczytana będzie już nowa wartość zmiennej A.

    Podsumowując:

    1. Wchodzę do podprogramu programuj
    2. Zeruję zmienną A
    3. Za pomocą SW wpisuję nowe A
    4. Wciskam na 3 sek SW1 = wracam do pętli głównej z nowym A

    Wartoś B praktycznie zawsze miała by być A+2 więc to nie taki problem.

    $regfile "attiny2313.dat"
    $crystal = 1000000
    
    Config Portb.4 = Output
    Config Portb.3 = Output
    
    Config Pinb.2 = Input
    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
    Dim C As Byte
    Dim D As Byte
    Dim E As Byte
    Dim Eeprom As Byte
    A = 8                                                       ' przypisanie wartości zmiennych
    B = 10
    C = 0
    D = 0
    
    Declare Sub Programuj
    
    Config Timer0 = Timer , Prescale = 1024                     'konfiguracja timer0
    On Timer0 Przerwanie                                        'właczenie Przerwanie
    Enable Timer0                                               'włączenie timer0
    Enable Interrupts                                           'uruchomienie globalnych przerwań
    
    
    
    '############################### PĘTLA GŁÓWNA ##################################
    
    Do
    Readeeprom Eeprom , 2
    A = Eeprom
    
    
       If Sw1 = 0 And Sw = 0 Then
          If C = 20 Then
          Waitms 1
          Call Programuj
          Waitms 1
          End If
       End If
    
    
       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
    
    
    
    '################################ PROGRAMOWANIE EEPROM #########################
    
     Sub Programuj
    
    Wait 1
    
       For D = 1 To 10
          Waitms 50
          Reset Dioda1
          Reset Dioda2
          Waitms 50
          Set Dioda1
          Set Dioda2
       Next D
    
    Reset Dioda1
    Reset Dioda2
    Set Dioda1
    Wait 1
    
    Eeprom = 0
    
    Do
     If Sw = 0 Then
      Waitms 25
       If Sw = 0 Then
        Eeprom = Eeprom + 1
       End If
     End If
    Loop Until Sw1 = 0
    
    Wait 1
    
    Writeeeprom Eeprom , 2
    Wait 1
    
    Bitwait Sw1 , Reset
    
    Reset Dioda2
    C = 0
    
     End Sub
    Return
    
    
    '############################### PRZERWANIE TIMER0 #############################
    
    Przerwanie:
       If Ptimer1 > 0 Then Decr Ptimer1                         'odmierzenie około 1sek
       If Sw1 = 0 And Sw = 0 Then Incr C
    Return


    Proszę w temacie sprecyzować problem.
    Robak
  • REKLAMA
  • #3 9091856
    hanibal0
    Poziom 11  
    O flagach jeszcze nic nie wiem, a te wait 1 są tylko w fazie testów, żeby łatwiej było wyczuć o co chodzi, natomiast waitms 1 jest i pewnie będzie bo mimo iż używam timer0 to jeśli nie wstawię waitms 1 to diody delikatnie mrugają bez przerwy.

    Jednak byłbym wdzięczny gdyby ktoś przynajmniej jakiś przykład wskazał rozwiązania mojego problemu.
REKLAMA