Forum: Mikrocontroller und Digitale Elektronik atMega8, Hauptprogramm hängt nach Interrupt


von Stefan K (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.