Einfaches Beispiel für 8-Bit Counter mit AtMega32 und WinAV

Gast #281214
Lesenswert?
• ▲
▼
Hilfe! Ich versuche ein ganz einfaches Beispiel zur Nutzung von Countern
zu machen. Das Programm soll den Zählerstand auf LED's am Port B
ausgeben, aber er bleibt konstant beim Initialisierungswert!

#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdio.h>

// Counter Wert
unsigned int Counter = 0xAA;

// Timer 0 overflow ISR
ISR(SIG_OUTPUT_COMPARE0)
{
  Counter++;
}

void main(void)
{
// Port B
PORTB=0x00;
DDRB=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Output Compare
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0xFF;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x03;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// Global enable interrupts
sei();

while (1)
{
  PORTB=Counter;
};

}
Gast #281216
Lesenswert?
• ▲
▼
Vielen Dank. "volatile" sorgt dafür, das der Wert im Register der CPU
bleibt, oder?! Allerdings funktioniert es immer noch nicht. Es scheint
so als ob der Zähler zählt, aber der Interrupt nicht auslößt.
Was kann es da für Fehler geben? Vieleicht außer dem Programmcode, Fuse
Bits, Makefile?! Hab nen Makefile mit MFile für ATMega32 / 16MHz
generiert und die Fuse Bits alle 1 außer die beiden BOOTSZ-Flags.
#281218
Lesenswert?
• ▲
▼
Yippee! Es funktioniert! Mit Signal hat es auch nicht funktioniert. Habe
dann nochmal in die avr-libc Dokumentation geschaut und da stand das man
fpr sei() und cli() die interrupt.h braucht, die ja schon eingebunden
war. Für Interrupts aber das Makro INTERRUPT(SIGNALVECTOR) aus der
signal.h benutzt werden soll. Hab die dann noch zusätzlich eingebunden
und aus ISR(SIGNALVECTOR) umbenannt. Danke für die Tipps!

So klappt es:

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdio.h>

// Counter Wert
volatile unsigned int Counter = 0xAA;

// Timer 0 overflow ISR
INTERRUPT(SIG_OUTPUT_COMPARE0)
{
  Counter++;
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.