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

CNY17, Atmega16: Dioda na PD7 miga zamiast świecić przy detekcji zera

lbobby 15 Kwi 2013 22:30 2352 17
REKLAMA
  • #1 12203932
    lbobby
    Poziom 10  
    Czemu dioda podłączona do portu PD7 mignie i zgaśnie zamiast palić się z intensywnością zależną od licznika?

    Układ zbudowany na CNY17, detekcja zera podanego na int1.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 12203981
    BlueDraco
    Specjalista - Mikrokontrolery
    Pewnie dlatego, że tak jej kazałeś.
  • #3 12204015
    Tomasz Gumny
    Poziom 28  
    Brakuje zatrzymania timera w OVF.
  • #4 12204019
    lbobby
    Poziom 10  
    hm.. a w jaki sposób to zrobić?
  • #5 12204075
    Tomasz Gumny
    Poziom 28  
    TCCR1B &= ~(1 << CS10);
    lub po prostu:
    TCCR1B = 0;
    jeśli poza CS10 nic tam nie ustawiasz.
  • REKLAMA
  • #6 12204102
    lbobby
    Poziom 10  
    nic to nie dało
    mignie i gaśnie
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    
    
    
    
    #define D7 7 //dioda podłączone do pinów portu D
    unsigned int counter=60110;
    
    
    int main(void)
    {
    DDRD = (1 << D7);
    
    
    MCUCR |= (1 << ISC01) | (1 << ISC11);
    GICR |= (1 << INT0) | (1 << INT1);
    TCNT1 = counter;
    TIMSK |= 1 << TOIE1;
     
    
    sei();
    
    
    while(1);
     
    return 0;
    }
    
    
    
    ISR(INT0_vect)
    {
     counter=61111;
    }
    
    
    
    ISR(TIMER1_OVF_vect)
    {
    
     PORTD &= ~(1 << D7);
     TCCR1B =0; 
    }
    
    
    ISR(INT1_vect)
    {
    
     PORTD |= (1 << D7);
     
     TCNT1 = counter;
     TCCR1B |= (1 << CS10);
    }
    
  • #7 12204154
    BlueDraco
    Specjalista - Mikrokontrolery
    Zastanów się, w którym miejscu programu zapalasz, a w którym gasisz diodę, i kiedy to następuje (w wyniku jakiego zdarzenia).
  • #8 12204170
    Tomasz Gumny
    Poziom 28  
    Jak taktujesz procesor?
    Co ma dać zmiana counter z 61110 na 61111?
    Pokaż schemat i dopisz jakieś komentarze w programie.
  • REKLAMA
  • #9 12204210
    lbobby
    Poziom 10  
    dziwna sprawa
    bo jak zahaszowałem DDRD w programie gdzie występował to diod takze sie zapala na pół sekundki i gaśnie???

    tamto int0 ma nie bys to zostalo z prob.
    aktualnie jest tak ale i tak nie dzial

    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    
    
    
    
    //#define D7 7 //dioda podłączone do pinów portu D
    unsigned int counter=60110;
    
    
    int main(void)
    {
    DDRD = (1 << D7);
    
    
    
    MCUCR |= (1 << ISC01) | (1 << ISC11);
    GICR |= (1 << INT0) | (1 << INT1);
    TCNT1 = counter;
    TIMSK |= 1 << TOIE1;
     
    
    sei();
    
    
    while(1);
     
    return 0;
    }
    
    ISR(TIMER1_OVF_vect)
    {
    
    PORTD &= ~(1 << D7);
    TCCR1B =0; 
    }
    
    
    ISR(INT1_vect)
    {
    
     PORTD |= (1 << D7);
     
     TCNT1 = counter;
     TCCR1B |= (1 << CS10);
    }
    
  • REKLAMA
  • #10 12204282
    Tomasz Gumny
    Poziom 28  
    Skoro nie definiujesz obsługi INT0, to go nie właczaj.
    Spróbuj najpierw zapalać/gasić LED.
    Potem włącz i sprawdź czy program wchodzi w przerwanie od INT1.
    Dopiero potem spróbuj odliczać czas i gasić LED z timera.
    Podasz częstotliwość taktującą procesor czy mamy zgadywać?
  • #11 12204298
    lbobby
    Poziom 10  
    1MHz wewnętrzny oscylator

    Dodano po 28 [minuty]:

    Dobra doszedłem do jednej pomyłki, wgyrwałem cały czas plik hex który nie był w tym czasie kompilowany tylko kiedys a sciezka była podana na sztywno i dlatego dioda zapala i gasła po chwili

    Mam problem z wejscie w przerwanie
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    
    
    
    
    #define D7 7 //dioda podłączone do pinów portu D
    unsigned int counter=10110;
    
    
    int main(void)
    {
    DDRD = (1 << D7);
    PORTD=(1 << D7);
    
    
    MCUCR |= (1 << ISC01) | (1 << ISC11);
    GICR |=  1 << INT1;
    TCNT1 = counter;
    TIMSK |= 1 << TOIE1;
    
    sei();
    
    
    while(1);
    
    
    return 0;
    }
    
    
    
    ISR(INT0_vect)
    {
     counter=61111;
    }
    
    
    
    ISR(TIMER1_OVF_vect)
    {
    
    PORTD &= ~(1 << D7);
    //TCCR1B =0; 
    }
    
    
    ISR(INT1_vect)
    {
    
     PORTD=(0 << D7);
     
     //TCNT1 = counter;
    // TCCR1B |= (1 << CS10);
    }


    Dioda zapala sie ale nie gaśnie a powinna według programu? Prawda
  • #12 12204482
    Tomasz Gumny
    Poziom 28  
    Nie wiem jak LED jest podłączony do wyjścia.
    Większość programu jest zakomentowana, więc tam niewiele się dzieje.
  • #13 12205147
    Tom1988p
    Poziom 16  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Komentarze prawie żywcem brane z dokumentacji atmegi 16:
    atmega16 PL

    PS. na tyle komunikatów a ty nadal wklejasz w znacznik code, gdzie do kodu programu służy syntax. Ładnie koloruje składnie i lepiej idzie czytanie ;)
  • #14 12224531
    lbobby
    Poziom 10  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dobra chłopcy dioda się już ściemnia ale żarówka jak się świeciła tak się świec, mimo że dioda się ściemnia .
    Pomoże ktoś co trzeba zmienić, siedzę od rana i nie mogę wykminić
  • #15 12224878
    Tomasz Gumny
    Poziom 28  
    Może pokażesz schemat?
  • #17 12232670
    Tomasz Gumny
    Poziom 28  
    MOC3041 ma układ załączania w zerze, więc średnio się nadaje do regulacji fazowej.
    Przy 450Ω prąd LED może być za mały do zapalenia optotriaka. Bezpieczne minimum to 15mA, więc proponuję przyjąć 20mA, stąd:
    (5.0V[VCC] - 0.5V[VOL] - 1.5V[VF]) / 20mA = 150Ω
    Poprawka: sterujesz LED stanem wysokim, więc rachunki powinny wyglądać tak:
    (4.5V[VOH] - 1.5V[VF]) / 20mA = 150Ω
    Akurat w tym wypadku rezystancje wychodzą takie same.
  • #18 12236000
    lbobby
    Poziom 10  
    Przperaszam nie wiem czemu ale omylkowo napisalem oczywiscie jest tam MOC3022 bez układu przełączania w zerze.
    Powiedz mi czy w programie jest błąd czy tylko tę rezystancję poprawić ?
REKLAMA