-         

Ergebnis 1 bis 7 von 7

Thema: DS1820 CRC-Fehler - Timerproblem?

  1. #1

    DS1820 CRC-Fehler - Timerproblem?

    Anzeige

    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    07.03.2008
    Ort
    Bremen
    Alter
    43
    Beiträge
    63
    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

    Code:
    '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

  3. #3
    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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.03.2008
    Ort
    Bremen
    Alter
    43
    Beiträge
    63
    Hallo ,
    So wie das Programm unten aussieht
    Läuft es bei mir Problemlos durch Bascom durch .



    Code:
     $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

  5. #5


    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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.03.2008
    Ort
    Bremen
    Alter
    43
    Beiträge
    63
    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

  7. #7
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •