Forum: Mikrocontroller und Digitale Elektronik Problem mit 16-Bit Zähler im Vergleichsmodus bei ATMEGA8


von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Hallo,
ich versuche mich gerade in 16-Bit-Zähler einzuarbeiten.
Dazu habe ich einen ATMEGA-8 genommen, ihn mit Wiederstand und 
Kondensatoren in ein Breadboard gesteckt und mit 1-kOhm-Wiederständen 
die Ports C0-5 mit LEDs bestückt.
Irgendwie mache ich alles so, wie in den Tutorials und Threads 
beschrieben (oder nicht???) und trotzdem gibt es bei mir zwei Probleme:
1.Die LED an PORTB5 leuchtet nicht.
2.Die LEDs blinken nicht.

Hier der Quellcode:
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
4
5
volatile int counter = 0;
6
volatile int set = 0;
7
8
ISR (TIMER1_COMPA_vect){
9
counter++;
10
if(counter == 3){
11
counter=0;
12
if(set==0){
13
  set=1;}
14
if(set==1){
15
  set=0;}
16
}
17
18
}
19
20
void init(){
21
DDRC = 0b00011111;
22
TCNT1 = 0;
23
OCR1A = 12500;
24
TCCR1A = (1<<WGM12);
25
TIMSK = (1<<OCIE1A);
26
TCCR1B = (1<<CS11) | (1<<CS10);
27
set = 0;
28
sei();
29
}
30
31
32
int main(void){
33
init();
34
  while(1){
35
  if (set==0){
36
  PORTC = 0b00011111;}
37
  if (set==1){
38
  PORTC = 0b00000000;}
39
  }
40
}
Könnt ihr mit vielleicht helfen?
mit freundlichen Grüßen,
Valentin

von Stefan E. (sternst)


Lesenswert?

Valentin Buck schrieb:

> 1.Die LED an PORTB5 leuchtet nicht.

Warum sollte sie?

> 2.Die LEDs blinken nicht.

set ist immer 0.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Nicht, wenn der Interrupt dreimal gezogen hat und set auf 1 gesetzt 
wurde.

Allerdings stimmt das mit dem Port, den habe ich wirklich vergessen...
Danke,
Valentin

von Stefan E. (sternst)


Lesenswert?

Valentin Buck schrieb:
> Nicht, wenn der Interrupt dreimal gezogen hat und set auf 1 gesetzt
> wurde.

Nein. Am Ende des Interrupts ist set immer 0. Schau dir den Code nochmal 
genau an, spiele notfalls "von Hand" Zeile für Zeile durch.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Oohhhh, im ersten if wird set auf 1 gesetzt, dann zieht das zweite if 
und set wird wieder 0.
Danke für den Denkanstoß,
Valentin

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Wenn ich nun Counter erst bei 10 wieder mit dem Set-Togglen und anderem 
auf 0 setze und mein Takt 8Mhz int. Osc. ist,
warum kommt dann nicht

8000000/64/12500/10 = 1Hz an Blinkfrequenz sondern zwischen 1/5 und 1/6 
Hz Blinkfrequenz raus?

Habe ich mich verrechnet oder müssen die Werte anders?
Valentin

von Stefan E. (sternst)


Lesenswert?

Valentin Buck schrieb:

> Habe ich mich verrechnet oder müssen die Werte anders?

Liegt daran, dass du versuchst das Bit WGM12 im falschen Register zu 
setzen.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

In welches kommts denn?
Und brauche ich das Bit überhaupt für das, was ich hier im Code mache?
Valentin

von Stefan E. (sternst)


Lesenswert?

Valentin Buck schrieb:

> In welches kommts denn?

Siehe Datenblatt.

> Und brauche ich das Bit überhaupt für das, was ich hier im Code mache?

Ja.

von Kasperle (Gast)


Lesenswert?

Wiederstand -> Widerstand

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Also ich habe das mit dem Bit-Setzen von WGM12 jetzt mal weggelassen.
Also es blinkt immer noch. Aber immer noch so langsam wie vorher.

Die Formel für die Frequenz(fout=fin/(2*TEiler*(1+OCR1n))) habe ich mal 
umgestellt und bin auf folgende Formel für OCR1n gekommen:

OCR1n = (fin/(fout*2*Teiler))-1

Also für diesen Fall:

(8000000/(10*2*64))-1 = 6249

und nicht 12500!

Aber selbst mit 6349 im OCR1A blinkt der CHip nur ca. mit 1/5Hz!
Was ist da los?

von Stefan E. (sternst)


Lesenswert?

Valentin Buck schrieb:
> Also ich habe das mit dem Bit-Setzen von WGM12 jetzt mal weggelassen.
> ...
> Aber selbst mit 6349 im OCR1A blinkt der CHip nur ca. mit 1/5Hz!
> Was ist da los?

Was glaubst du eigentlich, warum ich deine Frage zu dem Bit oben mit 
"Ja" beantwortet habe? Aus Bosheit, um dich gezielt in die Irre zu 
führen?

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Gut, mit dem WGM12 im TCCR1B funktionierts jetzt endlich.
Danke an alle.
Valentin

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.