Hallo, ich bin neu hier und habe vor ca. 1 Woche mit dem Programmieren von Mikrocontrollern über Bascom angefangen. Zuerst habe ich einige Beispiele des "kleinem Bascom AVR Kurs" durchgearbeitet und auch eigene Sachen ausprobiert. Hier zu meinem Problem: Das Programm soll eine Temperatur über einen NTC abfragen und die berechnete Temperatur ca. alle 5 sek über die serielle Schnittstelle zum PC senden. Dies Funktioniert auch, aber in unregelmäßigen Abständen bleibt die Hauptschleife einfach stehen. Der Interrupt wird weiter ausgeführt, jedoch wird nichts mehr gerechnet, sondern alle 5 sek die gleichen Werte über die RS232 gesendet. Hier das Programm: $regfile = "m8adef.dat" $crystal = 8000000 $hwstack = 100 $swstack = 100 $framesize = 100 $baud = 4800 Config Portb.1 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 Config Adc = Single , Prescaler = Auto , Reference = Avcc Config Timer0 = Timer , Prescale = 1024 On Ovf0 Ir_tmr0 Enable Ovf0 Enable Interrupts Start Adc Dim Messergebnis As Word Dim Temperatur As Single Dim A As Single Dim B As Single Dim Rntc As Single Dim Spannung As Single Dim Pwm As Word Dim Pwm_temp As Single Dim Z As Integer Dim A_spannung As Single Dim A_widerstand As Single Dim A_temperatur As Single Dim A_pwm As Word Dim K As Integer Z = 0 Do 'Spannung Berechnen Messergebnis = Getadc(0) Spannung = Messergebnis / 1024 '----------------------------------------------- 'K=13 Spannung = Spannung * 5.08 A_spannung = Spannung 'Widerstand berechnen Rntc = 5.08 / Spannung Rntc = Rntc - 1 Rntc = 1200 / Rntc A_widerstand = Rntc 'Temperatur berechnen A = 25 + 273.15 A = 1 / A B = Rntc / 1500 B = Log(b) B = B / 3975 Temperatur = A + B Temperatur = 1 / Temperatur Temperatur = Temperatur - 273.15 Temperatur = Temperatur - 1 A_temperatur = Temperatur 'PWM berechnen Pwm_temp = Temperatur - 20 Pwm_temp = Pwm_temp / 10 Pwm = Pwm_temp * 255 A_pwm = Pwm Compare1a = A_pwm Loop End Ir_tmr0: Timer0 = 0 If Z = 153 Then Z = 0 Print "Messwert" ; Getadc(0) Print "Spannung: " ; A_spannung Print "Rntc: " ; A_widerstand Print "Temperatur: " ; A_temperatur Print "" Else Z = Z + 1 End If Return An der Stelle wo ich Striche eingefügt habe bleibt meiner Meinung nach die Hauptschleife hängen, ich habe eine Variable "K" definiert und diese mit verschiedenen Werten zwischen alle Befehle gesetzt. Bei K = 13 war schluss. Ich hoffe das ich hier auf Hilfe treffe, denn im Netz finde ich nichts passendes, oder ich verwende die falschen Suchbegriffe :D Vielen Dank Stefan
Gewöhn dir ab, Ausgaben in einer Interrupt Routine zu machen. Ausgaben gehören immer in die Hauptroutine! So, wie machst du das? In der ISR setzt du dir eine Variable auf 1. Und in der Hauptschleife fragst du zb nach den Berechnungen ab, ob die Variable 1 ist und wenn ja, dann machst du die Ausgabe (und setzt die Variable wieder zurück auf 0). generell: Man kann in Interrupt Routinen ein wenig rechnen. Das ist noch ok. Aber im Allgmeinen sieht man zu, dass man aus einer Interrupt Routine so schnell wie möglich wieder rauskommt. Ausgaben dauern dafür auf jeden Fall schon viel zu lange - die will man auf keinen Fall in einer Interrupt Routine haben.
Und noch was: ein AVR hat keine FPU. Man sollte daher nicht unnötig viel mit Fließkommazahlen rummachen... Mentale Defaulteinstellung: Integer mit Festkommaarithmetik. Und wenn man das mit der Festkommaarithmetik gedanklich überhaupt nicht gebacken bekommt: zur Not auch mal eine kleine Zwischenrechnung mit Float, aber dann wieder weiter auf Integer...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.