- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Attiny861A - Timer1 läuft viel zu schnell

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Anzeige

    Praxistest und DIY Projekte
    Wenn du sie bei genau 1 sec blinken lassen willst solltest du die Timervorgabe auf "31250" setzen.

    Im 5sec Takt? Da stimmt doch noch irgendwas nicht.

    Edit: Ich weiss auch was nicht stimmt! XD Im Code wird der Prescaler 2 mal gestetzt. Nimm mal die Zeile "Tccr0b = &B0000_0101" raus oder änder sie in "Tccr0b = &B0000_0100". Dann sollte es passen. Guck dir mal auf Seite 84 das Register an.
    Geändert von DanielSan (29.07.2013 um 13:26 Uhr)
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.07.2012
    Beiträge
    201
    Ich muß mich revidieren... genau 8 Sekunden.

    Ich versteh jetzt gar nichts mehr, ich hab den $crystal = 8000000 auf $crystal = 1000000 geändert.

    Er blinkt mit selben Geschwindigkeit weiter. Sowas...

    Das gleiche wenn ich den Teiler durch 8 wieder einschalte.

    mfG

    Mario

    - - - Aktualisiert - - -

    Vielen Dank für deine Hilfe.

    Es blinkt jetzt etwa im 2 Sekunden Takt.

    mfG

    Mario

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Meinst du 1 sec Led = AN und 1 sec Led = AUS? Falls ja, das ist auch genau das was dein Code machen soll. Wenn das insgesamt 1 sec dauern soll musst du die Timervorgabe halbieren.

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.688
    ... $crystal = 8000000 auf $crystal = 1000000 ... selben Geschwindigkeit ... Teiler durch 8 wieder einschalte ...
    Schön, dass es jetzt klappt. Mario ich hoffe, dass Du die Compileranweisung $crystal und eine gesetzte/gelöschte Fuse - in diesem Fall CKDIV8 - nicht verwechselst. Das wären ZWEI grundverschiedene Aktionen - die übrigens nicht dasselbe bewirken. Aber ich vermute, dass Dir das klar ist.
    Ciao sagt der JoeamBerg

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.07.2012
    Beiträge
    201
    Nein, Leider nicht ganz, 2 Sek LED an und 2 Sek LED aus.

    Mit den Einstellungen:
    -$crystal = 8000000
    -8Mhz gefused
    -Teiler aus

    @oberallgeier
    wenn ich 8Mhz und den Teiler 8 reinnehme muß ich ja auch $crystal = 1000000 schreiben und den Timer am neuen Systemtakt anpassen. Ist doch Richtig oder?

    Ich muss leider erstmal bissl Arbeiten gehen.

    Ich melde mich Morgen dann nochmal.

    Tausend Dank euch Beiden.

    mfG

    Mario

  6. #16
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.688
    ... 8Mhz und den Teiler 8 reinnehme muß ich ja auch $crystal = 1000000 schreiben ... Timer am neuen Systemtakt anpassen. ...
    Genau, nichts für ungut dass ich nachfragte. War ja eigentlich schon sicher, dass Du es so machst.
    Ciao sagt der JoeamBerg

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Den Timer sollte die Crystal-Angabe nicht interessieren. Der arbeitet stur nach seinen Registern.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  8. #18
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.07.2012
    Beiträge
    201
    So, mir hat es keine Ruhe gelassen...

    Der Fehler liegt an "Timer0 = Timervorgabe". Timer0 (TCNT0) ist für Bascom ein 8Bit Timer. Nachdem ich diesen aber als 16Bit schalte kann ich aber nicht mehr auf Timer0-Wert zugreifen/setzen.
    Für Timer1 funktioniert das, da Bascom die 2 8Bit Register (TCNT1H und TCNT1L) als ein pseudoregister Timer1 (TCNT0) bereit stellt. Das ist aber für Timer0 nicht vorgesehen.

    Eine schöne Beschreibung die mir auf die Sprünge geholfen hat: http://halvar.at/elektronik/kleiner_...timer_counter/

    Und das gleiche Thema schonmal diskutiert: http://www.avr-praxis.de/forum/showt...e-f%FCr-Timer0

    Da die Timervorgabe ignoriert wurde hatte ich eine Frequenz von 0,47684Hz also 2Sekunden Blinkfrequenz.

    Da das Pseudoregister nicht mehr angesprochen werden kann (evtl. gibts eine neuere "attiny861.dat"), muß der Vorgabewert direkt in die beiden 8Bit-Register TCNT1H und TCNT1L (beim attiny861:TCNT0H und TCNT0L) geschrieben werden.

    Ich bin mir nur noch nicht ganz sicher wie ich die 16Bit-Timervorgabe auf die beiden 8Bit-Register aufteilen muss, um auf 1Hz Timerfrequenz zu kommen.
    Evtl. kann mir das noch jemand erklären? (Mit Timervorgabe*4 sieht es zumindest Augenscheinlich wie 1Hz aus)

    Code:
    $regfile = "attiny861.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 32
    $framesize = 32
    
    
    
    'Config Timer0 = Timer , Prescale = 256
    
    Tccr0a = &B1000_0000       '16Bit Mode einschalten
    Tccr0b = &B0000_0100       'Prescale=256
    
    Config Pinb.4 = Output
    Led3 Alias Portb.4
    Led3 = 0
    Enable Timer0
    On Timer0 Timer_irq
    
    Const Timervorgabe = 34286
    
    Enable Interrupts
    
    Do
    
    Loop
    
    Timer_irq:
      'Timer0 = Timervorgabe   'Bascom kennt Timer0 nicht als 16Bit Timer
      Tcnt0h = Timervorgabe * 4       '
      Tcnt0l = Timervorgabe * 4
       Toggle Led3
       'Wait 1
    Return
    Danke für Eure Hilfe

    mfG
    Mario

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Versuchs mal so:

    Tcnt0h = &b0111_1010
    Tcnt0l = &b0001_0010

    Anstelle von Timervorgabe.

    31250 = 0111101000010010 als 16bit. Das sollte als Erklärung für dich reichen! So weit wie du schon gekommen bist
    Ich weiss ja nicht wie du auf 34286 gekommen bist aber wenn du genau 1 sec willst musst du 31250 nehmen.
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.07.2012
    Beiträge
    201
    Guten Morgen,

    ja, spitze so klappt es.

    tausend Dank

    zum Thema Timervorgabe:
    Ich habe den Timer mit dem rnAVR von Roboternetz gerechnet. (siehe Bild)Klicke auf die Grafik für eine größere Ansicht

Name:	Timer1.jpg
Hits:	9
Größe:	67,9 KB
ID:	26109
    Es kommt da exakt 1-Sekunden-Takt raus.

    nachgerechnet:
    Von meinen 8Mhz wird nur jeder 256 Takt gezählt also 31250 Takte/sek. Um aber einen Überlauf bei 65535 zu erreichen, muß ich schon ab 34286 anfangen zu zählen.
    Oder habe ich einen Denkfehler?

    mfG
    Mario

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Atmega 32 Uhr läuft zu schnell
    Von Natureengeneer im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 24.10.2012, 16:24
  2. Wie schnell läuft ein Schrittmotor
    Von Hellmut im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 20.03.2008, 19:29
  3. Hilfe! Uhr läuft zu schnell?
    Von HPM im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 28.02.2007, 22:13
  4. PCF 8583 läuft zu schnell
    Von Zeroeightfifteen im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 02.04.2006, 17:54
  5. Timer1 Läuft nicht richtig
    Von DeltaEx im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 23.01.2006, 17:19

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests