mikrocontroller.net

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


Autor: SoundsO (Gast)
Datum:

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

}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ueblichen Verdächtigen:

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

Autor: SoundsO (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du benutzt WinAVR?
Dann solltest du statt ISR lieber SIGNAL benutzen...

Autor: Der Thomas (soundso)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

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.