megszakítások !! egy pici elakadás!

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Baszus, fél éve hogy nem használtam a bascom-ot és egy ilyenen elcsúszni!
Most már a kondi is lehagyható.

Köszönöm !
Avatar
sznorbee
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. október 14. vasárnap, 6:00

Hozzászólás Szerző: sznorbee »

Sziasztok!

Egy kis segítségre lenne szükségem. Adott egy 6 csatornás RC vevő. Ennek minden csatornáján szabványos PWM jel jön ki a szervómotorok számára. Az egyik csatorna felfutó élének HIGH-on eltöltött idejét szeretném megmérni. Vagyis az impulzushosszúságot. Mega16-on Timer1-el ez már megy is, de mivel itthol soic8-ban csak attiny45-öm van, így át akarom írni a kódot TIMER0-ra és TIN0 megszakításra mert csak ez van neki ha jól olvastam.

A jelenlegi kódom:

Kód: Egész kijelölése

'======================================================
'System settings
'======================================================
'Definition for Mega 16
$regfile "m16def.dat"
'System frequency (8Mhz)
$crystal = 8000000
$baud = 9600

Config Timer0 = Timer , Prescale = 1024

Config Pina.0 = Output                                      'Világitáskapcsoló
Porta.0 = 1
Config Pina.4 = Output                                      'Timer0 túlcsordulás jelzése
Porta.4 = 1

Led Alias Porta.0
Led2 Alias Porta.4

Led2 = 1

Dim Wtime As Byte
Dim Timercounter As Word
Dim Jel As Bit

Stop Timer0
Timer0 = 0
Jel = 0

On Int0 Captmr
On Timer0 Ovf

Wtime = 200
Timercounter = 0

Config Int0 = Falling
Enable Interrupts
Enable Int0
Enable Timer0

Do
  If Timer0 > 0 And Timer0 < 100 Then
  Led = 1
  End If
  If Timer0 > 120 And Timer0 < 250 Then
  Led = 0
  End If

  Waitms Wtime
  Print "pwidth: " ; " " ; Timer0
Loop


Captmr:
If Jel = 0 Then
  Jel = 1
  Start Timer0
  Config Int0 = Rising
Else
  Jel = 0
  Stop Timer0
  Config Int0 = Falling
  Timercounter = Timer0
  Timer0 = 0
  Start Timer0
End If

Return

Ovf:
Toggle Led2
Return

End
Namásmost amig az adó ki van kapcsolva, addig Timer0 szépen nullán áll. De amint bekapcsolom tök véletlenszerű értéteket vesz fel. Látszólag semmit nem változtat ha tekergetem az adón a mért csatornához tartozó potit. A TIMER0 viszont nem csordul túl egyszer sem. Nem értem mi lehet a baj. Elvileg a TIMER0 felbontásába 8Mhz-en belefér a jel mérése nem?

Köszi előre is.
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Ha csak ilyen egyszerű a feladat akkor a pulsein utasítással is mérhetsz jelet.
Avatar
sznorbee
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. október 14. vasárnap, 6:00

Hozzászólás Szerző: sznorbee »

Az jó lenne, de az az ICP-pin-el működik ha jól tudom. Attiny45-ben olyan nincs. :(
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Itt kitöltési tényező lenne, nem jelsorozat... Ha jól értem a feladatot.


Timer0: 0..255 számol
Timer1: 0..65535-ig számol. Szóval pár túlcsordulásod elmarad, ha Timer0-val számolsz....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

T45: csak 8bites timered van:(
Avatar
sznorbee
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. október 14. vasárnap, 6:00

Hozzászólás Szerző: sznorbee »

Így van. A szervó jelének kitöltési tényezőjét mérném. Egy modellrepülő világítását kapcsolnám vele ki / be. Bizonyos érték felett be, az alatt pedig kikapcsolná. Szóval nagyon pontos mérés nem lenne szükséges.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Tipp:

Kód: Egész kijelölése

config timer0=
dim t0ovf as byte

on timer0 ovf0
enable timer0
enable interrupts

do
.
.
if most_van =1 then
  stop timer0
  valosido=t0ovf*256
  valosido=valosido+timer0
  timer0=0
  start timer0
endif
.
.
.
loop

ovf0:
incr t0ovf
return
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Itt az én verzióm:

Kód: Egész kijelölése

$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 10
$framesize = 40

Dim Ch As Word

Config Portd.4 = Input  
Config Portb.0 = Output  

Waitms 100   

Do
Pulsein Ch , Pind , 4 , 1
If Ch < 145 Then Reset Portb.0

If Ch > 155  Then Set Portb.0

Waitms 1

Loop

End

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A Pulsein lehet egyszerűbb :)
10usec pontossággal mér, max 655.35 ms időt...

http://avrhelp.mcselec.com/pulsein.htm

A BitWaittal az elején meg lehet várni a fel/lefutó élet:). Ez _túl egyszerű_. Nem lehetne kicsit élvezni a problémát?:)

