Skocz do zawartości

Pomocna odpowiedź

Już sam do tego doszedłem, ale znowu niby program działa, ale nie działa:

'--------------Definicja--------------'


$regfile = "m32def.DAT"
$crystal = 8000000


'----------------Porty----------------'



'-----------Diody-----------'
Config Porta.7 = Output
Config Porta.6 = Output
Config Porta.5 = Output
Config Porta.4 = Output


'-----------Sharp-----------'
Config Pina.3 = Input
Config Pina.0 = Input

Config Pinb.4 = Input
Config Pinb.3 = Input
Config Pinb.2 = Input


'-----------Ktiry-----------'
Config Pina.2 = Input
Config Pina.1 = Input


'----------Switchs----------'
Config Pinb.0 = Input
Config Pinb.1 = Input



'---------------Alias'y---------------'



'-----------Diody-----------'
Dioda1 Alias Porta.4
Dioda2 Alias Porta.5
Dioda3 Alias Porta.6
Dioda4 Alias Porta.7


'-----------Sharp-----------'
Sharpp2 Alias Pina.3
Sharpp1 Alias Pina.0

Sharp1 Alias Pinb.3

Sharpl1 Alias Pinb.2
Sharpl2 Alias Pinb.4

'-----------Ktiry-----------'
Ktirp Alias Pina.2
Ktirl Alias Pina.1


'----------Switchs----------'
Switch1 Alias Pinb.0
Switch2 Alias Pinb.1



'---------------Zmienna---------------'

Dim A As Byte
Dim Wart_ac As Byte


Const Granica = 200

  Config Adc = Single , Prescaler = Auto , Reference = Avcc


'---------------Program---------------'

  Start Adc
Do

  If A = 0 Then
  Dioda1 = 1
  Dioda2 = 1
  Dioda3 = 1
  Dioda4 = 1
  End If

  If A = 1 Then
  Dioda1 = 0
  Dioda2 = 1
  Dioda3 = 1
  Dioda4 = 1
  End If

  If A = 2 Then
  Dioda1 = 1
  Dioda2 = 0
  Dioda3 = 1
  Dioda4 = 1
  End If

  If A = 3 Then
  Dioda1 = 1
  Dioda2 = 1
  Dioda3 = 0
  Dioda4 = 1
  End If

  If A = 4 Then
  Dioda1 = 1
  Dioda2 = 1
  Dioda3 = 1
  Dioda4 = 0
  End If


  If Switch1 = 0 Then
  A = A + 1
  End If

  Waitms 10

  If A = 1 And Switch2 = 0 Then
  Gosub F1
  End If


  If A = 5 Then
  A = 0
  End If

Loop

End


'---------------Podprogramy---------------'



'------------------Walki------------------'


'-----------------F1-----------------'

F1:

  Do
     Dioda1 = 0
     Dioda2 = 1
     Dioda3 = 1
     Dioda4 = 1

     Wart_ac = Getadc(1)

     If Ktirl > Granica Then
     Gosub Fight1
     End If

     Wart_ac = Getadc(2)

     If Ktirp > Granica Then
     Gosub Fight2
     End If

     If Ktirl > Granica And Ktirp > Granica Then
     Gosub Fight3
     End If




     'Program walki

  Loop

Return




'---------------Fight1---------------'
Fight1:
  Do

     Dioda2 = 0

  Loop Until Ktirl < Granica Or Ktirp > Granica
Dioda2 = 1
Return


'---------------Fight2---------------'
Fight2:
  Do

     Dioda3 = 0

  Loop Until Ktirp < Granica Or Ktirl > Granica
Dioda3 = 1
Return



'---------------Fight3---------------'
Fight3:
  Do

     Dioda4 = 0

  Loop Until Ktirp < Granica Or Ktirl < Granica
Dioda4 = 1
Return

