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

Attiny 26 i kod GETRC5 (wlacz-wylacz)za pomoc daje punkty!

16 Lut 2007 18:49 3099 13
  • Poziom 27  
    Witam!
    Mam taki problem , znam sie na elektronice , ale nie cyfrowej , nie znam jezykow C+ , bascom , assembler itp .

    Złożylem juz uklad , tzn. programator + attiny 26 + tmfs 5360 + kilka diod , calosc "dziala" w sensie programator programuje proca .

    Teraz moj problem - potrzuje aby ten uklad uczyl sie dowolnego pilota rc5 i posiadal- FUNKCJE WLACZ i WYŁACZ oraz PODGLOSNIJ /SCISZ .

    Niestety nie potrafie napisac takiego softu , zwracam sie z prosba o pomoc w napisaniu takiego kodu.


    ZA POMOC DAJE DODATKOWE PUNKTY !!!

    Jak ktos wykona caly program ( gotowy, tylko ja podam pod ktore piny mam podlaczone te diody itp ) to dam w dowod wdziecznosci 50 PUNKTOW !!!

    z gory dziekuje za odpowiedzi !

    POZDRAWIAM!
  • Pomocny post
    Poziom 19  
    Dowolny pilot nie może być - musi być taki o częstotliwości nośnej 36kHz lub inaczej mówiąc dopasowany do odbiornika (TMFS5360). Odbiornik podłączony do PB6 - w innym przypadku oprogramowanie będzie znacznie bardziej kłopotliwe. Jeżeli nie używasz adc to lepszy od tiny26 byłby tiny2313.
  • Poziom 27  
    Witam !

    masz racje , zle sie wyrazilem , mialem na mysli RC5 ,
    uklad jak dalej stal tak stoi , czytam i czytam rozne topic-i i nic z tego nie wynika...
    czytalem hepla do bascoma i nie czaje tego zbytnio

    Moze ktos moze udostepnic mi soft w ktorym bedzie obsluga samego wlacz wylacz , to moze juz bym sobie dal rade..... pomalu bym obczail o co w tym wszystkim chodzi ,

    Prosta funkcja - odczytac kod z pilota , puzniej np. zewrzec zworke / lub zeby mignela dioda led ze juz zapamietal i tyle i puzniej zeby po nacisnieciu zapamietanego przycisku attiny26 odpowiadal na sygnal....


    Jesli ktos mi pomoze to Dam Dużo Punktow za poswiecony cenny czas....


    Z gory dziekuje za pomoc


    Pozdrawiam!
  • Pomocny post
    Poziom 12  
    Witam! posiadam przedwzmacniacz (z uczącym się kodem z pilota RC5,włącz,wyłącz,pełna regulacja),ale na ATmega 8+TDA 8425.Sygnalizacja na 7 diodach,2 wejścia,przekaznik jako włącznik.Program napisany w Bascomie.Cały układ był zbudowany na podstawie jakiegoś kitu ,ale nie pamiętam w tej chwili jakiego,albo z oferty AVT,albo NE
  • Poziom 27  
    Witam!
    Platom- a masz do tego podglad kodu do atmegi 8 ? jak masz to jesli mozesz to wklej na forum , moze temat sie rozwinie , ktos pomoze dalej...
  • Pomocny post
    Poziom 17  
    Jest to kawałek kodu w bascomie dla atmega8, może coś pomoże:

    Code:
    **Podprogram konfiguracji**
    

    Sub Konfig
    Cls
    Pwm1a = 200     'to od podświetlenia lcd
    Lcd "USTAWIENIA"
    Locate 2 , 1
    Lcd "        PROGRAMU"
    Wait 2
    Cls
    Lcd "Przycisk START"

    Do
    Getrc5(address , Command)
    Command = Command And &B01111111

    If Adress <> 255 Then  'jak nic nie wciśnięte to petla
    Loop
    Else
    X = Command    'do zmiennej x przypisany klawisz z pilota
    End If
    Locate 2 , 1
    lcd "START klawisz-";x  'informacja jaki przypisany   
    Wait 2

    Tu reszte klawiszy podobnie..........


    End Sub



    Potem zapis do pamięci:

    Code:
    Lcd "Zapis danych !!!"
    

    Writeeeprom x , 1
    Writeeeprom st_wym , 2
    Writeeeprom st_pompy , 3
    Set Buzzer
    Waitms 100
    Reset Buzzer
    Waitms 100
    Set Buzzer
    Waitms 100
    Reset Buzzer
    Wait 3
    Cls


    Coś może z tego się przyda.
  • Pomocny post
    Poziom 16  
    W c ten program gdzies w internecie widziałem..
    Bedzie wymagał być moze małego dostosowania.

    Mam go ale niestety w asm pod atmege 16.

    Code:

    ; Programowalny pilot RC5, obsługa interfejsów optycznych i pamięci EEPROM
    ; Rafał Baranowski (C) 2004

    .INCLUDE "m16def.inc"      ; SEGMENT DEKLARACJI

    .EQU OSC_FREQ   = 1000000   ; częstotliwość pracy w Hz
    .EQU SYS_FREQ   = OSC_FREQ/1000000; częstotliwość pracy w MHz (dla opóźnień)
                   ; stałe nadajnika podczerwieni
    .EQU K_IR_OUT   = DDRD   ;   rejestr kierunku portu
    .EQU O_IR_OUT   = PORTD   ;   rejestr wyjściowy portu
    .EQU IR_OUT      = 7      ;   nr linii dla sygnału nadawanego
                   ; stałe odbiornika podczerwieni
    .EQU K_IR_IN   = DDRD   ;   rejestr kierunku portu
    .EQU O_IR_IN   = PORTD   ;   rejestr wyjściowy portu
    .EQU I_IR_IN   = PIND   ;   rejestr wejściowy portu
    .EQU IR_IN      = 3      ;   nr linii dla sygnału odbieranego
                   ; stałe klawiatury matrycowej
    .EQU K_KLAW      = DDRB   ;   rejestr kierunku portu
    .EQU O_KLAW      = PORTB   ;   rejestr wyjściowy portu
    .EQU I_KLAW      = PINB   ;   rejestr wejściowy portu
    .EQU K_KL_WCISN   = DDRD   ;   rejestr kierunku linii "kl. wciśnięty"
    .EQU O_KL_WCISN   = PORTD   ;   rejestr wyjściowy linii "kl. wciśnięty"
    .EQU I_KL_WCISN   = PIND   ;   rejestr wejściowy linii "kl. wciśnięty"
    .EQU KL_WCISN   = 2      ;   nr linii dla sygnału "kl. wciśnięty"
                   ; stałe wyświetlacza LCD
    .EQU K_LCD      = DDRA   ;   rejestr kierunku portu
    .EQU O_LCD      = PORTA   ;   rejestr wyjściowy portu
    .EQU LCD_RS      = 0      ;   nr linii dla sygnału RS
    .EQU LCD_EN      = 1      ;   nr linii dla sygnału EN
    .EQU LCD_DB4   = 2      ;   nr linii dla sygnału DB4
    .EQU LCD_DB5   = 3      ;   nr linii dla sygnału DB5
    .EQU LCD_DB6   = 4      ;   nr linii dla sygnału DB6
    .EQU LCD_DB7   = 5      ;   nr linii dla sygnału DB7
                   ; symboliczne nazwy rejestrów roboczych
    .DEF R_ADRES   = R20      ;   rejestr adresu nadanej/odebranej wiadomości RC5
    .DEF R_ROZKAZ   = R21      ;   rejestr rozkazu nadanej/odebranej wiadomości RC5


    .DSEG               ; SEGMENT DANYCH
    .ORG   0x0060         ; początek pamięci SRAM
    Klaw_inf:   .BYTE   1      ; zmienna klawiatury matrycowej
    IR_adres:   .BYTE 1      ; zmienna odebranego adresu wiadomości RC5
    IR_rozkaz:   .BYTE 1      ; zmienna odebranego rozkazu wiadomości RC5
    IR_znacz:   .BYTE 1      ; zmienna znaczników wiadomości RC5


    .ESEG               ; SEGMENT PAMIĘCI EEPROM
    .ORG   0x000            ; początek pamięci EEPROM
                   ; deklaracje wstępnych wiadomości RC5, przyporządkowanych
                   ;   kolejnym przyciskom klawiatury matrycowej
    ;      /---------------------  adres RC5
    ;      |  /------------------  rozkaz RC5
    Kl_0:   .DB   0, 0;-----------------  dla danego klawisza
    Kl_1:   .DB   0, 1
    Kl_2:   .DB   0, 2
    Kl_3:   .DB   0, 3
    Kl_4:   .DB   0, 4
    Kl_5:   .DB   0, 5
    Kl_6:   .DB   0, 6
    Kl_7:   .DB   0, 7
    Kl_8:   .DB   0, 8
    Kl_9:   .DB   0, 9
    Kl_A:   .DB   0, 10
    Kl_B:   .DB   0, 11
    Kl_C:   .DB   0, 12
    Kl_D:   .DB   0, 13
    Kl_E:   .DB   0, 14


    .MACRO ldi_wsk         ; makro ładujące wskaźnik 16-bitowy stałą 16-bitową
                   ; parametry:
                   ;   0. modyfikowany wskaźnik (X, Y lub Z)
                   ;   1. 16-bitowa bitowa wartość bezpośrednia
       ldi   @0H, high(@1)
       ldi   @0L, low(@1)
    .ENDM


    .CSEG               ; SEGMENT PROGRAMU
    .ORG   0            ; wektor zerowania
       jmp   Reset         ; skok do procedury inicjalizującej
    .ORG   INT0addr         ; wektor przerwania INT0
       jmp   Odczyt_klawiatury   ; skok do procedury odczytującej stan klawiatury
    .ORG   INT1addr         ; wektor przerwania INT1
       jmp   Odbior_IR      ; skok do procedury obsługującej odbiornik podczerwieni

    .ORG   0x30            ; przejście do pierwszej komórki za wektorami przerwań


                   ; deklaracje stałych w pamięci programu
    L_powitanie:.DB   "   Pilot RC5", ZNAK_KONCA   ; tekst powitalny
    L_adres:   .DB   "A: ", ZNAK_KONCA         ; etykieta adresu RC5
    L_komenda:   .DB   " ", 0x3B, " C: ", ZNAK_KONCA   ; etykieta rozkazu RC5
    L_prog:   .DB   "Kl.programowany?", ZNAK_KONCA; zachęta do programowania


    Reset:            ; podprogram inicjalizujący
       ldi_wsk X, RAMEND
       out   SPH, XH
       out   SPL, XL      ; inicjalizacja wskaźnika stosu

       rcall   Ini_IR      ; inicjalizacja nadajnika i odbiornika podczerwieni
       rcall   Ini_klawiatury   ; inicjalizacja klawiatury matrycowej
       rcall   Ini_LCD      ; inicjalizacja wyświetlacza LCD

       ldi   R16, (1<<LCD_STER)|(1<<LCD_SW_ON)
       rcall   Instrukcja_LCD   ; wyświetlacz LCD włączony, kursor nieaktywny

       ldi_wsk Z, L_powitanie<<1
       rcall   Pokaz_ciag_LCD   ; wyświetlenie powitania ("Pilot RC5")

       ldi   R17, 100
       ldi   R16, 10
       rcall   Czekaj_ms      ; opóźnienie o 1 s

       rcall   Czysc_LCD      ; czyszczenie wyświetlacza

       sei            ; odblokowanie przerwań


    Petla:            ; pętla główna programu
                   ; odbiór wiadomości RC5
       lds   R16, IR_ZNACZ
       sbrs   R16, IR_NOWY   ; jeśli odebrano nową wiadomość RC5, to..
       rjmp   Petla_pilot

       andi   R16, ~(1<<IR_NOWY)
       sts   IR_ZNACZ, R16   ;   zmaż znacznik nowej wiadomości

       lds   R_ADRES, IR_ADRES      ;   zapisz nowy adres RC5 w rejestrze
       lds   R_ROZKAZ, IR_ROZKAZ   ;   zapisz nowy rozkaz RC5 w rejestrze

    Petla_pokaz:         ; obsługa wyświetlacza LCD
       rcall   Czysc_LCD      ;   zmaż zawartość wyświetlacza LCD
             
       ldi_wsk Z, L_adres<<1
       rcall   Pokaz_ciag_LCD   ;   wyświetl etykietę adresu RC5 ("A:")

       mov   R16, R_ADRES
       rcall   Pokaz_bajt_LCD   ;   wyświetl wartość adresu wiadomości RC5

       ldi_wsk Z, L_komenda<<1
       rcall   Pokaz_ciag_LCD   ;   wyświetl etykietę rozkazu RC5 ("C:")

       mov   R16, R_ROZKAZ
       rcall   Pokaz_bajt_LCD   ;   wyświetl wartość rozkazu wiadomości RC5

    Petla_pilot:         ; nadawanie wiadomości RC5
       lds   R16, Klaw_inf
       sbrs   R16, 7      ; jeśli naciśnięto klawisz, to..
       rjmp   Petla

       cbr   R16, 1<<7      ;   zeruj bit informujący o przytrzymaniu klawisza

       cpi   R16, 15      ;   jeśli naciśnięto klawisz 15 ("*"), to..
       breq   Petla_pil_prog   ;     przejdź do procedury programowania

       mov   XL, R16      ;   zapisz nr wciśniętego klawisza w rejestrze XL
       lsl   XL         ;   pomnóż go przez 2
       clr   XH
       rcall   Czytaj_EE      ;   i odczytaj spod otrzymanego adresu z pamięci EEPROM
       mov   R_ADRES, R16   ;     adres RC5 odpowiadający wciśniętemu klawiszowi

       inc   XL         ;   inkrementuj nr klawisza (zwiększ adres w EEPROM)
       rcall   Czytaj_EE      ;   i odczytaj spod otrzymanego adresu z pamięci EEPROM
       mov   R_ROZKAZ, R16   ;     rozkaz RC5 odpowiadający wciśniętemu klawiszowi

       mov   R16, R_ADRES
       mov   R17, R_ROZKAZ
       rcall   Nadaj_IR      ;   nadaj wiadomość RC5 odpowiadającą wciśniętemu
                   ;     przyciskowi klawiatury matrycowej

       ldi   R16, 111
       ldi   R17, 3
       rcall   Czekaj_ms      ;   wprowadź opóźnienie o ok. 333 ms
                   ;   (częstotliwość powtarzania - ok. 3 Hz)

       rjmp   Petla_pokaz      ;   wyświetl informacje o nadanej wiadomości RC5


    Petla_pil_prog:         ; programowanie pilota (po naciśnięciu klawisza "*")
       lds   R16, Klaw_inf
       sbrc   R16, 7
       rjmp   Petla_pil_prog   ;   oczekuj na puszczenie klawisza

       ldi   R16, 40|(1<<LCD_DDADR)
       rcall   Instrukcja_LCD   ;   przejdź do drugiej linii wyświetlacza LCD
       ldi_wsk Z, L_prog<<1
       rcall   Pokaz_ciag_LCD   ;   wyświetl zachętę do wyboru kl. programowanego

    Petla_pil_prog_1:
       lds   R16, Klaw_inf
       sbrs   R16, 7
       rjmp   Petla_pil_prog_1   ;   oczekuj na naciśnięcie klawisza

       cbr   R16, 1<<7      ;   zeruj bit informujący o naciśnięciu klawisza

       rcall   Czysc_LCD      ;   zmaż zawartość wyświetlacza LCD

       cpi   R16, 15      ;   jeśli naciśnięto klawisz "*", to..
       breq   Petla_pil_koniec   ;     anuluj procedurę programowania

       mov   XL, R16      ;   zapisz nr wciśniętego klawisza w rejestrze XL
       lsl   XL         ;   pomnóż go przez 2
       clr   XH
       mov   R16, R_ADRES
       rcall   Zapisz_EE      ;   i zapisz pod otrzymanym adresem pamięci EEPROM
                   ;     nowy adres RC5 dla wybranego klawisza
       inc   XL         ;   inkrementuj nr klawisza (zwiększ adres w EEPROM)
       mov   R16, R_ROZKAZ   
       rcall Zapisz_EE      ;   i zapisz pod otrzymanym adresem pamięci EEPROM
                   ;     nowy rozkaz RC5 dla wybranego klawisza

    Petla_pil_koniec:         ; zakończenie pętli
       lds   R16, Klaw_inf
       sbrc   R16, 7
       rjmp   Petla_pil_koniec   ; oczekuj na puszczenie klawisza

       rjmp   Petla         ; zapętl program


                   ; DOŁĄCZANE PODPROGRAMY
    .INCLUDE "czekaj_ms.inc"   ;   oczekiwanie milisekundowe
    .INCLUDE "czekaj_us.inc"   ;   oczekiwanie mikrosekundowe
    .INCLUDE "ir_rc5.inc"      ;   obsługa nadajnika i odbiornika podczerwieni
    .INCLUDE "eeprom.inc"      ;   obsługa wewnętrznej pamięci EEPROM
    .INCLUDE "klaw_mat.inc"      ;   obsługa klawiatury matrycowej
    .INCLUDE "lcd.inc"      ;   obsługa wyświetlacza LCD


    Mam nadzieje że Ci lepszy odemnie troche pomogą.
    Jakby był napisany w c to może sam bym sobie poradził.... [/code]
  • Pomocny post
    Poziom 17  
    gregor10 napisał:

    Moze ktos moze udostepnic mi soft w ktorym bedzie obsluga samego wlacz wylacz , to moze juz bym sobie dal rade..... pomalu bym obczail o co w tym wszystkim chodzi ,




    Zmalazłem jeszcze mój kod do sterownika oświetlenia, który mam w pokoju, jest to część odpowiedzialna za włączanie i wyłączania poszczególnych kanałów, sterowanych oczywiście z portów procka. Mam nadzieję że to też pomoże w części wykonawczej programu:


    Rem * * * Pętla Główna * * *

    Do 'w tej pętli odczyt z pilota

    Getrc5(address , Command)
    Command = Command And &B01111111
    If Address <> 255 Then
    Call Odczyt 'jeśli coś odczyta to skok do "odczyt"
    End If

    Toggle Led

    Loop



    Rem * * * Odczyt Z Pilota * * *
    Sub Odczyt 'program odczytu kodu

    Tu po odczycie "1" z pilota zmienia stan "Lampa1" czyli np: Portd.1
    na przeciwny. Czyli włącza lub wyłącza w zależności od aktualnego stanu.

    Rem * * * Lampy Pojedyńcze * * *
    If Command = 1 Then
    Toggle Lampa1
    End If

    I inne porty:

    If Command = 2 Then
    Toggle Lampa2
    End If

    If Command = 3 Then
    Toggle Lampa3
    End If


    If Command = 4 Then
    Toggle Lampa4
    End If


    If Command = 5 Then
    Toggle Lampa5
    End If

    Tu po wciśnięciu guzika od wyłączania gasi wszystko po kolei;

    If Command = 12 Then
    Reset Lampa1
    Wait 1
    Reset Lampa2
    Wait 1
    Reset Lampa3
    Wait 1
    Reset Lampa4
    Wait 1
    Reset Lampa5
    End If


    Po wciśnięciu 0 zapala wszystko po kolei:

    If Command = 0 Then
    Set Lampa1
    Waitms 200
    Set Lampa2
    Waitms 200
    Set Lampa3
    Waitms 200
    Set Lampa4
    Waitms 200
    Set Lampa5
    Waitms 200
    End If

    End Sub

    Zasada jest dość prosta, jak już odczytasz kod z pilota to możesz zrobić wszystko co ci przyjdzie do głowy.
  • Pomocny post
    Poziom 16  
    Włącz wyłącz roobisz poprzez wpisywanie wartosci do rejestru.
    Najpierw port ustawiasz jakow yyjscie czyli DDRx ustawiasz w stan wysoki.
    A potem PORTx wysoki lu niski w zaleznosci jak chcesz.
    x to nr portów a jak chcesz konkretne piny to piszesz DDRx0 PORTx0 dla pinu 0 z portu x. :)
  • Poziom 27  
    Witam!
    Bardzo wam dziekuje .
    Teraz pozostaje przystosowac te kody pod moje potrzeby,
    nie wiem czy dobrze zrozumialem ale kolegi
    domelfm - Włącz wyłącz roobisz poprzez wpisywanie wartosci do rejestru.
    - ale czy aby na pewno to jest to o co mi chodzi ? 0 czy bedzie taki soft potrafil nauczyc sie dowolnych pilotow pracujacych w tym samym standardzie rc5 ? (np mam 3 rozne piloty i chce zebym go mogl w kazdej chwili zaprogramwac pod dany pilot ) ??

    bardzo licze na to ze ktos mi pomoze i najwazniejsze przystosuje program lub napisze co mam inaczej podpiac w moim sterowaniku ktorego dalem wyzej schemat (brakuje tylko w nim odbiornika ir - nie wiedzialem gdzie go podpiac ? )

    Jeszcze raz dziekuje ze dotychczasową pomoc i z gory dzieki za kolejną :)


    Pozdrawiam!
  • Pomocny post
    Poziom 16  
    Portem usatwiasz sobie stan logiczny wyjscia.
    Czyli robisz sobie konstrukcje typu:
    if(warunek)
    {
    tu cos tam robi, jakis instrukcja np właczenie lub wyłączenie portu zmiana stanu partu itp...
    }
    Program jest uniwersalny tzn odczytuje kody wysyłane przez pilot i je zwraca. W warunku wpisujesz sobie ze jezeli odczytany kod odpowiada przyciskowi "X" to on cos robi . I w ten sposób oprogramywujesz całośc.
  • Poziom 27  
    Troche mi sie juz rozjasnilo , ale jest jeszcze mnostwo niejasnosci...

    PODSTAWOWE :

    1.- ODCZYTUJE kody i je zwraca czyli ? odczytuje zapisuje i po zapisaniu (w ktorym momencie sie dowiem ze juz zapisana jest funkcja ? ) i ponownym napisniciu przycisku dzieje sie to co ustale czyli np na pinie x pojawia sie stan loginczy - 5V ?
    2. - Czy ten program moge wgrac do mojego Attiny26 przy aktualnym hardware (musze jeszcze gdzies ODBIORNIK IR podlutowac - gdzie ? ) bedzie dzial ? Co musze w programie zmienic zeby przystosowac ten kod do mojego ukladu

    Schemat 6postow wyzej

    Sory za moje glupie pytania , ale w tych klockach nie mam duzego pojecia....

    Pozdrawiam!
  • Poziom 16  
    Kodzik który wkleiłem jezt w asm pod atmege .
    Asm atmegi i attiny jest bardzo porównywalny ale niewiem czy attiny obsługuje wszystkie przerwania tak samo jak atmega.
    Podejzewam ze trzeba bedzie troche korygować program poza oczywistymi zmianami nazw tejesrów odp za stany portów.

    Ale w zasadzie to wszystko powinno być jak nalezy.

    Jakby tak znalezć ten prog w c to przeróbka była by jeszcze prostsza.

    Niestety tera niezabardzo u mnie z czasem poniewarz mam egzaminy na uczelni. Ale jak pozaliczam albo odpadne to napisze jakiś programik który tobie się przyda.
  • Poziom 13  
    Witam, tak jak wcześniej obiecałem (na GG :P) w wolnej chwili coś naskrobałem.
    Na schemacie widać że nie ma zewnętrznego rezonatora, więc wykorzystywany jest wewnętrzny RC - ustaw go na 8MHz.

    W załączniku jest narazie tylko plik hex do testów, bo nei mam sprzętu rzeby go przetestować, jak napiszemy aplikacje, która bedzie dobrze działać, zamieszcze wtedy kod.

    Pod port PA1 podepnij sobie LED'a, program narezie powinien działać tak:
    po włączeniu zasilania powinien zapalić sie led, i palić sie do tej pory, aż zostanie wciśnięty przycisk na pilocie odpowiadający za komende "power_on", potem dioda zgaśnie na około 1s, potem znowu sie zapali i bedzie sie świecić do tej pory aż odczyta kod klawisza odpowiadającego za "power off" , następnie za +volume, a potem za -volume, jak te 4 kody zostaną odczytane prawidłowo to program już powinien działać.

    Napisz mi czy to wogule ruszyło, bo tak jak wcześniej wspomniałem nie mam teraz sprzętu, żeby to przetesteować.