- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 22

Thema: Tiny13(A), PWM, $crystal: Komisches Verhalten

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.07.2012
    Beiträge
    19

    Rotes Gesicht

    ... niemand sacht das, aber ich bin schon so lange in Foren unterwegs (da gab es das WWW noch gar nicht), das ich da vorsichtig geworden bin

    Sodele... Software ist fertig und tut, was sie soll. Anbei der Quellcode zur allgemeinen Verwendung, falls es wer braucht.

    PB0 befeuert direkt einen kleinen FET (3A- Typ aus der Grabbelkiste), der wiederum einen 1:10 Übertrager mit umzu 6V befeuert, der wiederum auf der Sekundärseite eine EL- Folie zum leuchten bringt.
    Der Teil ist erst im Kopf fertig und wird wohl morgen zusammen gesteckt.

    PB1 kümmert sich um Änderungen bei Druck auf das Wählrad, PB2 und PB3 um Statusänderungen beim Drehen des Rades... Welches Rad fragt ihr? Wählrad RC Sender Spektrum DX- Serie... Und nu ist wohl auch klar, das ich nicht nur schnöde das Display beleuchten möchte, sondern das auch schön haben will

    Code:
    $regfile = "attiny13.dat"
    $crystal = 4800000
    
    '$prog &HFF , &H72 , &HFF , &H00                                                 ' 9,6 MHz, Vorteiler aus
    $prog &HFF , &H75 , &HFF , &H00                                                 ' 4,8 MHz, Vorteiler aus
    
    Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 1                 'PWM im Schnellgang
    
    Dim Z As Byte , T As Bit , L As Byte                                            ' Z= Zähler P-Breite, T= dunkel/hell, PWM Startwert
    Dim M As Bit , N As Bit , W As Byte , D As Byte                                 ' Merker für Rollen Eingänge, Geschwindigkeit Dimmer, AN- Zeit
    L = 8 : W = 10 : D = 10                                                         ' Vorbelegen
    
    Config Pinb.0 = Output                                                          ' PWM Ausgabe
    Config Pinb.1 = Input                                                           ' INT0 Eingang (Klicktaste)
    Config Pinb.2 = Input                                                           ' Eingang Rollen links
    Config Pinb.3 = Input                                                           ' Eingang rollen rechts
    Portb.1 = 1                                                                     ' Pullup einschalten
    Portb.2 = 1                                                                     ' Pullup einschalten
    Portb.3 = 1                                                                     ' Pullup einschalten
    
    On Int0 Isr_display                                                             ' Sprungziel bei Auslöung
    Config Int0 = Change                                                            ' Jeden Pegelwechsel nutzen
    Enable Int0                                                                     ' INT0 einschalten
    
    Gosub Isr_display                                                               ' Erstmal beim EInschalten Licht machen
    
    Do                                                                              ' Start Hauptschleife
       While T = 1                                                                  ' Licht ist an, also Ausdimmen
          Decr Z
          Pwm0a = Z
          If Z = L Then T = 0                                                       ' Ende, wenn Startwert erreicht
          Waitms W                                                                  ' Geschindigkeit des Dimmens
       Wend
    
       If Pinb.2 = M Then                                                           ' Start Abfrage der Rollen- Eingänge
          M = 1 : Gosub Isr_display                                                 ' und Sprung, wenn sich was geändert hat
       End If
       If Pinb.2 = M Then
          M = 0 : Gosub Isr_display
       End If
       If Pinb.3 = N Then
          N = 1 : Gosub Isr_display
       End If
       If Pinb.3 = N Then
          N = 0 : Gosub Isr_display
       End If                                                                       ' Fertig mit der Auswertung
    Loop
    
    
    Isr_display:                                                                    ' INT- und Sprungziel
       Disable Int0                                                                 ' Erstmal für Ruhe sorgen
       While T = 0
          Incr Z
          Pwm0a = Z
          If Z = 128 Then T = 1                                                     ' Bis 50% Puls/Pause hochzählen
          Waitms W
       Wend
    
       Wait D                                                                       ' Display für D Sekunden an lassen
    
       Enable Int0                                                                  ' Ab jetzt wieder horchen
    Return                                                                          ' und zurück zum Hauptprogramm
    
    
    End

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Schön dass es klappt!
    Aber es wäre gar nicht nötig gewesen die Resonanzfrequenz des Übertragers anzupassen - denn man kann die PWM-Frequenz auch nahezu stufenlos variieren. Das geht im sogenannten "CTC"-Modus. CTC heißt "Clear Timer on Compare". Der Timer zählt in diesem Modus von 0 aufwärts, und wenn er den Wert des OCR-Registers erreicht, toggelt er einen Ausgang und wird sofort auf 0 gesetzt, um wieder von vorne zu beginnen. Heißt also, dass der Ausgang umso öfter getoggelt wird, je niedriger der Wert im OCR-Register ist - und den kann man ja in 256 Schritten variieren. In den Datenblättern sind sehr schöne, aufschlussreiche Grafiken hierzu abgebildet. Auch wenn´s jetzt auch schon mit der "festen" Frequenz funktioniert - aber vielleicht brauchst Du ja irgendwann noch mal eine variable Frequenz

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.07.2012
    Beiträge
    19
    ... hu? Da ich sowieso noch nicht fertig bin, lass mich mal wissen, wie man dieses Register in Bascom setzen kann? Ich finde da nix zu (oder ich sehe es einfach nicht). Einfach ein compare0a=x klappt ja so nicht ...

    BTW:
    Nach einigem Rumspielen habe ich mal eine andere Merkwürdigkeit entdeckt...
    Wenn man die Wait- Statements mit den vorbelegten Variablen W und D besetzt, schmiert der Tiny irgendwann ab, wenn man abwechselnd einen INT und eine der beiden anderen Eingänge triggert. Wenn man aber die Wait's mit fixen Werten setzt, dann passiert das nicht

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Der Interrupt bringt wahrscheinlich die Waitschleife durcheinander.
    Wenn ein Interrupt ausgelöst wird, müssen bestimme Registerinhalte gesichert werden. Eventuell macht dir das Schwierigkeiten.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    30.07.2012
    Beiträge
    19
    ... das kann natürlich sein, ist natürlich doof, wenn dem so sein sollte *hmmmm*


    BTW: Meine Nachbildung der "Change" Funktion für die anderen beiden Engänge funktioniert nicht korrekt; ich rätsel noch... oder geh ins Bett ...

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Da ich sowieso noch nicht fertig bin, lass mich mal wissen, wie man dieses Register in Bascom setzen kann?
    Also, ich setzte bei PWM-Anwendungen die beiden relevanten Register immer direkt. Wenn man sich da einmal reingedacht hat, ist es eigentlich ziemlich einfach. Eine gute Beschreibung des CTC-Modus findest Du auf Seite 63 im Datenblatt des Tiny13.

    Falls Du es aber ohne viel Kopfzerbrechen testen möchtest, probier mal folgendes:

    Code:
    DDRB.0=1 'OC0A als Ausgang konfigurieren
    TCCR0A = &B01000010
    TCCR0B = &B00000001
    Wenn Du diesen Code vor die Do-Loop-Schleife stellst, müsste am Port B.0 ein Rechtecksignal anliegen, dessen Frequenz zwischen CLK/2 (wenn OCR0A = 0) und CLK/512 (wenn OCR0A = 255) liegt.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Zitat Zitat von M_I_B Beitrag anzeigen

    BTW:
    Nach einigem Rumspielen habe ich mal eine andere Merkwürdigkeit entdeckt...
    Wenn man die Wait- Statements mit den vorbelegten Variablen W und D besetzt, schmiert der Tiny irgendwann ab
    Wen Du keine Stackwerte definierst, ist das weiter nicht verwunderlich.

    MfG
    Rone

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    30.07.2012
    Beiträge
    19
    @Rone: Wo du Recht hast ^^

    @Sauerbruch: Ok, so weit, so gut. Aber wie verändere ich das jetzt?

    @all: der obige Code ist Murks, da einige Unschönheiten. Ich habe es mal ganz anders gemacht und die Unschönheiten (bis auf die PWM- Frequenz) sind w.e.c.h. ...
    Die Dokuentation habe ich erstmal weg gelassen, da mich dieser eingebaute Editor echt elendig genervt hat; kann man da nicht irgendwie Notepad++ integrieren?!? *grrr*

    Code:
    $regfile = "attiny13.dat"
    $crystal = 4800000
    $hwstack = 16
    $swstack = 16
    $framesize = 16
    '$prog &HFF , &H72 , &HFF , &H00                                                ' 9,6 MHz, Vorteiler aus
    $prog &HFF , &H75 , &HFF , &H00                                                 ' 4,8 MHz, Vorteiler aus
    
    
    
    Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 1                 'PWM im Schnellgang
    'Ddrb.0 = 1                                                                      'OC0A als Ausgang konfigurieren
    'Tccr0a = &B01000010
    'Tccr0b = &B00000001
    
    Dim Z As Byte , T As Byte , L As Byte
    Dim Du As Integer , Dd As Integer , Ot As Integer
    L = 8 : Du = 2000 : Dd = 2000 : Ot = 1500
    
    Config Pinb.0 = Output
    Config Pinb.1 = Input : I1 Alias Pinb.1 : Portb.1 = 1
    Config Pinb.2 = Input : I2 Alias Pinb.2 : Portb.2 = 1
    Config Pinb.3 = Input : I3 Alias Pinb.3 : Portb.3 = 1
    
    
    
    Enable Pcint0
    Enable Interrupts
    Pcmsk = &B001110
    On Pcint0 An
    
    
    
    Hell:
    
       While T = 0
          Incr Z
          Pwm0a = Z
          If Z = 128 Then T = 1
          Waitus Du
       Wend
    
       If T = 1 Then
          Waitms Ot
       Else
          Z = 127 : Goto Hell
       End If
    
       While T = 1
          Decr Z
          Pwm0a = Z
          If Z = L Then T = 2
          Waitus Dd
       Wend
    
       While T = 2
          nop
       Wend
       Goto Hell
    
    End
    
    
    An:
       T = 0
       If Z > 125 Then Z = 127
    Return

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    30.07.2012
    Beiträge
    19
    ... ich hätte da noch eine Frage *duck...*

    Wie kann ich während der Laufzeit den als PWM laufenden Timer anhalten resp. das AUsgangssignal auf LOW setzen (und später wieder einschalten)??

    Ich habe es jetzt versucht mit Disable Timer0, pinb.0=0, portb.0=0. Nichts funktioniert


    Hat sich erledigt: Einfach Pwm0a = 0 und anschliessend ein Config Powermode = Powerdown funktioniert perfekt
    Geändert von M_I_B (17.09.2012 um 21:31 Uhr)

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Wie kann ich während der Laufzeit den als PWM laufenden Timer anhalten resp. das AUsgangssignal auf LOW setzen (und später wieder einschalten)??
    Auch wenn´s mit PWM0A = 0 klappt, gibt´s noch zwei einfachere Methoden (die dem Verständnis im allgemeinen und speziellen auch förderlich sein könnten):

    "disable timer0" wird oft anfangs fälschlicherweise so verstanden, dass man damit den Timer anhält. Dem ist aber nicht so, sondern mit diesem Befehl wird lediglich der Interrupt deaktiviert, der beim Überlaufen des Timers ausgelöst würde (entsprechend aktiviert man diesen Interrupt mit "enable timer0")

    Der Befehl den Du suchst lautet ganz einfach "stop timer0" bzw. "start timer0", wenn er weiterlaufen soll.

    Nur diese Frage habe ich nicht ganz verstanden:
    Aber wie verändere ich das jetzt?
    WAS willst Du denn verändern??

    Und den PWM-Pin kannst Du über das Data-Direction-Register als Eingang konfigurieren. Dann führt er weder High noch Low, sondern ist einfach nur ein hochohmiger Eingang:
    DDRB.0=0

    Mit DDRB.0=1 wird er dann wieder zum Ausgang!
    Geändert von Sauerbruch (17.09.2012 um 22:32 Uhr)

Ähnliche Themen

  1. RP6-Wetterstation komisches Verhalten
    Von Virus im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 03.01.2010, 12:35
  2. komisches Verhalten einer Schaltung
    Von Arduino99 im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 24.12.2009, 16:13
  3. Antworten: 18
    Letzter Beitrag: 06.06.2007, 09:22
  4. Komisches AVR Verhalten...
    Von EDatabaseError im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 21.02.2007, 20:44
  5. Komisches verhalten meiner CC1
    Von d4rkwolf im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 01.03.2005, 21:58

Stichworte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress