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!
-
Jasam
- Użytkownik
- Posty: 422
- Rejestracja: 27 mar 2007, 21:09
Post
autor: Jasam » 07 mar 2008, 19:26
Kod: Zaznacz cały
$regfile= "attiny26.dat"
$crystal = 4000000
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pina.0 = Output
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Rc5 = Pina.7
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : Enable Interrupts
On Timer0 Przerwanie
Declare Sub Silnikb(byval krokb As Integer , byval Ilekrokowb As Integer)
Do
Wait 1
Silnikb 1 , 10
Wait 1
Silnikb -1 , 10
Loop
Przerwanie:
Return
Sub Silnikb(byval Krokb As Integer , Byval Ilekrokowb As Integer)
Local Numerb As Integer , I As Integer
For I = 0 To Ilekrokowb
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.numerb = 1
Numerb = Numerb + Krokb
If Numerb > 3 Then
Numerb = 0
End If
If Numerb < 0 Then
Numerb = 3
End If
Waitms 200
Next I
End Sub
Chciałem napisać sobie taki programik do sterowania silnikiem krokowym. Kolejne cewki przez bufory są załączane gdy na ktorymś z kolejnych wyjść B.0 do B.3 znajduje się logiczna jedynka. Więc logiczna jedynka powinna się przemieszczac przez kolejne porty w kierunku od b.0 do b.3 (lub przeciwnie- w zależności od wartości zmiennej krokb. jesli wynosi ona 1 to w jedna strone, jesli -1 to w przeciwną), o tyle kroków ile wynosi wartość ilekrokowb. Przerwanie od timera ma slużyć do czegoś innego. Gdzie tutaj jest błąd?
Ostatnio zmieniony 07 mar 2008, 20:33 przez
Jasam, łącznie zmieniany 1 raz.
-
ZbeeGin
Post
autor: ZbeeGin » 07 mar 2008, 20:18
Zmienna lokalna NumerB jest nie zainicowana. Zatem numer bitu jest błędny.
A silnikiem krokowym nie steruje się w ten sposób.
-
Jasam
- Użytkownik
- Posty: 422
- Rejestracja: 27 mar 2007, 21:09
Post
autor: Jasam » 07 mar 2008, 20:26
Gdzie zainicjować tą zmienią żeby było dobrze?
I dlaczego nie tak sterowac tym silnikiem? sprawdzalem już ten sam mechanizm sterowania tylko napisany w inny prymitywniejszy sposob i śmigało aż miło
-
ZbeeGin
Post
autor: ZbeeGin » 07 mar 2008, 20:31
Dopisać na początku:
Kod: Zaznacz cały
$framesize = 32
$swstack = 20
$hwstack = 32
A w procedurze dodać:
Kod: Zaznacz cały
Sub Silnikb(krokb As Integer , Ilekrokowb As Integer)
Local Numerb As Integer , I As Integer
Numerb = 0 '<<<<<<<<
For I = 0 To Ilekrokowb
(...)
Skoro twierdzisz, że taki sposób sterowania jest poprawny...
-
Jasam
- Użytkownik
- Posty: 422
- Rejestracja: 27 mar 2007, 21:09
Post
autor: Jasam » 07 mar 2008, 20:34
Jeśli smiga i to bardzo dobrze z wykorzystaniem sterownika mocy mojego pomysłu to znaczy że działa. Procesor ma dostarczyć tylko odpowiedniej sekwencji sygnałów.
Dzięki.