Forum: Mikrocontroller und Digitale Elektronik Fast PWM mit Tiny13


von Noch so ein Anfänger :-) (Gast)


Lesenswert?

Ich habe ein Bascom Programm von einem Atmega8 auf einen Attiny13 
"kopiert", mit minimalen Änderungen. Es läuft soweit, nur die PWM wo 
vorher 19 kHz hatte, hat jetzt nur noch 2,3 kHz (mit Multimeter 
gemessen).
Wie stelle ich (in Bascom) eine Fast PWM ein? Takt ist 9,6 MHz.

Achja, sorry das ich keinen Code gepostet habe, der ist nämlich auf nem 
anderen Rechner. Uns auch ins Datenblatt habe ich geschaut, leider 
klemmts gewaltig beim Englisch und ausserdem brauche ich den gesuchten 
Befehl/Codeschnipsel in Bascom.
Also weiss da jemand (einfachen) Rat??

von Rolle Z. (rolle-z)


Lesenswert?

Hallo,

ohne den schon bestehenden Bascom-Code wirds schwer bis unmöglich dir zu 
helfen... Bitte Code posten.

von Karl H. (kbuchegg)


Lesenswert?

19 kHz zu 2.3 kHz ist ungefähr ein Faktor 8.

Daher würde ich das hier
> Takt ist 9,6 MHz
erst mal in Zweifel ziehen. Hast du die 9.6MHz kontrolliert?

von Noch so ein Anfänger :-) (Gast)


Lesenswert?

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 16
$swstack = 5
$framesize = 16

Config Portb.0 = Output                                     'Ausgang für 
PWM an PB0
Config Portb.1 = Output                                     'Ausgang für 
LED blau
Config Portb.3 = Input                                      'Eingang für 
Taster an PB3
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 1 
'Timer für 8-Bit PWM einstellen

Taster1 Alias Pinb.3                                        'Taster 
Konfiguration
Config Taster1 = Input
Portb.3 = 1 
'PullUp-Widerstand einschalten


Do

Debounce Taster1 , 0 , On_taster1 , Sub                     'Taster 
entprellen

Loop

End


On_taster1:                                                 'Subroutine 
Taster "Ein"

   If Pwm0a = 0 Then
      Pwm0a = 140
      Portb.1 = 1

                                                 'LED blau "Ein"
   Else

      Waitms 400
      Pwm0a = 0
      Portb.1 = 0
                                                 'LED blau "Aus "
   End If
Return

von Noch so ein Anfänger :-) (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> erst mal in Zweifel ziehen. Hast du die 9.6MHz kontrolliert?

Nein, wüsste nicht wie ich das machen sollte..

von Karl H. (kbuchegg)


Lesenswert?

Noch so ein Anfänger :-) schrieb:
> Karl Heinz Buchegger schrieb:
>> erst mal in Zweifel ziehen. Hast du die 9.6MHz kontrolliert?
>
> Nein, wüsste nicht wie ich das machen sollte..

zb in dem du mit WAITMS(1000) eine LED blinken lässt. Wenn die 9.6Mhz 
stimmen, dann tut sie das auch mit 1 Sekunde an, 1 Sekunde aus. Wenn die 
9.6Mhz nicht stimmen (und dein Tiny immer noch auf den Werkseitigen 1Mhz 
steht), dann sind die Blinker entsprechend länger. Und den Unterschied 
zwischen 1 Sekunde und 8 Sekunden sieht man mit freiem Auge.

von Karl H. (kbuchegg)


Lesenswert?

ALso
1
$regfile = "attiny13.dat"
2
$crystal = 9600000
3
$hwstack = 16
4
$swstack = 5
5
$framesize = 16
6
7
Config Portb.1 = Output                                     'Ausgang für LED blau
8
9
Do
10
  Portb.1 = 1
11
  waitms 1000
12
  Portb.1 = 0
13
  waitms 1000
14
Loop

Hast du 1 Sekunde Led an/aus, oder nicht?

Ich überprüf inzwischen, ob der Tiny13 eine CKDIV8 Fuse hat.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Ich überprüf inzwischen, ob der Tiny13 eine CKDIV8 Fuse hat.

Hat er. Und sie ist standardmässig eingeschaltet.

Hast du sie ausgeschaltet?

von Noch so ein Anfänger :-) (Gast)


Lesenswert?

Die LED war ca. jeweils ca. 8 s an und aus. Du hast also Recht, der Takt 
stimmte nicht.

Den Atmega8 hatte ich mit Yaap geflasht, den Tiny erkennt das Programm 
nicht. Mit PonyProg geht es auch nicht. Also habe ich es mit dem myAVR 
Progtool probiert und es geht. Leider haben die Jungs die Eistellung der 
Fuses etwas anders gestaltet und zudem noch eine Funktion "divide clock 
by 8" hinzugefügt. Diese war aktiviert...

Also vielen Dank Karl Heinz, für die schnelle und kompetente Hilfe. Ich 
wünsche noch ruhige Feiertage.

Grüsse, Thomas.

von Noch so ein Anfänger :-) (Gast)


Lesenswert?

Edit: CKDIV8 ist wohl die Abkürzung dafür.. Manchmal stelle ich mich 
aber auch blöd an..

von Hannes L. (hannes)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich überprüf inzwischen, ob der Tiny13 eine CKDIV8 Fuse hat.

Es ist nicht nötig, diese Fuse zu verändern.

Es reicht völlig zu, in der AVR-Software das I/O-Register CLKPR 
einzustellen. Das erfordert 3 Zugriffe, zuerst 128 
(Schreibschutz-Freigabe-Bit), dann zweimal hintereinander den 
gewünschten Teilerwert (0 bei 1 zu 1).

Frohen Rest vom Fest...

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.