Bascom pomoc przy programie

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
fluke2010
-
Posty: 31
Rejestracja: 16 maja 2010, 18:11
Lokalizacja: lubuskie

Bascom pomoc przy programie

Post autor: fluke2010 » 29 sie 2010, 19:59

Witam.

Na Początku napiszę ze dopiero zaczynam zabawę z bascom'em

Bawię sie z Attiny 2313. płyta testowa ZL11AVR

Potrzebuję zrobić takie coś :)

Jednym switchem który jest na PIND.0 chcem ustawić PORTB.0 = 1
ponowne naciśnięcie switcha ustawia PORTB.1 = 1
ponowne nacisnięcie ustawia PORTB.2 = 1
ponowne nacisniecie ustawia PORTB.3 = 1

itd aż zapełni sie cały PORTB stanem wysokim.

jeżeli zapełni się cały POTRTB wartościa 11111111 to po ponownym nacisnięciu switcha
znow najmłodszy bit PortB ma 1 reszta 0. i tak cały cykl sie powtarza.

Za każdym nacisnięciem Switcha na chwilę ( 200 ms ) na PORTD.6 = 1 ( sygnalizacja dzwiękowa Zalączenia switcha )


zaczełem kombinować i pisać, ale za mało wiem i po drugim naciśnięciu switcha nie ustawia mi się PORTB.1 = 1


moze ktoś zerknąć ?

Browarka jakiegoś postawię za pomoc :)











' Wlacznik Przekaznikow sterowanych z Portu B


Config Portb = Ouput 'wszystkie końcówki jako wyjścia
Portb = &B00000000 'stan spoczynkowy niski
Config Portd = &B1111110 'jedno najmlodsze jako wejscie ,reszta jako wyjscie
Portd = &B0000001 'wszedzie stan niski, oprócz najmlodszego bitu

Wej Alias Pind.0 ' nazwa zamienna, zmieniamy nazwy dla uproszczenia
Wy0 Alias Portb.0
Wy1 Alias Portb.1
Wy2 Alias Portb.2
Wy3 Alias Portb.3
Wy4 Alias Portb.4
Wy5 Alias Portb.5
Wy6 Alias Portb.6
Wy7 Alias Portb.7
Piezo Alias Portd.6 ' piezo na porcieD=6



Do
If Wej = 0 Then ' jezeli wej jest w stanie 0 to
Wy0 = 1 ' wyscie 0 jest w stanie wysokim
If Wy0 = 1 And Wej = 0 Then ' jeżeli wyjscie 0 jest w stanie wysokim i wejscie w stanie 0 to
Wy1 = 1 ' wyjscie 1 jest w stanie wysokim














If Wej = 0 Then Piezo = 1
Waitus 200
Piezo = 0






Loop
End If
End

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

Post autor: Pikczu » 29 sie 2010, 21:14

Cześć
spróbuj innaczej użyj debouce i skoku do podprogramu.
Potem nie rób and-ów tylko przypisz warotości do portu jak 1,3,7,15,31,63,127,255.
pozdrawiam

fluke2010
-
Posty: 31
Rejestracja: 16 maja 2010, 18:11
Lokalizacja: lubuskie

Post autor: fluke2010 » 29 sie 2010, 22:03

