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

[atmega32][Bascom]1sek nierówna 1sekundzie

kibec 28 Gru 2008 01:21 2814 29
  • #1 5911267
    kibec
    Poziom 11  
    Witam..

    stało się...
    nie mogłem się dogadać z kwarcem - nie zgadzały mi się czasy
    tzn.
    kwarc 16 Mhz
    prescale 256
    load timer 250
    czyli czas = 0,004

    250 przerwań to 1 sekunda..
    niestety jakaś dużo dłuższa..

    zacząłem więc grzebać w FUSEBITACH bo gdzieś znalazłem, że koleś ma ustawione na ext ..... 16K + 4ms..
    ale po tym sekunda była nieco dłuższa od normalnej (niewiele) toteż przestawiłem na:

    ext ... 16k + 0ms

    i dupa..
    nie mogę teraz odczytać fusebitów...
    ani nic zaprogramować oczywiście.
    mam 2 płytki testowe - avr 2313 oraz ZL3AVR
    zablokowałem ZL3AVR.
    Napisałem więc program na 2313


    
    $regfile = "2313def.dat"
    Config Portb.0 = Output
    Portb.0 = 1
    
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Przerwanie
    Enable Interrupts
    Enable Timer0
    
    Do
    Loop
    End
    
    Przerwanie:
    Load Timer0 = 4
    Toggle Portb.0
    Return
    


    żeby uzyskać sygnał około 1MHz
    płytke testową avr 2313 zasiliłem z zestawu ZL3AVR i podałem pin B0 na pin XTAL1 Atmegi32 (przytknąłem kabelek - mam nadzieje że to wystarczy)
    no i próbuje odczytać fusebity albo rozpoznać procek za pomocą programatora stk200/300
    i nic..

    czytałem że sample programer może by pomógł..
    mam od drugiej płytki ale piny w atmedze32 inaczej się nazywają.
    nie jestem pewien czy CLK to to samo co SCK (m32)

    Pomóżcie mi odblokować atmelka
  • #2 5911278
    dawid512
    Poziom 32  
    Jak już próbujesz odblokować jednego uc korzystając z drugiego to rób to po ludzku. Z wyjścia zegarowego jednego uc podaj sygnał na wejście zegarowe drugiego uc. Tak swoją drogą to na pewno nie otrzymasz 1MHz z tego programu:
    $regfile = "2313def.dat"
    Config Portb.0 = Output
    Portb.0 = 1
    
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Przerwanie
    Enable Interrupts
    Enable Timer0
    
    Do
    Loop
    End
    
    Przerwanie:
    Load Timer0 = 4
    Toggle Portb.0
    Return 


    Nie licząc co ile będzie wywoływane przerwanie śmiem twierdzić że kolega zapomniał o dość istotnym fakcie... informacji dla kompilatora jakiej częstotliwości używasz.
  • #3 5911284
    kibec
    Poziom 11  
    zestaw avr 2313 ma w sobie kwarc 4Mhz
    a kompilator BASCOM miał to ustawione w opcjach.
    i rzeczywiście wyjdzie z tego zdaje się 500 kHz
    poza tym coś czytałem, że przerwania z takim małym dzielnikiem nie są bezpieczne..

    Alę proszę o pomoc z tą nierówną sekundą.


    udało się..
    zmodyfikowałem program

    
    $regfile = "2313def.dat"
    Config Portb.0 = Output
    Portb.0 = 0
    
    Do
    Toggle Portb.0
    Loop
    End
    


    podłączyłem pod nóżke procka XTAL1
    i zaczął gadać :)
    zmieniłem fusebity !
    było ustawione:
    011111:Ext. Crystal/Resonator Low Freq.; Start-up time: 16k CK + 0 ms; [CKSEL=1111 SUT=01]

    przestawiłem na:
    011111:Ext. Crystal/Resonator High Freq.; Start-up time: 16k CK + 0 ms; [CKSEL=1111 SUT=01]

    i śmiga teraz już z kwarcem 16Mhz :)
    zaraz sprawdze czy w końcu będzie równa 1sekunda

    Dodano po 36 [minuty]:

    No i nie jest 1 sekunda...
    ale jak ustawie program $crystal = 1000000 (1Mhz)
    to 1 sek = 1 sek..
    a przeciez w FS-ach ustawiłem zewnętrzny kwarc 16Mhz
    o co chodzi?

    [atmega32][Bascom]1sek nierówna 1sekundzie
  • #5 5912335
    dawid512
    Poziom 32  
    Oprócz tego [CKSEL=1111 SUT=01] musisz jeszce zaprogramować CKOPT dopiero wtedy będziesz korzystał z 16MHz w przypadku m32. Po za tym ciężko dodać $Crystal=16000000 ?
  • #6 5916831
    kibec
    Poziom 11  
    Właśnie sprawdziłem poprawny zapis użycia funkcji LOAD i nie ma tam znaku "=" tylko ","
    W każdym razie dzięki za info... bo mi coś ta funkcja nie działała do końca (chyba).

    A co do CKOPT to nie znalazłem tego :(
    Na screenie, którego załączyłem są wszystkie fusebity do ustawienia.. nie widze tam CKOPT-a (BASCOM 1.11.9.0)
    widze na screenach, że kolesie mają na FUSEBIT H taką opcję, ja tam mam JTAG.. na żadnej z opcji nie znalazłem CKOPT-a :/
    Zciągnąłem PonyProg ale nie mam do niego programatora bo STK200/300 nie działa... mam jeszcze sample programer ale nie wiem czy bedzie działać i gdzie jest CLK w atm32

    Jak mam ustawić CKOPT i na jaką wartość?

    Dodano po 3 [minuty]:

    mam nadzieje, że po tym rozwiąże się problem jednoczesnego sterowania pilotem GETRC5 i przerwań..
    mam przerwania do liczenia czasu TIMER1 (co 4ms przerwanie) i używam w głównej pętli funkcji GETRC5
    czy to się ze sobą kłóci?
    jak chodziło mi za wolno przerwanie ($crystal=16mhz) to odbieram sygnały z pilota.. jak chodzi normalnie (1mhz) to nie działa odbieranie sygnałów..
    coś mi się wydaje, że przerwanie przerywa działanie funkcji odbierającej sygnał podczerwieni :/
  • #7 5917066
    Konto nie istnieje
    Poziom 1  
  • #8 5917633
    kibec
    Poziom 11  
    mam zestaw uruchomieniowy zl3avr i avr 2313
    w tym mniejszym jeden z pinów wyprowadzony do programatora sample programer nazywał się CLK..

    a w zestawie zl3avr mam kwarc zewnętrzny 16Mhz
    i nie mogę go uruchomić..

    a ponyproga to musze sprawdzić w domu..
  • Pomocny post
    #9 5917692
    dawid512
    Poziom 32  
    Fuse bity dla 16MHz Link
  • #10 5918533
    kibec
    Poziom 11  
    przestawiłem wszystko (prawie)
    oprócz CKOPT-a którego dalej nie ma..
    a to jest mój program..
    chodzi poprawnie jak ustawię $crystal = 1000000
    a jest przecież $crystal = 16000000

    
    $regfile = "m32def.dat"  ' specify the used micro
    $crystal = 16000000      ' used crystal frequency
    '$crystal = 1000000
    
    '****************************** KONFIGURACJA ******************************'
    
    ' Konfiguracja LCD
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
    Config Lcdmode = Port
    
    ' Irda
    $lib "mcsbyte.lbx"
    'The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
    Config Rc5 = Pinc.0
    Dim Address As Byte , Command As Byte
    
    Rem przyciski
    Config Portc.7 = Input
    Config Portc.6 = Input
    Config Portc.5 = Input
    Config Portc.4 = Input
    Portc.7 = 1
    Portc.6 = 1
    Portc.5 = 1
    Portc.4 = 1
    
    Rem dioda mrugajaca co 1sek
    Config Portc.1 = Output
    Portc.1 = 0
    
    'Timer1 uzyjemy do odmierzania czasu
    Config Timer1 = Timer , Prescale = 256       '256
    On Timer1 Ontimer1
    Enable Timer1
    Enable Interrupts
    
    Rem pomocznicze zmienne
    Dim Hh As Byte
    Dim Mm As Byte
    Dim Ss As Byte
    Dim Wath As Byte
    Dim Wathpanel As Byte
    Dim Dzies As Byte
    Dim Jedn As Byte
    Dim Temp As Byte
    Dim Incrtime As Byte
    Dim S As String * 10
    
    '****************************** PROGRAM ******************************'
    
    ' Ustawiamy zegarek
    Hh = 23
    Mm = 22
    Ss = 00
    Wath = 0
    Wathpanel = 0
    
    
    Cursor Off Noblink
    Cls
    Waitms 1000
    
    Do
    
    Debounce Pinc.7 , 0 , Addhours , Sub
    Debounce Pinc.6 , 0 , Addminutes , Sub
    Debounce Pinc.5 , 0 , Zeroseconds , Sub
    
    Getrc5(address , Command)
    
    If Address < 255 Then    'we check for the TV address and that is 0
        'clear the toggle bit
        'the toggle bit toggles on each new received command
        'toggle bit is bit 7. Extended RC5 bit is in bit 6
        Command = Command And &B01111111
    
    '    Locate 2 , 1
    '    Lcd Str(address) + "-" + Str(command) + "   "
    
        If Command = 16 Then Gosub Addminutes
        If Command = 17 Then Gosub Removeminutes
        If Command = 32 Then Gosub Addhours
        If Command = 33 Then Gosub Removehours
    
    End If
    
    Loop
    
    End
    
    
    Addminutes:
    Incr Mm
    Ss = 0
    Return
    
    Removeminutes:
    Decr Mm
    Ss = 0
    Return
    
    Addhours:
    Incr Hh
    Return
    
    Removehours:
    Decr Hh
    Return
    
    
    Zeroseconds:
    Ss = 0
    Return
    
    
    Rem ****************************************************************************
    Rem Obsługa przerwania 4ms
    Ontimer1:
    Load Timer1 , 250        'przerwanie co 4ms
    'Timer1 = 65286                                              '65536 - 250 przerwanie co 4ms
    
    
    Rem rysowanie zegarka co 4ms
    Gosub Check
    S = Str(hh) + ":" + Str(mm) + "." + Str(ss) + "   "
    Locate 1 , 6
    Lcd S
    
    Rem rysowanie kodu pilota
    If Address < 255 Then
       Locate 2 , 1
       Lcd Str(address) + "-" + Str(command) + "   "
    End If
    
    Rem rysowanie licznika przerwan
    S = Str(incrtime) + "   "
    Locate 2 , 12
    Lcd S
    
    Incr Incrtime
    Rem Inkrementacja zegara >> 250 * 4ms = 1 sek
    If Incrtime = 250 Then
    
       Incrtime = 0
    
       Incr Ss
       Gosub Check
    
       Toggle Portc.1
    
    End If
    Return
    
    Check:
       If Ss > 59 Then
          Ss = 0
          Incr Mm
       End If
    
       If Mm > 59 Then
          Mm = 0
          Incr Hh
       End If
    
       If Hh > 23 Then Hh = 0
    Return
    


    a mam płytkę taką Link tylko, że oryginalną

    Dodano po 2 [godziny] 56 [minuty]:

    ale to jest dziwne!
    bo 1mhz kwarc prescale 256 skrócone na 250 daje 0,064s * 4 = 0,256 sekundy
    a jest co 0,004 * 250 = 1 sekunda

    może to wina bascoma..

    jak wywale GetRC5 to chodzi szybciej (przerwanie)
    kurcze..
    jak to zrobic zeby to nie przeszkadzało odliczaniu czasu?
  • Pomocny post
    #11 5920177
    zumek
    Poziom 39  
    kibec napisał:
    ...może to wina bascoma..

    No tak, winni są wszyscy, tylko nie Ja :D
    Na Twoim miejscu, zadał bym sobie pytanie:"Ile czasu potrzebuje procek taktowany 16MHz, na wykonanie procedury przerwania Ontimer1 :idea:
  • #12 5920238
    kibec
    Poziom 11  
    Właśnie na to wpadłem..

    Wygląda na to, że nie wyrabiam się czasowo w timerze !!
    Powyrzucałem trochę poleceń z timera i przyśpieszył..

    Ale beton... kilkanaście poleceń i się nie wyrabia czasowo..

    No i przeszkadza również funkcja Getrc5 :(
    no porażka

    Dzięki.. :/
    Wychodzi na to że muszę dać dodatkowy procek który będzie odbierał IR i przekazywał jak by to była klawiatura..
  • #13 5920369
    mirekk36
    Poziom 42  
    kibec napisał:

    może to wina bascoma..


    nieee no kolego (sorki) ale puknij się w głowę, zrób "mea culpa" i przestań szukać winy za swoje błędy wszędzie tylko nie w swoich poczynaniach. Czyżbyś był "kolejnym" pierwszym człowiekem na świecie, który doszukał się tak poważnago błędu w Bascomie??? sorry ale to jest śmieszne (przepraszam za te ostre słowa ale gdybyś zadał normalne pytanie typu? "co robię nie tak? , że mi to nie wychodzi?" to byłoby inaczej

    co ty wyprawiasz w przerwaniu ???? jakieś wyświetlanie na LCD itp bzdury - to już masakruje twój program i twoje założenia.

    poczytaj o przerwaniach i podpatrz u innych w programach jak się z nimi pracuje. Naucz się jak korzystać z flag itp - bo tak podchodząc to w żadnym języku nie napiszesz nic sensownie

    ... nie trzeba żadnego dodatkowego procka tylko porządnie napisać program - bo inaczej to niedługo do migania dwiema diodami LED będziesz potrzebował zaprząc do pracy z 10 procków w tym ze dwa 32bitowe

    zapamiętaj, że przerwania w obojętnie jakim języku pisze się program muszą się wykonywać możliwie najkrócej. Stosuj falgi a operacje wymagąjące sporo czasu jak LCD w Bascomie nie stosuj w przerwaniach
  • #14 5920664
    kibec
    Poziom 11  
    ale żeś mnie zjechał..
    przyznaję się.. mój błąd.. dopiero zaczynam..
    napisałem to pierwszego dnia zabawy z bascomem..
    to jest mój program przez który się uczę obsługi pilota, wyświetlacza itd...
    z tąd moje podstawowe błędy..
    do tej pory pisałem programy na PC z tąd moja niewiedza o tempie wykonywania instrukcji.. wiedziałem, że jest wolniejsza ale z tego co czytałem myślałem, że dużo szybsze..

    dzięki wam wszystkim za pomoc..

    a może mi ktoś powie jak mam użyć funkcji getrc5 żeby nie przytrzymawała innego przerwania (TIMER1) który odmierza czas..
    czy jedynym wyjściem jest zrobienie przerwania co 1sek (TIMER1), tylko wtedy mogę zapomnieć o wyświetlaczach BCD (8 segmentowych)
  • #15 5920750
    mirekk36
    Poziom 42  
    Witam ponownie,

    poszukaj sobie na elektrodzie ale nie tylko n/t wykorzytywania polecenia Getrc5 w przerwaniu np INT0 lub INT1 i jak się to robi. Jest sporo przykładów - to rozwiąże ci już jeden problem.

    druga sprawa to ja pisałem naucz się pracy z tzw flagami. czyli w swoim przerwaniu Timer1 zamiast wyświetlać cokolwiek za pomocą LCD ustawiaj jakąś flagę na 1. Natomiast w pętli głównej cyklicznie będziesz sprawdzał tę flagę i jeśli będzie = 1 to wtedy wyświetlisz już spokojnie na LCD swoje potrzebne dane. Oczywiście po IF'ie w którym sprawdzasz czy flaga = 1 od razu ją ponownie zerujesz dzięki czemu kolejne wyświetlanie odbędzie się wtedy gdy w Timerze nastąpią odpowiednie zmiany itp rozumiesz? Nie zapomnij tylko po zadeklarowaniu flagi w sekcji inicjalizacji programu ustawić ją wstępnie na 0. Zauważ że dzięki takiemu podejściu w procedurze obsługi przerwania pozostaną ci już tylko zajmujące mało czasu polecenia inkrementacji czy dekrementacji potrzebnych ci liczników.

    Generalnie z RC5 będziesz miał bardzo podobnie. W obsłudze przerwania INTx ustawisz flagę dzięki której znowu w pętli głównej spokojnie i bez nerwów odczytasz jaki kod z pilota nadleciał
  • #16 5920875
    kibec
    Poziom 11  
    rozumiem... (programuje tylko w c# na PC)
    bo mi się wydaje.. że jak mam getrc5 w głównej pętli programu to przerwanie Timer1 przerywa mi działanie tej funkcji i nie pobiera do konca kodu IR...

    (czytalem ze getrc5 wykorzystuje timer0)
  • Pomocny post
    #17 5920898
    mirekk36
    Poziom 42  
    Przecież pisałem ci aby Getrc5 dać w przerwaniu, eeeh, no kolego - weź no użyj troszkę szukajki na elektrodzie chociażby.

    Int1_rc5:
          Disable Int1
          Enable Interrupts
          If Ir_flag = 0 Then
             Getrc5(address , Command)
             Ir_flag = 1
          End If
    Return


    a potem w pętli głównej:

    Do
    
      if Ir_flag = 1 then
        Ir_flag = 0
        If Address < 255 then
           ..... tutaj dalej obrabiasz swoje kody RC5
        Endif
      Endif
    
    Loop


    czy teraz jaśniej?

    Getrc5 domyślnie korzysta z Timer0, ale można ustawić na Timer2 o ile jest takowy w procku

    gwarantuję ci że przy takiej konstrukcji programu to o co tobie chodzi będzie działało wyśmienicie
  • #18 5920979
    kibec
    Poziom 11  
    o....

    a czy jak wyskoczy inny timer (co 4ms) od zliczania czasu
    to nie przerwie działania funkcji Getrc5 ?

    bo sprawa jest taka, że:
    timer0 - wykorzystuje getrc5
    timer1 - wyskakuje przerwanie co 4ms odswieża 4 segmenty BCD i co 250 wystąpień - 1sek zwiększa czas - sekundy
    timer2 - wtedy bedzie odpalac getrc5 ale przerwanie z timer1 przerwie dzialanie funkcji getrc5 prawda?
    albo jesli nie przerwie a getrc5 nie pozwoli na wystapienie przerwania timer1 to mi się rozjedzie czas..

    Dodano po 1 [minuty]:

    tak czy inaczej już sprawdzam to w praktyce..
  • #19 5921254
    mirekk36
    Poziom 42  
    Ty się zastanów co chcesz uzyskać - czy testowy program w celach uczenia się czy też może atomowy wzorzec czasu?

    ... bo jeśli to drugie to wybrałeś najgorszą z wielu możliwych metod aby zrobić zegarek na procku AVR i to jeszcze na takim jak ATmega32.

    .... jak chcesz zrobić dokładny zegarek to :

    1. Uzyj specyficznych do tego poleceń Bascoma - same załatwią to za ciebie

    2. użyj kwarca 32768Hz i zrób zegarek w oparciu o niego (poczytaj sobie jak to się robi z takimi prockami)

    3. Użyj zewnętrznego układu zegarkowego - taki najbardziej ludzki sposób - jak np PCF8583 lub dowolny inny i czas z niego odczytuj przez I2C lub 1Wire w zależności od rodzaju scalaka zegarkowego

    ..... a w ten sposób o którym piszesz to tak jak mówiłem możesz się poprostu poduczyć co i jak. W przeciwnym wypadku przy twoich największych staraniach wyjdzie ci z tego taki zegar jak stary radziecki kukuruźnik
  • #20 5921300
    kibec
    Poziom 11  
    aaaa... dziękuję Ci bardzo za te informację.. :)
    tylko ciekawe jakie to specyficzne polecenia Bascoma..

    chcę żeby zegarek synchronizował się z czasem frankfurckim raz na dobę powiedzmy, wiec aż taka dokładność to nie jest mi potrzebna..

    a odbieranie sygnnałów IR, wyswietlanie zegarka na 4 segmentach BCD oraz na LCD i mroganie 8mioma diodami działa.. wszystko na raz..
    zaraz tylko jeszcze sprawdzę dokładność zegarka..
    wcześniej była niezła..

    Dodano po 4 [minuty]:

    tylko kody z pilota są dziwne... wcześniej był jeden kod.. a teraz pojawiają się dwa kody na jeden przycisk.. raz 0-16 a raz 0-144 (na zwiekszenie glosnosci - philips tv)
    wczesniej podawal tlyko 0-16
  • #21 5921376
    mirekk36
    Poziom 42  
    kibec napisał:
    tylko kody z pilota są dziwne... wcześniej był jeden kod.. a teraz pojawiają się dwa kody na jeden przycisk.. raz 0-16 a raz 0-144 (na zwiekszenie glosnosci - philips tv)
    wczesniej podawal tlyko 0-16


    a uwzględniłeś maskowanie ToogleBit ???
  • #22 5921390
    kibec
    Poziom 11  
    irda zmieniła swoją pozycje i nie jest na porcie na ktorym jest toglebit..

    no i super... odlicza poprawnie..
    tylko kody IRdy coś dziwne..
    ale nieźle..
    tylko ciekawe czy da się dorobić do tego dużo więcej funkcjonalności..

    
    $regfile = "m32def.dat"                                     ' specify the used micro
    $crystal = 16000000                                         ' used crystal frequency
    '$crystal = 1000000
    
    '****************************** KONFIGURACJA ******************************'
    
    ' Konfiguracja LCD
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
    Config Lcdmode = Port
    
    ' IRDA
    ' The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
    $lib "mcsbyte.lbx"
    Config Rc5 = Pina.7
    Dim Address As Byte , Command As Byte
    
    'Timer2 uzyjemy do pobierania kodu z pilota
    Config Int1 = Low Level
    'Config Timer2 = Timer , Prescale = 1024
    'On Timer2 Ontimer2
    On Int1 Ontimer1
    'Enable Timer2
    Enable Int1
    
    Dim Ir_flag As Boolean
    
    ' przyciski
    Config Portc.3 = Input
    Config Portc.2 = Input
    Config Portc.1 = Input
    Config Portc.0 = Input
    Portc.3 = 1
    Portc.2 = 1
    Portc.1 = 1
    Portc.0 = 1
    
    ' Diody
    Config Portd = Output
    Portd = &B11111111
    
    ' Wyświetlacz BCD
    Config Portb = Output                                       'abcdef
    Config Portc.7 = Output                                     'kolumy
    Config Portc.6 = Output
    Config Portc.5 = Output
    Config Portc.4 = Output
    Portb = 1
    Portc.7 = 1
    Portc.6 = 1
    Portc.5 = 1
    Portc.4 = 1
    Dim Lcdrefresh As Boolean
    
    
    ' Timer1 uzyjemy do odmierzania czasu
    Config Timer2 = Timer , Prescale = 256                      '256 - 0,000016 sek
    On Timer2 Ontimer2
    Enable Timer2
    
    Enable Interrupts
    
    ' Pomocznicze zmienne
    Dim Hh As Byte
    Dim Mm As Byte
    Dim Ss As Byte
    'Dim Wath As Byte
    Dim Wathpanel As Byte
    Dim Dzies As Byte
    Dim Jedn As Byte
    Dim Temp As Byte
    Dim Incrtime As Byte
    Dim S As String * 10
    
    '****************************** PROGRAM ******************************'
    
    ' Ustawiamy zegarek
    Hh = 23
    Mm = 22
    Ss = 00
    'Wath = 0
    Wathpanel = 0
    Lcdrefresh = 1
    Ir_flag = 0
    
    Cursor Off Noblink
    Cls
    
    Do
    
       'sprawdzamy czy odczytalismy jakis kod z pilota
       If Ir_flag = 1 Then
          Ir_flag = 0
          S = "IR-" + Str(address) + ":" + Str(command) + "   "
          Locate 2 , 1
          Lcd S
       End If
    
       'obsluga przyciskow
       Debounce Pinc.3 , 0 , Addhours , Sub
       Debounce Pinc.2 , 0 , Addminutes , Sub
       Debounce Pinc.1 , 0 , Zeroseconds , Sub
    
       'odswierzanie zegarka
       If Lcdrefresh = 1 Then
          Lcdrefresh = 0
          Gosub Check
          S = Str(hh) + ":" + Str(mm) + "." + Str(ss) + "   "
          Locate 1 , 6
          Lcd S
       End If
    
       Enable Int1
    
    Loop
    
    End
    
    
    Addminutes:
    Incr Mm
    Ss = 0
    Return
    
    Removeminutes:
    Decr Mm
    Ss = 0
    Return
    
    Addhours:
    Incr Hh
    Return
    
    Removehours:
    Decr Hh
    Return
    
    
    Zeroseconds:
    Ss = 0
    Return
    
    '****************************** Timer1 - IRDA ******************************'
    Ontimer1:
       Disable Int1
       Enable Interrupts
          If Ir_flag = 0 Then
             Getrc5(address , Command)
             If Address < 255 Then Ir_flag = 1
          End If
    Return
    
    
    Rem *************************** Timer2 - czas **********************************
    Rem Obsługa przerwania 0,000016 * 250 = 4ms
    Ontimer2:
    Load Timer2 , 250                                           'przerwanie co 4ms
    
    Incr Incrtime
    Rem Inkrementacja zegara >> 250 * 4ms = 1 sek
    If Incrtime = 250 Then
    
       Incrtime = 0
       Lcdrefresh = 1
    
       Incr Ss
       Gosub Check
    
       Toggle Portc.0
    
    End If
    
    Rem diody
    Portd = Incrtime
    
    Rem Wyświetlacze BCD
    Select Case Wathpanel
    Case 0:
       Dzies = Makebcd(mm)
       Shift Dzies , Right , 4
    
       Portc.4 = 1                                              'wyłączamy poprzedni wyswietlacz
       Portb = Lookup(dzies , Cyfry)
       Portc.7 = 0
    Case 1:
       Jedn = Makebcd(mm) And 15
    
       Portc.7 = 1
       Portb = Lookup(jedn , Cyfry)
       Portc.6 = 0
    
    Rem Zapalamy kropeczke miedzy HH a MM co parzystą ilość sekund
       Temp = Ss Mod 2
       Portb.7 = Temp
    
    Case 2:
       Dzies = Makebcd(ss)
       Shift Dzies , Right , 4
    
       Portc.6 = 1
       Portb = Lookup(dzies , Cyfry)
       Portc.5 = 0
    
    Case 3 :
       Jedn = Makebcd(ss) And 15
    
       Portc.5 = 1                                              'wyłączamy poprzedni wyswietlacz
       Portb = Lookup(jedn , Cyfry)
       Portc.4 = 0
    End Select
    
    Incr Wathpanel
    If Wathpanel = 4 Then Wathpanel = 0
    
    Return
    
    
    Rem ************************************ Sprawdzenie inkrementascji zegara *******
    Check:
       If Ss > 59 Then
          Ss = 0
          Incr Mm
       End If
    
       If Mm > 59 Then
          Mm = 0
          Incr Hh
       End If
    
       If Hh > 23 Then Hh = 0
    Return
    
    Cyfry:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 191
    
  • #23 5921454
    dawid512
    Poziom 32  
    Widzę że kolega jakieś nowe teorie tworzy...
    Cytat:
    irda zmieniła swoją pozycje i nie jest na porcie na ktorym jest toglebit..
  • Pomocny post
    #24 5921520
    mirekk36
    Poziom 42  
    no to teraz nie ma czemu się dziwić dlaczego masz sieczuszkę z IR.

    Po pierwsze to nie IRDA (bo to coś nieco innego) tylko odbiornik podczerwieni. Ale i jego wejścia/wyjścia jak i procesora nie mają nic wspólnego z ToogleBit ;) (o tym za chwilę)

    Poza tym popraw w programie bo opisy przy INT1 masz poplątane z pomieszaniem m.inn z Timerem2 - później sam się pogubisz a już na pewno nie przeanalizujesz sam tego kodu za miesiąc

    więc jeszcze raz, ale już ostatni ;)

      'sprawdzamy czy odczytalismy jakis kod z pilota 
       If Ir_flag = 1 Then 
          Ir_flag = 0 
    
    '---- A O TYM FRAGMENCIE TO ZAPOMNIAŁEŚ ???? ------------------
          Command = Command And &B01111111 
    
          S = "IR-" + Str(address) + ":" + Str(command) + "   " 
          Locate 2 , 1 
          Lcd S 
       End If 


    ten fragment który dodałem to jest właśnie maskowanie bitu TOOGLE w komendzie z pilota - bez maskowania będziesz miał wyświetlane dziwolągi (przecież wcześniej użyłeś tego - ale widzę, że bez minimum wysiłku i zrozumienia)
  • #25 5921527
    kibec
    Poziom 11  
    w nowym kodzie robiłem toglebit na porcie na którym była kiedyś IRDA... a może nie może tylko na porcie np. portc.2
    myślałem że o to chodzi.
    nie dokładnie to określiłem w zdaniu albo pomieszałem nazwy funkcji

    rzeczywiście..
    gdzieś się zapodziało..
    musiałem skasować przez pomyłkę..

    teraz działa poprawnie
    wielkie dzięki..

    Dodano po 9 [minuty]:

    za to przyciski od ustawiania godziny działają teraz w zwolnionym tempie..
    najwyżej zrealizuję to ciutek inaczej w przerwaniu Timer2
  • #26 5924804
    kibec
    Poziom 11  
    Właśnie znalazłem artykuł o odczytywaniu sygnałów RC5 tylko na inny procesor i zastanawiam się czy nie popełniłem podstawowego błędu, który nie został zauważony.
    Różnica polega na tym, że ja co przerwanie próbuję pobrać kod RC5 zajmując tym procesor, a na projekcie który znalazłem dopiero wykrycie sygnału z pilota (PIN INT0) generuje przerwanie, które dopiero uruchamia polecenie GetRC5.

    Czyli muszę przepiąć odbiornik podczerwieni na pin INT0 procesora..
    Wtedy zmienić Config RC5 = pinINT0 procka..

    Nie wiem jak to wcześniej działało.. chyba było generowane przerwanie i w każdym przerwaniu była próba odczytu kodu RC5..
    Chociaż nie ustawiałem chyba co ile ma występować przerwanie (prescale itp).

    Co wy o tym myślicie..
    O północy będę domu to wszystko sprawdze..
  • #27 5924991
    mirekk36
    Poziom 42  
    jak to nie zostało zauważone - a co ja wcześniej ci pisałem na temat twoich opisów przy konfiguracji INT1

    'Timer2 uzyjemy do pobierania kodu z pilota 
    Config Int1 = Low Level 
    'Config Timer2 = Timer , Prescale = 1024 
    'On Timer2 Ontimer2 
    On Int1 Ontimer1 
    'Enable Timer2 
    Enable Int1 


    widać z tego, że próbowałeś najpierw robić GetRc5 w przerwaniu Timera - błąd

    a później zmieniłeś na INT1 chociaż nazwę procedury przerwania zostawiłeś jak dla Timera

    On Int1 Ontimer1 


    a jak to w efekcie popodłączałeś fizycznie to już tylko sam Winetou raczy wiedzieć ;)

    oczywiście, że należy w takim przypadku podpiąć odbiornik podczerwieni pod pin INT1 a nie inaczej - no ale o tym też chyba wspominałem - choć może nie do końa dobitnie - bo uznałem, że to jest bardzo oczywiste

    tak więc popraw to wszystko i do dzieła ;)
  • #28 5925080
    kibec
    Poziom 11  
    Dzięki za pomoc..

    W czyimś kodzie znalazłem to low level.. i config rc5= pinc.5 (np)
    No i w moim kodzie widać, że podłączyłem pod Pinc.0, który nie jest pinem przerwania procka, ale to się nie rzuca w oczy.
    
    Config Rc5 = Pinc.0 
    


    Jeszcze raz dzięki...
    Wszystkiego najlepszego w nowym roku..
    Pozdrawiam

    Dodano po 9 [minuty]:

    Mam jeszcze ostatnie pytanie..
    Czy Enable Interrupts w przerwaniu INT1 powoduje, że jeśli wystąpi w tym czasie INT2 to zostanie ono wykonane natychmiast po czym będzie kontynuować INT0 ?
  • #30 5927202
    kibec
    Poziom 11  
    Dzięki...
    Wszystko działa jak w zegarku ;)
REKLAMA