ATTiny13 / Timer1 + Bascom =PWM

Gast #1472227
Lesenswert?

Hallo,

ich habe folgendes Programm, welches die LED an Portb1 langsam dimmen 
sollte.
Aber es kommt beim Compilieren schon eine Fehlermeldung. Benutze ich 
Timer0 funktioniert es so. Ziel ist es beide Timer unabhängig 
voneinander " laufen" zu lassen.


$regfile = "attiny13.dat"
$crystal = 1000000
Config Portb.1 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare B Pwm = Clear Down , Prescale = 
1

Do
  Pwm = Pwm - 1

  Wait 1

Loop

End

Wer weiß Rat? Danke Maxx
Gast #1472267
Lesenswert?

Hoi Maxx

als erstes musst du erstmal deine Variable deklarieren (hier PWM)

Da du dich für eine 8-Bit Pwm entschieden hast reicht eine Byte Variable

Also:

Dim Pwm as Byte

pwm = 255    'damit deine Led am anfang auch hell ist und nicht erst 
eine sekunde lang dunkel ?????!!!!! :-))

Danach würde ich die Config Anweisung für den Timer1 anders machen. 
Obwohl du Compare1A nicht brauchst soltest du ihn schreiben. nur als 
disconnect.

Also:

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Disconnect, Compare B 
Pwm = Clear Down , Prescale = 1

Nun musst du die Interuppts freigeben. entweder auf registerebene (sehr 
schwer führ dich, mehr Erfahrung notwendig) oder ganz einfach damit:

Enable Timer1              'Timer1 Interrupt zulassen
Enable Interrupt           'Interrupts Global freigeben


Als nächstes musst du nur noch deine Pwm Variable in das Compare1B 
register schreiben:


Do

Pwm = pwm - 1

wait 1

Compare1B = pwm

Loop


Im übrigen steht im Bascom Help alles drin was du "normalerweise" 
brauchst

Wenn du dich mehr damit beschäftigen willst und die dinger auch mal auf 
Registerebene und damit schon sehr Hartwarenah (Ja das geht trotz 
anderer Meinungen auch mit Bascom) programmieren willst hilft nur das 
Atmel Datenblatt.

Ciao, Rene
Gast #1472285
Lesenswert?

Hoi,

hast recht....

der hat nur nen 8-Bit Timer (timer0) .... hab grad das datenblatt 
gesehen :-)

Dann eben so Configurieren:

'####################################################################### 
##

$regfile = "attiny13.dat"
$crystal = 1000000

Dim Pwm as Byte
Pwm = 255

Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Disconnect, Compare B
Pwm = Clear Down , Prescale = 1

Enable Timer1              'Timer1 Interrupt zulassen
Enable Interrupt           'Interrupts Global freigeben


Do

Pwm = pwm - 1

wait 1

Compare0B = pwm

Loop

End

'####################################################################### 
###

So nun hab ich auch gleich ungewollt den ganzen Code geschrieben, den 
rest machst du aber selber.


Ciao , Rene
Gast #1473480
Lesenswert?

Hallo,
ich danke allen, die sich um mein Problem bemüht haben, besonders Rene. 
Leider komme ich nicht richtig weiter.
Sorry,aber das Datenblatt hätte ich auch selbst bemühen können....
Also es gibt nur einen 8-Bit-Timer, der hat zwei Kanäle. Einmal PB0 = 
OC0A und zum zweiten PB1 = OC0B.

Ich wollte es so programmieren, daß beide Kanäle unabhängig  laufen, 
d.h. beide Kanäle von 0 bis 255.

Mein "Programm" mit Ausgabe an PB0 steht hier. Es klappt!

$regfile = "attiny13.dat"
$crystal = 100000
Config Pinb.0 = Output
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up

Do
  Pwm = Pwm - 1

  Waitms 100
Loop

End

Was kann man nun tun damit es eine Ausgabe auch an PB1 = OC0B (aber 
unabhängig hiervon) gibt.
Die Sache mit dem Interrupt habe ich schon verstanden. Ich nahm bisher 
an, daß ein äußeres Ereignis (Taster) oder internes (Zählerüberlauf)
sowas bewirkt.Hier ist aber beides nicht der Fall.
Ich habe Dein Programm compilieren wollen, es kopmmen Fehlermeldungen. 
Woran könnte es liegen?
Vielleicht sollte ich einen anderen Chip nutzen ?
Gruß Maxx
#1474400
Lesenswert?

Maxx schrieb:
> Ich habe Dein Programm compilieren wollen, es kopmmen Fehlermeldungen.

Psst, ich verrate Dir mal ein ganz großes Geheimnis:

Es gibt den Dateianhang, um genau den Quelltext zu posten, den Du 
compilierst.
Und es gibt copy&paste, um den exakten Wortlaut der Fehlermeldung zu 
posten.

Und Du wirst staunen, dann könnte sogar jemand antworten, der nicht 
Hellseher ist.


Peter
Gast #1483795
Lesenswert?

Hallo Maxx,

hier eine Version für den anderen Ausgang.
Wenn Du statt der ersten For/Next Schleife Pwm0a = 255 setzt, wird deine
LED gedimmt

Achte auf crystall = 1200000  (Auslieferungszustand)

' Anschluss an Pin 5 (PB0) und Masse (GND)

$regfile = "attiny13.dat"
$crystal = 1200000
Config Portb = Output

Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down

Dim I As byte

Do
  For I = 0 To 255
       Incr Pwm0a         ' = Pwm0a + 1
       Waitms 10
  Next I

  For I = 255 To 0 Step - 1
       Decr Pwm0a         ' = Pwm0a - 1
       Waitms 10
  Next I

Loop
End
#3812536
Lesenswert?

Es fehlt aber was:

$regfile = "attiny13.dat"
' $regfile = "attiny13a.dat"  ' oder neuerer Tiny13A
$crystal = 1200000

$swstack = 10    ' ohne geht es nicht
$hwstack = 10    ' muss rein

Config Portb.0 = Output  ' Anschluss an Pin 5 (PB0) und Masse (GND)

Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down

Dim I As byte

Do
  For I = 0 To 255
       Incr Pwm0a         ' = Pwm0a + 1
       Waitms 10
  Next I

  For I = 255 To 0 Step - 1
       Decr Pwm0a         ' = Pwm0a - 1
       Waitms 10
  Next I

Loop
End

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