Podłączenie przekaźnika

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Podłączenie przekaźnika

Post autor: maxxxior » 31 mar 2014, 22:44

Witam, zrobiłem sobie taki ukłąd. Po odebraniu przez ukłąd komendy RC-5 układ ma załączyć przekaźnik. Problem w tym, że jak trzymam na pilocie cały czas wcisniety przycisk to przekaźnik nie "trzyma" tylko się przełącza. Co jest nie tak? Chcę uzyskać efekt taki że jak trzymam przycisk na pilocie to aby przekaźnik byłprzez ten czas załąćzony.
Załączniki
laptimer.png

Jony130
Moderator
Posty: 3157
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 01 kwie 2014, 14:13

Z twojego opisu wynika, że to problem PROGRAMOWY a nie sprzętowy.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 01 kwie 2014, 16:25

tylko że jak miałem wcześniej podpiętą diodę zamiast przekaźnika, to jak trzymałem na pilocie przycisk to dioda świeciła cały czas. Może wartości rezystorów, bądź dioda zabezpieczająca jest zła? W sumie dioda to nawet nie wiem jaką zamontowałem, bo SMD, i miałem ją luzem...

Jony130
Moderator
Posty: 3157
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 01 kwie 2014, 17:58

Pokaż program. Dodatkowo przeprowadź pomiar napięcia na porcie PC5 w czasie gdy trzymasz na pilocie cały czas wciśnięty przycisk.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 01 kwie 2014, 18:28

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

// Odbiornik podczerwieni SFH5110  przyłączony do portu  PB0
#define RC5_IN   (PINB & (1<<0))

typedef unsigned char u8;
typedef unsigned int uint;


volatile u8 timerL;
volatile u8 timerH;

// konfiguracja timera, przerwanie powinno wystapic co 32us
void init_rc5() {
    //atmega8
    TCCR0 = (1 << CS00); // włącza Timer0
    TIMSK = (1 << TOIE0); // włącza przerwanie "Timer0 Overflow"

    sei();
}


// Procedura obsługi przerwania  Timer0 Overflow
ISR(TIMER0_OVF_vect)
{
    volatile static u8 inttemp;

    // zmienna timerL zwiększa się co 32us
    timerL++;

    // zmienna timerH  zwiększa się co 8.192ms (32us*256)
    inttemp++;
    if (!inttemp)
        timerH++;
}


// detekcja komendy RC-5
uint detect() {
    u8 temp;
    u8 ref1;
    u8 ref2;
    u8 bitcnt;
    uint command;

    timerH = 0;
    timerL = 0;

    // Czeka na okres ciszy na linii wejścia uC trwający  3.5ms
    // Jeśli nie wykryje takiego okresu ciszy w ciągu 131ms,
    // to kończy działanie funkcji z błędem
    while (timerL < 110) {
        if (timerH >= 16)
            return command = -1;

        if (!RC5_IN)
            timerL = 0;
    }

    // Czeka na  pierwszy bit startowy.
    // Jeśli nie wykryje bitu startowego w ciągu 131ms,
    // to kończy działanie funkcji z błędem
    while (RC5_IN)
        if (timerH >= 16)
            return command = -1;

    // Pomiar czasu trwania niskiego poziom syganłu
    // w pierwszym bicie startowym.
    // Jeśli nie wykryje rosnącego zbocza sygnału w ciągu
    // 1ms, to kończy działanie funkcji z błędem
    // czas trwania jednego bitu - 1,788ms
    timerL = 0;
    while (!RC5_IN)
        if (timerL > 34)
            return command = -1;

    //
    temp = timerL;
    timerL = 0;

    // ref1 - oblicza  3/4 czasu trwania bitu
    ref1 = temp + (temp >> 1);

    // ref2 - oblicza 5/4 czasu trwania bitu
    ref2 = (temp << 1) + (temp >> 1);

    // Oczekuje na zbocze opadające sygnału w środku drugiego
    // bitu startowego.
    // Jeśli nie wykryje zbocza w ciągu 3/4 czasu trwania
    // bitu, to kończy działanie funkcji z błędem
    while (RC5_IN)
        if (timerL > ref1)
            return command = -1;

    // W momencie wykrycia zbocza sygnału, synchronizuje
    // zmieną timerL dla próbkowania  bitu toggle
    timerL = 0;

    // Odczytuje dekoduje pozostałe 12 bitów polecenia rc5
    for (bitcnt = 0, command = 0; bitcnt < 12; bitcnt++) {
        // Czeka 3/4 czasu trwania bitu od momentu wykrycia
        // zbocza sygnału w połowie poprzedniego bitu
        while (timerL < ref1) {
        };

        // Próbkuje - odczytuje port we  uC
        if (!RC5_IN) {
            // Jeśli odczytano 0, zapamiętuje w zmiennej
            // "command" bit o wartości 0
            command <<= 1;

            // Oczekuje na zbocze rosnące sygnału w środku bitu.
            // Jeśli nie wykryje zbocza w ciągu 5/4 czasu trwania
            // bitu, to kończy działanie funkcji z błędem
            while (!RC5_IN)
                if (timerL > ref2)
                    return command = -1;
        } else {
            // Jeśli odczytano 1, zapamiętuje w zmiennej
            // "command" bit o wartości 1
            command = (command << 1) | 0x01;

            // Oczekuje na zbocze opadające sygnału w środku bitu.
            // Jeśli nie wykryje zbocza w ciągu 5/4 czasu trwania
            // bitu, to kończy działanie funkcji z błędem
            while (RC5_IN)
                if (timerL > ref2)
                    return command = -1;
        }

        // W momencie wykrycia zbocza sygnału, synchronizuje
        // zmieną timerL dla próbkowania kolejnego bitu
        timerL = 0;
    }

    // Zwraca kod polecenia rc5
    // bity 0..5 numer przycisku
    // bity 6..10  kod systemu(urządzenia)
    // bit 11 toggle bit
    return command;
}

//---------------------------------------------------------------
// GLÓWNA FUNKCJA PROGRAMU
//---------------------------------------------------------------
int main(void) {

    uint cmd;
    u8 out;

    // Konfiguracja portów Atmega8
    // serwo podpiete pod pin PB1(OC1A), a mostek H, czyli silniki do pinów PC4 PC5
    DDRD = 0x7f;
    PORTD = 0x00;
    DDRB |= (1 << 1);
    PORTB |= (1 << 1);
    DDRC = 0xFF;
    PORTC = 0x00;

    // Konfiguracja timera do obsługi serwomechanizmu
    int wypelnienie = 1500;
    TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); //tryb pracy licznika(15), ustawienie prescalera na 8,

    TCCR1B = (1 << CS11) | (1 << WGM12) | (1 << WGM13);

    ICR1 = 20000; //ustawienie okresu na 20ms(czestotliwosc 50Mz)
    // uruchamia Timer0 i przerwanie
    init_rc5();

    while (1) {
            OCR1A = wypelnienie; //określenie czasu impylsu

            // Wykrywa i dekoduje polecenie pilota RC5
            cmd = detect();
            PORTC = 0x00;
            
            // Jeśli odebrano komendę
            if (cmd != -1) {

               PORTC=0xFF;
            }
            else{
            	PORTC=0x00;

            }
        }


    return 0;
}
napięcie na pinie PC5 faluje.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 15 kwie 2014, 20:47

Witam ponownie. Do tej pory nie udało mi się rozwikłać zagadki czemu ten przekaźnik nie trzyma. Zmontowałem prawie że identczyny układ na płytce stykowej i wszystko działa jak należy. Później w jużgotowym układzie podmieniałem poszczególne elementy (przekaźnik, odbiornik IR, rezystory kondensatory) i dalej tak samo :/. W układzie na stykówce, po załączeniu pilota, napięcie na wejściu, czyli na odbiorniku IR spada z ~4.9 do ~4.3,, w układzie na wytrawionej płytce też tak samo. Natomiast na wyjściu, czyli na PC5, napięcie na stykówce trzyma ~4.9V a w układzie faulje w granicac 2-5V. I nie chodzi tu o tranzystor bo nawet bez tranzystora tak faluje. Jedyną różnicą jest to że w układzie znajduję się Atmega8 w TQFP32 a na stykówce w DIP. CO to może być? Czy może być to wina szerokości ścieżek? BO ja w to wątpie... najwęższa ścieżka to 0.254mm.
POMOCYYYYYYYY!

Awatar użytkownika
KrzysiekK
Użytkownik
Posty: 1287
Rejestracja: 12 kwie 2006, 19:38

Post autor: KrzysiekK » 16 kwie 2014, 8:17

Czasami się tak właśnie zdarza, że układ zmontowany w "pająku" lub na płytce stykowej działa. Natomiast na płytce drukowanej już nie. Mogą mieć na to wpływ różne czynniki, np. sposób prowadzenia i długość ścieżek czy rozmieszczenie elementów na płytce.

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 16 kwie 2014, 22:44

maxxxior pisze:Natomiast na wyjściu, czyli na PC5, napięcie na stykówce trzyma ~4.9V a w układzie faulje w granicac 2-5V. I nie chodzi tu o tranzystor bo nawet bez tranzystora tak faluje.
1. Jak policzyłeś rezystor R2?
2. Jaki tranzystor Q1?
3. Jaki przekaźnik?
4. Pokaż PCB.
5. Pokaż zdjęcia - ostre, dobrze oświetlone i dużej rozdzielczości w trybie makro.
6. Załącz program, który pracuje w momencie, który opisujesz.

ODPOWIEDZ