www.mikrocontroller.net

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


Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr\io.h>
#include <avr\interrupt.h>


volatile int counter = 0;
volatile int set = 0;

ISR (TIMER1_COMPA_vect){
counter++;
if(counter == 3){
counter=0;
if(set==0){
  set=1;}
if(set==1){
  set=0;}
}

}

void init(){
DDRC = 0b00011111;
TCNT1 = 0;
OCR1A = 12500;
TCCR1A = (1<<WGM12);
TIMSK = (1<<OCIE1A);
TCCR1B = (1<<CS11) | (1<<CS10);
set = 0;
sei();
}


int main(void){
init();
  while(1){
  if (set==0){
  PORTC = 0b00011111;}
  if (set==1){
  PORTC = 0b00000000;}
  }
}
Könnt ihr mit vielleicht helfen?
mit freundlichen Grüßen,
Valentin

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Valentin Buck schrieb:

> 1.Die LED an PORTB5 leuchtet nicht.

Warum sollte sie?

> 2.Die LEDs blinken nicht.

set ist immer 0.

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiederstand -> Widerstand

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, mit dem WGM12 im TCCR1B funktionierts jetzt endlich.
Danke an alle.
Valentin

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.