Forum: Mikrocontroller und Digitale Elektronik Einfaches Beispiel für 8-Bit Counter mit AtMega32 und WinAV


von SoundsO (Gast)


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;
};

}

von Karl H. (kbuchegg)


Lesenswert?

Die ueblichen Verdächtigen:

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

von SoundsO (Gast)


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.

von Rahul (Gast)


Lesenswert?

Du benutzt WinAVR?
Dann solltest du statt ISR lieber SIGNAL benutzen...

von Der T. (soundso)


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++;
}

von Rahul (Gast)


Lesenswert?

Kleine Anmerkung noch:
SIGNAL schaltet im Gegensatz zu INTERRUPT die anderen Interrupts
während der ISR ab, kann also von einem anderen Interrupt nicht gestört
werden.

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.