napisałem program, czy ma szansę 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
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

napisałem program, czy ma szansę działać?

Post autor: matrix » 28 wrz 2009, 19:07

napisałem sobie program, a czekam na programator i zaprogramować procka nie mogę. czy ten program ma szansę działać?

Kod: Zaznacz cały

'              proba ztrobo + odbieranie sygnalu z odbiornika rc

'PD.2 wejscie przerwania INT0
'PD.1 wejscie zworki wyboru
'PB.2 i PB.3 jako strobo na przodzie
'PD.3 i PD.4 jako STOP
'PD.5 i PD.6 jako WSTECZNY

$regfile = "2313DEF.dat"           ' rodzaj proca
$crystal = 4000000
Config Timer0 = timer , Prescale = 64 , Edge = Rising       'Timer0 jako licznik , zbocze narastajace
dim wartosc as Byte
dim licznegacja as Byte
dim wybor as Bit
dim wstecz as Byte
timer0 = 0
Config Portb = 255                 'wszystkie końcówki jako wyjścia
       Portb = &B01111111          'włącz kropki
Config Portd = &B1111001           'INT0 jako wejscie i PD.1 jako wejscie (zworka wyboru)
       Portd = &B1111111           'wszystko wyłaczone
enable INT0
enable INTERRUPTS
on int0 wybor

'===================================================================
'============petla glowna zajmuje sie tylko miganiem diod===========
'===================================================================
Do
    reset PORTB.2                  'migam jedna dioda
      waitms 150
    set PORTB.2
      waitms 250
    reset PORTB.2
      waitms 150
    set PORTB.2


    reset PORTB.3                  'migam druga dioda
      waitms 150
    set PORTB.3
      waitms 250
    reset PORTB.3
      waitms 250
    set PORTB.3
loop


'================================================================
'=====wybieram w zaleznosci od silnika czy zaswiecanie sie=======
'=====odpowiednich funkcji nastepuje przy nacisnieciu drazka=====
'=====w przod czy w tyl==========================================
'================================================================
wybor:                             'wybor odwrotnego podlaczenia
if pind.1 = 0 then                 'lub normalnego
  gosub licznegacja
 else
  gosub licz
  end if
return

'================================================================
'====obsluga  hamulca i wstecznego i odpowiednie reakcje=========
'================================================================
licz:
wstecz = 0
enable timer0                      'wlaczam timer 0
start TIMER0
   do
     if pind.2 = 0 then            'jesli na wejsciu skonczy sie sygnalz odbiornika
      stop TIMER0                  'zatrzymauje timer0
      set portd.2
      exit DO                      'i wychodze z petli
     end if
   loop

  wartosc = tcnt0
if wartosc < 81 then               'jezeli dlugosc impulsu mniejsza niz 1,3ms(jazda w tyl)
   incr WSTECZ
  if wstecz = 1 then               'jesli raz nacisniety hamulec to
     set PORTD.5                   'gasze swiatla WSTECZ
     set PORTD.6
     reset PORTd.3                 'zapalam swiatla STOP
     reset PORTD.4
    else
     set PORTD.3
     set PORTD.4
   end if
   if wstecz = 2 then              'jak dwa razy nacisniety stop to
     set PORTD.3                   'gasze swiatla STOP
     set PORTD.4
     reset PORTD.5                 'zapalam swiatla wstecz
     reset PORTD.6
    else
     set PORTD.5
     set PORTD.6
   end if
end if

if wartosc > 81 then               ' jezeli drazek nie jest naciskany w zadna strone
   if wartosc < 106 then
     set PORTD.3                   'to wylaczam wszystkie diody
     set PORTD.4
     set PORTD.5
     set PORTD.6
   end if
end if


if wartosc > 106 then              'jezeli dlugosc impulsu jest wieksza niz1,7ms(jazda w przod)
   set PORTD.3                     'to wylaczam wszystkie diody
   set PORTD.4
   set PORTD.5
   set PORTD.6
end if
reset timer0
  if wartosc > 106 then
     wstecz = 0
  end if
return

licznegacja:
  enable timer0                    'wlaczam timer 0
  start TIMER0
  do
    if pind.2 = 0 then             'jesli na wejsciu skonczy sie sygnalz odbiornika
     stop TIMER0                   'zatrzymauje timer0
     set portd.2
     exit DO                       'i wychodze z petli
     end if
  loop

  wartosc = tcnt0
if wartosc < 81 then               'jezeli dlugosc impulsu jest wieksza niz1,7ms(jazda w przod)
     set PORTD.3                   'to wylaczam wszystkie diody
     set PORTD.4
     set PORTD.5
     set PORTD.6

end if
if wartosc > 81 then
   if wartosc < 106 then
      set PORTD.3                  'to wylaczam wszystkie diody
      set PORTD.4
      set PORTD.5
      set PORTD.6
   end if
