Problem z impulsatorem - wiesza sie a działa

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
Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Problem z impulsatorem - wiesza sie a działa

Post autor: Skrzydlaty » 31 sie 2008, 15:24

Witam! Robie modyfikacje układu AVT 5083. Puki co testowo, główna modyfikacja to cześć mikroprocesorowa - na jakimś AVR'ku. Reszta bez zmian.
Regulacja na impulsatorze obrotowym. Wszystko działa po właczeniu zasilania ale po dłuższej lub krótszej chwili wartość "Licznik" przestaje sie zmieniać mimo iż wyżej widać że procek przyjmuje impulsy i zmieniają sie na 2 pinach zera i jedynki. I nie wiem co jest grane - tak poprostu żeby przestawało liczyć :neutral:
Procek Mega8515, dolne linijki tj. 5 i 6 wyświetlają wartości przyjmowane od procka mega8535. Przy "zawieszeniu" 5 linijka także przestaje odpowiadać mimo iż w 6 widać zmiany wartości poszczególnych bitów. Wydaje mi sie że właśnie ta cześć odpowiada za zawieszanie się - to odbieranie wartości z innego procka. Wartość "$crystal" podniesiona żeby przy pracy procka sobie troche obniżył prędkość pracy bo wyświetlac graficzny nie wyrabia i pojawiają sie kropeczki i paseczki (jest na to jakaś rada?). Co do samego impulsatora - ma ktoś może jakiś niezawodny kod żeby nie przepuszczało impulsów przy szybszych obrotach? Zmiany opóźniania mają swoje zalety i wady które i tak prowadzą do nieprawidłowego zliczania w różnych sytuacjach. Kombinacja z przerwaniami daje jeszcze dziwniejsze efekty :neutral:
Kod dla mega8515:

Kod: Zaznacz cały

$regfile = "8515def.dat"
$crystal = 20000000
$lib "glcdKS108.lib"
$include "font8x8.font"

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 6 , Ce2 = 7 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 1 , Mode = 8       ' , Mode = 6
Cls

Config Int0 = Falling
Config Portd.5 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Portd = Output
Config Porta = Input
Config Portb.3 = Input
Config Portb.4 = Input
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Down

Portb.0 = 1
Portb.2 = 1

Dim A As Bit , B As Bit , A_ As Bit , B_ As Bit , E As Bit , F As Bit , G As Bit , H As Bit
Dim Licznik As Integer
Dim Napiecie As Single
Dim Licznik_wys As Byte
Dim Prad As Word
Dim Prad_ As Word

Enable Interrupts
Enable Timer1
Start Timer1
Enable Timer0
Start Timer0
On Timer0 Wyswietlanie
Setfont Font8x8

Do
A = Pinb.0
B = Pinb.2
If A_ = 1 And B_ = 0 Then

 If A = 0 And B = 0 Then
 Licznik = Licznik + 10                                     ' Incr Licznik
 End If
 If A = 1 And B = 1 Then
  Licznik = Licznik - 10                                    'Decr Licznik
 End If

End If

Pwm1a = Licznik
Waitms 4
A_ = A
B_ = B
Napiecie = 0.0048828 * Licznik

Prad = Pina
If Pinb.3 = 1 Then
 Prad = Prad + 256
End If
If Pinb.4 = 1 Then
 Prad = Prad + 512
End If
Prad_ = Prad
Prad = 0

Loop

Wyswietlanie:
Incr Licznik_wys
If Licznik_wys = 2 Then
 Licznik_wys = 0
 Cls
 Lcdat 1 , 1 , Pinb.0
 Lcdat 2 , 1 , Pinb.2
 Lcdat 3 , 1 , Licznik
 Lcdat 4 , 1 , Napiecie
 Lcdat 5 , 1 , Prad_

 Lcdat 6 , 1 , Pina.0
 Lcdat 6 , 9 , Pina.1
 Lcdat 6 , 17 , Pina.2
 Lcdat 6 , 25 , Pina.3
 Lcdat 6 , 33 , Pina.4
 Lcdat 6 , 41 , Pina.5
 Lcdat 6 , 49 , Pina.6
 Lcdat 6 , 57 , Pina.7
 Lcdat 6 , 65 , Pinb.3
 Lcdat 6 , 73 , Pinb.4

End If
Return
I dodatkowo kod dla mega8535:

Kod: Zaznacz cały

$regfile = "8535def.dat"
$crystal = 16000000


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Prad As Word
Config Porta.0 = Input
Config Portc = Output
Config Portd = Output
Dim Prad_l(2) As Byte
Do
Prad = Getadc(0)
'Prad = 1023

Portc = Prad
Shift Prad , Right , 8
Portd = Prad
Waitms 1
Loop

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 31 sie 2008, 15:32

Nie bardzo znam się na bascomie, ale czemu nie zrobisz zliczania na zbocze? Bo chyba robisz poziomem zliczanie impulsów. Poza tym jaką masz częstotliwość impulsów przy prędkości dla której zaczyna się gubić? Może po prostu przekraczasz warunek fclk/2 ? Ja bym na twoim miejscu robił sprzętowo a nie programowo. Podepnij do wejścia licznikowego i zliczaj impulsy.

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

Post autor: Skrzydlaty » 31 sie 2008, 15:58

Tylko że to ma dwa wyjścia, kod zależny do kierunku kręcenia. Reakcja na poziomy bo ze zboczami i przerwaniami wychodziły dziwne rzeczy :neutral: fclk/2 nie przekroczona bo aż tak szybko sie nie da nadgarstkiem przekręcic. 12 impulsów na obrót, w każdym:
Prawo:
00
01
11
Lewo:
00
11
01
A może to wina impulsatora? Kupiłem go na giełdzie po 3zł a w sklepie kosztują 12zł. Przy szybkim kręceniu też zauważa sie jakby przeskok w przeciwną strone;|
Ale jak narazie to najważniejsze jest zawieszanie sie zliczania po pewnym czasie od wałczenia zasilania.

ODPOWIEDZ