Forum: Mikrocontroller und Digitale Elektronik Bascom Timer flag


von Groedi2001 (Gast)


Lesenswert?

Hallo ich hab ein kleines Problem mit dem setzen eines Timerflags.

Hier erstmal das Programm:
######################################################################## 
####
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 38400
Config Portb.2 = Output

Config Timer1 = Timer , Prescale = 256 Timer1 = 34285
'Vorladewert 8mhz / 256 = 31250 Der Zähler Würde Normal Von 0 Bis 65535 
Zählen
'Wenn Er Jedoch Bei 34285 Beginnt Läuft Er Jede Sek über


Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc

Dim Ad_w(25) As Word                                        '25 
Variablen als Word dimensioniert
Dim Wert As Word                                            'Variable 
als Word Variable als Word dimensioniert
Dim I As Byte                                               'Variable 
als Byte dimensioniert
Dim Puffer As Single                                        'Variable 
als Single dimensioniert

Dim Float As Single                                         'Variable 
als Single dimensioniert
Float = 3.48
Dim Flag As Byte
Enable Interrupts
Enable Timer1
On Timer1 Isr_timer1



Do
If Flag.1 = 1 Then
   Flag.1 = 0
 For I = 0 To 24                                            'Beginn 
For-Schleife mit Zählen bis 24
   Ad_w(i) = Getadc(0)                                      'Messen 
AD-Wert an Pin A0
   Waitms 5                                                 '5ms warten
 Next                                                       'weiter wenn 
For-Schleife abgearbeitet ist

 For I = 0 To 24                                            'Beginn 
For-Schleife mit Zählen bis 24
   Wert = Wert + Ad_w(i)                                    'addiere 
Wert mit dem AD-Wert der Variabele Ad_w entsprechend I
 Next                                                       'weiter wenn 
For-Schleife abgearbeitet ist

 Wert = Wert / 25                                           'Bilden des 
Mittelwert durch division mit 25

 Puffer = Wert                                              'Inhalt 
Variable Wert wird in Variable Puffer geschrieben
 Puffer = Puffer - 425                                      'Vom Puffer 
wird der 0 °C Offset abgezogen

 Puffer = Puffer / Float                                    'Berechung 
der Temperatur (5.3125 = Bit pro °C Änderung)


 Print "Temp " ; "; " ; Puffer ; " ; " ; " AD_Wert" ; "; " ; Wert 
'Ausgabe der Variablen Puffer und Wert im Terminalprogramm
 Waitms 875                                                 '875ms 
warten um Programmlaufzeit von 1s zu erreichen

 Wert = 0
End If

Loop

Isr_timer1:

Flag.1 = 1

Timer1 = 34285
Return
####################################################################

Das Problem liegt darin das der Timer nur einmal beim EInschalten oder 
Reset aufgerufen wird.

Wenn ich das Programm ohne jede Berechnung ausführe sondern nur beim 
Flag den Adc ausgebe funktioniert es.

Könnt ihr mir einen Tip geben?

von Weingut P. (weinbauer)


Lesenswert?

der erste Fehler ist mal, das Bascom Arrays ab 1 beginnt nicht mit 0

also :

an stelle von
For I = 0 To 24

dann

For I = 1 To 25


wozu das Waitms 875 ? du nutzt doch nen Timer, für das Flag,
dann mach den Preload halt so groß, dass 1 Sekunde kommt.

von Groedi2001 (Gast)


Lesenswert?

Das ändert aber auch nichts an dem Problem das es nur geht wenn der ADC 
ausgelesen wird und das es nicht geht wenn man berechnet.

Wäre für weitere Tips sehr dankbar.

von Groedi2001 (Gast)


Lesenswert?

OK es wird jetzt Sekündlich ausgegeben.

Aber noch eine Frage wie kommt es das die Ausgabe bei Print nicht 
richtig Sauber ist

bsp:

Temp ; 15.804596898 ;  AD_Wert; 480ŠTemp ; 15.804596898 ;  AD_Wert; 480
Temp ; 15.804596898 ;  AD_Wert; 480
Temp ; 16.091953276 ;  AD_Wert; 481ŠTemp ; 15.804596898 ;  AD_Wert; 
480
                                                                         Temp 
;
15.804596898 ;  AD_Wert; 480
Temp ; 15.804596898 ;  AD_Wert; 480ŠTemp ; 15.804596898 ;  AD_Wert; 480
Temp ; 15.804596898 ;  AD_Wert; 480
ŠTemp ; 15.804596898 ;  AD_Wert; 480
Temp ; 15.804596898 ;  AD_Wert; 480
Temp ; 15.804596898 ;  AD_Wert; 480

Also es wird nicht immer auf einer neuen Teile ausgegeben und manchmal 
kommen auch zusätzliche zeichen rein, habt ihr nen tip.

die Baud, Pari etc sind alles identisch eingestellt.

von Weingut P. (weinbauer)


Lesenswert?

hmmm 8MHz ... nimm entweder nen Baudratenquarz oder geh mit der Baudrate 
runter 19200 oder 9600

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.