PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS1820 CRC-Fehler - Timerproblem?



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

becki133
16.06.2008, 08:44
Hallo Christian,

Wenn du noch das Ursprüngliche Programm hast
wo alles ausser der PWM lief .
Ersetze dort mal die Software PWM durch eine Hardware PWM .
Dann sollte es gehen .

Habe den code unten eingefügt .

Gruß Holger



'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000


'konfiguriert timer2 für PWM
Config Timer2 = Pwm , Prescale = 128 , Compare = Clear



'Start des Timers
Enable Timer2
Timer2 = 0
Start Timer2

DO

Ocr2 = Hier deinen wert oder deine Variable eintragen .

'bei mir ist die ausgabe der PWM an oc.2 pinb.3 aber ich habe auch einen Mega 8
LOOP
END

goof1980
16.06.2008, 12:46
Ich glaube ich hatte das schonmal versucht. Da wollte aber BASCOM nicht und hat nen Fehler gebracht. Hier im Forum hatte das Problem auch jemand anderes, hatte irgendwie mit AT8515 und Hardware-PWM auf Timer 0 zu tun. Ich probiere es nochmal. Ansonsten muss ich mal nen anderen Prozessor nehmen.

Danke.

Gruss Christian

becki133
16.06.2008, 13:22
Hallo ,
So wie das Programm unten aussieht
Läuft es bei mir Problemlos durch Bascom durch .





$regfile = "m8515.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000


'konfiguriert timer0 für PWM
Config Timer0 = Pwm , Prescale = 128 , Compare = Clear



'Start des Timers
Enable Timer0
Timer0 = 0
Start Timer0

Do

'So könntest du 2 Motoren ansteuern :-)
'Wenn du nur einen hast brauchst du nur einen PWM kanal angeben
Pwm1a = 100
Pwm1b = 200

'Die ausgabe ist dann bei dir an PD.5 OC1A und/oder PE.2 OC1B
Loop

END


Gruß Holger

goof1980
16.06.2008, 18:48
:-(

bei mir will das nicht. ich direkt den code von dir reinkopiert, da kommt erstmal die meldung das der wert 128 beim prescale nicht anwendbar ist. hab den also einfach mal geändert. dann kommt kein fehler, es kommt aber auch nichts am ausgang an.
woanders hab ich gesehen das ich den port noch als ausgang definieren muss, hab also noch
Config Portd.5 = Output
reingeschrieben. die led an dem anschluss leuchtet dauerhaft.

mach ich was falsch?

gruss Christian

becki133
16.06.2008, 19:44
Hallo ,

Nein Falsch machst du nicht´s das die LED dauerhaft Leuchtet ist OK.
Denn die PWM wird ja auch dauerhaft erzeugt .

"Du solltest bei der Zeile PWM1A = und hier eine Variable mit dem Wert "

Du kannst jetzt aber über dem Wert dem du PWM1a oder 1b zuweist die Helligkeit deiner LED steuern .
Also auch die Drehzahl deines Motors .

ALso um bei deinem Projekt zu bleiben .
Das was du mist ist Kalt dann geht der wert der PWM auf null.
Weil der Lüfter muß ja nicht Laufen .
Wird es Warm dann soll der Lüfter sich ja Langsam Anfangen zu drehen .
Also Steigt der Wert in der PWM langsam an .

Wenn das alles sehr unverständlich war Les dir mal den Beitrag im WIki zum Thema PWM durch der ist echt gut .

Und halt mal ein Meßgerät an dem Ausgang wo die PWM ist und Spiel mit den Werten .
Dann siehst du wie sich die Spannung ändert .

Gruß Holger

goof1980
17.06.2008, 17:41
hallo,

das mit dem pwm ist schon klar. das merkwürdige ist nur, wenn ich das softwareseitig mache dann sehe ich nen klaren unterschied zwischen einem kleinen und einem großen wert (hell und dunkel). aber hier sieht es immer gleich aus. und müsste die led nicht aus bleiben wenn ich pwm1a auf 0 setze?

gruss Christian