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:
Ich habe jetzt keine Ahnung mehr wo ich ansetzen kann. Ich hoffe es hat jemand vielleicht eine Idee.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
Vielen Dank vorab.
Gruss Christian







Zitieren

Lesezeichen