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.

AVRStudio PonyProg i ATmega32

16 Paź 2006 13:42 1321 5
  • Poziom 14  
    Witam.
    Mam zestaw opisany jak w temacie.
    Programator STK200.
    Pojawił mi się problem który nawet trudno wytłumaczyć.
    Próbowałem juz nawet z drugim ATmegą i tak samo się dzieje.
    Nadmienię że do układu dołączam oscyloskop Hamega - sprawny i dokładny.
    Napisałem program z wykorzystaniem Timera T0 - odmierza zadany czas i zapala diodę po czym przy następnym przerwaniu gasi ją i tak w kółko.
    Sprawdzam na oscyloskopie czas się zgadza.
    Program umieszczony w swiom folderze T0
    Dokonuję zmiany czasu (zmieniam tylko TCCR0) wgrywam program i czas się nie zmienia a dobieram skrajne wartości ( 00 lub ff).
    Piszę kolejny program i umieaszczam w folderze T1 teraz wykorzystuje T1 do odmierzenia czasu.
    Wgrywam i działa.
    Czas się zgadza.
    Dokonuje zmiany czasu w programie z Timerem 1 i ponownie wgrywam i działa ale na starym czasie.
    Co jest nie tak.
    Czasem zadziała jak prescaler zmienię.
    Pomocy!!!!!!!!!!!!!!!!!!
    Grzegorz.
  • Poziom 39  
    grzesio14 napisał:
    ...Pojawił mi się problem który nawet trudno wytłumaczyć.

    Faktycznie trudno , bo z tego co napisłeś , niewiele można wywnioskować :(
    grzesio14 napisał:
    ...Napisałem program z wykorzystaniem Timera T0 - odmierza zadany czas i zapala diodę po czym przy następnym przerwaniu gasi ją i tak w kółko.

    Może zdradź tajemnicę i napisz , w którym trybie pracuje T0.
    grzesio14 napisał:

    Dokonuję zmiany czasu (zmieniam tylko TCCR0) wgrywam program i czas się nie zmienia a dobieram skrajne wartości ( 00 lub ff).

    Czy ty napewno wiesz , do czego służy rejestr TCCR0 :?: Może masz na myśli TCNT0 :?:
    grzesio14 napisał:

    Czasem zadziała jak prescaler zmienię...

    Między innymi , to właśnie bity sterujące podziałem preskalera , znajdują się w TCCR0.
    Moja propozycja brzmi:
    Napisz dokładnie z czym masz problem , w jakim języku jest Twój kod , załącz jakieś urywki kodu , lub nawet cały kod , a wtedy napewno uzyskasz pomoc :D

    Piotrek
  • Poziom 14  
    Faktycznie zapomniałem dodać kilku rzeczy.
    Pomyłka z rejestrem - wipsałem rejestr z 2313.
    Chciałem zobaczyć czy dobrze wpisuje wartości do rejestrów (TCNT1H i TCNT1L dla T1 i TCNT0 dla T0) - czy odmierzany czas zgadza się z czasem który zadałem.
    Napisałem prosty program który jeśli nadejdzie przerwanie od przepełnienia timera zmienia stan na wyjściu portu - efektem jest świecenie lub nie diody na wyjściu PD.0.
    Timer jest w wykorzystywany tylko do odmierzenia zadanego czasu
    poniżej umieszczam konfigurację timerów:


    T0;
    .include "m32def.inc"
    .def Temp = R16
    .org 0x00
    rjmp reset
    .org 0x016
    rjmp Timer0

    Reset:
    ldi Temp, 0x66
    out TCNT0, Temp
    ldi Temp,0x03
    out TCCR0,Temp
    ldi Temp,0x00
    out TIFR,Temp
    ldi Temp,0x01
    out TIMSK,Temp
    sei przerwań
    ldi Temp, LOW(RAMEND) ;inicjacja stosu
    out SPL, Temp
    ldi Temp, HIGH(RAMEND)
    out SPH, Temp
    ldi Temp,0xff
    out DDRD,Temp
    Petla:
    rjmp Petla ;pusta pętla

    Timer0:
    ldi Temp,0x01
    out TIFR,Temp
    brbc 1,Ustaw
    brbs 1,Zeruj
    Ustaw:
    bset 1
    sbi PORTD,0
    rjmp Wyjdz
    Zeruj:
    bclr 1
    cbi PORTD,0
    Wyjdz:
    reti


    po skąpilowaniu, wyczyszczeniu i wgraniu programu do mikrokontrolera czas między przerwaniami wynosi 2,05 ms a powinien 1,23 ms.
    fuse bity ustawione poprawnie CKSEL 3..0 na 1110 (kwarc 8 MHz).


    ale główny problem nie leży w tym.

    Zmieniam teraz czas wpisuje 11H
    i efekt jest taki że czas się nie zmienia, nadal oscyloskop pokazuje taki sam czas sygnału.
    Teraz zmieniam prescaler na 4
    i zmienił się czas ale nie jest taki jak trzeba - powinien być 7,64 ms a jest 8,2 ms ( jest jakbym wpisał 00h)
    teraz zmiana czasu również nie daje efektu.

    Podobne rzeczy dzieją się przy T1.
    Próbowałem resetu komputera, zamknięcia i otwarcia ponyproga2000 za każdym wgraniem programu. Odłączeniem zasilania od mikrokontrolera przed każdym wpisaniem programu.
    Nic nie działa. Co to może być???????
    Grzegorz.
    Jeśli jeszcze macie jakieś niejasności piszcie bo nie wiem co się dzieje.
  • Poziom 32  
    W obsłudze przerwania nie musisz kasować flagi, to robione jest sprzętowo. A przeciwnie może spowodować wygenerowanie kolejnego przerwania. Zmień i daj znać.
  • Poziom 39  
    No , to teraz wszystko jasne - nie do końca rozumiesz zasadę działania liczników/timerów :(
    To , o co Ci chodzi , w przybliżeniu powinno wyglądać:
    Code:

    .include "m32def.inc"
    .def Temp = R16
    .def Temp1 = R17
    .equ   T0_VALUE = 0x66
    .equ   BITNUMBER =   PD0
    .org 0x00
    rjmp reset
    .org 0x016
    rjmp Timer0

    Reset:
    cli
    ldi Temp, LOW(RAMEND) ;inicjacja stosu
    out SPL, Temp
    ldi Temp, HIGH(RAMEND)
    out SPH, Temp
    ;------
    ldi Temp,0xff
    out DDRD,Temp
    ;------
    ldi Temp,T0_VALUE
    out TCNT0, Temp
    ldi Temp,(1<<TOIE0)
    out TIMSK,Temp
    ldi Temp,(1<<CS00 | 1<<CS01) ; FCPU/64
    sei
    out TCCR0,Temp
    Petla:
    rjmp Petla ;pusta pętla

    Timer0:
    ldi   Temp,T0_VALUE
    out   TCNT0,Temp
    ldi   Temp1,(1<<BITNUMBER)
    in      Temp,PORTD
    eor   Temp,Temp1
    out   PORTD,Temp
    reti

    Poza tym , naucz się używać symboli , a nie "suchych" liczb.Np zamiast zapisu CBI PORTD,1 , bardziej zrozumiale wygląda zapis CBI PORTD,PD1 , a szczególnie dla kogoś , kto patrzy na kod czyjegoś autorstwa.Makr typu bset,bclr,sbr,cbr , też nie używam , bo wolę "prawdziwe" instrukcje , a nie jakieś zamienniki oferowane przez kompilator. Ale to tylko tak na marginesie :D

    Piotrek
  • Poziom 14  
    Po wpisaniu kodu do mikrokontrolera program działa - DZIĘKI Zumek!!!!!
    Co się jeszcze okazuje działa nawet po zmianie czasu
    wszystko jest Ok :D
    Dzięki za pomoc.
    Temat uważam za zamknięty.