[Bascom][Atmega8] Obrotomierz, Generator PWM i Stroboskop


Witam!

Mam problem z programem do urządzenia, które potrzebuję do szkoły jako pomoc przy doświadczeniu fizycznym. Jego zadaniem jest:

- sterowanie mocą silnika przez PWM oraz regulować jego wartość przez 2 przyciski Pluspwm i Minuspwm,
- liczyć obroty co 1s i przedstawiać je w postaci obr/min. W programie jest Wynik*30 ponieważ chcę użyć elektroniki wentylatora komp.
- generować częstotliwość regulowaną 2 przyciskami Plus i Minus, by stworzyć stroboskop LED o danej f.

Przeglądnąłem wiele tematów dotyczących obrotomierzy, generatorów PWM oraz generatorów częstotliwości. Poskładałem kilka programów w jeden, ale jako że nie jestem biegły w Bascomie bardzo bym prosił o sprawdzenie, ew. modyfikacje i ulepszenia.

'Miernik obrotów, generator PWM, generator częstotliwości na ATMEGA8
 
'||||| Konfiguracja procesora |||||
$crystal = 8000000
$regfile "m8def.dat"
 
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 4
 
'||||| Konfiguracja wej/wyj pinów ||||| Nie jestem pewien czy taki zapis jest poprawny.
Config Portb = &B1111101
Config Portc = &C000000
Config Portd = &D0100000
 
Dim Wynik As Long
Dim Freq As Long
 
'||||| Aliasy |||||
Plus Alias Portc.2
Minus Alias Portc.3
Pluspwm Alias Portc.4
Minuspwm Alias Portc.5
 
'||||| Timery |||||
Config Timer0 = Counter , Edge = Rising
Config Timer1 = Timer , Prescale = 1
Config Timer2 = Timer , Async = On , Prescale = 128
 
Enable Interrupts : Enable Timer1 : On Timer1 Time
Enable Timer2
 
Cursor Off
Cls
 
'||||| Pętla główna |||||
Do
Timer0 = 0
Pwm1a = 0
Start Timer0
Wait 1
Stop Timer0
 
Wynik = Timer0 * 30
 
Cls
Lcd "RPM" ; Wynik
Lowerline
Lcd "f" ; Freq
Thirdline
Lcd "PWM" ; Pwm1a
 
Loop
End
 
 
'||||| Przyciski |||||
If Plus = 1 Then
   Gosub Up
   End If
 
If Minus = 1 Then
   Gosub Down
   End If
 
If Pluspwm = 1 Then
   Gosub Uppwm
   End If
 
If Minuspwm = 1 Then
   Gosub Downpwm
   End If
 
'||||| Koniec przycisków |||||
'||||| Generator częstotliwości |||||
 
Time:
Timer1 = Freq
Toggle Portb.3
Return
 
'||||| Gosuby |||||
 
Up:
Freq = Freq + 1
Return
 
Down:
Freq = Freq - 1
Return
 
Uppwm:
Pwm1a = Pwm1a + 1
Return
 
Downpwm:
Pwm1a = Pwm1a - 1
Return




Portret użytkownika mirley

Re: Program Bascom

Testowałeś ten program w praktyce? bo wydaje mi się, a nawet jestem prawie pewny że to nie ma szans zadziałać. Obsługa przycisków leży poza pętlą główna a program nigdy nie wyjdzie poza pętlę główna. Dodatkowo po co to:

If Plus = 1 Then
   Gosub Up
   End If
 
......

i

Up:
Freq = Freq + 1
Return

nie wystarczyło:

If Plus = 1 Then
   Freq = Freq + 1
End If

To wyżej daremnie zajmuje stos procesora i wprowadza plątaninę w kodzie. jeszcze te 3 timery i ich tryby pracy..... sam nie wiem w jakich trybach działają te wszystkie timery, no może poza klasyczną konfiguracją Timera1.

Do zrealizowania tego zadania wystarczy jeden timer no może dwa działające w klasycznym ustawieniu timera

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Merior

Niee..

Coś lepiej?

'Miernik obrotów, generator PWM, generator częstotliwości na ATMEGA8
 
'||||| Konfiguracja procesora |||||
$crystal = 8000000
$regfile "m8def.dat"
 
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 4
 
