Problem ze sterowaniem serwem [BASCOM]

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
Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Problem ze sterowaniem serwem [BASCOM]

Post autor: Spanner » 18 lis 2011, 19:46

Witam. Próbuję uruchomić serwo modelarskie SG91R, jednak zatrzymałem się na etapie pisania programu. Serwem musi sterować attiny13 (mam już gotową płytkę do układu). Jednak gdy próbuję skompilować program wywala dwa błędy:
132 : TIMER0 reload could not be calculated [ 0]
46 : Assignment error [reload: 0 10: 112]

Nie wiem dlaczego tak się dzieje. Ma to pracować na wewnętrznym oscylatorze 9,6MHz.

Oto kod programu:

Kod: Zaznacz cały

$regfile "attiny13.dat"
$crystal = 9600000

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input

Config Servos = 1 , Servo1 = Portb.0
Reload = 10
Enable Interrupts

Do
If Pinb.2 = 0 Then
Servo1 = 170
End If
loop
Poprawiłem parę błędów, jednak nie stacza ramu. Jak zwiększyć jego zakres?

Kod: Zaznacz cały

$regfile "attiny13.dat"
$crystal = 9600000

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input

Config Servos = 1 , Servo1 = Portb.0 , Reload = 10

Enable Interrupts

Do
If Pinb.2 = 0 Then
Servo(1) = 100
End If
Loop


Pozdrawiam Spanner

Awatar użytkownika
tom5555
Użytkownik
Posty: 625
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 19 lis 2011, 1:44

Zmniejsz ilość ramu przeznaczoną na stos poleceniem $hwstack, np:

Kod: Zaznacz cały

$hwstack = 24

Awatar użytkownika
kris74
Użytkownik
Posty: 270
Rejestracja: 16 sie 2006, 17:36
Lokalizacja: Gorzów Wielkopolski

Post autor: kris74 » 19 lis 2011, 10:35

Dokładnie powinno być tak :

Kod: Zaznacz cały

$hwstack = 32
$swstack = 18
$framesize = 8

keruseykaryu

Post autor: keruseykaryu » 19 lis 2011, 10:56

Spanner pisze:Poprawiłem parę błędów, jednak nie stacza ramu. Jak zwiększyć jego zakres?
Weź zmień tego staruszka Tiny13 na Tiny25 albo Tiny45.
tom5555 pisze:Zmniejsz ilość ramu przeznaczoną na stos poleceniem $hwstack
24 bajty? Nie starczy mu stosu na przerwania. Przecie BASCOM wali cały zestaw rejestrów na stos, a tych jest 32. Nawet jakby coś się wreszcie zmieniło to i tak by mu brakło bo gdzieś jeszcze program coś pewnie odłoży.
kris74 pisze:Dokładnie powinno być tak :
Kod:
$hwstack = 32
$swstack = 18
$framesize = 8
Suby ma? Nie ma. To po co te 18 na ten udziwniony stos?

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

Post autor: Spanner » 19 lis 2011, 11:37

Witam, pojawił się problem. W jednej pozycji serwo normalnie zatrzymuje się, natomiast tak jakby nie może się zatrzymać w drugą stronę stoi na blokadzie i drga. Zmiany liczb nie przynoszą efektów. Czy wie ktoś czym to jest spowodowane? Do portb.1 jest kontrolka, dal sprawdzenia czy dobrze zmienia się stan zmiennej.

Kod: Zaznacz cały

$regfile "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input
Set Portb.2
Set Portb.3
Set Portb.4
Dim A As Bit
Dim B As Bit
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10

Enable Interrupts

Do
If Pinb.2 = 0 Then
If A = 1 Then
Toggle B
A = 0
End If
Else
A = 1
End If

If B = 1 Then
Servo(1) = 120
Portb.1 = 1
End If
If B = 0 Then
Servo(1) = 100
Portb.0 = 0
End If
Loop

keruseykaryu

Post autor: keruseykaryu » 19 lis 2011, 12:16

Spanner pisze:W jednej pozycji serwo normalnie zatrzymuje się, natomiast tak jakby nie może się zatrzymać w drugą stronę stoi na blokadzie i drga.
Oscyloskop by się przydał i wtedy by szło zobaczyć.

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

Post autor: Spanner » 19 lis 2011, 12:55

Znalazłem swój błąd. Przez pomyłkę wpisałem zły port przy drugiej instrukcji, i był podawany stan wysoki na serwo. Teraz wszystko gra.
Pozdrawiam
Spanner

ODPOWIEDZ