Dziwny problem z bascomem (PWM)

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
ODPOWIEDZ
Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Dziwny problem z bascomem (PWM)

Post autor: Spanner » 07 lip 2011, 18:24

Witam. Miałem parę problemów z bascomem ostatecznie działa ten program

Kod: Zaznacz cały

$regfile = "attiny2313.dat"
$crystal = 4000000       

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
                              '8-bitowy przetwornik PWM - liczy 0...255
Portd = &B11             'podciągając wejscia PD.0, PD.1 umożliwiamy pracę przycisków S1, S2
'ale powyższa linia jest niepotrzebna, jeśli są połączone kołki zwór J4, J5

Pwm1a = 255              'początkowa wartość rejestru Pwm1a - maksimum

Do                       'pętla nieskończona
If Pind.0 = 0 Then Decr Pwm1a       'S1 zmniejsza zawartość rejestru Pwm1a (=OCR1)
If Pind.1 = 0 Then Incr Pwm1a       'S2 zwiększa zawartość rejestru Pwm1a (=OCR1)
'ponieważ rejestr PWM1a (=OCR1) jest 10-bitowy (0...1023),
'a my tu mamy PWM 8-bitowy, więc powinniśmy skracać jego cykl zliczania:
If Pwm1a = 256 Then Pwm1a = 0       ' przy zliczaniu w górę po 255 będzie 0
If Pwm1a = 1023 Then Pwm1a = 255       ' przy zliczaniu w dół po 0 będzie 255
Cls : Lcd Pwm1a : Lowerline : Lcd Timer1       'jak poprzednio
Waitms 20                ' 20ms opóźnienia - średnia szybkość zmian przy naciskaniu S1, S2
Loop : End

Nie mam podłączonego wyświetlacza LCD już wyjaśniam dlaczego:
Opisany program przestaje zupełnie działać po usunięciu tej linii

Kod: Zaznacz cały

Cls : Lcd Pwm1a : Lowerline : Lcd Timer1       'jak poprzednio
nie potrafię logicznie pojąć jak to możliwe ?

Drugie pytanie
Jeśli rozdzielczość pwm wynosi 8, to dlaczego widnieje zapis

Kod: Zaznacz cały

If Pwm1a = 1023 Then Pwm1a = 255       ' przy zliczaniu w dół po 0 będzie 255

Bardzo proszę o odpowiedź ponieważ mam z tym problem.
dziękuję pozdrawiam
spanner

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 07 lip 2011, 20:10

If Pwm1a = 1023 Then Pwm1a = 255 ' przy zliczaniu w dół po 0 będzie 255
To akurat jest proste do rozszyfrowania, jeżeli PMW ma max rozdzielczość 10 bitów to wartość max wynosi właśnie 1023 i licznik licząc w dół po przejściu przez zero wskoczy właśnie na liczbę 1023.
Aczkolwiek nie wiem co BASCOM definiuje przez Pwm1a (penie to jakiś wewnętrzny alias), bo defakto nie ma takiego rejestru w procesorze 2313, jest OCR1AH + OCR1AL oraz OCR1BH + OCR1BL.
JA jednak osobiście nigdy w BASCOM nie używam funkcji Config Timer, a to dla tego że kompilator ten był pisany w czasach pierwszych AVRów serii AT90Sxxxx i na nowszych CPU często pojawiają sie niespodzianki z działaniem (wynikające często z niekompatybilności rejestrów SFR), lepiej to robić jak w C, czyli bezpośrednio operować sobie na rejestrach.[/code]

Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Post autor: Spanner » 08 lip 2011, 7:52

Dzięki za odpowiedź. Rozmawiałem na ten tematz PIkczu, i okazało się że bascom, gdy mamy polecenie o lcd to sam ustawia portb jako wyjście, a pwm tego nie robi.
pozdro
spanner

keruseykaryu

Post autor: keruseykaryu » 08 lip 2011, 17:06

Spanner pisze:gdy mamy polecenie o lcd to sam ustawia portb jako wyjście, a pwm tego nie robi.
Bzdura. Jak poinstruujesz kompilator, że lcd będzie gdzieś indziej to ustawi te piny które wykorzysta. Config timer z opcją Compare Pwm sam też ustawi wyjścia OC. Czytać dokumentacje!

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 08 lip 2011, 18:27

keruseykaryu pisze:Jak poinstruujesz kompilator, że lcd będzie gdzieś indziej to ustawi te piny które wykorzysta.
No racja prawdę Pan piszesz ale tu nie o to chodziło
Sęk w tym że po usunięciu tej linii kodu :

