PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Problem



scales
27.08.2006, 16:04
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

Hanni
27.08.2006, 22:48
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

scales
28.08.2006, 03:08
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...

ogni42
28.08.2006, 09:39
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.

scales
28.08.2006, 14:41
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

ogni42
28.08.2006, 15:13
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.

scales
28.08.2006, 18:08
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:


$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

ogni42
28.08.2006, 19:59
Nimm ein Baudratenquarz, dann kannst Du auf 56k hoch gehen. Dann dauert der Empfang eines Zeichens zwar immer noch >160us, aber immerhin.

kalledom
29.08.2006, 11:59
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.

scales
29.08.2006, 15:43
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