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

ATTINY13A-PU /Bascom. problem

adept_avr 28 Lip 2010 11:20 2160 3
REKLAMA
  • #1 8338646
    adept_avr
    Poziom 2  
    Witam, swoją przygode z mikroprocesorami dopiero zaczynam, stad mój problem i pytanie.

    Problemem polega na tym, że potrzebuje aby dwie pętle wykonywały się jednocześnie, z uwagi na to że w jedne potrzebuje zastosować opóźnienie. Nie chce by to opóźnienie miało wpływ na druga pętle.

    Czy da się coś takiego wykonać jak poradzić sobie z tym problemem, proszę o pomoc.

    fakt, mój błąd. Poprawione
  • REKLAMA
  • #2 8338661
    Jaca
    Poziom 31  
    Zastosuj przerwanie od Timer'a.

    ps. Nie ma czegoś takiego jak ATTiny16. Chodzi Ci o 15 czy 26 ?

    Tak na szybko (sprawdź):

    $regfile = "attiny13.dat"
    $crystal = 1000000                                          'częstotliwość taktowania
    $hwstack = 20
    $swstack = 10
    $framesize = 10
    
    Const Div_t0 = 125                                          '1 ms
    
    Config Timer0 = Timer , Prescale = 8
    
    On Timer0 Int_t0
    Enable Timer0
    Enable Interrupts
    Load Timer0 , Div_t0
    Start Timer0
    Do
       'pętla główna programu
    Loop
    End
    
    Int_t0:
       Load Timer0 , Div_t0
       'Miejsce na procedurę obsługi przerwania
    Return
  • REKLAMA
  • #3 8339161
    adept_avr
    Poziom 2  
    $regfile = "attiny13.dat"
    $crystal = 1200000                                          'częstotliwość taktowania
    $hwstack = 20
    $swstack = 10
    $framesize = 10
    
    Const Div_t0 = 125                                          '1 ms
    Config Portb = &B000111
    Config Timer0 = Timer , Prescale = 8
    Dim Wart_ac As Word
    Ledsd Alias Portb.1
    Ledtd Alias Portb.0
    Relay Alias Portb.2
    We1 Alias Portb.3
    We2 Alias Portb.4
    Temperatura Alias Portb.5
    On Timer0 Int_t0
    Enable Timer0
    Enable Interrupts
    Load Timer0 , Div_t0
    Start Timer0
    
    Do
       Wart_ac = Getadc(3)
          If Wart_ac > 737 Then Set Ledsd Else Reset Ledsd      '3,6V
       Wart_ac = Getadc(2)
          If Wart_ac > 737 Then Set Ledtd Else Reset Ledtd      '3,6V
    Loop
    
    End
    
    Int_t0:
       Load Timer0 , Div_t0
    
    Do
    
    Wart_ac = Getadc(0)
          If Wart_ac > 32 Then Reset Relay Else Set Relay       '16stC
    Loop
    Return



    Czy kod jest poprawny? Mam pewne wątpliwości. Chciałbym aby przerwanie było wykonywane np. co 5 sekund a pętla główna była sprawdzana cały czas.
  • #4 8346243
    Konto nie istnieje
    Poziom 1  
REKLAMA