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

ATmega8 PWM na Timer1: kod działa w symulatorze, brak sygnału na OC1A po wgraniu

_Robak_ 23 Maj 2006 10:15 1899 10
REKLAMA
  • #1 2654606
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Witam. Napisalem posta w dziale mikrokontrolery ale nikt mi nie odpowiedzial wiec prosze teraz Was o pomoc. Otoz mam program w asemblerze do generwania przebiegu przez PWM za pomoca licznika1(16 bit) po uruchomieniu symulatora dziala wszystko i stany na wyjsciu OC1A sie zmieniaja, jednak juz po zgraniu programu do procka stan na pinie sie nie zmienia. Wiec moje pytanie brzmi co jest nie tak w kodzie? Z gory dziekuje za pomoc.

    .include "m8def.inc"

    .org 0x00
    rjmp reset

    RESET:

    ldi R16,low(RAMEND)
    out SPL,R16
    ldi R16,high(RAMEND)
    out SPH, R16

    ldi r16,1<<WGM10|1<<COM1A1
    out TCCR1A,r16
    ldi r16,1<<WGM13|1<<CS10|1<<CS12
    out TCCR1B,r16


    ldi r16,0xA0
    out OCR1AL,r16

    ldi r16,0xFF
    out DDRB,r16


    main:

    rjmp main
  • REKLAMA
  • #2 2666435
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Widze ze nikt nie jest w stanie pomoc:cry:To moze jesli ktos ma to prosilbym kod programu w C albo w asemblerze gdzie jest ustawiony PWM na timerze 1szym. Dziekuje z gory

    Moderowany przez McRancor:

    Nikt nie pomaga, bo dział był niewłaściwy, przeniosłem z Automatyki i Robotyki

  • REKLAMA
  • #3 2667026
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    ldi r16,0xA0 
    out OCR1AL,r16 
    
    ldi r16,0xFF 
    out DDRB,r16 
    
    
    main: 
    
    rjmp main


    problem w tym że zmieniasz te stany tylko raz, potem w pętli nie robisz nic...

    powinno moim zdaneim być

    
    main: 
    
    ldi r16,0xA0 
    out OCR1AL,r16 
    
    ldi r16,0xFF 
    out DDRB,r16 
    
    rjmp main


    edit:

    ups, nie doczytałem że chcesz wykorzystywać timer... więc nie wiem czy moje rozwiązanie problemu jest poprawne, ale na pierwszy rzut oka tak wygląda dziwnie ta pusta pętla... chyba że timer wywołuje przerwanie które chcesz wykorzystać, nie ma jednak nigdzie odniesienia co ma się dziać w przypadku przerwania timera.
  • #4 2667541
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Hmm nie wiem czemu ale nagle zaczelo cos dzialac, jednak nie bardzo to wspolgra z tym co sie dzieje w symulatorze. A petla jest pusta bo jak sie domyslam jesli ustawi sie tryb PWM to procesor sam zamienia stan na pinie.
  • #5 2667613
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    emm... kajam się, mój błąd - jeśli go ładnie poprosić to zmienia sam :-)... wszystko spowodowane tym że PWM w moim wykonaniu robiłem inaczej, sam zmieniałem stan pinów.
  • #6 2668114
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    PWM ustawiasz dosyć prosto dwoma rejestrami:
    
    TCCR0 =0x69; //Tu ustawiasz tryb, preskaler, sposob zliczania - szczegoly w dokumentacji Atmela
    OCR0 = wypelnienie; //Tu wpisujesz wypelenienie np. 128 to wypelnienie 50% (przy liczniku 8-bitowym)


    Ja to tak robie na ATmega16 i dziala bez problemu. Oczywiscie PIN OC0 musi być jako wyjście
  • REKLAMA
  • #7 2668276
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    maly35: To jest pewnie do licznika 8 bitowego, i tu sprawa jest prostsza, niestety ja mam OC2(wyjscie dla licznika 8 bitowego) zajety przez programator i musze skonfigurowac na liczniku 16 bitowy, w ktorym juz trzeba ustawic bity w rejestrach TCCR1A:B, no i ustawilem w symulatorze dziala ok widac ze przy zmianie OCR1AL zmienia sie wypelnienie, niestety nie dziala w rzeczywistosci, dioda mi sie swieci caly czas, nie jest to spowodowane tym ze za szybko mryga poniweaz gdy ustawie COM1A0 to dioda mruga lecz nie da sie zmienic za wypelnienia a tylko predkosc mrugania. Ale najdziwniejsze jest ze w symulatorze dziala to tak jak powinno. Chyba bedzie trzeba przeczytac dokladnie co i jak w dokumentacji:)
  • #8 2668916
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    Na 16-bitowym nie robilem ale poczytaj tutaj o rejestrach:

    www.pg.gda.pl/~zbczaja/pdf/atmega16mmr.pdf

    Co prawda to do Atmega16 ale po polsku

    Dla 16-bitowego zrobilbym to tak:

    COM1A1 >> 1;
    WGM10 >>1;
    WGM12 >>1;

    Preskaler jak chcesz bo nie wiem jaką masz częstotliwość. Wypełenienie podajesz do OCR1A.

    Nie sprawdzałem czy zadziała więc nie ręczę.
  • REKLAMA
  • #9 2675748
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    I jak nie dzialalo tak nie dziala:cry: Nie wiem czy symulator jest nie do konca zgodny z procekiem czy cos innego, wlaczylem fast PWM i powinno byc tylko jedno zobocze narstajace a w symulatorze liczy do gory potem do dolu:| A w rzeczywistosci jak nie mrugala dioda tak nie mruga:|
  • #10 2679085
    elektrofil
    Poziom 18  
    Posty: 505
    Pomógł: 32
    Ocena: 46
    moj problem polegał na tym iz nie ustawiłem OC1A oraz OC1B jako lini wyjsciowych. w symulacji wszystko było ok. a układ nie działał. może u ciebie jest ten sam problem.
  • #11 2679180
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Generalnie to ja juz nie mam pojecia co jest nie tak i juz mnie to irytuje powoli :( A jest tak: PWM, Phase Correct, 8,9,10-bit dziala dobrze w symulatorze i w rzeczywistosci, dioda mryga mozna zmienic wypelnienie, PWM, Phase and Frequency Correct dziala w symulatorze a w rzeczywistosci nie:( tak jak pisalem dioda albo swieci albo nie, w zaleznosci od wybranego zbocza ustwiajacego 1 na pinie. Fast PWM w symulatorze nie liczy od dolu do gory i znowu od dolu tylko tak jak zwykly PWM dol gora dol gora... spedzilem wczoraj(i nie tylko) nad tym kilka ladnych godzin i nie wiem czemu nie dziala:(

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z generowaniem sygnału PWM na wyjściu OC1A mikrokontrolera ATmega8 przy użyciu 16-bitowego Timer1. Kod w asemblerze działa poprawnie w symulatorze, gdzie widać zmiany stanu na pinie, natomiast po wgraniu do rzeczywistego układu sygnał na pinie OC1A nie zmienia się, a dioda świeci ciągle. Użytkownik ustawił rejestry TCCR1A i TCCR1B do trybu PWM, jednak brak efektu w praktyce. Wskazano, że w symulatorze timer może działać inaczej niż w rzeczywistości, a problemem może być nieustawienie pinu OC1A jako wyjścia (DDR). Zwrócono uwagę, że w trybie PWM procesor sam steruje stanem pinu, więc pusta pętla główna jest poprawna. Podkreślono różnice między timerami 8-bitowymi a 16-bitowymi oraz konieczność dokładnego ustawienia bitów trybu pracy i preskalera. Jeden z uczestników zasugerował, że brak konfiguracji pinu OC1A jako wyjścia mógł być przyczyną braku sygnału w rzeczywistym układzie. Autor potwierdził, że tryby PWM Phase Correct działają poprawnie zarówno w symulatorze, jak i na sprzęcie, natomiast tryby Phase and Frequency Correct oraz Fast PWM działają tylko w symulatorze, co może wskazywać na różnice w implementacji lub błędy w konfiguracji.
Wygenerowane przez model językowy.
REKLAMA