PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahlmessung mit mega8, debugger gesucht ;)



2strokePino
03.07.2009, 18:44
Hallihallo RN Community,

ich versuche mir derzeit einen dzm und tacho für meine cross mit einem mega8 zu bauen. als hardware habe ich das myavr board mit lpt anschluss.
zur ausgabe habe ich ein 16*2 display.

ich habe in bascom einen code geschrieben, vermute da aber noch nen haufen bugs, wo ich aber einfach nicht weiter weiß, da ich erst durch den elektrotechnik leistungskurs in der schule zur elektronik kam. die ganze mikrocontrollerei habe ich mir soweit möglich dann selbst versucht beizubringen.


$regfile "m8def.dat"
$crystal = 3686400
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcdpin = 16 * 2
Config Portb = Output

Dim Umin As Integer 'Drehzahl
Dim Speed As Integer 'Geschwindigkeit
Speed = 113
Dim Numa As Integer 'zahl1 für berechnung
Dim Numb As Integer 'zahl2 für berechnung


Config Int0 = Low Level 'int0
Enable Int0
On Int0 Isrcounter
Config Timer1 = Timer , Prescale = 64 'timer1
Enable Timer1
On Timer1 Isrtimer
Enable Interrupts
Timer1 = 36735

Do
'Waitms 100 'Display
'Cls

Locate 1 , 1
Lcd "Drehzahl:"

Locate 1 , 11
Lcd Umin

Locate 2 , 1
Lcd "Speed: "

Locate 2 , 8
Lcd Speed

Locate 2 , 11
Lcd "Km/h"

Loop
End

Isrcounter:
Incr Numa 'Zähler durch Interrupt
Return

Isrtimer: 'Timer, alle 500ms Überlauf
Cls
Timer1 = 36735
Numb = Numa * 2
Umin = Numb * 60
Numa = 0
Numb = 0
Return

ich hatte mir gedacht durch einen timer in 500ms die anzahl der impulse zu zählen und dann auszugeben.
das display funktioniert und zeigt mir auch was an. aber ich weiß noch nicht so recht wie ich alles beschalten mus.

Da ich das signal gern induktiv, um das zündkabel, abnehmen möchte, tun sich mir da noch einige rätsel auf aber das wird schon noch werden. mir wäre jetzt erst einmal die software wichtig, da wenn ich dann int0 mit der masse verbinde und wieder davon weg gehe, wo ja ne fallende flanke entsteht, zeigt mir das display auch etwas an aber halt riesige zahlen und zum teil auch negative.
nach recht kurzer zeit scheint sich der atmel dann aufzuhängen weil das display dann nur noch wirres, schnell wechselndes zeug anzeigt.

meine vermutung es liegt an den langen isr, aber ich weiß nicht wie ich das besser machen soll.

es wäre toll wenn mir hier geholfen werden könnte, ich bin halt einfach noch ein verdammt blutiger anfänger.

danke im vorraus

for_ro
03.07.2009, 20:48
Hallo,
hier mal ein paar "Fehler":

Integer sind in Bascom ganze Zahlen mit einem Wertebereich von -32768 bis +32767, also etwa mittig um 0. Wenn du bei einem Wert von 32767 um 1 erhöhst, hat die Variable anschliessend einen Wert von -32768.
Es gibt auch den Typ Word, ganze positive Zahlen von 0 bis 65535. Du solltest alle Variablen als Word definieren.
Schau dir mal in der Hilfe unter Language Fundamentals nach. Da kommst du hin, wenn du z.B. das Wort Integer markierst und dann F1 drückst.

Config Int0 = Low Level gibt an, dass die ISR angesprungen wird, wenn am Eingang PinD.2 (INT0) eine 0 anliegt. Dies passiert kontinuierlich, solange bis am Eingang eine 1 kommt. Du wirst wohl eher
Config Int0 = Falling wollen. Dann wird die ISR nur einmal ausgeführt, und zwar dann, wenn die Spannung am Eingang das erste Mal auf 0 fällt. Danach muss erst wieder eine 1 kommen, bevor der Interrupt wieder ausgeführt wird.

Deine Timer ISR wird nur alle 500ms aufgerufen, die Int0 ISR bei max 12.000 U/min alle 5ms. Dazwischen hat der µC nichts besseres zu tun, als andauernd die Werte zum Display zu schreiben, obwohl sich da ja garnichts ändert. Um dies zu verhindern würde ich dir empfehlen, in der Timer ISR ein Flag zu setzen, z.B. Anzeige_flag=1. In der Do Loop fragst du dann
If Anzeige_flag=1 Then
Anzeige_flag=0
'alle deine LCD Befehle
End If

Die Anzeige wird dann sehr ruhig stehen.

Gruß

Rolf

2strokePino
03.07.2009, 22:57
Super sache! danke vielmals für die schnelle antwort!
hat alles bestens funktioniert und läuft jetzt auf anhieb. hätte nicht gedacht dass das so fix geht. danke nochmals.

ich poste es noch mal zur kontrolle:


$regfile "m8def.dat"
$crystal = 3686400
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcdpin = 16 * 2
Config Portb = Output

Dim Umin As Word 'Drehzahl
Dim Speed As Word 'Geschwindigkeit
Speed = 113
Dim Numa As Word 'zahl1 für berechnung 'zahl1 für berechnung
Dim Numb As Word
Dim Anzeige_flag As Bit 'zahl2 für berechnung


Config Int0 = Falling 'int0
Enable Int0
On Int0 Isrcounter
Config Timer1 = Timer , Prescale = 64 'timer1
Enable Timer1
On Timer1 Isrtimer
Enable Interrupts
Timer1 = 36735