'||||| Konfiguracja wej/wyj pinów |||||
Config Portb = &B1111101
Config Portc = &C000000
Config Portd = &D0100000
 
Dim Wynik As Long
Dim Freq As Long
 
'||||| Aliasy Dimy |||||
Plus Alias Portc.2
Minus Alias Portc.3
Swpwm1 Alias Portc.4
Swpwm2 Alias Portc.5
 
'||||| Timery |||||
Config Timer0 = Counter , Edge = Rising                     'Co zmienić w tym?
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       'Timer dwóch PWM
Config Timer2 = Timer , Gate = Internal , Mode = 2          'Ten pewnie nie będzie potrzebny.
 
Enable Interrupts : On Timer1 Strobo
Start Timer2
 
Cursor Off
Cls
 
Pwm1a = 0
Pwm1b = 0
 
'||||| Pętla główna |||||
Do
Timer0 = 0
Start Timer0
Wait 1
Stop Timer0
 
Wynik = Timer0 * 30
 
 
Cls
Lcd "RPM" ; Wynik
Lowerline
Lcd "f" ; Freq
Thirdline
Lcd "PWM 1" ; Pwm1a
Fourthline
Lcd "PWM 2" ; Pwm1b
 
If Plus = 1 Then
   Incr Freq
   End If
 
If Minus = 1 Then
   Decr Freq
   End If
 
If Plus = 1 And Swpwm1 = 1 Then
   Incr Pwm1a
   End If
 
If Minus = 1 And Swpwm1 = 1 Then
   Decr Pwm1a
   End If
 
If Plus = 1 And Swpwm2 = 1 Then
   Incr Pwm1b
   End If
 
If Minus = 1 And Swpwm2 = 1 Then
   Decr Pwm1b
   End If
 
Strobo:
Toggle Portb.3
Load Timer2 , Freq
Return
 
Loop
End

Do kolegi pod spodem: Nie, niestety nie. Naprawdę nie wiem jak to ma być...

Portret użytkownika mordacz222

Przepraszam że się wtrącę ale

Przepraszam że się wtrącę ale czy ten post to nie efekt 1 kwietnia???

Portret użytkownika mirley

Re: program

Na pewno nikt nie robił by sobie jaj pisząc kawał bo wtedy bez pytania poleci konto użytkownika wraz z postem do kasacji: ) Dodatkowo: nie pisze się odpowiedzi na pytanie edytując post wcześniej, takie działanie jest niedozwolone

Próbowałeś to wogóle kompilować? bo juz na początku wyleci mnóstwo błędów:

Config Portb = &B1111101
Config Portc = &C000000
Config Portd = &D0100000

Pierwszy port ok bo wpisujesz do niego liczbę binarną &Bxxxx ale &c lub &d, co to za format liczby? Nie mówiąc już że żaden port nie ma przypisanych wartości początkowych.

po drugie konfiguracja timera prawdopodobnie wklejona z programu dla 2051:

Config Timer2 = Timer , Gate = Internal , Mode = 2  

nie zadziała dla procesora AVR, przynajmniej nigdy nie słyszałem o takich trybach timera

Ściągnij sobie kurs mikroprocesorowej oślej łączki i zacznij od podstaw programów w bascomie, bo tego kodu nie da się poprawić. Trzeba go napisac od początku

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Merior

No cóż. Dziękuję za

No cóż. Dziękuję za wyrozumiałość :)
Pozdrawiam

Portret użytkownika mordacz222

Witam. Pytanie nie na temat

Witam.

Pytanie nie na temat ale to tylko jedno malutkie:
w jakim internetowym sklepie z elektronika mozna dostac atmegi w obudowie plcc i czy w polsce sa w ogole osiagalne?

Portret użytkownika mirley

Re: M8

Nie spotkałem jeszcze w sklepie w takiej obudowie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mordacz222

Szkda ja tez nie widzialem a

Szkda ja tez nie widzialem a tak swoja droga to mogli by sprzedawac można lutowac jak DIP a zajmuje kupe mniej miejsca.

P.S. Zobaczyłem w tme maja atmege8515 ale ceny układów mają niezłe ale czego sie nie da za oszczednosc miejsca na pcb.....