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

Pytanie o asembler... Ściemniacz sterowany pilotem i ręcznie na Tiny12.

08 Kwi 2006 01:22 2469 7
  • Poziom 18  
    Witam
    Dzisiaj znalazłem fajną stronkę gdzie był umieszczony super fajny ściemniacz sterowany pilotem i ręcznie na Tiny12 ( http://republika.pl/rejestr/strony/avr_regulator.html ). I tu mam pare pytań:

    1. Potrzebuje 2 takich układów w jednej puszce więc żeby mi się to zmieściło wymyśliłem że uwspólnie odbiornik podczerwieni, zasilanie, tranzystor odp. za detekcje przejścia przez zero (Q1) i rezonator... Tylko właśnie z tym rezonatorem nie jestem pewien czy da się taką kombinacje wykonać, proszę o porade... [schemat poniżej]

    2. Czytałem i czytałem to co było tam na stronie i nie znalazłem opisu odnośnie konfiguracji kodu odbieranego z pilota... Jeżeli miałbym 2 takie układy w jednej puszce to musiałbym ustawić ściemnianie pierwszego układu pod np 1 a ściemnianie drugiego układu np pod 2 żeby po przyciśnięciu 1 nie ściemniały mi się oba układy. Ja na asemblerze się nie znam więc byłbym wdzięczny gdyby ktoś podpowiedział mi gdzie jest to miejsce... [kod poniżej] (czy chodzi może o kody 0x01, 0x0C, 0x1E i 0x24?)

    3. Co się może stać po wyłączeniu i ponownym włączeniu prądu? Układ nie ma już resetu, więc jeżeli np wyłączą prąd kiedy układ będzie włączony to po ponownym zasileniu układ się zresetuje czy powróci do stanu sprzed zaniku prądu?

    Code:
    ;*********************************************
    
    ; Regulator mocy RC5
    ; Procesor ATtiny12
    ; Autor Henryk Więsyk
    ; wersja z obsługą przycisku
    ; 20-to i 30-to stopniowa regulacja z uwzględnieniem SIN
    ; ograniczenie do 29-ciu kroków dla stabilnej pracy przy zasilaniu szeregowym
    ; wersja 1.3.B 10.10.2003
    ; kwarc 4MHz
    ;*********************************************
    .include "tn12def.inc"

    ;*********************************************
    ; Definicje
    ;*********************************************


    .equwejscie  =5; wejście odbiornika (PB)
    .equprzycisk =2; wejście przycisku
    .equsys_adres=0x0C; adres rc5
    .equSIZE =8; data block size
    .equtabela_l =$08; Low SRAM address of first data element
    .equtabela_h =$00; High SRAM address of first data element

    .deftemp=R16; rejestr uniwersalny
    .deflicz1=R17; licznik opóźnienia
    .deflicz2=R18;
    .deflicz3=R19;
    .defkomenda=R20; rejestr komendy rc5
    .defbity=R21; rejestr przechowywania ilości bitów
    .deflicz_f=R22; pomocniczy licznik tabeli
    .deffaza=R23; bajt dla fazy
    .deflicz4=R24;
    .defstatus=r25; bajt bitów statusu
    ;*********************************************
    .cseg
    .org0x00
    rjmpstart;
    .orgINT0addr; skoku do podprogramu
    rjmpinterrupt_int0; obsł przerw INT0
    .orgOVF0addr; skoku do podprogramu
    rjmpinterrupt_TC0; obsł przerw TC0

    ;*********************************************
    ; Inicjalizacja
    ;*********************************************

    start:cli; blokada przerwań
    lditemp,0x01; linia "0" wyjście
    outddrb,temp; zapis do rejestru
    sbi$08,7; wyłącz komparator
    lditemp,0x06; ustaw
    outportb,temp; podciąganie 1 i 2
    lditemp,0x04; ustawienie preskalera
    outtccr0,temp; na 256
    lditemp,0x02; wyzwolenie przerwania
    outmcucr,temp; zboczem opadającym
    ldifaza,0x9F
    ldilicz_f,0x09
    lditemp,1<<int0; ustawienie bitu zezwolenia
    outgimsk,temp; na przerwania INT0
    main:
    sbispinb,wejscie; testowanie wejścia RC5
    rjmpodb_rc5; skok do odbioru kodu
    sbispinb,przycisk; testowanie przycisku
    rjmpobs_przyc; skok do obsługi przycisku
    rjmpmain; zapętlenie
    odb_rc5:
    ldilicz1,0x32; początkowa wartość
    p1:ldilicz2,0x3B; odliczenie 2.25 msek
    p2:declicz2
    brnep2; skocz jeśli nie zero
    declicz1; druga pętla
    brnep1; skocz jeśli nie zero
    clrkomenda; zerowanie rejestru
    ldibity,0x07; liczba bitów adresu
    pa1:sbispinb,wejscie; odczyt wejścia i skok jeśli zero
    bset0; ustaw bit (C) przeniesienia
    rolkomenda; obrót logiczny w lewo z przeniesieniem
    ldilicz1,0x30; pętla opóźnienia 1.76 msek
    pa2:ldilicz2,0x30
    pa3:declicz2
    brnepa3
    declicz1
    brnepa2
    decbity; dekrementuj liczbę bitów
    brnepa1
    andikomenda,0x1F; maskowanie bitu "P"
    cpikomenda,sys_adres; sprawdzenie adresu
    brneczekaj_49; skok jeśli zły adres
    clrkomenda; zerowanie rejestru
    ldibity,0x06; liczba bitów dla komendy
    pc1:sbispinb,wejscie; odczyt wejścia i skok jeśli zero
    bset0; ustaw bit (C) przeniesienia
    rolkomenda; obrót logiczny w lewo z przeniesieniem
    ldilicz1,0x30; pętla opóźnienia 1.76 msek
    pc2:ldilicz2,0x30
    pc3:declicz2
    brnepc3
    declicz1
    brnepc2
    decbity; dekrementuj liczbę bitów
    brnepc1

    ;*********************************************
    ; sprawdzenie komendy
    ;*********************************************
    cpikomenda,0x01; załączenie                         <<<
    brnekom2; skok jeśli nie ta
    sei; odblokuj przerwania
    rjmpczekaj_49; skok do opóźnienia
    kom2:cpikomenda,0x0C; wyłącz                         <<<
    brnekom3
    cli; zablokuj przerwania
    rjmpczekaj_49
    kom3:cpikomenda,0x1E; zwiększ                         <<<  to są te 4 kody klawiszy pilota?
    brnekom4
    inclicz_f
    movlicz1,licz_f
    sbcilicz1,0x1D; odejmij stałą od rejestru dla 29-ciu kroków
    brmikom_end; skok jeśli ujemny
    ldilicz_f,0x1C; dla 29-ciu kroków
    rjmpczekaj_49
    kom4:cpikomenda,0x24; zmniejsz                         <<<
    brneczekaj_49
    declicz_f
    brplkom_end; skocz jeśli dodatni
    ldilicz_f,0x00
    brneczekaj_49
    kom_end:
    rcallw_faza
    ; opóźnienie
    ldilicz4,0x02; 100ms
    rjmppcz3
    czekaj_49:
    ldilicz4,0x01
    pcz3:ldilicz1,0xFF;  49ms
    pcz1:ldilicz2,0xFF
    pcz2:declicz2
    brnepcz2
    declicz1
    brnepcz1
    declicz4
    brnepcz3
    rjmpmain
    ;*********************************************
    ; obsługa przycisku
    ;*********************************************
    obs_przyc:
    rcallczas10
    sbicpinb,przycisk; testowanie przycisku
    rjmpwyjsc; skok jeśli nie wciśnięty
    ldilicz4,0x32
    cz500_1:
    rcallczas10
    declicz4
    brnecz500_1
    sbicpinb,przycisk; testowanie przycisku
    rjmpwl_wyl; włącz lub wyłącz
    bridp_przycisk; skocz jeśli nie włączony
    p_faza:; regulacja fazy
    sbrcstatus,0; sprawdzenie statusu
    rjmpdol
    inclicz_f; zwiększ fazę
    movlicz1,licz_f
    sbcilicz1,0x1C; odejmij stałą od rejestru dla 29-ciu kroków
    brmitest_przy; skok jeśli ujemny
    sbrstatus,1; ustawienie bitu statusu
    rjmptest_przy
    dol:declicz_f; zmniejsz fazę
    brpltest_przy
    ldilicz_f,0x01
    cbrstatus,1; kasowanie bitu "1" statusu
    test_przy:
    rcallw_faza; wyliczenie fazy
    ldilicz4,0x1A; czas opóźnienia
    cz500_2:
    rcallczas10
    declicz4
    brnecz500_2
    sbicpinb,przycisk; testowanie przycisku
    rjmpwyjsc
    rjmpp_faza
    wl_wyl:; włącz wyłącz
    bridwl; sprawdzenie załączenia przerwań
    cli; wyłącz
    rjmpwyjsc
    wl:sei; włącz
    rjmpwyjsc
    p_przycisk:
    sbispinb,przycisk; czeka na puszczenie przycisku
    rjmpp_przycisk
    wyjsc:rjmpmain
    ;*********************************************
    ; podprogram czas 10ms
    ;*********************************************
    czas10:
    ldilicz1,0x34
    cz1:ldilicz2,0xFF
    cz2:declicz2
    brnecz2
    declicz1
    brnecz1
    ret
    ;*********************************************
    ; podprogram wyliczania fazy
    ;*********************************************
    w_faza:ldizl,low(tabela<<0x01)
    ldizh,high(tabela<<0x01)
    addzl,licz_f
    lpm; ustawienie zegara
    movfaza,r0
    ret
    ;*********************************************
    ; podprogram obsługi przerwania od INT0
    ;*********************************************
    ;
    interrupt_int0:

    outtcnt0,faza
    lditemp,1<<toie0; zezwolenie na przerwanie
    outtimsk,temp; od zegara
    intemp,tifr
    sbrstemp,tov0
    rjmpinend
    sbrstatus,2
    ;lditemp,0<<tov0
    ;outtifr,temp
    inend:reti

    ;*********************************************
    ; podprogram obsługi przerwania od zegara T0
    ;*********************************************
    ;
    interrupt_TC0:; etykieta podprogramu
    sbrsstatus,1
    rjmpw4
    cbrstatus,2; kasuj bit znacznika
    rjmpw5
    w4:sbis$16,1; sprawdzenie bitu portu B
    rjmpw3
    lditemp,0<<toie0; zablokowane przerwanie
    outtimsk,temp; od zegara
    rjmpw1; jeśli bit L skok
    w3:lditemp,0x64; odliczenie 10 ms
    outtcnt0,temp
    w1:sbi$18,0; ustaw bit wyjścia
    ldilicz3,0x0E; ustaw czas impulsu
    w2:declicz3
    brnew2
    cbi$18,0; zeruj bit wyjścia
    w5:reti
    ;*********************************************
    ; Tabela wartości fazy
    ;*********************************************
    tabela:
    ;.db0x6F,0x7B,0x87,0x93,0x9F,0xB7,0xC3,0xCF,0xDB,0xE7,0xF3; dla 10 liniowo

    ;.db0x7A,0x84,0x8C,0x92,0x98,0x9E,0xA3,0xA8,0xAD,0xB2; z uwzględnieniem SIN
    ;.db0xB7,0xBC,0xC1,0xC6,0xCC,0xD2,0xD8,0xE0,0xEA; 18 kroków

    .db0x75,0x7D,0x83,0x88,0x8C,0x90,0x94,0x98,0x9B,0x9F; dla 30 z uwzględnieniem SIN
    .db0xA2,0xA5,0xA9,0xAC,0xAF,0xB2,0xB5,0xB8,0xBB,0xBF; dla 30
    .db0xC2,0xC5,0xC9,0xCC,0xD0,0xD3,0xD8,0xDC,0xE1;,0xE7,0xEE; dla 30
  • Poziom 18  
    po co 2 ukaldy ??
    jak rozumiem chcesz sterowac dwoma punktami swietlnymi ??
    jaesli tak to wystarcza dwa triaki (i optotriaki) natomiast jeden uC i jeden odbiornik
    co do restatu procka przy zaniku zasilania to mozn awykorzystac jego EEPROM do zapisu aktualnych warosci sciemniacza (np przy zaniku zasilania) wiec z tym nie ma problemu
  • Poziom 18  
    Anderian napisał:
    po co 2 ukaldy ??
    jak rozumiem chcesz sterowac dwoma punktami swietlnymi ??


    Tak dokładnie o to chodzi, mam w pokoju żyrandol w którym są 2 układy po 2 żarówki...

    Anderian napisał:
    jaesli tak to wystarcza dwa triaki (i optotriaki) natomiast jeden uC i jeden odbiornik


    Ale chciałem mieć możliwość niezależnego sterowania układami...

    Anderian napisał:
    co do restatu procka przy zaniku zasilania to mozn awykorzystac jego EEPROM do zapisu aktualnych warosci sciemniacza (np przy zaniku zasilania) wiec z tym nie ma problemu


    Mi nie chodzi tu o tworzenie nowego układu tylko przeróbkę tego... wiadomo że można, tylko po pierwsze ja nie znam asemblera, który jest tu niezbędny bo procek nie ma ramu (więc bascom odpada). Po drugie właśnie taki efekt "zapamiętywania" aktualnego stanu układu jest niepowołany... jeżeli np wyłączą prąd o 21 (światło zapalone), a włączą o 2 w nocy kiedy wszyscy rozejdom się do łóżek, to niepotrzebnie będzie bił nam licznik prądu...
  • Specjalista techniki cyfrowej
    Co do dwóch mikrokontrloeró na wspólnym kwarcu.
    Możesz spróbować, ale wątpię, żeby to zadziałało.
    Pierwszy zostawić tak jak jest na schemacie, a drugiemu przestawić fusy na zewnętrzny oscylator i jego wejście (XTAL1) połączyć z wyjściem (XTAL2) oscylatora w pierwszym procesorze. Problem może być taki, że wejście drugiego procesora zbytnio obciąży generator w pierwszym i generator się nie wzbudzi, albo będzie pracował niestabilnie.

    Znacznie lepszym rozwiązaniem było by zastosowanie zewnętrznego generatora i podłączenie sygnału taktującego do obu kontrolerów.
  • Poziom 32  
    nic nigdzie nie musisz zmieniac podlacz x tal 2 procesora z kwarcem do x tal 1 procesora bez kwarcu zawsze dziala i program tez bez zmian
  • Poziom 18  
    OK, zrozumiałem... A co z moim drugim pytaniem odnośnie pilota i RC5 wysyłanego przez niego? czy chodzi o te 4 zaznaczone kody?
    Code:
    ;********************************************* 
    
    ; sprawdzenie komendy
    ;*********************************************
    cpikomenda,0x01; załączenie                         <<<
    brnekom2; skok jeśli nie ta
    sei; odblokuj przerwania
    rjmpczekaj_49; skok do opóźnienia
    kom2:cpikomenda,0x0C; wyłącz                         <<<
    brnekom3
    cli; zablokuj przerwania
    rjmpczekaj_49
    kom3:cpikomenda,0x1E; zwiększ                         <<<  to są te 4 kody klawiszy pilota?
    brnekom4
    inclicz_f
    movlicz1,licz_f
    sbcilicz1,0x1D; odejmij stałą od rejestru dla 29-ciu kroków
    brmikom_end; skok jeśli ujemny
    ldilicz_f,0x1C; dla 29-ciu kroków
    rjmpczekaj_49
    kom4:cpikomenda,0x24; zmniejsz                         <<<
  • Poziom 25  
    shg napisał:
    .....Pierwszy zostawić tak jak jest na schemacie, a drugiemu przestawić fusy na zewnętrzny oscylator i jego wejście (XTAL1) połączyć z wyjściem (XTAL2) oscylatora w pierwszym procesorze....


    Jest to jak najbardziej do zrealizowania. Zrób jak proponuje shg tylko miedzy "procki" daj szeregowo rezystor 1 - 4,7k i kondensator 47p - 10nF (dobrze byłoby dobrać te wartości). Rezystor aby nie obciążać wejścia generatora kwarcowego w pierwszym procku a kondensator, żeby oddzielić składową stała napięcia która może uniemożliwić start i stabilna pracę w/w generatora. Raczej więcej niż jeden "dodatkowy procek" nie podłączysz bo bedzie to już za duże obciążenie dla wewn. gen. jednak dając bufor i z jego wyjścia pobierając sygnał problem ustępuje (to tak na przyszłość).
  • Poziom 18  
    OK. A teraz co z tym kodem? czy w zaznaczonych liniach są podane kody z pilota?