Kod: Zaznacz cały

Cls : Lcd Pwm1a : Lowerline : Lcd Timer1       'jak poprzednio 
Program mu przestawał działać do momentu aż skonfigurował nogę portb.3 jako wyjście
Więc powinno ustawić ale tego nie robiło.

keruseykaryu

Post autor: keruseykaryu » 08 lip 2011, 19:04

Program mu przestawał działać do momentu aż skonfigurował nogę portb.3 jako wyjście
Więc powinno ustawić ale tego nie robiło.
Ludziska! Nauczcie się, że jak jes coś do skonfigurowania w programie to się to konfiguruje. W programie brakuje Config lcdpin i potem nie dziwota, że jakieś kwiatki wychodzą. Sobie zobaczcie jak domyślnie jest lcd ustawiony: Enable jako PB3!

Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Post autor: Spanner » 08 lip 2011, 19:19

Porty były zmienione enable pb.3 na pb.1. reszta bez zmian. ja tylko chciałem przerobić ten problam, jednak nie działał wiec żeby zobaczyć co schrzaniłem to usuwałem niepotrzebne linie. Problem juz rozwiazałem i dziekuję za pomoc
pozdrawiam
spanner

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 08 lip 2011, 19:43

Wiem widziałem i P. Górecki w książce pisze że do ćwiczenia 26 trzeba zmienić ustawienia LCD w opcjach.

keruseykaryu, Ja wiem że trzeba konfigurować ale popatrz na to że On dopiero zaczyna i kopiuje przykłady z książki.
I zadaje pytanie dlaczego mu nie działa a usuął tylko linie kodu o lcd.

Zrobiłem mały test dla sprawdzenia na podstawie cwiczenia nr 26.
Według tego co pisze help:
"Using COMPARE A, COMPARE B, COMPARE A PWM or COMPARE B PWM will set the corresponding pin for output. When this is not wanted you can use the alternative NO_OUTPUT version that will not alter the output pin.


For example : COMPARE A NO_OUTPUT , COMPARE A PWM NO_OUTPUT"


i tego co pisałeś wyżejkeruseykaryu,
keruseykaryu pisze:Config timer z opcją Compare Pwm sam też ustawi wyjścia OC. Czytać dokumentacje!
Wiec tak do pisałem do kodu że jeśli portb.3 będzie ustawiony jako wyjście to pojawi sie stan wysoki na portb.7
Zrobiłem dwa testy: pierwszy z samym config timer bez ustawienia ręcznego portb.3 jako wyjście

Kod: Zaznacz cały

'$sim
$regfile = "attiny2313.dat"
$crystal = 4000000

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
Config Portd.7 = Output
Portb.7 = 0



'Config Portb.3 = Output

Portd = &B11
Pwm1a = 255

Do
If Ddrb.3 = 1 Then
Portb.7 = 1
Else
Portb.7 = 0
End If
If Pind.0 = 0 Then Decr Pwm1a
If Pind.1 = 0 Then Incr Pwm1a

If Pwm1a = 256 Then Pwm1a = 0
If Pwm1a = 1023 Then Pwm1a = 255

Waitms 20
Loop
End
I dupa zbita nie ustawia a help mówi że ustawia zresztą nawet w symulatorze widać.

Za to dodanie config portb.3=output
rozwiązuje sprawę efekt jest widoczny dioda zmienia jasność i
co tez widać poprzez wystawienie stanu wysokiego na portb.7

Kod: Zaznacz cały

'26a
'$sim
$regfile = "attiny2313.dat"
$crystal = 4000000

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
Config Portd.7 = Output
Portb.7 = 0



Config Portb.3 = Output

Portd = &B11
Pwm1a = 255

Do
If Ddrb.3 = 1 Then
Portb.7 = 1
Else
Portb.7 = 0
End If
If Pind.0 = 0 Then Decr Pwm1a
If Pind.1 = 0 Then Incr Pwm1a

If Pwm1a = 256 Then Pwm1a = 0
If Pwm1a = 1023 Then Pwm1a = 255

Waitms 20
Loop
End
Pozdrawiam
Załączniki
sym 1.jpg
symulacja pierwsza bez
config portb.3=output
sym2.jpg
symulacja druga z
config portb.3=output

keruseykaryu

Post autor: keruseykaryu » 09 lip 2011, 9:30

Błąd jest przy tiny2313, tiny2313a i tiny4313. Przy normalnym 90s2313 port jest ustawiany razem z config timer. Pliki z danymi pewnie maja byka.
Zgłosić do wsparcia, że jest błąd.

ODPOWIEDZ