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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren