Forum: Mikrocontroller und Digitale Elektronik 8 Bit Timer ATMEGA 8 Vorladewert berechnen


von Schnipi (Gast)


Lesenswert?

HAllo,

ich arbeite mich gerade in das Thema µC ein und habe mal eine Frage zu 
Timer.

Aufgabenstellung:

LED im 1 Sekundenabstand blinken lassen ( Takt 1HZ)
ATMEGA 8 wird verwendet CPU Taktfrequenz (4MHZ)
8 BIT Timer
Vorteiler soll 256 sein

Nun möchte ich mir gerne den Vorladewert berechnen
Jedoch würde nach meiner Berechnung ein Wert <0 rauskommen.

2^8-1 - (1sec x 4000000HZ/256) = -15730?

Kann man für jede Blinkfrequenz irgendeinen Timer nehmen?
Kann man überhaupt einen Vorladewert nutzen bei so einer langsamen 
Frequenz?


Hier der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
ISR(TIMER0_OVF_VECT){
5
6
PORTD ^=(1<<PD5);
7
 }
8
9
int main(){
10
11
12
// ATMEAG 8 arbeitet mit 4MHZ CPU Frequenz
13
// 16 BIT Timer wird benutzt = 
14
// Anforderung: LED soll in 1 Sekundentakt blinken 
15
// = 0.5s an und 0.5s aus 
16
// Verdendeter Prescaler =  256
17
// Berechnung: 4000000/256 = 15625 HZ
18
// Vorwert  = 15625/2 = 7813
19
20
DDRD |= (1<<PD5);
21
22
TCCR0 = (1<<CS02); // Verdendeter Prescaler =  256
23
TCNT0 = -7813;
24
TIMSK |= (TOIE0);
25
sei();
26
while(1){
27
28
29
30
}
31
32
return 0;
33
34
35
}


Stimmt der Code soweit? Wird so der Interrupt aufgerufen?

Gibt es noch gute Infoblätter zu den einzelnen Funktionen beim ATMEGA?

Vielen Dank.

von Schnipi (Gast)


Lesenswert?

Mit Infoblätter meine ich z.B. diese

http://bbs-technik-koblenz.de/cbs2011/index.php?option=com_content&view=article&id=104&Itemid=171&lang=de

Hier wurden alle Funktionen super zusammengefasst.

von Peter R. (pnu)


Lesenswert?

Die Rechnung stimmt so weit, eventuell braucht man da aber noch den 
Faktor zwei. Einfach programmieren, eine LED ins Programm einbeziehen 
und mit einer Uhr vergleichen.

Timer mit 8 oder 16 bit:

Ein 8-bit Zähler kann nur auf 256 voreingestellt werden, da reichts halt 
nicht für sec-Takt.

Bei 16 bit ist die maximale Zahl aber 65536, mit den 7813 kommt man 
damit auf einen sec-Takt.

von (Gast)


Lesenswert?

Wo kommt der Sche.. mit dem "Vorwert" nur immer her? Nimm CTC Modus und 
Timer1! Außerdem ist der in deinem Programm nach einem Timerdurchlauf 
wieder weg; und -7813 erzeugt im 8Bit Register vermutlich auch nicht 
das, was du erwartest.

von Peter R. (pnu)


Lesenswert?

noch etwas: mit dem 8-bit-Teiler kann man im (CTC oder reload-Verfahren) 
eine 4ms-Folge an int's erzeugen. Wenn man dann im int einen Zählindex 
bis 250 mitzählen lässt, kann man daraus den 1-sec-Takt bilden.

von Thomas E. (thomase)


Lesenswert?

Nö schrieb:
> Wo kommt der Sche.. mit dem "Vorwert" nur immer her?
U.a. vom 8051.

mfg.

von Schnipi (Gast)


Lesenswert?

Guten Morgen zusammen,

ja das mit dem Vorladewert ist eine Sache für sich.

Gebe euch absolut Recht, das die Compare Funktion erheblich besser 
geeignet ist.

Aber stehe ja noch am Anfang.

Anbei ein Code den ich geschrieben habe.

Jedoch blinkt die LED nicht.

Könnt ihr weiter helfen?

Muss die LED an einem bestimmten Ausgang geschaltet werden?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
ISR(TIMER1_COMPA_VECT){
5
6
PORTD ^=(1<<PD5); // Ausgang Pollin Board zu LED
7
PORTB ^=(1<<PB1); //Ausgang ATMEGA wo auch OC1A anliegt
8
 }
9
10
int main(){
11
12
13
// ATMEAG 8 arbeitet mit 4MHZ CPU Frequenz
14
// 16 BIT Timer wird benutzt = 
15
// Anforderung: LED soll in 1 Sekundentakt blinken 
16
// = 0.5s an und 0.5s aus 
17
// Verdendeter Prescaler =  256
18
// Berechnung: 4000000/256 = 15625 HZ -1
19
20
21
DDRD |= (1<<PD5);
22
DDRB |= (1<<PB1);
23
24
TCCR1B |= (1<<WGM12) | (1<<CS12); // Verdendeter Prescaler =  256 und CTC Modus
25
TIMSK |= (1<<OCIE1A);
26
OCR1A = 15624; // Vergleichswert bis wohin gezählt werden soll
27
sei(); //Interrupt erlauben und aufrufen
28
while(1){
29
30
}
31
32
return 0;
33
34
35
}

