mój problem polega na ustawianiu wszystkich wyjść w stan 0 podczas zmiany kroku.
wklejam link do filmu, nie jest zbyt dobrze to ujęte lecz jak się przyjrzeć to widać zapalanie się wszystkich ledów, czyli stanu 0 na portach.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat"'Zdefiniuj odpowiedni mikrokontroler (np. ATmega328P)
- $crystal = 16000000 ' Ustaw częstotliwość zegara (np. 16 MHz)
- $hwstack = 64
- $swstack = 64
- $framesize = 64
- $baud =115200
- $projecttime = 155
- ' Definicje pinów
- config Portd.2=input ' Pin D2 czujnika światła
- sensorState alias pind.2
- ' Ustawienie pinów jako wejścia i wyjścia
- config portd.4=output ' porty sterujące tranzystorami
- config portd.5=output
- config portd.6=output
- config portd.7=output
- set portd.2 ' włączenie podciągania int0
- set portd.4 ' Wstępne wyłączenie transoptorów
- set portd.5
- set portd.6
- set portd.7
- Declare Sub UpdateMotorStep
- Dim currentStep As Byte
- Dim stateChanged As Bit
- ' Konfiguracja przerwania
- Config Int0 = change ' Przerwanie na zmianę stanu (można dopasować)
- on int0 interrupt
- enable int0
- enable interrupts
- ' Inicjalizacja zmiennych
- sensorState = 0
- stateChanged = 0
- currentStep = 1
- ' Komunikacja szeregowa
- Baud = 115200
- ' Waitms 1 ' Czekaj, aby upewnić się, że port szeregowy jest gotowy
- Print "Program started. Waiting for sensor changes..."
- ' Główna pętla
- Do
- If stateChanged = 1 Then
- Call UpdateMotorStep
- stateChanged = 0
- endif
- Loop
- ' Funkcja aktualizująca krok silnika
- sub UpdateMotorStep:
- '( ' Wyłącz wszystkie tranzystory
- ' set portd.3
- set portd.4
- set portd.5
- set portd.6
- waitms 500
- ' Włącz następny tranzystor
- ')
- select case currentStep
- case 1
- print "case1"
- reset portd.4
- set portd.5
- set portd.6
- set portd.7
- case 2
- print "case2"
- set portd.4
- reset portd.5
- set portd.7
- set portd.6
- case 3
- print "case3"
- set portd.5
- set portd.4
- reset portd.6
- set portd.7
- case 4
- print "case4"
- set portd.4
- set portd.5
- set portd.6
- reset portd.7
- case else
- print "else"
- set portd.3
- set portd.4
- set portd.5
- set portd.6
- end select
- ' Wyświetl informacje
- '(
- toggle portb.5
- If sensorState = 2 Then
- Print "Sensor: HIGH"
- Else
- Print "Sensor: LOW"
- End If
- Print "Active transistors: "; currentstep
- 'reset portb.5
- ')
- ' Przejdź do następnego kroku
- currentStep = currentStep+1
- if currentstep>4 then
- currentstep=1
- endif
- end sub
- ' Obsługa przerwania
- Interrupt:
- sensorState = pind.2
- '
- reset portb.5
- ' sensorState = Pin(sensorPin) ' Odczytaj stan pinu czujnika
- stateChanged = 1
- waitms 10
- nop
- set portb.5
- ' Gifr = &B01000000 'Ustawianie flagi INTF0 w rejestrze GIFR
- return