end if

if wartosc > 106 then
   incr WSTECZ
      if wstecz = 1 then           'jesli raz nacisniety hamulec to
        set PORTD.5                'gasze swiatla WSTECZ
        set PORTD.6
        reset PORTd.3              'zapalam swiatla STOP
        reset PORTD.4
       else
        set PORTD.3
        set PORTD.4
      end if
      if wstecz = 2 then           'jak dwa razy nacisniety stop to
         set PORTD.3               'gasze swiatla STOP
         set PORTD.4
         reset PORTD.5             'zapalam swiatla wstecz
         reset PORTD.6
       else
         set PORTD.5
         set PORTD.6
         wstecz = 0
      end if
      reset timer0
end if
    if wartosc < 81 then
       wstecz = 0
    end if

return

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

Post autor: kayron » 28 wrz 2009, 19:24

:lol: Skreśliłem dziś liczby w Lotto. Mam szanse na 40 baniek :?: Dziwny temat jak dla mnie. Ale powiem ci tak. Jak go nie spróbujesz to się nie dowiesz. Zresztą napisz co ten program ma robić :?:

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 28 wrz 2009, 20:39

kayron pisze:Skreśliłem dziś liczby w Lotto. Mam szanse na 40 baniek
masz jak 1:14 000 000.
kayron pisze:Jak go nie spróbujesz to się nie dowiesz
pewnie tak będzie, ale myślałem że ludzie siedzący dłużej niż ja w bascom avr coś o tym powiedzą? w każdym razie ani Syntax check, ani kompilator bascom avr nie zgłaszają żadnych błędów.
kayron pisze:Zresztą napisz co ten program ma robić
porzeznaczeniem tego softu jest odbieranie sygnału z odbiornika RC (modelu samochodu), a raczej pobieranie tegoż sygnału z wyjścia sterującego regulatorem i zaświecanie diod czerwonych czyli świateł STOP podczas hamowania modełu oraz wyłączania STOP a załączania świateł WSTECZ jeśli model śmiga w tył.

główna pętla programu zaświeca na przemian dwie diody, jedna 2x a później druga 2x. jak stroboskopy w samochodach rządowych.

podprogram wybór pozwala na wybranie która z etykiet będzie obsługiwać sprawdzanie długości sygnału z odbiornika RC. potrzebne jest to ponieważ u niektórych naciskanie cyngla gazu w przód to u innych jest to w tył. tak więc jeden hamując zaświecał by sobie światła stop a inny miał by to naciskając gaz, więc wystarczy wsadzić zworkę i po kłopocie.

podprogram licz i jego odpowiednik licznegacja pełnią te same funkcje tylko przy odwrotnej wartości sygnału badanego.

na początku po odebraniu przerwania z wejścia INT0 startuje timer0 i liczę jak długo na wejściu panuje stan wysoki. po zakończeniu stanu wysokiego zatrzymuję ów timer i przypisuję jego wartość do zmiennej wartosc.

dalej to już tylko zwykła prosta matematyka, jeśli długość sygnału jest mniejsza niż określona wartość to zaświecam powiedzmy światła STOP, jeśli mieści się w penych granicach to wyłączam wszystkie diody, a jeśli jest powyżej jakiejś tam granicy i zmienna pomocnicza wstecz posiada określoną wartość, to zaświecam światła WSTECZ.

zmienna pomocnicza o nazwie wstecz musi przyjąć wartość 2 żeby możliwe było zapalenie świateł wstecznych, a to dlatego żę jazda do tyłu w większości regulatorach odbywa się na zasadzie dwukrotnego naciśnięcia cyngla w tył, bo pierwsze naciśnięcie to hamulec.

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

Post autor: Pikczu » 28 wrz 2009, 21:36

Witam wrzuciłem twój program do procka tak z czystej ciekawości ale kicha tylko te dwie diody na przemian zmieniają prędkość migania.
Troszkę przerobiłem żeby na moim procku hulał.
Ostatnio zmieniony 28 wrz 2009, 21:38 przez Pikczu, łącznie zmieniany 1 raz.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 28 wrz 2009, 21:37

Pikczu pisze:ale kicha tylko te dwie diody na przemian zmieniają prędkość migania.
a masz jakis model żeby pobrać sygnał z odbiornika RC?
trzeba podpiąć sygnał.

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

Post autor: Pikczu » 28 wrz 2009, 21:42

Nie mam ale odpaliłem na na atmega 128 servo i biorę dane z adc i sygnał podaje na przewanie w attiny 2313. zresztą mną się nie sugeruj nudziło mi się ale też się nie przyłożyłem do tego.
pozdrawiam pikczu

ODPOWIEDZ