Do

If Anzeige_flag = 1 Then
Anzeige_flag = 0
'Display
Cls
Locate 1 , 1
Lcd "Drehzahl:"

Locate 1 , 11
Lcd Umin

Locate 2 , 1
Lcd "Speed: "

Locate 2 , 8
Lcd Speed

Locate 2 , 11
Lcd "Km/h"

End If

Loop
End

Isrcounter:
Incr Numa 'Zähler durch Interrupt
Return

Isrtimer: 'Timer, alle 500ms Überlauf
Timer1 = 36735
Numb = Numa * 2
Umin = Numb * 60
Numa = 0
Numb = 0
Anzeige_flag = 1
Return

kannst du mir evntl auch bei der beschaltung jetzt helfen oder muss ich da ein extra thema aufmachen?
weil wenn ich einen draht bei int0 anschließe und den nur mit den händen berühre habe ich 3000 umin aufm display stehen. hat das was mit dem entprellen zu tun? und wenn ich dann das signal um das zündkabel abnehmen möchte müsste ich das dann ja verstärken. meine idee mit nem klassischem transistor? is das ne gute idee oder wird das nix?

grüße, pino

for_ro
03.07.2009, 23:16
Die 3000U/min sind ok. Das entspricht 50Hz. Die strahlen ein, weil du keinen PullUp an dem Pin hast. Den PullUp kannst du in dem µC einschalten, einfach mit
PortD.2=1
Ich würde an deiner Stelle auch noch ein
Config PinD.2 = 0 oder DDRD.2=0
hinzufügen. Das ist zwar der Standard beim Einschalten, aber es wird dann in deinem Programm noch einmal deutlich, dass du den Pin als Eingang benutzen willst.

Mit der Schaltung zum Auswerten des Zündsignals kann ich dir leider nicht helfen. Vielleicht kann dir hier jemand helfen oder du musst mal in den einschlägigen Foren nachschauen.

Gruß

Rolf

2strokePino
04.07.2009, 20:50
Super sache! ich bedanke mich recht herzlich bei dir! funktioniert 1a die software. :D

nur mal noch zum verständnis, PortD.2 = 1 setzt den sozusagen auf high und wenn dann auf low geht, dann springt der mikrocontroller in die isr. Aber was genau sagt das Config PinD.2 = 0?

MfG Pino

2strokePino
06.07.2009, 13:17
auch nochmal hier ein super dankeschön an dich rolf! hab jetzt durch hilfe anderer die signalaufnahme hin bekommen und läuft 1a, ohne probleme bis über 15.000 umin!

MfG Pino

2strokePino
13.07.2009, 15:49
Hallihallo, nochmal ich,

aus irgend einem grund hängt sich mein dzm ab und zu auf, manchmal nach sehr kurzer zeit, aber ich weiß noch nicht so richtig warum. ich dachte mir jetzt mal die messung der drehzahl durch das messen der zeit zwischen den impulsen zu bestimmen. einziger haken meine software macht nicht was se soll ;)

hier die erklärung dazu, vll könnte nochmal einer von euch mir auf die sprünge helfen. problem ist übrigenz das mein display nichts anzeigt.

danke im vorraus

int0 ist der interrupt der zündung
timer1 misst die zeit zwischen den impulsen
timer0 sollte eigentlich etwa alle halbe sekunde mein dislpay aktualisieren

berechnung der drehzahl:
Numb = Numa (vom timer gezählt) / 0,1229079 (Wert aus 16Bit Timer / Prescaled frequenz)
Numc = Numb / 65536 (16Bit Timer)
Numd = 1 / Numc
Umin = Numd * 60

ich hoffe das versteht einer, ist recht verwirrend, vll liegt da auch schon ein fehler?


$regfile "m8def.dat"
$crystal = 3686400
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcdpin = 16 * 2
Config Portb = Output

Config Pind.2 = 0
Portd.2 = 1

Dim Umin As Word 'Drehzahl
Dim Speed As Word 'Geschwindigkeit
Speed = 113
Dim Numa As Word 'zahl1 für berechnung 'zahl1 für berechnung
Dim Numb As Single
Dim Numc As Single
Dim Numd As Single
Dim Zahler As Word 'zahl2 für berechnung

Config Int0 = Falling 'int0
Enable Int0
On Int0 Isrcounter

Config Timer0 = Timer , Prescale = 1024
Enable Timer0
On Timer0 Isrdisplay

Config Timer1 = Timer , Prescale = 8 'timer1
Enable Timer1
On Timer1 Isrtimer

Enable Interrupts
Timer1 = 0

Do

If Zahler = 7 Then

Zahler= 0

Numb = Numa * 0.1229079 'Berechnung umin
Numc = Numb / 65536
Numd = 1 / Numc
Umin = Numd * 60

Cls

Locate 1 , 1
Lcd "Drehzahl:" 'Display

Locate 1 , 11
Lcd Umin

Locate 2 , 1
Lcd "Speed: "

Locate 2 , 8
Lcd Speed

Locate 2 , 11
Lcd "Km/h"

End If

Loop
End

Isrcounter:
Numa = Timer1
Timer1 = 0 'Zähler durch Interrupt
Return

Isrdisplay:
Incr Zahler
Return

Isrtimer: 'Wenn Timer1 Überlaufen sollte
Umin = 0
Return

2strokePino
15.07.2009, 06:54
Hat denn keiner ne ahnung davon? ich glaube mein problem liegt irgendwo in dem zyklus vom refreshen des displays.

Danke

MfG Pino