Avr Rs232 & Timer ?

Gast #3230996
Lesenswert?

Wunderschönen Sonnatg

Ich brauche für ein Projekt möglichst viele(30) Pwm's Jenachdem was 
möglich ist werd ich wohl mehrere Avrs verwenden.
Nun mein Problem wenn ich eine Soft Pwm erstelle und den Prescaler vom 
Timer unter 64 einstelle kann ich über die Rs232 keine daten mehr 
emfangen.
Ist damit die Leistungsfähigkeit schon am ende? Lg
Gast #3231013
Lesenswert?

Gute Frage.
Im rs232 Isr schreib ich gerade nur das emfangene Byte in eine Variable 
und setzt eine andere variable auf 1.
In der Main warte ich auf ein emfangenes Byte und übergebe das an die 
Variable der Softpwm.
Da Passiert allerdins nix mehr, Erst ab einem Prescale 64. Nur dann ist 
die Pwm viel zu langsam.
Gast #3231043
Lesenswert?

1
$regfile = "m32def.dat"
2
$crystal = 12000000
3
$baud = 9600
4
Config Portd.4 = Output
5
Config Portd.5 = Output
6
Config Portd.6 = Output
7
Config Portd.0 = Input
8
Config Portd.1 = Output
9
Config Portd.7 = Output
10

11
Dim Adsoll As Byte
12
Dim Rsin As Byte
13
Dim Ist As Bit
14
Dim Pw1 As Byte
15
Dim Zahler As Byte
16

17

18
Config Timer0 = Timer , Prescale = 64
19
Enable Timer0
20
On Timer0 Isr_t1
21

22
Enable Urxc
23
On Urxc Rxd
24

25
Enable Interrupts
26
Adsoll = 101
27
Pw1 = 100
28

29
Do
30
'   If Ist = 0 Then
31
'      Pw1 = Adsoll
32
'      Print Chr(adsoll)
33
'      Ist = 1
34
'   End If
35
Loop
36

37
Rxd:
38
   Pw1 = Udr
39
   Ist = 0
40
   Toggle Portd.7
41
Return
42

43
Isr_t1:
44
   Timer0 = 254
45
   If Zahler < Pw1 Then Portd.6 = 1 Else Portd.6 = 0
46
   Incr Zahler
47
Return


Selbst wenn die Timer Isr nurnoch den wert stellt geht nixmehr. Das 
sollte keine 64 Takte dauern.
Gast #3231049
Lesenswert?

Sven schrieb:
> Isr_t1:
>    Timer0 = 254
>    If Zahler < Pw1 Then Portd.6 = 1 Else Portd.6 = 0
>    Incr Zahler
> Return

naja, ich glaube mit BASROM und diese Art von Code wirst du wohl nicht 
mehr erreichen können.

Du kannst dir ja mal den Artikel
http://www.mikrocontroller.net/articles/Soft-PWM

durchlesen, eventuell kann man es ja in Basrom übertragen, aber ich 
würde gleich zu C raten.
Gast #3231054
Lesenswert?

Peter II schrieb:
> MWS schrieb:
>> Peter II schrieb:
>>> ISR braucht mehr als 64takte.
>>
>> 64 Takte x Top des Timers
>
> er wird wohl mehrfach die Compare ISR aufrufen. Sonst könnte er wohl
> kaum 30 PWM bedienen können.

Ich wollte darauf hinweisen, dass die Softpwm ISR schon ein wenig länger 
dauern kann als 64 Takte, denn mit dem Prescaler 64 wird ja erst mal der 
Timer gefüttert, welcher dann bei Top auf 0 geht. Verwendet er einen 
8Bit Timer, so geht das ganze bei 64 x 256 = 16384 Takten zwischen den 
Aufrufen, aber eben nicht mehr mit 8 x 256 = 4096 Takten dazwischen. 
Zuästzlich anders wär's noch bei CTC.

Im Prinzip stimme ich aber zu, die SPwm ISR verbraucht einfach zu viele 
Zyklen, so dass nichts mehr geht.
#3231195
Lesenswert?

Bei 30 PWMs und serieller Kommunikation sind ja keine Pins mehr übrig.

Ich würde folgendes probieren:

-Interrupts weglassen
-Empfang per ischarwaiting
-Soft-PWM in die Hauptschleife packen, der Timer is eh überflüssig, wenn 
dieser ständig anschlägt


Da geht nichts verloren. Evtl. "stockt" die PWM, wenn Daten empfangen 
werden. Wenn man weiß, was da für Daten kommen und wieviel Takte das 
braucht, kann man bei keinen Daten diese Zeit als NOPs "simulieren"

Ist das ganze zu langsam, dann den Takt z.B. auf 16 MHz erhöhen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren