www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny13 / Timer1 + Bascom =PWM


Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann beschwere dich bei Atmel weil die in den Tiny13 nur
einen Timer einbauen.

avr

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Danach würde ich die Config Anweisung für den Timer1 anders machen.

ATTiny13 hat keinen Timer1.

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch ein Fehlerteufel:

muss so heissen

Enable Timer0              'Timer0 Interrupt zulassen


Ciao, Rene

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
?????????????????????????

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maxx (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe hänge mal die Fehlermeldugen nach dem Compilieren mit 
an.Vielleicht hilft es zur Klärung.
Vl. Grüße und Danke Maxx.

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
melde mich nochmal da ich noch keine Lösung weiß.
Vielleicht schaut Ihr es Euch nochmal an.
Schönes WE(Wochenende)
Maxx.

Autor: Klaus E (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens S. (jens_s56)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marc Vesely (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens S. schrieb:
> Es fehlt aber was:

 Wie stehst du mit Kalender und Datum ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.