- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 13

Thema: MoBo PWM einlesen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2015
    Beiträge
    8
    Vielen Dank für all eure Anregungen!

    Ich komme leider er jetzt wieder dazu, ich dem Projekt zu widmen.
    Die Idee von 021aet04 kam mir sehr interessant vor, so habe ich versucht, mir nach dieser etwas zusammen zu basteln.
    Problem / Denkfehler / whatever was nun auftritt: Wie kann ein Interrput Pin auf verschiedene Ereignisse reagieren?
    Ich habe am tiny einen Interrupt Pin, an diesen hänge ich das PWM Signal.
    Nun lege ich im Kopf des Programmes fest, dass bei steigender Flanke unterbrochen werden soll, nach der Idee von 021aet04.
    Aber wie sorge ich jetzt dafür, dass der gleiche Pin anschließend auf eine fallende Flanke reagieren soll?
    Ich kann diesen noch nicht im Programm umstellen?
    Hier der bisherige Versuch, falls interessant für euch:
    PS: In diesem Programm geht es probehaft erst einmal darum, eine LED anzuschalten, wenn der Duty Cyle kurz genug ist.

    Code:
    $regfile = "ATtiny45.dat"
    $crystal = 1000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    
    Pwm_mobo Alias Portb.2
    Config Pwm_mobo = Input
    
    Led Alias Portb.3
    Config Led = Output
    
    Config Timer0 = Timer , Prescale = 1
    On Int0 Steigende_flanke                                    'Wenn Int0 ausgelöst wird, springe zu Label Steigende_Flanke
    Config Int0 = Raising                                       'Int0 löst bei steigender Flanke aus
    
    Enable Interrupts
    
    Do
       'Mit dem Hauptprogramm habe ich mich noch nicht befasst
       If Tcnt1 > X Then                                       'X = Anzahl der Ticks ab der der Zustand der LED gedert werden soll
       Led = 1
       Else
       Led = 0
    Loop
    
    Steigende_flanke:
       Timer0 = 0                                               'Timer auf 0 setzen
       Enable Timer0                                            'Timer starten
       Return                                                   'zutück ins Hauptprogramm springen
    Geändert von Flo3578 (20.10.2015 um 11:24 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Ich kenne mich mit Bascom nicht aus. Aber die Flanke kann man im Programm immer ändern. Du hast oben geschrieben "config int0 = raising ", das stellst du auf falling. Ich würde noch die Interrupts sperren (disable Interrupt) .

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2015
    Beiträge
    8
    Stimmt, ich dann die Flanke ändern, jedoch aber nicht die Sprungmarke dazu.
    Dann bringt mir ersteres doch auch nichts? :/

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Du kanst hinter der fraglichen Sprungmarke eine Fallunterscheidung vorsehen:
    - wenn INT bei steigender Flanke aktiviert ist, dann Zähler rücksetzen
    - wenn INT bei fallender Flaanke aktiviert ist. dann Zähler auslesen und ggf. darauf reagieren

    Das relevante Bit im Steuerregister kannst du direkt testen. Anscheinend musst du dafür das Datenblatt studieren, falls es keine Ausleseroutine gibt, die diesen Hardwarebezug so hübsch abstrahiert.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2015
    Beiträge
    8
    Du meinst also in etwa so?
    Code:
    $regfile = "ATtiny45.dat"
    $crystal = 1000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    
    Pwm_mobo Alias Portb.2
    Config Pwm_mobo = Input
    
    Led Alias Portb.3
    Config Led = Output
    
    Config Timer0 = Timer , Prescale = 1
    
    On Int0 Sprungmarke                                         'Wenn Int0 ausgelöst wird, springe zu Label Sprungmarke
    
    Enable Interrupts
    
    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
    
    Sprungmarke:
       If Int0 = Raising Then
       Timer0 = 0
       Enable Timer0
       Else
       Stop Timer0
       Return                                                   'zutück ins Hauptprogramm springen

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    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.

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

Ähnliche Themen

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

Berechtigungen

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

Solar Speicher und Akkus Tests