Hallo,

ich habe mich als Einstieg mit Bascom gleich an etwas größeres gewagt.
Es geht um eine kleine Lüftersteuerung, Temperaturmessung mit DS1820, Ausgabe der Temperatur über 7-Segment mit Schieberegistern (SPI) und Ansteuerung des Lüfters mit PWM (noch Theorie, derzeit nur LED)

Zum Test wird ein Atmega8515 genutzt, 8MHz Quartz.

Timer 0 nutze ich zur PWM Erzeugung (Software-PWM).
Timer 1 gibt alle 0,5 Sekunden einen Interrupt, startet die Temperaturmessung, Umrechnung, Ausgabe der Temperatur auf die Anzeige und evtl. Änderung des PWM-Wertes.
Dies funktioniert auch sehr gut, mit einem kleinen Problem: Timer 1 dauert zu lang und das PWM des Timers 0 erhält Pausen. Dies spiegelt sich folgendermaßen wieder: eine LED zeigt das PWM an, wird also gedimmt angezeigt. und alle 0,5 Sekunden bleibt diese für eine längere Zeit aus oder voll an.

Ich bin somit davon ausgegangen das es daran liegt das Timer 1 zu lang für die Abarbeitung braucht da die komplette Messung, Ausgabe usw. direkt dort drin stehen.

Ich habe Timer 1 somit geändert, dort wird nur ein Bit gesetzt, mehr nicht.
In der Hauptschleife wird auf dieses Bit kontrolliert. Ist dieses gesetzt wird es wieder zurückgesetzt und das komplette Skript von ehemals Timer 1 (Messung, Ausgabe, PWM-Änderung) gestartet. Beide Timer sollten also kaum Zeit brauchen.

Allerdings habe ich jetzt das Problem das die Anzeige nichts sinnvolles mehr anzeigt. Dort wo normalerweise die Temperatur steht stehen jetzt 3mal dasselbe Zeichen. Und ich habe rausgefunden das es daran liegt das ständig ein CRC-Fehler kommt.

Auszug der Temperaturmessung:
Code:
' Deklaration
$regfile = "m8515.dat"                                      ' für Mega8515
$crystal = 8000000                                          ' für 8MHz Quarz

' Temperatursensor (DS1820) - Port festlegen
Config 1wire = Portc.5

' SPI Bus (Hardware) als Master konfigurieren
Config Spi = Hard , Master = Yes , Polarity = Low , Phase = 1 , Data Order = Lsb
Config Portc.2 = Output                                     ' !!! für D718D
Config Portc.3 = Output                                     ' !!! für D718D
Portc.2 = 1                                                 ' !!! für D718D
Spiinit                                                     ' SPI Bus initialisieren

' Timer 0 ist für die PWM der Lüfter zuständig
Config Timer0 = Timer , Prescale = 1                        ' Konfiguriere Timer0
On Timer0 Pwmausgabe                                        ' verzweige bei Timer0 überlauf zu Zeitkontrolle
Enable Timer0                                               ' schalte den Timer0 ein
Timer0 = 0                                                  ' Timer0 soll von 0

' Timer 1 ist für die Laufzeit zuständig, wird alle 0,5 Sekunden ausgelöst
Config Timer1 = Timer , Prescale = 64                       ' Konfiguriere Timer1
On Timer1 Zeitkontrolle                                     ' verzweige bei Timer1 überlauf zu Zeitkontrolle
Enable Timer1                                               ' schalte den Timer1 ein
Timer1 = 34286                                              ' Timer1 soll von 34286

' Interrupts einschalten
Enable Interrupts

......

Do
  If Timerpuls1 = 1 Then
    Timerpuls1 = 0

    ' Temperatur abfragen
    1wreset
    1wwrite &HCC
    1wwrite &H44
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Ar(1) = 1wread(9)
    ' Wenn CRC korrekt war dann Ausgabe
    If Ar(9) = Crc8(ar(1) , 8) Then
      ' Genauere Temperaturberechnung auf 0,1 °C
      ......
    Else
      ......
    End If

  End If
Loop
End

' ##### Hauptkontrolltimer (Timer1) ##### 
Zeitkontrolle:                                              '0,5 Sekunden sind um
  ' Timer1 wieder setzen
  Timer1 = 34286
  ' 0,5 Sekunden sind um
  Timerpuls1 = 1
Return

' ##### PWM-Schleife (Timer0) ##### 
Pwmausgabe:
  If Korrekturwert >= Pwmwert Then
    If Korrekturwert = 0 Then
      Porta.0 = 1
    Else
      Porta.0 = 0
    End If
  Else
    Porta.0 = 1
  End If
  Incr Pwmwert
  If Pwmwert > 255 Then Pwmwert = 0
Return
Ich habe jetzt keine Ahnung mehr wo ich ansetzen kann. Ich hoffe es hat jemand vielleicht eine Idee.

Vielen Dank vorab.

Gruss Christian