|
Ez talán segít az indulásban: Bővebben: Link
alul van , amire szukséged van
Ebből azt olvasom ki hogy a bascom egy az egyben értelmezi az AT parancsokat, pl: Call-al használva. Jól érem ?
Sajna, ebben nem tudok segíteni, mert idáig is Te segitettél nekem. Menj fel a tavir.hu oldalra, ott előbb segítenek.
A modem értelmezi a parancsokat, a Bascom sima terminálként viselkedik....
Szia! PWM használatáról, pár példa progit tudnál csinálni? Pl: PB1 kimeneten legyen 100.3 hz 1%-os kitöltési tényezővel. Ha lehetne timerekkel, és kommentekkel.
Ez tényleg nem egyszerű, de régebben már találtam rá megoldást egy külföldi fórumon, de nem találom sajna.
Hello!
Nem jövök rá sehogy, hogy milyen formában értelmezi a bascom az AT parancsokat.
Így nem jó:
Mi a hiba?
Print "At+Cpbs =< Sto>"
De mi az a sto?
Ha változó, akkor:
Print "At+Cpbs="; Sto
Áhá, akkor az idézőjelt hagytam le, azt hittem nem kell mint az LCD-nél ha változót akarok kiíratni. Igazából nem is tudom mit tesz ez a parancs, csak bemásoltam valahonnan, hogy lássam elfogadja-e a bascom.
Kérdésem lenne Bascomban az energiatakarékos mód kezelésével kapcsolatban.
Az alany egy mega8. powerdown/powersave/idle módba sikerült betenni, de semmi semi hajlandó felébreszteni, pedig külső interruptnak elvileg fel kellene mindegyikből, int0-t int1-et is próbáltam, s 2 procival is.
Az ébresztés ennyi lenne csak, nem? :
Config Int1 = Low Level
On Int1 Ebred:
Enable Interrupts
Enable Int1
do
...
loop
ebred:
'pl relékattogtatás
return
end
Az int1 (portd3) láb magasra van húzva 10k-val (többfélével is próbáltam), ha alacsonyra teszem, semmi.
Ha nincs elaltatva a proci, akkor a megszakítás működik:
Mi lehet a gond?
Pedig elvileg így működnie kéne.
Esetleg írd át hogy: de ez csak tipp, így is mennie kéne.
Külön a megszakításra reagál ?
Mintaprogram, ami működik:
$regfile = "2313def.dat"
$crystal = 4000000
Config Pind.6 = Output
Config Int0 = Low Level
On Int0 Button:
Enable Interrupts
Enable Int0
Do
Set Portd.6
Wait 1
Reset Portd.6
Cls
Lcd "power-idle..."
Lowerline
Lcd "pushbtn to wake"
Powerdown
Loop
Button:
Cls
Lcd "awake!"
Wait 1
Return
End
Powerdownbol felebresztes:
Csal low level INT ebreszti -> adatlap....
idle-bol klti barmelyik int...
Sziasztok!
Tegnap írtam M8-ra egy programot. Annyi a feladata, hogy soros porton fogad 11 karaktert, és a beérkező adat alapján vezérel néhány motort és szervót. Például ha egy ilyen karakterláncot kap: "-100+100661", akkor az egyik motor sebessége -100, a másiké +100. Az egyik szervó állása 6, a másiké is, a harmadik motor pozitív irányba forog, mert 1 az értéke.
$regfile "m8def.dat"
$crystal = 8000000
$baud = 9600
'$sim
Dim Szamlalo As Byte 'SW PWM
Dim Motor1a As Byte 'SW PWM
Dim Motor1b As Byte 'SW PWM
Dim Motor2a As Byte 'SW PWM
Dim Motor2b As Byte 'SW PWM
Dim Emeloa As Byte 'SW PWM
Dim Emelob As Byte 'SW PWM
Dim Motorbal As Integer 'soros porton olvasando
Dim Motorjobb As Integer 'soros porton olvasando
Dim Servo1 As Byte 'soros porton olvasando
Dim Servo2 As Byte 'soros porton olvasando
Dim Emelo As Byte 'soros porton olvasando
Dim Balenc As Integer
Dim Jobbenc As Integer
Dim Serialrec As String * 11
Dim Serialrecmod As String * 4
Config Portc.2 = Output 'motor meghajtok
Config Portc.3 = Output 'motor meghajtok
Config Portc.4 = Output 'motor meghajtok -bal
Config Portc.5 = Output 'motor meghajtok -bal
Config Portd.6 = Output 'motor meghajtok -jobb
Config Portd.7 = Output 'motor meghajtok -jobb
Config Timer2 = Timer , Prescale = 8
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024
On Int0 Balenc
On Int1 Jobbenc
On Timer2 Pwmhajt
Enable Timer2
Start Timer2
Enable Interrupts
'Enable Int0
'Enable Int1
Do
If Ischarwaiting() = 1 Then Input Serialrec
Serialrecmod = Mid(serialrec , 1 , 4)
Motorbal = Val(serialrecmod)
Serialrecmod = Mid(serialrec , 5 , 4)
Motorjobb = Val(serialrecmod)
Serialrecmod = Mid(serialrec , 9 , 1)
Serialrecmod = Mid(serialrec , 10 , 1)
Servo2 = Val(serialrecmod)
Serialrecmod = Mid(serialrec , 11 , 1)
Emelo = Val(serialrecmod)
Print Serialrec
Print Motorbal
Print Motorjobb
Print Servo2
Print Emelo
Pwm1b = Servo2
Select Case Emelo
Case 1 :
Emeloa = 255
Emelob = 0
Case 2:
Emeloa = 0
Emelob = 255
Case 0:
Emeloa = 0
Emelob = 0
End Select
Select Case Motorbal
Case 0:
Motor1a = 0
Motor1b = 0
Case Is > 0:
Motor1a = Motorbal
Motor1b = 0
Case Is < 0:
Motor1a = 0
Motor1b = Motorbal * -1
End Select
Select Case Motorjobb
Case 0:
Motor2a = 0
Motor2b = 0
Case Is > 0:
Motor2a = Motorjobb
Motor2b = 0
Case Is < 0:
Motor2a = 0
Motor2b = Motorjobb * -1
End Select
Loop
Pwmhajt:
Incr Szamlalo
'motor bal*******************
If Motor1a = 0 Then Reset Portc.5
If Motor1a > Szamlalo Then Set Portc.5 Else Reset Portc.5
If Motor1b = 0 Then Reset Portc.4
If Motor1b > Szamlalo Then Set Portc.4 Else Reset Portc.4
'motor jobb*************************
If Motor2a = 0 Then Reset Portd.6
If Motor2a > Szamlalo Then Set Portd.6 Else Reset Portd.6
If Motor2b = 0 Then Reset Portd.7
If Motor2b > Szamlalo Then Set Portd.7 Else Reset Portd.7
'emelo************************
If Emeloa = 0 Then Reset Portc.2
If Emeloa > Szamlalo Then Set Portc.2 Else Reset Portc.2
If Emelob = 0 Then Reset Portc.3
If Emelob > Szamlalo Then Set Portc.3 Else Reset Portc.3
Return
Balenc:
If Motorbal > 0 Then
Incr Balenc
Else
Decr Balenc
End If
Return
Jobbenc:
If Motorjobb > 0 Then
Incr Jobbenc
Else
Decr Jobbenc
End If
Return
A kódot szimulátorban teszteltem, annyi külömbséggel, hogy az " if ischarwaiting()=1 then input serialrec" sor helyett csak Input serialrec volt, mivel nem tudtam gyorsan beírni a szimulátorba a szöveget.
A porbléma az, hogy szimulátorban tökéletesen megy, viszont amikor rárakom az avr-re, és kiíratom vele a motorok értékeit, akkor mindig 0-t ír. Kiírattam már külön a string-ek értékét is, és az is hülyeséget ír. A legérdekesebb viszont az, hogy 11 karaktert kell fogadni, így 11 hosszúságú string-et hoztam létre. Amikor a soros porton kapott string-et visszaküldöm a gép felé, akkor már csak 10 karakterből áll. Szimulátorban ez is normálisan működött.
Esetleg valakinek valami ötlet?
Sok szenvedés után működni látszik a dolog. Nem tudom, hogy milyen karaktert küldhet először, de biztos, hogy a PC-n a Terminal Emulator-ban nem jelenik meg. Tolódott az egész dolog jobbra eggyel, ezért volt hibás a feldolgozás is.
Bejövő adatokat buffereld a config serialin = buffered, 20 sorral.
Én raknék START és STOP karaktert, és így fűzném össze a feldolgozandó karakterláncot.
Start: #, adásvége: &
ami az adásvége és a start közt jön, az szemét..
A karakterlánc hossza ha nagyobb mint 10 karakter: szemét is jött. Eldobni.
Puffereltem a soros portot, és egy & jelet raktam kezdő karakternek. Úgy néz ki, hogy most jó, viszont ha még belerakok egy soros porti küldést, akkor már igencsak szaggatva megy a motor, és a szervó is ugrál. Kezdem azt hinni, hogy ezekkel az avr-ekkel nem lehet egy ilyen dolgot megcsinálni...
$regfile "m8def.dat"
$crystal = 8000000
$baud = 9600
'$sim
Dim Szamlalo As Byte 'SW PWM
Dim Motor1a As Byte 'SW PWM
Dim Motor1b As Byte 'SW PWM
Dim Motor2a As Byte 'SW PWM
Dim Motor2b As Byte 'SW PWM
Dim Emeloa As Byte 'SW PWM
Dim Emelob As Byte 'SW PWM
Dim Motorbal As Integer 'soros porton olvasando
Dim Motorjobb As Integer 'soros porton olvasando
Dim Servo1 As Byte 'soros porton olvasando
Dim Servo2 As Byte 'soros porton olvasando
Dim Emelo As Byte 'soros porton olvasando
Dim Balenc As Integer
Dim Jobbenc As Integer
Dim Serialrec As String * 15
Dim Serialrecmod As String * 4
Dim A As String * 1
Config Portc.2 = Output 'motor meghajtok
Config Portc.3 = Output 'motor meghajtok
Config Portc.4 = Output 'motor meghajtok -bal
Config Portc.5 = Output 'motor meghajtok -bal
Config Portd.6 = Output 'motor meghajtok -jobb
Config Portd.7 = Output 'motor meghajtok -jobb
Config Pind.2 = Input
Config Pind.3 = Input
Pind.2 = 1
Pind.3 = 1
Config Serialin = Buffered , Size = 20
Config Timer2 = Timer , Prescale = 8
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024
Config Int0 = Falling
Config Int1 = Falling
On Int0 Balenc
On Int1 Jobbenc
On Timer2 Pwmhajt
Enable Timer2
Start Timer2
Enable Interrupts
Enable Int0
Enable Int1
Echo Off
Do
'Print Balenc ; " " ; Jobbenc
If Ischarwaiting() = 1 Then
A = Inkey()
Waitms 1
If A = "#" Then
Input Serialrec
End If
End If
Serialrecmod = Mid(serialrec , 1 , 4)
Motorbal = Val(serialrecmod)
Serialrecmod = Mid(serialrec , 5 , 4)
Motorjobb = Val(serialrecmod)
Serialrecmod = Mid(serialrec , 9 , 1)
Serialrecmod = Mid(serialrec , 10 , 1)
Servo2 = Val(serialrecmod)
Serialrecmod = Mid(serialrec , 11 , 1)
Emelo = Val(serialrecmod)
'Print Motorjobb
'Print Servo2
'Print Emelo
Pwm1b = Servo2
Select Case Emelo
Case 1 :
Emeloa = 255
Emelob = 0
Case 2:
Emeloa = 0
Emelob = 255
Case 0:
Emeloa = 0
Emelob = 0
End Select
Select Case Motorbal
Case 0:
Motor1a = 0
Motor1b = 0
Case Is > 0:
Motor1a = Motorbal
Motor1b = 0
Case Is < 0:
Motor1a = 0
Motor1b = Motorbal * -1
End Select
Select Case Motorjobb
Case 0:
Motor2a = 0
Motor2b = 0
Case Is > 0:
Motor2a = Motorjobb
Motor2b = 0
Case Is < 0:
Motor2a = 0
Motor2b = Motorjobb * -1
End Select
Loop
Pwmhajt:
Incr Szamlalo
'motor bal*******************
If Motor1a = 0 Then Reset Portc.5
If Motor1a > Szamlalo Then Set Portc.5 Else Reset Portc.5
If Motor1b = 0 Then Reset Portc.4
If Motor1b > Szamlalo Then Set Portc.4 Else Reset Portc.4
'motor jobb*************************
If Motor2a = 0 Then Reset Portd.6
If Motor2a > Szamlalo Then Set Portd.6 Else Reset Portd.6
If Motor2b = 0 Then Reset Portd.7
If Motor2b > Szamlalo Then Set Portd.7 Else Reset Portd.7
'emelo************************
If Emeloa = 0 Then Reset Portc.2
If Emeloa > Szamlalo Then Set Portc.2 Else Reset Portc.2
If Emelob = 0 Then Reset Portc.3
If Emelob > Szamlalo Then Set Portc.3 Else Reset Portc.3
Return
Balenc:
If Motorbal > 0 Then
Incr Balenc
Else
Decr Balenc
End If
Return
Jobbenc:
If Motorjobb > 0 Then
Incr Jobbenc
Else
Decr Jobbenc
End If
Return
Sziasztok!
A bascom-AVR getrc5 parancsát lehet valahogy interruptolni?
Mert most nekem egy do-loop cikulsban van és viszonylag sok időt áll és jó lenne úgy megoldani, hogy csak akkor kezdje el dekódolni a jelet, ha tényleg kap is.
Valahogy így(bocs, csak vázlat):
on INT0 infra
do
...akármi
loop
infra:
getrc5...
return
Sziasztok!
Hogy tudom előcsalni bascomban egy attiny2313 4 pwm csatornáját ??? pwm1a az működik, a pwm1b arra hibár ir ki, hogy ilyen parancs nincs, és hol a többi két csatorna ?
Biztos T2313-t és nem 90S2303-t választottad ki?
PWM0, PWM1a, WM1b, PWM2.
Hát igy most aztmondanám, hogy nem, de megnézem Melobol hazaérek, első dolgom lesz
Köszi!
Hát ezt a szivatást !
Tényleg rossz chip volt beállítva !
Köszi a segitséget!
Helló!
Nézegettem az előző servos pwm szabályozást de nem igazán tudom kihámozni azt ami nekem kellene.
Egy mintaprogramot tudna nekem valaki írni arra hogy egy sima servot egyik végállásból a másikba tekerjen?
Segítséget előre is köszönöm.
Kenikol
$regfile = "2313def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'Servo's need a pulse in order to operate
'with the config statement CONFIG SERVOS we can specify how many servo's we
'will use and which port pins are used
'A maximum of 14 servos might be used
'The SERVO statements use one byte for an interrupt counter and the TIMER0
'This means that you can not use TIMER0 anymore
'The reload value specifies the interval of the timer in uS
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
'as an option you can use TIMER1
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1
'we use 2 servos with 10 uS resolution(steps)
'we must configure the port pins used to act as output
Config Portb = Output
'finally we must turn on the global interrupt
Enable Interrupts
'the servo() array is created automatic. You can used it to set the
'time the servo must be on
Servo(1) = 40 '10 times 10 = 100 uS on
'Servo(2) = 20 '20 times 10 = 200 uS on
Dim I As Byte
Do
For I = 30 To 170
Servo(1) = I
Waitms 100
Next
For I = 170 To 30 Step -1
Servo(1) = I
Waitms 100
Next
Loop
End
A szervo igy hivatalosan 50...150 kozti erteket vehet fel (0.5...1,5 msec - emlekeim szerint)
köszönöm a segítséget így már sokkal érthetőbb mit kell(ene) csinálnom!
Sziasztok!
Az itt látható jelsorozatot kellene előállítanom.
Így próbálkozom:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Input
Config Int0 = Falling
On Int0 Gomb
Dim A As Bit
Enable Interrupts
Enable Int0
Do
If A = 1 Then
A = 0
Set Portd.1
Portd.0 = 1
Waitus 2000
Portd.0 = 0
Waitus 27830
Portd.0 = 1
Waitus 390
Portd.0 = 0
Waitus 1580
Portd.0 = 1
Waitus 410
Portd.0 = 0
Waitus 3580
Portd.0 = 1
Waitus 400
Portd.0 = 0
Waitms 63
Portd.0 = 1
Waitus 2000
Portd.0 = 0
Waitus 27830
Portd.0 = 1
Waitus 390
Portd.0 = 0
Waitus 1580
Portd.0 = 1
Waitus 410
Portd.0 = 0
Waitus 3580
Portd.0 = 1
Waitus 400
Portd.0 = 0
Else
Reset Portd.0
Reset Portd.1
End If
Loop
Gomb:
A = 1
Waitms 75
Gifr = 64
Return
(Portd.1 csak próba nekem egy sima leddel, hogy lássam)
De valamiért nem működik, meg tudjátok mondani hogy mit szúrok el ?
Köszi előre is
Peti
Elnézést, a beégetéssel volt a gond, a program működik! Fönnhagyom példának.
Megépítettem egy hőmérőt ATMEGA8 és egy ds18b20 sensorral. egy digitális hőmérőhöz képest csal kb 4 C fokot.
Mit csinálok rosszul?
'1Wire
Config 1wire = Portc.5
Config Portb.1 = Output
Dim Bd(9) As Byte
Dim I As Byte
Dim Tmp As Byte
Dim T As Integer , T1 As Integer
Dim Ia As String * 4
Locate 1 , 7
Locate 4 , 5
Lcd "by KoteszLab"
Wait 1
Do
Reset Portb.1
1wwrite &HCC
1wwrite &H44
Waitms 300
1wreset
1wwrite &HCC
1wwrite &HBE
Bd(1) = 1wread(9)
1wreset
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50
T = T - 25
T1 = Bd(8) - Bd(7)
T1 = T1 * 100
T1 = T1 / Bd(8)
T = T + T1
T = T / 10
T = T + 4
If Err = 1 Then
Locate 2 , 1
Lcd "-- "
Else
Ia = Str(t)
Waitms 50
Cls
Locate 4 , 1
Lcd "Copyright Koteszlab"
Locate 1 , 5
Lcd "H" ; Chr(002) ; "m" ; Chr(003) ; "rs" ; Chr(003) ; "klet"
Locate 2 , 8
Lcd Left(ia , 2) ; "." ; Mid(ia , 3 , 1) ; "C" ; Chr(5)
Set Portb.1
End If
Waitms 250
Loop
End
A 18B20-as hőmérőt a DS18S20-as módon akarod kiolvasni.
Értem.
Miben különbözik a 18b20 lekérdezési methodikája?
|
|