- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: MoBo PWM einlesen

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Anzeige

    E-Bike
    Zumindest nach dem Label 'Sprungmarke' geht es in die Richtung, die ich meinte.
    Genaueres kann ich nicht sagen, weil ich keine Ahnung von Bascom habe.

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Ich sehe hier ein paar Probleme:

    Code:
    Do
       Config Int0 = Raising                                    'Int0 loest bei steigender Flanke aus
    
       Config Int0 = Falling                                    'Int0 loest bei fallender Flanke aus
    
       If Tcnt1 > X Then                                        'X = Anzahl der Ticks ab der der Zustand der LED geaendert werden soll
       Led = 1
       Else
       Led = 0
    Loop
    Erstens: Config INT0 = Falling und Config INT0 = Rising nacheinander ist ziemlich sinnlos, weil der zweite Befel den ersten überschreibt. Es resultiert also ein Interrupt auf eine fallende Flanke.

    Zweitens: TCNT1 ist ja der Zählerstand des Timers 1, der kontinuierlich hochzählt. Irgendwann wird er zwangsläufig größer werden als die Variable X, und dann schaltet sich die LED ein.

    Wenn Du INT0 auf "Change" konfigurierst, löst jede Flanke einen Interrupt aus. Wenn Du am Anfang der ISR eine Abfrage des INT0-Pins machst, kannst Du unterscheiden, ob es eine steigende (PIN = 1) oder eine fallende (PIN = 0) Flanke war. Du bräuchtest dann nur noch ein geeignetes Vefahren, die Zeiten zwischen steigendrn und fallenden Flanken zu messen. Aber das ist auch kein Hexenwerk...

    Ud in der ISR gibt´s auch ein paar Probleme:

    "Enable Timer1" startet nicht den Timer, sondern aktiviert lediglich den Interrupt beim Überlauf des Timers. Zum Starten des Timers nimt man Start Timer1.

    Und "If Int0 = Rising" geht auch nicht, das wird Bascom nicht kompilieren. Wenn, dann müsstest Du die niedrigsten beiden Bits im MCUCR-Register abfragen. Aber bei genauer Betrfachtung bauchst Du diese Abfrage gar nicht!

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2015
    Beiträge
    8
    Danke für deine Antwort!

    Zitat Zitat von Sauerbruch Beitrag anzeigen
    Erstens: Config INT0 = Falling und Config INT0 = Rising nacheinander ist ziemlich sinnlos, weil der zweite Befel den ersten überschreibt. Es resultiert also ein Interrupt auf eine fallende Flanke.
    Du hast absolut recht.

    Zitat Zitat von Sauerbruch Beitrag anzeigen
    Zweitens: TCNT1 ist ja der Zählerstand des Timers 1, der kontinuierlich hochzählt. Irgendwann wird er zwangsläufig größer werden als die Variable X, und dann schaltet sich die LED ein.
    Es soll natürlich das Register von TIMER0 abgeglichen werden, also TCNT0.

    Zitat Zitat von Sauerbruch Beitrag anzeigen
    Wenn Du INT0 auf "Change" konfigurierst, löst jede Flanke einen Interrupt aus. Wenn Du am Anfang der ISR eine Abfrage des INT0-Pins machst, kannst Du unterscheiden, ob es eine steigende (PIN = 1) oder eine fallende (PIN = 0) Flanke war.
    Heißt, mit "Config INT0 = Change" springt er bei jeder Flanke (egal ob fallend oder steigend) zum Label, das ich beim "On INT0 ..." gewählt habe?
    Damit das funktioniert muss ich Interrupts global aktivieren, nehme ich an, zusätzlich auch noch "Enable INT0"?

    Am Label frage ich dann ab, ob der Pin 1 oder 0 ist, je nachdem setze ich Timer 0 auf 0 und starte ihn, oder stoppe ihn?
    Der Abgleich des Registers des Timers, gehört der dann noch in die ISR oder ins Hauptprogramm?
    In diesem würde dann ja nach jetzigem Stand ... nichts stehen? Oo

    Zitat Zitat von Sauerbruch Beitrag anzeigen
    Du bräuchtest dann nur noch ein geeignetes Vefahren, die Zeiten zwischen steigendrn und fallenden Flanken zu messen. Aber das ist auch kein Hexenwerk...
    Dazu würde ich dann wie oben beschrieben einen Timer auf 0 setzen und starten, bzw. stoppen und ggf. noch den Zählerstand mit einer Variablen abgleichen.

    Zitat Zitat von Sauerbruch Beitrag anzeigen
    "Enable Timer1" startet nicht den Timer, sondern aktiviert lediglich den Interrupt beim Überlauf des Timers. Zum Starten des Timers nimt man Start Timer1.
    Gut zu wissen, ein echtes Fettnäpfchen.

    Zitat Zitat von Sauerbruch Beitrag anzeigen
    Und "If Int0 = Rising" geht auch nicht, das wird Bascom nicht kompilieren. Wenn, dann müsstest Du die niedrigsten beiden Bits im MCUCR-Register abfragen. Aber bei genauer Betrfachtung bauchst Du diese Abfrage gar nicht!
    Ja, habe ich schon beim ersten Kompilieren bemerkt, aber wie du sagst, man braucht es tatsächlich nicht.

    Code zum aktuellen Stand der Dinge:
    Code:
    $regfile = "ATtiny45.dat"
    $crystal = 1000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    
    Pwm_mobo Alias Pinb.2
    Config Pwm_mobo = Input
    
    Led Alias Portb.3
    Config Led = Output
    
    Config Timer0 = Timer , Prescale = 1                        'Timer 0 wird konfiguriert
    Config Int0 = Change                                        'Der Interrupt soll bei jeder Falke ausgelöst werden
    On Int0 Sprungmarke                                         'Wenn Int0 ausgelöst wird, springe zu Label Sprungmarke
    
    Enable Interrupts
    
    Do
       If Tcnt0 > X Then                                        'X = Anzahl der Ticks ab der der Zustand der LED geaendert werden soll
       Led = 1
       Else
       Led = 0
    Loop
    
    End
    
    Sprungmarke:
       If Pwm_mobo = 1 Then
       Timer0 = 0
       Start Timer0
       Else
       Stop Timer0
       Return                                                   'zurück ins Hauptprogramm springen
    Geändert von Flo3578 (22.10.2015 um 00:38 Uhr)

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Drehzall einlesen ....
    Von Muecke82 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 17
    Letzter Beitrag: 23.05.2010, 19:34
  2. Pin einlesen --> Led einschalten
    Von Finwe0815 im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 26.09.2007, 21:51
  3. Analogwert einlesen
    Von scream!!!! im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 01.09.2005, 15:27
  4. PWM einlesen
    Von LinkinPark im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 21.07.2005, 19:56
  5. Frequenz einlesen
    Von r00kx im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 08.05.2005, 12:25

Berechtigungen

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

Labornetzteil AliExpress