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

Zasilanie ATMEGA i transmisja IR w modyfikacji Ericsson ChatBoard

Mad Bekon 03 Wrz 2005 22:25 4551 16
REKLAMA
  • #1 1789772
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Moim problemem jest zasilanie dla WW kości. Chcę zmodyfikować klawiaturkę do SMS Ericsson ChatBoard, tak aby podmienić oryginalny układ z tą właśnie ATMEGĄ, i dodać diodę IR, by przesyłała do odbiornika IR wciśnięty klawisz. Pytanie moje: Ile taka bateria wytrzyma?

    Chciałbym również zapytać o jakiś protokół transmisji IR, tak aby przesyłać te 8 bitowe znaki, w miare płynnie, bez zakłóceń...
  • REKLAMA
  • #2 1789843
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    jeszcze raz o co chodzi??
    czyżby chodziło o to że chcesz tę klawiatórę przerobić na bezprzewodową??
    jeśli tak to długość zucia bateri nie będzi zbyt długi.
    sam up edzie brał przy niskim zasilaniu i wolnym kwarcu powiedzmy 5mA
    dotego dochodzi prąd diody nadawczej który jest tródny do oszacowania ale będzie w granicach 10 do 20mA w impulsach.
    należy się również zastanowić ile będzie pobierać sama klawiatura??
    tak czy inaczej bateri pastylkowe mają pojemnośc dla 2032 32mAh
    a to dość niewiele.
  • REKLAMA
  • #3 1789859
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Tak, na bezprzewodową, ale nie do telefonu, tylko do PC. Takie baterie, może zmieszczą się tam 2, 3. Chcialbym do tego zrobić jakąś ładowarkę.
    Będzie to zrobione na podstawie: http://www.myplace.nu/avr/avrchatboard/
    Chcę tylko dodać tam obsługę PS/2 i właśnie IR.
    PS/2 w przypadku kiedy będzie podpięta do PC, IR jak siąde na kanapie.
  • #4 1789960
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    dobry pomysł z tą klawiaturą.
    wszystko powinno chodzić tylko musisz zaimplementować w procku protoków ps2 ale to nie powinno być tródne trzeba znaleść tylko odpowiedni opis.
    jeżeli układ ma się komunikować przez irde to drugi uP musi być podłączony do kompa i to on będzie odbierał sygnał ir i dekodował go na ps2.
  • #5 1789980
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Od strony kompa i odbiornika to na bank coś wymyśle. Chodzi mi tylko o sposób przesyłania danych. Czy ma to wyglądać np jak ramki RC5 czy jakieś moze inne, lepsze?!? W sumie jakby zrobić tak jak RC5 to po włączeniu klawiaturki w inny tryb miałbym pilota do TV. Łoo... :D Wystarczy wewnętrzny oscylator 1MHz?

    Opis PS/2 w sumie mam gdzieś, to nie będzie problem. Problemem dla mnie teraz jest zasilanie. Tak, żeby mogło to podziałać przynajmniej dzień bez ładowania...
  • #6 1790074
    matczar
    Poziom 13  
    Posty: 28
    Pomógł: 8
    @Mad. Bekon:
    O ile się nie mylę to używasz AVR-GCC i jeśli chodzi o PS/2, to najnowsza wersja biblioteki uniwersalnej RKlibAVR (z 28.08.2005) zawiera moduł do obsługi tego protokołu (RC-5 lub innych IR zresztą też). Na stronce z dokumentacją online jeszcze o PS/2 nie wspomniano, ale w sekcji 'download' są najnowsze archiwa zawierające interesujące nas biblioteki.

    Pozdrawiam :-)

    EDIT: Aha.. Tych modułów jeszcze nie używałem (co mam nadzieję wkrótce sie zmieni ;-) ), ale do LCD, ADC oraz UARTA - tak, i byłem z nich zadowolony.
  • REKLAMA
  • #7 1790559
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Naskorbałem coś takiego:
    
    
    #include <avr/io.h>
    #define F_CPU        11059200                                       /* 1MHz zegar procesora */
    #define CYCLES_PER_US ((F_CPU+500000)/1000000)
    char a;
    void delay(unsigned int us)
    {
        unsigned int delay_loops;
        register unsigned int  i;
        delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
        for (i=0; i < delay_loops; i++) {};
    }
    void delayms(unsigned int ms)
    {
                unsigned int i;
                for (i=0;i<ms;i++){delay(999);asm volatile ("WDR"::);                                               }
    } 
    
    void setbit(char a){
    PORTB=~a&0x01;
    delay(889);
    PORTB=a&0x01;
    delay(889);
    }
    
    int main(void)
    {
    DDRB=0x01;
    while(1) {
    setbit(1);
    setbit(1);
    setbit(a++&0x01);
    setbit(0);//addr
    setbit(0);
    setbit(0);
    setbit(0);
    setbit(0);
    setbit(0);//comm
    setbit(0);
    setbit(0);
    setbit(0);
    setbit(0);
    setbit(0);
    delayms(500);
    }
    }
    

    Program ma za zadanie załączanie kanału 0 na moim TV. Jako adres urządzenia przyjąłem 0. Co może być nie tak. Dioda świeci, coś tam się wysyła, ale sie nie przełącza...
  • REKLAMA
  • #9 1790821
    Nemo
    Poziom 31  
    Posty: 2078
    Pomógł: 9
    Ocena: 72
    Tak. Pamiętaj, że dane w pilotach IR są zwykle kodowane bifazowo. Czasy włączenia/wyłączenia muszą być ustawione precyzyjnie. Kiedyś w Elektorze był opis RC5. Inne firmy czasami stosują lepszy "kosmos" w kodowaniu - chociażby Sony, Sharp, Sanyo... Wszystko zależy od modelu TV.

    A co do klawiatury - mam w domu TV Sharpa i padnięty pilot do niego. Ponieważ jest używany bardzo intensywnie przez niektórych domowników postanowiłem go zrobić w wersji własnej. Jednak przez myśl by mi nie przeszło użycie jakiegokolwiek Atmela. Myślałem raczej o MSP430. One są bardziej energooszczędne...

    Pozdrawiam.
  • #10 1790829
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    No właśnie mój chodzi w RC-5. Na pewno adres to jest 0, a dla kanało 0 - komenda jest 0. Sprawdziłem, rozbierając swojego pilota, porównójąc z datasheetem SC3010S na którym jest zrobiony połówka bitu trwa 844uS... Co jeszcze może być nie tak?

    Nemo, tylko że te ATMELE mają dokłądnie takie same wyprowadzenia jak kość która aktualnie siedzi w klawiaturce czyli Philipsowska 87c52. Wkładająć inną kość będe miał pajęczyne że hej. Gdyby chodziło mi o energooszczędnosć to raczej bym pomyślał o AtTiny. Atmega 162 przy 3V i 1MHz ciągnie prąd ok 0.5mA w Idle. Myśle raczej o tym, zeby go usypiać po jakimś czasie. Ewentualnie mały guziczek żeby go budzić.
  • #11 1790992
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Może problem w funkcji opóźnienia...
    Nie jest to szczególnie dokłądna metoda...
    Wykorzystaj raczej timer do odliczania czasu...
  • #12 1791937
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h> 
    char s[] ="0101011010101010101010101010";
    static volatile unsigned int a;
    
    SIGNAL (SIG_OVERFLOW1){
    TCNT1H = 0xd9;
    TCNT1L = 0x99;
    PORTB=s[a++]&0x01;
    if(a==27)a=0;
    }
    
    int main(void)
    {
    DDRB=0xff;
    TCNT1H = 0xd9;
    TCNT1L = 0x99;
    TCCR1B = 0x01;
    TIMSK = 0x14;
    sei();
    while(1){ } 
    }

    Naskrobałem coś takiego. Gdy ustawie preskaler na 0x05, gołym okiem widzę, że dioda się zapala i gaśnie w takiej kolejności jak jest w zmiennej s. 0 1 0 1 0 1 1 itd. Nadal nie działa. Wartosci timera liczylem kalkulatorem. Co moze byc nie tak?
  • #13 1792063
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Mad Bekon napisał:

    Naskrobałem coś takiego. Gdy ustawie preskaler na 0x05, gołym okiem widzę, że dioda się zapala i gaśnie w takiej kolejności jak jest w zmiennej s. 0 1 0 1 0 1 1 itd. Nadal nie działa. Wartosci timera liczylem kalkulatorem. Co moze byc nie tak?

    A o czymś nie zapomniałeś :?:
    A modulacja promienia IR 36kHz , to gdzie jest :?:
    A jak "gołym okiem widzisz" promienie IR :?:

    Pozdrawiam
    Piotrek
  • #14 1792121
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Gołym okiem przez aparat w telefonie.
    Modulacja? Jak to zrealizować? CHyba czegoś nie wiem, tudzież nie kumam... :/ Czyli jeśli jest 1 to przez te 889us robie 1 0 1 0 z odstepami 27uS, a jak 0 to wystawiam przez 889uS stan niski?
  • #15 1792465
    warth
    Poziom 13  
    Posty: 50
    Pomógł: 5
    Ocena: 3
    bekon, a nie zapomniałeś o bitach startu (czy nawet dwóch) itp itd? w sumie przez IR nie nadawałem jescze, ale dzisiaj moge coś o tym poczytać to jutro do ciebie wpadne i możemy spróbować sklecić coś mądrego :) (tym bardziej że to ostatnie chwile mojej wolności w tym miesiącu :( )
  • Pomocny post
    #16 1793360
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Mad Bekon napisał:
    Gołym okiem przez aparat w telefonie.

    A więc uzbrojonym ;)
    Mad Bekon napisał:

    Modulacja? Jak to zrealizować? CHyba czegoś nie wiem, tudzież nie kumam...

    Programowo , bądź sprzętowo(np.NE 555)
    Mad Bekon napisał:

    :/ Czyli jeśli jest 1 to przez te 889us robie 1 0 1 0 z odstepami 27uS, a jak 0 to wystawiam przez 889uS stan niski?

    Właśnie tak.Jeśli jedynka , to swieci-nie świeci ... ... i tak 32 krotnie w ciągu ~889 uS , a dla zera - ciemność ;)
    Zajrzyj tu: http://www.xs4all.nl/%7Esbp/knowledge/ir/rc5.htm

    Piotrek
  • #17 1802532
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    #define F_CPU 11059200
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h> 
    #include <avr/delay.h>
    
    volatile char c,toggle;
    
    void lo(void){
    c=0;
    while(c<64){ PORTB=c++;_delay_us(13);} 
    PORTB=0;
    _delay_us(889);
    }
    void hi(void){
    c=0; PORTB=0;
    _delay_us(889);
    while(c<64){PORTB=c++; _delay_us(13);};
    }
    
    int main(void)
    {
    DDRB=0xff;
    while(1){ 
    hi();
    hi();
    if(toggle++&0x01)hi(); else lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    lo();
    _delay_ms(150);
    }
    }
    


    Nadal nie chce działać. _delay_us raczej działa. Jak wyrzuce linijke _delay_us(889), to wywolanie lo i hi daje mi częstotliwość ~36kHz. Zmierzone Hercomiarką.

Podsumowanie tematu

✨ Dyskusja dotyczy modyfikacji klawiatury Ericsson ChatBoard poprzez zastąpienie oryginalnego układu mikrokontrolerem ATMEGA oraz dodanie diody IR do bezprzewodowej transmisji wciśniętych klawiszy do odbiornika IR podłączonego do komputera. Poruszono kwestie zasilania, wskazując, że przy niskim poborze prądu ATMEGA (ok. 0,5 mA w trybie idle przy 3V i 1 MHz) oraz impulsowym poborze prądu diody IR (10-20 mA) czas pracy na bateriach pastylkowych CR2032 (32 mAh) będzie ograniczony, ale można zastosować kilka baterii i ładowarkę. Wskazano na konieczność implementacji protokołu PS/2 w mikrokontrolerze oraz rozważano protokół transmisji IR, sugerując standard RC5 Philipsa jako popularny i dobrze udokumentowany, z modulacją 36 kHz i kodowaniem bifazowym. Omówiono problemy z generowaniem sygnału IR, w tym precyzyjne timingi i modulację nośnej, a także wykorzystanie timerów sprzętowych zamiast opóźnień programowych dla dokładności. Zaproponowano użycie bibliotek RKlibAVR do obsługi PS/2 i IR. Wskazano, że ATMEGA ma kompatybilne wyprowadzenia z oryginalnym układem Philips 87c52, co ułatwia wymianę. Poruszono też kwestie energooszczędności i usypiania mikrokontrolera. Kod źródłowy do generacji sygnału IR z wykorzystaniem timerów i opóźnień został przedstawiony, jednak wymaga poprawnej implementacji modulacji 36 kHz.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA