PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm für Zündung



sachse
26.05.2005, 14:33
Hallo liebe Profis O:)

Ich habe hier ein Prog für eine Zündung. Will bemerken es ist mein erstes Prog.
Wer Lust hat und vor allem Zeit könnte sich das mal durchlesen um einen Neuling kräftig die Meinung zu sagen oder auch nicht :-)


Folgendes sollte jetzt laufen.

Int0 und Int1 werden per Interrupt erfasst und an die Asugänge Portb.0 und Portb.1 ausgegeben.
Der Pegel fällt auf Low.
Eine Zeit von 1ms soll der Pegel so gehalten werden.
Danach soll der Pegel vieder auf High

Wenn die Anzahl der Takte vom INT0 über einen sollwert ansteigt , soll Portb.2 angehen.




$regfile = "m8def.dat"
$crystal = 10000000
$baud = 9600
Config Portb = Output
Portb = &B00000000
Config Portc = Output
Portc = &B00000000
Config Portd = Input
Portd.2 = 1
Portd.3 = 1
Portd.5 = 1

Dim A As Integer
Dim B As Long

Dim Testzeit As Integer
Dim Testanzahl As Integer







Enable Interrupts

On Int0 Links
On Int1 Rechts


On Timer1 Ontimer1

Config Timer1 = Timer , Prescale = 1024
Enable Timer1



'Testrotine der Ausg�ge


Testzeit = 30
Portb.2. = 1

While A <= 4
A = A + 1
Print 0;
Waitms Testzeit
Portb.0 = 1
Portb.1 = 1
Waitms Testzeit
Portb.0 = 0
Portb.1 = 0
Wend
Print "Testrotine abgelaufen,"


'Spulen auf an
Print ",Spulen an,"
Portb.0. = 1
Portb.1. = 1
Waitms 300
Portb.2. = 0



A = 0
B = 0


Do

Enable Int0
Enable Int1
Portb.0. = 1
Portb.1. = 1

Loop


Ontimer1:
Portb.2 = 0
Print A;

B = A /3600
Print B
Timer1 = 5687
If A > 1000 Then
Portb.2 = 1
Print "DB"
End If


A = 0
Return


Links:
A = A + 1
Disable Int0
Portb.0. = 0
Print "L"
Waitms 1
Return

Rechts:
Disable Int1
Portb.1. = 0
Print "R"
Waitms 1
Return





Wenn mir noch mal einer erklären könnte wie ich den besten Prescale-Faktor ermittle und auf was ich Timer1 = XXXX setzte und warum wäre ich ihm auserordentlich dankbar :-)
Das ganze funzt auf meinem myAVR-Board. Nun müsste ich noch meine Kurve einbasteln (anderer Beitrag ,was aber funktionieren sollte)

Danke erst mal vorweg =D>

recycle
26.05.2005, 15:55
Wenn mir noch mal einer erklären könnte wie ich den besten Prescale-Faktor ermittle


Ein Timer zählt bei jedem Takt des Controllers einen Zähler um eins hoch.
Bei einer Taktung von 16MHz wird der Zähler also 16 Mio mal pro Sekunde hochgezählt.
Bei einem 8Bit Timer ist der Zähler aber nur eine 8 Bit Variable, geht also nur bis 2^8 = 255. Bei 256 läuft der Zähler (Timer) über, wird auf 0 zurückgesetzt und es wird ein Interrupt ausgelöst.

Der Prescale ist ein zusätzlicher Faktor um die Intervalle bei denen der Timerinterrupt ausgelöst wird zu verlängern.

Bei einem Prescale von 1 löst der Timer 16Mio/256 mal pro Sekunde aus.
Bei einem Prescale von 8 sind es 16Mio/(256*8 ) oder allgemein:
Taktung/(256*Prescale)

Bei einem 16 Bit Timer fünktioniert es analog, der läuft halt erst bei 2^16 statt bei 256 über.



und auf was ich Timer1 = XXXX setzte

Timer0 ist ein 8 Bit Timer, läuft wie gesagt bei 256 über, löst einen Interrupt aus, wird auf = zurückgesetzt und das Spiel geht von vorne los.

Wenn du in der Interruptroutine den Wert von Timer0 änderst, z.B.
Timer0 = 100, zählt der Timer0 nicht mehr von 0-255, sondern von 100-255. Damit machst du den Timerintervall also kürzer.

Mit der Kombination von Prescale und Wert für Timer0 kannst du dir den Timerintervall auf die Frequenz legen die du benötigst.

Beim 16 Bit Timer (Timer1) funktioniert das genauso, nur halt mit 2^16.

Im Downloadbereich gibt es ein Programm, das die Berechnung automatisch ausführt und den passenden Quellcode erstellt. Da brauchst du nur deine Quarzfrequenz und die Gewünschte Frequenz für den Timerinterrupt eingeben.

sachse
26.05.2005, 19:39
Danke für deine Antwort.
Damit kann ich was anfangen. =D>

sachse
28.05.2005, 19:20
Beim Timer1 also :

16Bit = 65536
10MHz = 39062,50 Takte/sec
bei Prescale = 64 = 2,3841858 Hz/sec

Wenn ich jetzt Timer1 = 1 machen würde , käme ich an meine 1Hz schon nahe ran.

Richtich ?
Kann ich gleitkomma verwenden ? 1.384 blablabla .

Wenn ich 1/10sec. benötige, welche Timer wäre besser ?

Dankle

=P~