Forum: Mikrocontroller und Digitale Elektronik Zeiteinstellung am Attiny261A


von Berndt (Gast)


Lesenswert?

Hallo
versuche meine ersten Schritte mit einem kleinen Board mit dem Attny261A 
zu machen. Dazu verwende ich dieses kleine Programm um 2 LEDs blinken zu 
lassen:
1
#define F_CPU 16000000UL  // Angabe der Quarzfrequenz, wichtig für die Zeit
2
#include <util/delay.h>    // Einbindung Datei Pause
3
#include <avr/io.h>      // Einbindung Datei Ausgänge
4
5
int main(void)
6
  {
7
  DDRA=0b11000000;    // Port A als Ausgang definiert
8
  PORTA=0b11000000;
9
  while(1)        // Programmschleife
10
    {
11
    PORTA &= ~(1<<PA6);  // Schaltet Pin aus
12
    _delay_ms(500);    // Pause 500 ms
13
    PORTA |= (1<<PA6);  // Schaltet Pin ein
14
    _delay_ms(500);    // Pause 500 ms
15
    
16
    PORTA &= ~(1<<PA7);  // Schaltet Pin aus
17
    _delay_ms(500);    // Pause 500 ms
18
    PORTA |= (1<<PA7);  // Schaltet Pin ein
19
    _delay_ms(500);    // Pause 500 ms
20
    }
21
  }
Das Programm läuft auch. Nur die Zeit stimmt nicht. Verwende einen 16MHz 
Keramik Schwinger. Da ich Pausen von 500ms drin habe müstte es doch mit 
einer Frequenz von 1Hz blinken. Wenn ich richtig gezählt habe dauert es 
ca. 4 Sekunden je Pause. Leider sehe ich meinen Fehler nicht. Woran 
könnte es liegen?

LG Berndt

von Berndt (Gast)


Lesenswert?

Den Prozessor habe ich mit

EX 0xFF
HI 0xDF
LO 0x5E

eingestellt. Nach dem Datenblatt sollte er mit externen Schwinger >8MHz 
laufen.

von the_yrr (Gast)


Lesenswert?

moin

du hast ckdiv8 fuse gesetzt, also wird der mit 1/8 der frequenz 
betrieben

von Stefan F. (Gast)


Lesenswert?

Du hast die CLKDIV8 Fuse aktiv, dadurch ist die effektive Taktfrequenz 
nicht 16MHz sondern 2MHz.

Du kannst die Fuse aus schalten oder das per Software im CLKPR Register 
ändern.

von the_yrr (Gast)


Lesenswert?

diese seite ist recht praktisch um die fuses richtig zu konfigurieren

http://www.engbedded.com/fusecalc

CKDIV8 ist standard gesetzt bei der auslieferung, deiner läuft grade mit 
2 MHz, einfach fuses neu und richtig setzen dann gehts.
ansonsten kann man auch den vorteiler für den takt im betrieb setzen, 
dafür guck ins datenblatt
6.3 System Clock Prescaler seite 31 bzw.
6.5.2 CLKPR – Clock Prescale Register eine seite weiter

von Alexander S. (esko) Benutzerseite


Lesenswert?

Bei dem Code (und ohne CKDIV8) sind es 2 s oder 1/2 Hz.
1
    PORTA &= ~(1<<PA6);  // PA6 aus
2
    _delay_ms(500);
3
    PORTA |= (1<<PA6);   // PA6 ein
4
    _delay_ms(500);
5
    PORTA &= ~(1<<PA7);  // PA7 aus
6
    _delay_ms(500);
7
    PORTA |= (1<<PA7);   // PA7 ein
8
    _delay_ms(500);

Jede LED ist 3x500 ms an und 500 ms aus.

von Berndt (Gast)


Lesenswert?

Habe auf dieser Seite die Einstellung gesucht und natürlich das mit 
übernommen. Habe es ausgeschaltet und geht korrekt. Danke für eure Hilfe

LG Berndt

von the_yrr (Gast)


Lesenswert?

andere lösung waäre noch richtige Frequenz im Programm angeben, also
#define F_CPU 16000000UL ändern zu
#define F_CPU  2000000UL

dann gehts auch genau so gut

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.