program główny wygląda tak
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '**********************************************
- 'STEROWNIK WYKONAWCZY OBROTU
- 'ANTENY TYPU M0PLK MIKROKONTROLER ATMEGA328p 16MHz
- '**********************************************
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 64
- $swstack = 64
- $framesize = 128
- $baud = 115200
- Config Submode = New
- 'Config Watchdog = 4096
- 'Start Watchdog
- 'Debug Off
- Debug On
- '*******************************************************************
- $include "subs\G_adc.inc"
- $include "subs\Blink_.inc"
- $include "subs\Display_.inc"
- $include "subs\Hold_.inc"
- $include "subs\Left_.inc"
- $include "subs\Right_.inc"
- $include "subs\Convert_adc_actuator.inc"
- $include "subs\RS485_read.inc"
- $include "subs\Convert_adc_keypad.inc"
- '----------------------------------------------------------------------
- Config Scl = Portc.5 ' used i2c pins
- Config Sda = Portc.4
- Config Twi = 400000 ' i2c speed
- I2cinit
- $lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
- $lib "glcdSSD1306-I2C_V2.lib" ' override the default lib with this special one
- Const Ssd1306_rotate = 1 ' Display rotation. [connection cable is lower side = 0, upper side = 1]
- Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
- '------------------------------------------------------------------------------------------------
- 'KONFIGURACJA TIMER'ÓW
- Config Timer1 = Timer , Prescale = 8
- On Timer1 Przertimer1
- Enable Timer1
- 'Config Timer1 = Pwm , Pwm = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_down , Prescale = 1
- Config Timer2 = Pwm , Compare_a_pwm = Clear_up , Prescale = 1024
- '--------------------------------------------------------------------
- Enable Interrupts
- '--------------------------------------------------------------------
- 'KONFIGURACJA ADC
- Config Adc = Single , Prescaler = Auto , Reference = Avcc
- '--------------------------------------------------------------------
- 'KONFIGURACJA PORTÓW
- Config Portc.0 = Input : Pinc.0 = 1 'ADC POTI ACTUATOR
- Config portc.1 = Input: pinc.1=0 'ADC_KEYPAD
- Config Portd.2 = Output : Portd.2 = 0 'IN_A
- Config Portd.3 = Output : Portd.3 = 0 'IN_B
- Config Portd.4 = Output : Portd.4 = 1 'CS_DIS
- Config Portd.7 = Output : Portd.7 = 1 'ENA/DIAGA
- Config Portb.0 = Output : Portb.0 = 1 'ENA/DIAGB
- Config Portb.5 = Output : Portb.5 = 0 'LED_LIVE
- Config PORTD.5 = Output : PORTD.5=0 'LED_HOLD
- Config Portb.3 = Output : Portb.3 = 1 'PWM_OUT
- '--------------------------------------------------------------------
- 'ALIASY PORTÓW
- In_a Alias Portd.2
- In_b Alias Portd.3
- Cs_dis Alias Portb.2
- Ena_da Alias Portd.7
- Ena_db Alias Portb.0
- Led_hold Alias Portd.5
- Led_live Alias Portb.5 'Dioda Led sygnalizująca prace układu
- Pwm_ alias portb.3
- '--------------------------------------------------------------------
- 'ZMIENNE CZASU
- Dim Timer_tikx10 As Byte 'zmienna liczaca przepełnienie timera
- Dim Timertikx100 As Byte
- Dim Timertikx200 As Byte
- Dim Timer_tik_flag As Byte
- Flaga10ms Alias Timer_tik_flag.0
- Flaga100ms Alias Timer_tik_flag.1
- Flaga500ms Alias Timer_tik_flag.2
- Flaga1s Alias Timer_tik_flag.3
- Flaga2s Alias Timer_tik_flag.4
- Flaga2_5s Alias Timer_tik_flag.5
- 'zostaly jeszce trzy wolne flagi
- ' a uzylem tylko jednego bajtu
- ' Paweł - pikczu
- '**********************************************
- 'STAŁE
- Const Sw_r = 1
- Const Sw_u = 2
- Const Sw_d = 3
- Const Sw_l = 4
- '--------------------------------------------------------------------
- 'ZMIENNE
- Dim _contrast As Byte ' Contrast value of OLED. [0-255]
- Dim adc_actuator As Word , actuator_h as word
- dim ADC_keypad_ as word
- dim angle_actuator as word
- dim angle_pos_antenna as word
- dim pwm_h as word
- Dim Key As Byte
- Dim Read_key As Byte
- '---------------------------------------------------------------------
- 'USTAWIENIA POCZATKOWE
- Ena_da = 1
- Ena_db = 1
- cls
- Waitms 500
- Cls
- waitms 250
- setfont font16x16
- lcdat 1,24,"M0PLK"
- setfont font8x8tt
- lcdat 4,35,"STEROWNIK"
- lcdat 5,45,"OBROTU"
- setfont font16x16
- lcdat 7,16,"SQ2EER"
- wait 5
- cls
- '--------------------------------------------------------------------
- 'PĘTLA GŁÓWNA
- Do
- if Timer_tikx10 = 1 then
- Timer_tikx10 = 0
- end if
- If Timer_tikx10 >= 10 Then 'jesli uplynelo 100ms to
- Flaga100ms = 1 'ustaw flage uplynelo 100ms
- Incr Timertikx100
- Timer_tikx10 = 0 ''zeruj liczenie
- End If
- If Timertikx100 >= 10 Then 'jesli uplynela sekunda
- Flaga1s = 1 'ustaw flage sekundy
- Incr Timertikx200
- Timertikx100 = 0 'zeruj liczenie
- End If
- If Timertikx200 >= 2 Then
- Flaga2s = 1
- Timertikx200 = 0
- End If
- If Flaga10ms = 1 Then
- Call G_adc
- Flaga10ms = 0
- End If
- If Flaga100ms = 1 Then 'co 100ms
- call Convert_adc_actuator
- call Convert_adc_keypad
- Call Display_
- Flaga100ms = 0 'wyzeruj Flaga100ms
- End If
- If Flaga1s = 1 Then
- Call Blink_
- debug "adc_keypad " ; adc_keypad_
- debug "key " ; key
- debug "Read_key " ; Read_key
- Flaga1s = 0
- End If
- If Flaga2s = 1 Then 'co2s
- Flaga2s = 0
- End If
- '**********************************************************************
- if angle_actuator > angle_pos_antenna then
- call right_
- end if
- if angle_actuator < angle_pos_antenna then
- call left_
- end if
- if angle_actuator = angle_pos_antenna then
- call Hold_
- end if
- '***************************************************************
- Select Case Key
- Case Sw_u
- If pwm_h < 255 then Incr pwm_h
- Case Sw_d
- If pwm_h > 0 Then decr pwm_h
- Case Sw_r
- If angle_pos_antenna < 90 then incr angle_pos_antenna
- Case Sw_l
- If angle_pos_antenna > 0 then decr angle_pos_antenna
- End Select
- Key = 0
- Loop
- End
- '------------------------------------------------------------
- $include "font8x8TT.font" ' this is a true type font with variable spacing
- $include "font16x16.font"
- '*******************************************************************
- 'PODPROGRAM PRZERWAŃ TIMER1
- Przertimer1:
- Timer1 = 45536 'wstawienie do Timer1 wartości 45536
- Incr Timer_tikx10
- If Timer_tikx10 = 1 Then
- Set Flaga10ms
- End If
- Return
- '----------------------------------------------------------------------
funkcję wstawiłem do suba
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'KONWERSJA ADC KLAWISZY
- $nocompile
- sub Convert_adc_keypad
- Local adc_keypad As Word , Read_key As Byte , Key_val As Byte , Old_key As Byte , Key_cnt As Byte
- Function Read_keypad() As Byte
- If Read_key <> 0 Then
- If Old_key = Read_key Then
- If Key_cnt < 20 Then
- Incr Key_cnt
- Key_val = 0
- Else
- Key_cnt = 0
- Key_val = Read_key
- End If
- End If
- Else
- Key_cnt = 15
- Key_val = 0
- End If
- Old_key = Read_key
- Read_keypad = Key_val
- End Function
- '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- key = Read_keypad()
- '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- end sub
odczyt adc mam również w osobnym sub'ie
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'POBIERANIE DANYCH Z ADC
- $nocompile
- Sub G_adc
- adc_actuator=getadc(0)
- adc_keypad_=getadc(1)
- Select Case adc_keypad_ ' Select Case Adc_read
- Case 0 To 100 : Read_key = Sw_r 'right = 0
- Case 101 To 250 : Read_key = Sw_u 'up = 145
- Case 251 To 400 : Read_key = Sw_d 'dwn = 330
- Case 401 To 600 : Read_key = Sw_l 'left = 506
- Case Is > 601 : Read_key = 0 'Case Is > 851 : Read_key = 0 'no key = 1023
- End Select
- End Sub
w terminalu widzę odczyt klawiszy i wartości odczytu, niestety
w pierwszym subie nie jest przekazywana wartość funkcji Read_keypad() do zmiennej key
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- key = Read_keypad()
czy może ktoś pomóc lub podpowiedzieć co mam źle napisane.
pozdrawiam Jacek.