Bo gdy na pinach od LEDów powinno być jeden jest zero więc się świecą, a gdy powinno być zero jest 'bardziej zero' i mocniej się świecą, a gdy czujniki widzą białą linię nie świecą się.

zrób prostszy program na początek...

do

a=getadc(1)

b=getadc(2)

if a

dioda1=1

else

dioda1=0

end if

if b

dioda2=1

else

dioda2=0

end if

loop

jak już okiełznasz czujniki przez adc to dopiero podziel to sobie na podprogramy itd.

A i B to zmienne, którym przypisywany jest odczyt z ADC... i to był bardziej pseudokod, niż wersja do wklejenia 🙂 Ale chyba problemu z tym nie ma do napisania w Bascomie ?

Masz mój program testowy do czujników

$regfile = "m8def.dat"
$crystal = 1000000

'/'/'/'/'/'/'/'Konfiguracja ADC'/'/'/'/'/'/'/'
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja ADC

'/'/'/'/'/'/'/'Deklaracje zmiennych'/'/'/'/'/'/'/'
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word
Dim E As Word


'/'/'/'/'/'/'/'Granica reagowania na biala linie'/'/'/'/'/'/'/'
Const Granica = 500






Config Portd.5 = Output
Dioda3 Alias Portd.5

Config Portd.1 = Output
Dioda1 Alias Portd.1

Config Portd.2 = Output
Dioda2 Alias Portd.2


Do





A = Getadc(4)
B = Getadc(3)
C = Getadc(2)
D = Getadc(1)
E = Getadc(0)


Dioda1 = 1
Dioda2 = 1
Dioda3 = 1


If A < Granica Or E < Granica Then Dioda1 = 0
If B < Granica Or D < Granica Then Dioda2 = 0
If C < Granica Then Dioda3 = 0









Loop
End

procek i taktowanie musisz wybrać pod swój układ. To samo z nóżkami ADC ( ja akurat wykorzystałem prawie wszystkie). No i zmień też nóżki od diod.

Ja powiem tak, niestety z doświadczenia wiem, że Aliasy nie działają prawidłowo. Jeśli nadasz jakiemuś pinowi Alias i później wymusisz na nim jakiś stan przez nazwę aliasa to nie zawsze to zadziała. Wiem, że Aliasy są bardziej przejrzyste niż nazwy portów/pinów, ale według mnie nie powinno się ich używać.

Podczas tego jak pisaliście wymyśliłem to i to działa, ale nie wiem czemu diody się słabo świecą:

'--------------Definicja--------------'


$regfile = "m32def.DAT"
$crystal = 8000000


'----------------Porty----------------'



'-----------Diody-----------'
Config Porta.7 = Output
Config Porta.6 = Output
Config Porta.5 = Output
Config Porta.4 = Output


'-----------Ktiry-----------'
Config Pina.2 = Input
Config Pina.1 = Input


'----------Switchs----------'
Config Pinb.0 = Input
Config Pinb.1 = Input



'---------------Alias'y---------------'



'-----------Diody-----------'
Dioda1 Alias Porta.4
Dioda2 Alias Porta.5
Dioda3 Alias Porta.6
Dioda4 Alias Porta.7


'-----------Ktiry-----------'
Ktirp Alias Pina.1
Ktirl Alias Pina.2


'----------Switchs----------'
Switch1 Alias Pinb.0
Switch2 Alias Pinb.1



'---------------Zmienna---------------'

Dim A As Word
Dim B As Word


Config Adc = Single , Prescaler = Auto , Reference = Avcc

Const Granica = 300

'---------------Program---------------'
     Start Adc
Do
     Dioda1 = 0
     Dioda2 = 1
     Dioda3 = 1
     Dioda4 = 1


     A = Getadc(1)
     B = Getadc(2)


     If A < Granica Then
     Dioda2 = 0
     End If

     If B < Granica Then
     Dioda3 = 0
     End If


Loop
End
Podczas tego jak pisaliście wymyśliłem to i to działa, ale nie wiem czemu diody się słabo świecą:

Jeśli świecą słabo, oznacza to, że najprawdopodobniej migają z dość dużą częstotliwością. Wstaw w główną pętlę waita 1 sekundę i wszystko się okaże.

No teraz świecą normalnie tylko ich prędkość reagowania jest zabójcza 😃 Jak wyeliminować ich mruganie?

[ Dodano: 19-04-2012, 17:35 ]

e... wystarczyło opóźnienie 1ms...

Jak wyeliminować ich mruganie?

Pisząc program, który się rozumie?

Zobacz na to co napisałeś, najpierw każesz diodzie się zapalić:

Dioda2 = 1

Dioda3 = 1

Dioda4 = 1

a zaraz po odczytaniu ADC, jeśli wynik jest mniejszy od granicy to diodę gasisz. Więc czas jaki dioda jest zapalona jest równy ułamkowi sekund, a dokładniej czasowi pomiaru ADC plus przypisaniu wartości do pinu.

Kod powinien wyglądać tak:

if pomiar < granica to zgaś diodę

else zapal diodę

Ja mam podłączenie takie: pin uC -> dioda -> rezystor -> Vcc, więc diody zapala się zerem.

[ Dodano: 19-04-2012, 21:42 ]

Kurde. Napisałem taki program i nie wiem czemu, działa niepoprawnie, gdy sharp wykrywa przeszkodę skacze do podprogramu 'ataku', lecz gdy w momencie trwania tego podprogramu jeden z ktirów(P/L) wykryje przeszkodę to uC nie wychodzi, tak jak powinien, z tego podprogramu do innego.

     Start Adc
  Do
     Dioda1 = 0
     Dioda2 = 1
     Dioda3 = 1
     Dioda4 = 1

'---------\\\KTIRs///---------'

     L = Getadc(1)
     P = Getadc(2)


     If L <= Granica Then
     Gosub Prawo
     End If

     If P <= Granica Then
     Gosub Lewo
     End If

     If L <= Granica And P <= Granica Then
     Gosub Zawroc
     end If

     Waitms 1


'---------\\\Sharp///---------'

     If Sharp1 = 0 Then
     Gosub Atak
     End If


'---------\\\Sh+KT///---------'

     If Sharp1 = 0 And L <= Granica Then
     Gosub Prawo
     End If

     If Sharp1 = 0 And P <= Granica Then
     Gosub Lewo
     End If

  Loop

Return



'-----------------F2-----------------'

F2:

  Do

  Loop

Return




'\\\-----------------\\\Inne///-----------------///'


'---------------\\\Fight///---------------'
Atak:
  Do
     Dioda1 = 1
     Dioda2 = 1
     Dioda3 = 1
     Dioda4 = 0
     'Program ataku

  Loop Until Sharp1 = 1 Or P <= Granica Or L <= Granica

  Dioda4 = 1

Return

Znalazłem inne rozwiązanie tego problemu(jeszcze nie wiem czy zadziała) ale nurtuje mnie dlaczego nie chodzi tak jest teraz.

Ja powiem tak, niestety z doświadczenia wiem, że Aliasy nie działają prawidłowo. Jeśli nadasz jakiemuś pinowi Alias i później wymusisz na nim jakiś stan przez nazwę aliasa to nie zawsze to zadziała.

Trochę mnie to zaskoczyło, bo ja używałem bardzo często aliasów w bascomie i nie miałem z nimi żadnych problemów. Może to kwestia wersji kompilatora?

Trochę mnie to zaskoczyło, bo ja używałem bardzo często aliasów w bascomie i nie miałem z nimi żadnych problemów. Może to kwestia wersji kompilatora?

Zawsze mam najnowszą wersję (oprócz aktualnej ponieważ za duża beta z tego jest), już kilkukrotnie miałem tak, że jeśli definiowałem PWM jako Aliasy, albo wyjścia portów to bardzo często nie przypisywała się wartość do Aliasu.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...