[bascom][atmega8]komnfiguracja pwm...

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
tzok
-
Posty: 5
Rejestracja: 16 lut 2007, 23:15

[bascom][atmega8]komnfiguracja pwm...

Post autor: tzok » 27 sie 2008, 15:43

Nie mogę sobie poradzić z uruchomieniem pwm na atmedze, na tiny2313 mi działa...

Nawet takie coś nie daję żadnego przebiegu na PB1:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 1000000

Config Portb.1 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 64

Do
  Pwm1a = 123
Loop
End
Ostatnio zmieniony 27 sie 2008, 18:35 przez tzok, łącznie zmieniany 1 raz.

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 27 sie 2008, 16:25

Za każdym przebiegiem pętli Do ... Loop wpisujesz wartość która niejako każe licznikowi liczyć "od początku". A może sie mylę? Też mnie to zastanawiało ale nie miałem takiego problemu nigdy. Pewnie fusy masz inaczej ustawione i przebieg pojawia sie ale rzadko. Bo 1MHz i prescale 64 to dość długi okres. Cos koło 0,2 sec. Chyba że 8 bitów jakoś skraca 2^16 do 2^8.

tzok
-
Posty: 5
Rejestracja: 16 lut 2007, 23:15

Post autor: tzok » 27 sie 2008, 18:35

Fusy są ok, jak dam w pętli

Kod: Zaznacz cały

do
   set portb.1
   waitms 5
   reset portb.1
   waitms 5
loop
to działa ok i jest 5ms stan wysoki i 5ms niski.

To, że w pętli wpisuję pwm1a nie powinno mieć znaczenia, to rejestr z którym jest porównywany licznik, chyba że się mylę.

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 27 sie 2008, 20:19

Z rejestrem masz racje. Ale sprawdzałeś czy działa z prescale = 1? W helpie nie ma "prescale = X" przy konfiguracji PWM. Jak nie zadziała to usuń "Compare B Pwm = Disconnect", może to pomoże.

tzok
-
Posty: 5
Rejestracja: 16 lut 2007, 23:15

Post autor: tzok » 27 sie 2008, 20:27

Już sobie poradziłem, działa:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 10000000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
Config Portb = Output

Rev Alias Portb.0
Byp Alias Portb.2

Start Timer1
Start Adc

Dim Pwm As Integer
Dim Inval As Integer

Do
   Inval = Getadc(0) / 4
Waitms 200

If Inval < 16 Then
   Set Rev
   Set Byp
   Pwm = 255
   Pwm1a = Pwm
Elseif Inval < 112 Then
   Set Rev
   Reset Byp
   Pwm = 271 - Inval
   Pwm1a = Pwm
Elseif Inval < 142 Then
   Reset Rev
   Set Byp
   Pwm = 0
   Pwm1a = Pwm
Elseif Inval < 239 Then
   Reset Rev
   Reset Byp
   Pwm = Inval + 16
   Pwm1a = Pwm
Else
   Reset Rev
   Set Byp
   Pwm = 255
   Pwm1a = Pwm
End If
Loop
End

***

Wprowadziłem małe zmiany i prosiłbym o ich optymalizację, bo w tej chwili używam typu Single i funkcji Round, a to nie jest dobry pomysł...

Kod: Zaznacz cały

Elseif Inval < 112 Then
   Set Rev
   Reset Byp
   'Pwm = 271 - Inval
   Pwma = 112 - Inval
   Pwma = Pwma / 96
   Pwma = Pwma * 153
   Pwma = Pwma + 102
   Pwm = Round(pwma)
   Pwm1a = Pwm

(...)

Elseif Inval < 239 Then
   Reset Rev
   Reset Byp
   'Pwm = Inval + 16
   Pwma = Inval - 142
   Pwma = Pwma / 97
   Pwma = Pwma * 153
   Pwma = Pwma + 102
   Pwm = Round(pwma)
   Pwm1a = Pwm
Chodzi o zamianę wartości ADC z zakresu 16...112 na wartości wypełnienia PWM z zakresu 255...102 oraz ADC 142...239 na PWM 102...255. Można sobie też darować dzielenia ADC przez 4 i pozostać przy wartościach 0...1023.

***

Odp. - zamienić kolejność dzielenia i mnożenia i robić wszystko na Integer.

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 28 sie 2008, 14:39

Co do samego PWM - zmieniłeś kolejność konfiguracji "prescale" - zapomniałem o tym napisać - mi też nie działał T1 jak prescale miałem na końcu, nigdzie nie ma mowy o kolejność a jest ważna przy konfiguracji czy to jako Counter, czy jako Timer czy PWM.

ODPOWIEDZ