Liegt hier ein Fehler vor?

von Spess53 (Gast)


Lesenswert?

Hi

>Liegt hier ein Fehler vor?

Du hast die COM-Bits in TCCR1A vergessen. Die sagen, was der Timer am 
OCR-Pin machen soll.

MfG Spess

von Schnipi (Gast)


Lesenswert?

Wie muss ich die COM Bits konfigurieren?

von Spess53 (Gast)


Lesenswert?

Hi

>Wie muss ich die COM Bits konfigurieren?

http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf

S.96

MfG Spess

von Schnipi (Gast)


Lesenswert?

TCCR1A |= (1<<COM1A1) | (1<<COM1A0);?

von Spess53 (Gast)


Lesenswert?

Hi

>TCCR1A |= (1<<COM1A1) | (1<<COM1A0);?

Ich dachte, du willst, das die LED blinkt? Und das nennt man auch 
'togglen'.

MfG Spess

von Schnipi (Gast)


Lesenswert?

TCCR1A |= (1<<COM1A0)


so das der Ausgang getoggelt wird.

Aber die Schaltzeit von 1s stimmt noch nicht.

Ist ca immer 5s an anstatt 1s

von c-hater (Gast)


Lesenswert?

Schnipi schrieb:

> LED im 1 Sekundenabstand blinken lassen ( Takt 1HZ)
> ATMEGA 8 wird verwendet CPU Taktfrequenz (4MHZ)
> 8 BIT Timer
> Vorteiler soll 256 sein

Das geht schlicht und einfach nicht. Der maximale Wert, den du in einen 
8Bit-Timer laden kannst, ist 255, was effektiv als ein Teiler von 256 
wirkt. Die kleinstmögliche Überlauffrequenz bei Vorteiler 256 ist dann 
also:

   4.000.000
--------------- = ca. 61Hz
256 * (255 + 1)

Im CTC-Mode mit Output-Toggle oder den PWM-Modi != FAST-PWM könnte man 
das nochmal durch zwei teilen und käme dann auf ca. 30,5Hz 
Ausgangsfrequenz.

Und selbst der größtmögliche Vorteiler von 1024 könnte das auch nur um 
den Faktor 4 ändern, damit käme man dann auf knapp 8Hz.

Kurzfassung: Du mußt entweder einen 16Bit-Zähler verwenden oder den 
Zählumfang des 8Bit-Zählers per Software erweitern, um eine Ausgabe von 
1Hz erreichen zu können.

Um bei 4MHz Takt und Vorteiler 256 exakt 1Hz zu erreichen, wäre es 
sinnvoll, den CTC-Modus zu verwenden und das CTC-Register mit 124 oder 
249 zu laden, dann läuft der Timer mit 125Hz oder 62,5Hz über.

In beiden Fällen brauchst du bloß noch ein Byte, um die 
Software-Zählererweiterung beherbergen zu können. Der Unterschied steckt 
im Code der ISR. Der Nutzcode der ISR für die 62,5Hz-Variante ist etwas 
aufwendiger, dafür wird sie aber auch nur halb so oft aufgerufen, was 
den Interrupt-Overhead um die Hälfte reduziert. Insgesamt dürfte deshalb 
die 62,5Hz-Variante effizienter sein.

von Spess53 (Gast)


Lesenswert?

Hi

>Ist ca immer 5s an anstatt 1s

Bei 4MHz brauchst du für eine Blinkfrequenz von 1Hz einen Comparewert 
von 1999.

MfG Spess

von Spess53 (Gast)


Lesenswert?

Hi

>Bei 4MHz brauchst du für eine Blinkfrequenz von 1Hz einen Comparewert
>von 1999.

Ergänzung:

Bei einem Vorteiler von 1.

MfG Spess

von Stefan E. (sternst)


Lesenswert?

Spess53 schrieb:
>>Bei 4MHz brauchst du für eine Blinkfrequenz von 1Hz einen Comparewert
>>von 1999.
>
> Ergänzung:
>
> Bei einem Vorteiler von 1.

Das ergibt dann aber 1kHz.

von Spess53 (Gast)


Lesenswert?

Hi

>Das ergibt dann aber 1kHz.

Ups. stimmt.

Dann 7812 bei Prescaler 256 oder 31249 bei clk/64.

MfG Spess

von Snipi (Gast)


Lesenswert?

Danke euch allen.

Eine Verständnisfrage habe ich aber noch

TCCR1A |= (1<<COM1A0)

bewirkt das der Ausgang getoggelt wird.


Aber

PORTB ^=(1<<PB1); //Ausgang ATMEGA wo auch OC1A anliegt

toggelt ja auch den Ausgang.


Ist das jetzt nicht doppelt getoggelt?

von Spess53 (Gast)


Lesenswert?

Hi

Ist das jetzt nicht doppelt getoggelt?

Nein. wenn die COM-Bits ungleich 00 ist hat der Timer die Kontrolle:

If one or both of the COM1A1:0 bits are written to one, the OC1A output
overrides the normal port functionality of the I/O pin it is connected 
to.

MfG Spess

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.