No będę kombinował, tylko teraz mam inny dylemat, dlaczego jak mam konfiguracje portów ze w stanie spoczynkowym sa w niskim ( cały port.B ) to na 1.2,4,5,7 mam stan H ??
Sprawdzam sobie próbnikiem stanów logicznych, czy miernikiem, ale to już nie ważne czym
Program pracuje w pustej pętli Do....Loop nic nie wykonuje.
Procka podmieniałem i to samo :(

No nie mogę tego zrozumieć, niech mi ktos to wytłumaczy.

keruseykaryu

Post autor: keruseykaryu » 30 sie 2010, 6:53

No nie mogę tego zrozumieć, niech mi ktos to wytłumaczy.
Zerknij na schemat to się wszystko wyjaśni: R10, R11, R12, R13, R14... Widzisz już?

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 30 sie 2010, 8:29

Dzień dobry
W pana kodzie jest nie zamknięta instrukcja warunkowa "if"
oraz występuje "End If" między "Loop" i "End"
Czy segmenty wyświetlaczy się świecą?
Jaką wartość mają rezystory R2..R9? Na schemacie pobranym z internetu mają 82R.
Jeżeli tak jest to wydaje mi się że został przekroczony maksymalny prąd pinów PortuB.
Pomijając spadek na otwartych tranzystorach T2..T6 oraz diod segmentów wyświetlaczy przy tej wartości rezystorów R2..R9 prąd wpływający do pojedynczego pinu portuB wyniesie >60mA przy
napięciu zasilania 5V.
60*8=480mA na port co jest raczej nie niedopuszczalne dla portu w tym mikroprocesorze.
sugerował bym zwiększenie rezystorów R2..R9 do wartości około 330R..520R.

Jeżeli chodzi o program to mógłby wyglądać na przykład tak:

Kod: Zaznacz cały

'$sim
$regfile = "ATtiny2313.DAT"
$crystal = 4000000
Config Pind.0 = Input
Config Pind.1 = Input
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portb = Output

Dim Sw_count As Byte
Portd=&B11110111
Do
  Bitwait Pind.0 , Reset
  Waitms 25
  If Pind.0 = 0 Then
    Incr Sw_count
    Reset Portd.2
    If Sw_count = 9 Then
      Sw_count = 1
    End If
    Select Case Sw_count
      Case 1 : Portb = &H01
      Case 2 : Portb = &H03
      Case 3 : Portb = &H07
      Case 4 : Portb = &H0F
      Case 5 : Portb = &H1F
      Case 6 : Portb = &H3F
      Case 7 : Portb = &H7F
      Case 8 : Portb = &HFF
    End Select
  End If
  Bitwait Pind.0 , Set
  Set Portd.2
Loop
End
Zanegowany stan portub będzie wyświetlany na wyświetlaczu W4.
Wyjście brzęczyka (piezzo z generatorem) załączanego na czas naciśnięcia przycisku S1 na kolektorze tranzystora T2.

Pozdrawiam

[ Dodano: 2010-08-30, 10:09 ]
Minimalna wartość napięcia wyjścia portu w stanie wysokim wynosi 4,2V przy 5V zasilaniu.
Jeżeli na wyjściu portu przykładowo PD6 będzie stan wysoki (H) więc w przypadku najmniej przyjaznym ok 4,2V to na bazie tranzystora T6 będzie 4,6V. Czyli 0,2V do jego otwarcia (otwarcie 4,4V czyli około 0.6V względem emitera). Przy różnej tolerancji rezystorów może wystąpić sytuacja że tranzystor będzie na granicy przewodzenia. Może warto zwiększyć wartości rezystorów R19..R23 z 3k3 do około 4k7?
To czy tranzystory multipleksujące wyświetlaczy są otwarte czy zamknięte nie powinno mieć wpływu na stany lini portuB skonfigurowanego jako wyjście. Zakładając zwiększenie rezystorów R2..R9 z 82R do 330R..560R.

fluke2010
-
Posty: 31
Rejestracja: 16 maja 2010, 18:11
Lokalizacja: lubuskie

Post autor: fluke2010 » 30 sie 2010, 9:27

Witam.

Wywaliłem te rezystory na razie, jednak to raczej nie przez nie.
załadowałem do kompilatora takie coś :

Config Portb = Ouput
Portb = &B00000000
Config Portd = &B1111110
Portd = &B0000001


Do

Loop
End


i wyjścia portuB oprócz portB.6 mają 0.35V portB.6 ma 4.25.
Wygląda na to ze są "pływające". Nie ma żadnego stanu na nich na próbniku logicznym
Teraz tak , Twoj programik pracuje jak najbardziej OK :) tak jak chciałem.
Na razie nie wiem o co chodzi dokładnie w nim, na nim wyjścia pracują jak najbardziej OK.
Mysle ze powoli go rozszyfruję, należy się dobre piwko dla Ciebie. (PW).

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 30 sie 2010, 9:50

"Sąda logiczna miernikowi uniwersalnemu nie równa" :smile:

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

Post autor: Pikczu » 30 sie 2010, 13:16

Kolego c4v2, jak już jestes taki dobry i tak bardzo chcesz pokazać że potrafisz.
To dodawaj komentarze żeby fluke2010 mógł zrozumieć.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 30 sie 2010, 15:48

Właśnie dlatego nie piszę komentarzy aby kolega mógł zrozumieć.
Przy tak prostym programie komentarze są zbędne ( jedna zmienna więc nie ma co komentować).
Może tylko cel użycia instrukcji opóźnienia "Waitms 25" do programowej eliminacji drgań styków "mikroswitcha" S1. Resztę można znaleźć w pomocy BascomaAVR.
Wystarczy skrupulatnie przeanalizować kod.

ODPOWIEDZ