- LiTime Speicher und Akkus         
Ergebnis 1 bis 10 von 10

Thema: PWM Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2006
    Beiträge
    559

    PWM Problem

    im Moment macht mein Controller auf einem Pin PWM und gleichzeitig Kommunikation per RS232 mit nem PC,
    beides funktioniert per Interrupt
    (PWM per Timer-Interrupt, RS232 per externem Interrupt)

    wird der Timer-Interrupt aufgerufen wird so lange per Hardware-Fluss-Steuerung dem Pc klargemacht dass im Moment nichts empfangen werden kann,
    der Pc wartet auch brav das ist kein Problem

    wenn nun allerdings die Kommunikation mit dem Pc läuft wird währenddessen natürlich der Timer-Interrupt nicht beachtet,
    außer ich würde dessen Priorität über die des externen Interrupts stellen,
    dann würde aber RS232 immer aus dem Takt geraten


    also ich kom einfach nicht drauf wie man das beides unter einen Hut bekommt,
    klar könnte man den UART benutzen, aber ich brauch mehrere RS232 Verbindungen, deswegen mach ich das per Software

    also das einzige was mir noch einfällt ist 2 Controller zu nehmen:
    der eine macht immer PWM und der andere unterbricht ihn nur wenn der PWM etwas geändert werden muss

    lieber wär mir aber eine Möglichkeit die mit einem Controller auskommt,
    vielleicht hat von euch jemand eine Idee


    war mir jetzt nicht sicher wo mein Problem hin soll,
    es ist nicht auf eine bestimmte Programmiersprache bezogen,
    aht aber eigentlich auch nichts mit Hardware zu tun

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Ich weiss ja nicht, wieviele PWM Kanäle du nutzt, aber vielleicht ist es eine Alternative, diese von der Hardware genereren zu lassen. Dieses geht natürlich nur, wenn man nicht allzuviele Kanäle braucht (6 beim ATmega x8 )

    Grüße,
    da Hanni

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2006
    Beiträge
    559
    ich benutz einen AT89C51ED2 bei dem gibt es keine PWM-Kanäle,
    wie gesagt ich war mir nicht sicher wo das hin soll

    aber irgendwie muss das doch per Software machbar sein,
    ich werd mal im WWW rumgucken, das Problem hatte bestimmt schonmal jemand...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Der Interrupt geht Dir ja nicht verloren, er wird nur verzögert.

    Sofern Du im Timer Interrupt nur die das Puls-Pause-Verhältnis des PWM Signals veränderst wäre das ja nur dann ein Problem, wenn der Zeitpunkt der Änderung kritisch ist (OK, wenn dauernd kommuniziert wird ist das ein Problem).

    Sofern Deine RS232 Messages sehr lange sind, ist eine Möglichkeit das Problem zu entschärfen, die Nachrichten in mehrere kleine aufzuteilen und zwischen den Nachrichten eine kurze Pause von z.B. 10u oder so zu machen, so dass die Timer ISR gestartet werden kann bevor der nächste RS232 Interrupt kommt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2006
    Beiträge
    559
    das dumme ist eben dass der roboter fernsteuerbar sein soll,
    immer wenn man Steuersignale sendet, oder auch nur Sensoren abfrägt gerät die PWM aus dem Takt,
    beispielsweise der Motor ist per PWM angeschlossen, der hält dann entweder an oder fährt plötzlich volle Kanne

    das problem ist dass während der RS232 kommunikation immer wieder eine wait funktion aufgerufen wird
    (damit er eben je nach Baudrate auf das nächste Bit wartet)
    und durch die entsteht eben eine große Verzögerung

    ich werd jetzt wohl Hardware RS232 benutzen im Moment brauch ich eh nur einen Kanal,
    später nehm ich am besten nen anderen Mikrocontroller, einen mit PWM Kanälen

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Wenn der uC immer Slave ist, kannst Du die RS232 Kommunikation per Polling statt Interrupt lösen. Das hat den Vorteil, dass Du immer sicher stellen kannst, dass die PWM ISR dran kommt.

    Die Daten vom Host bleiben ja im Ausgangspuffer bis sie abgenommen wurden.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2006
    Beiträge
    559
    ne, allein schon einen buchstaben komplett zu empfangen dauert zu lang,
    sonst wär das sowiso kein Problem

    ich bin grad dabei auf Hardware RS232 umzusteigen, aber im Moment kommt nur Mist beim Pc an
    (eigentlich sollen einfach laufen As gesendet werden, es kommen aber nur merkwürdige Zeichen an)

    hier mal der code mit dem ichs probier:

    Code:
    $NOMOD51
    $INCLUDE (89C51RX2.MCU)
    
    setb P3.0
    setb P3.1
    clr P3.6
    
    mov TMOD, #00100000b ;Timer1: 8-bit Reload Mode
    mov TL1, #253
    mov TH1, #253
    mov SCON, #01000000b ;UART: 8-bit Baudrate von Timer 1
    setb TR1             ;Timer 1 starten
    
    main:
    clr TI
    mov SBUF, #'A'       ;A senden
    jnb TI, $            ;warten bis gesendet
    jmp main
    
    END
    die Baudrate soll übrigens 9600 sein und ich benutz einen 12 Mhz Quarz,
    am Pc hab ich 8 Datenbits, 9600 Baud, 1 Stopbit, keine Paritätsbits und keine Flusskontrolle eingestellt

    EDIT:
    jetzt funzts, die Baudrate war einfach zu ungenau, mit 2400 klappts ohne Probleme

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Nimm ein Baudratenquarz, dann kannst Du auf 56k hoch gehen. Dann dauert der Empfang eines Zeichens zwar immer noch >160us, aber immerhin.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Hallo scales,
    bei meinen Assembler-Programmen habe ich immer einen Timer-Interrupt mit 1 ms bzw. bei einem Programm für 8 PWM-Ausgänge mit 0,1 ms (siehe http://www.domnick-elektronik.de/picpwm.htm ). Allerdings nutze ich die USART des PIC (RxD per Recive-Int und TxD per 1 ms Timer-Int).
    Für Deine Zwecke könntest Du einen Timer-Interrupt initialisieren, der genau die Zeit hat, wie ein Bit für Deine serielle Übertragung benötigt. Dann ist sicher gestellt, daß kein Bit verloren geht oder vergessen wird.
    Für die Erkennung des Start-Bit gibt es beim PIC den PortB Change Int, mit dem ein ankommendes Bit per Interrupt erkannt werden kann; es ist allerdings zu klären, welches Bit / welcher Kanal schon erkannt wurde.
    Vielleicht reicht die Timer-Zeit auch als 100-stel (0...100%) für die PWM ?
    Im Hauptprogramm kannst Du dann zeitunkritische Dinge abwickeln.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2006
    Beiträge
    559
    stimmt nen Timer zu nehmen wär ne gute Idee gewesen,
    den stell ich auf hohe Priorität und den fürs PWM auf niedrige,
    dann kann PWM immer in den Zwischenzeiten ran

    aber jetzt bin ich sowiso schon auf Hardware RS232 umgestiegen,
    trotzdem danke für den Tipp

Berechtigungen

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

LiTime Speicher und Akkus