goof1980
15.06.2008, 22:48
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:
' 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
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:
' 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