Viszont a leírás azt írja, hogy kvarcfüggő a mérhető idő. Azaz lehet ha precíz szám kelll, akkor kalibrálni kell.
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Erre is van egyszerű megoldás de jó felbontáshoz kell a 16Mega kristály, ez akkor jó mikor a programban nem szabad egy us sem várni.

$crystal = 16000000
Config Timer0 = Timer , Prescale = 256
Config Int0 = Change
On Timer0 Detectnorx1
On Int0 Ch1

Enable Interrupts
Enable Int0
Enable Timer0
Start Timer0
Dim Ch1v As Byte,, Ch1i As Integer


Do

If Ch1v > 61 And Ch1v < 139 Then
Ch1i = Ch1v - 100 '+-37
End If

'Ide kel tenni hogy a kapott +-37 értéket mire akarod felhasznalni.

Loop

End

Ch1:
If Pind.2 = 1 Then Timer0 = 0
If Pind.2 = 0 Then Ch1v = Timer0

Return

Detectnorx1:

Return
Avatar
sznorbee
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. október 14. vasárnap, 6:00

Hozzászólás Szerző: sznorbee »

Köszi!! A PULSEIN-el tényleg egyszerű volt. Jó, hogy a szemem nem verte ki :)

Kód: Egész kijelölése

'======================================================
'RC kapcsoló megvalósítása az RX egyik csatornájának
'PWM kitöltési tényező mérésével
'======================================================
$regfile "attiny45.dat"
$crystal = 8000000

Config Pinb.3 = Output                                      'Világitáskapcsoló
Led Alias Portb.3
Portb.3 = 1

Dim W As Word

Do
Pulsein W , Pinb , 4 , 0                                    '0-1 átmenet detektálása
Bitwait Portb.4 , Reset                                     'stopper megállít 1-0 átmenetre

If W < 1780 And W > 1725 Then                               'feltétel vizsgálat
Reset Led
End If

If W < 1725 And W > 1676 Then
Set Led
End If

Waitms 150                                                  'egy kis lassítás (ráérünk)

Loop

End                                                         'end program
Avatar
daniel926
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2011. december 7. szerda, 7:00

Re: megszakítások !! egy pici elakadás!

Hozzászólás Szerző: daniel926 »

Szép délutánt.
Megakadtam a megszakításokkal. Azt szeretném ha a zöld led villogna ha a gomb nincs működtetve, ha a gombot működtetjük a zöld led aludjon ki és egy piros led villogjon. Ehelyett ha a gombot működtetem akkor van hogy egyszerre világít a zöld és a piros led ez nagyon gyakori ritkább az amikor csak a piros led világít. Azonban egyik esetben sem villog a piros led. Az ic egy atmega328 külső kvarc nélkül. Utána olvastam de sehogy sem jövök rá mi lehet a gond.
A programom:

Kód: Egész kijelölése

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

Config Pind.6 = Output                                      'piros led
Config Pind.2 = Input                                       'gomb
Config Portb.1 = Output                                     'zöld led
Config Int0 = Low Level

On Int0 Gombnyomva

Enable Interrupts
Enable Int0

Do                                                          'zöld led 100 ms-os villogása alapesetben ha a gomb nincs működtetve
  Set Portb.1
  Waitms 100
  Reset Portb.1
  Waitms 100
Loop

Gombnyomva:                                                 'piros led 40 ms-os villogása ha a gomb működtetve van
Set Portd.6
Waitms 40
Reset Portd.6
Return


End
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: megszakítások !! egy pici elakadás!

Hozzászólás Szerző: Robert »

Mondjuk mars vissza olvasni:
- INTben nincs várakozás.
- amit nem kell INT-ben futtatni, az mehet a főprogramba.


if gombnyomva then pirosvillog else zoldvillog

Ez miért nem jó?
Avatar
daniel926
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2011. december 7. szerda, 7:00

Re: megszakítások !! egy pici elakadás!

Hozzászólás Szerző: daniel926 »

Üdv!
If szerkezettel megy csak jelen helyzetben a megszakításokat próbálom életre kelteni.
INT-ben lévő waitms 1 -re átírtam és így már működik, most már megjegyzem hogy maradj rövid.
INT0 és INT1 -et tudom kezelni megszakításként de mi a teendő ha valamely PCINT lábat akarom felhasználni?
C5 láb adatlapi neve PCINT13. Ha viszont ezt írom engedélyezésre kiírja hogy ilyen megszakítás nincsen.

Kód: Egész kijelölése

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

Config Pind.3 = Output                                      'piros led
Config Pinc.5 = Input                                       'gomb
Config Portb.1 = Output                                     'zöld led
Config Int0 = Low Level

On Pcint0 Gombnyomva

Enable Interrupts
Enable Pcint0

Do                                                          'zöld led 100 ms-os villogása alapesetben ha a gomb nincs működtetve
  Set Portb.1
  Waitms 100
  Reset Portb.1
  Waitms 100
Loop

Gombnyomva:                                                 'piros led 1 ms-os fellvillanása ha a gomb működtetve volt
Set Portd.3
Waitms 1
Reset Portd.3
Return


End
Válasz küldése