Időmérés megszakítással

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Jimmi12
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2008. december 10. szerda, 7:00

Időmérés megszakítással

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

Üdv mindenkinek!

A következő problémában kérnék véleményt ill. segítséget:

Szeretnék egy olyan kapcsolást és programot létrehozni, amivel jelenleg 6db (ez késöbb lehet több is) 5V-os jel idejét megmérem és a soros porton kiírja. Az elgondolásom a következő:
- a vezérlő Atmega1284, 16Mhz kristállyal
- a start jel Portb.2-re kötve generál egy INT2 megszakítást ami elindítja a Timer1-et
- a bejövő jelek a PortA és PortC-re vannak kötve
- miután megérkezett a start jel (felfutó él) engedélyezem a pin change interrupt-ot a bemeneteken
- az első (Porta.0) jel a start jel után kb. 1.3ms (max 7ms) után megérkezik, ezután a többi kb. 20ms-onként érkezik
- a pin change megszakítás rutinokban megnézem melyik lábon érkezett a megszakítás és a Times tömb megfelelő helyén tárolom a Timer1 értékét
- a főprogramban, ha érkezik egy kérés (get data) sorban elküldi a Times tömb elemeinek értékét.
A program amit csatoltam nem teljes, nemtudom jó-e az elgondolásom ill. nemtudom a Timer1-et hol állítsam le...

Csatoltam egy idő diagramot és az általam elgondolt programot
szekvencia.jpg
Ha valakinek rá ötlete ill. megnézné hol van benne hiba nagyon megköszönném.

Üdv.: Imi

$regfile = "m1284def.dat" ' specify the used AVR

$crystal = 16000000 ' used crystal frequency
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 20 ' default use 10 for the SW stack
$framesize = 60 ' default use 40 for the frame space

$baud = 19200 ' use baud rate 19200 baud




'The TIMER1 is a versatile 16 bit TIMER.
'This example shows how to configure the TIMER

'First like TIMER0 , it can be set to act as a TIMER or COUNTER
'Lets configure it as a TIMER that means that it will count and that
'the input is provided by the internal clock.
'The internal clock can be divided by 1,8,64,256 or 1024
'$crystal = 16000000 Hz


'1sec kezdőérték
'Crystal=16000000
'Prescale=1024
'1024/16000000=0,000064s
'0,000064*65536=4,194304s
'mivel Timer1 - 16bites Így 0 -65535 -ig Számol
'Azpedig 65536 Lépést Jelent
'1(mp) / 0 , 000064(mp) = 15625
'65536-15625= 49911

Const Maxinput = 10


Dim Times(maxinput) As Word
Dim Command As String * 8
Dim I As Integer
Dim Timer_flag As Bit


Config Timer1 = Timer , Prescale = 1024
Config Porta = Input
Config Portb = Input


Enable Interrupts
Enable Timer1


Timer_flag = 0


Enable Int2
Config Pinb.2 = Input
Portb.2 = 0
Config Int2 = Rising
On Int2 Isr_start_timer1

If Timer_flag = 1 Then

Enable Pcint0 'pin change interrupt engedélyezés pcint0-pcint7
Enable Pcint1 'pin change interrupt engedélyezés pcint8-pcint10

Pcmsk0 = &B11111111 'enable pcint0-pcint7 (portA.0-portA.7)
Pcmsk1 = &B00000011 'enable pcint8-pcint9 (portb.0-portb.1)

On Pcint0 Isr_pcint0 'ugrás Isr_pcint0 megszakítás rutinra
On Pcint1 Isr_pcint1 'ugrás Isr_pcint1 megszakítás rutinra


End If


'--------------- Fő program -----------------------------------

Do

Input , Command

If Command = "get data" Then

For I = 1 To Maxinput

Print Times(i)

next I
End If

Loop

'------------- Megszakítás rutinok! -----------


Isr_start_timer1:

'Timer1 = 49911
Start TIMER1
Timer_flag = 1

Return
'--------------------------------------------------
Isr_pcint0:

If Pina.0 = 1 Then Times(1) = Timer1 '
If Pina.1 = 1 Then Times(2) = Timer1
If Pina.2 = 1 Then Times(3) = Timer1
If Pina.3 = 1 Then Times(4) = Timer1
If Pina.4 = 1 Then Times(5) = Timer1
If Pina.5 = 1 Then Times(6) = Timer1
' If Pina.6 = 1 Then Times(7) = Timer1
' If Pina.7 = 1 Then Times(8) = Timer1

Return
'--------------------------------------------------
Isr_pcint1:

' If Pinb.0 = 1 Then Times(9) = Timer1 '
' If Pinb.1 = 1 Then Times(10) = Timer1

Return

'--------------------------------------------------



End 'end program
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Válasz küldése