mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 Interrupts


Autor: Egsler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Versuche mich gerade an Interrupts in C an einem Atmel Atmega8 und 
ich bekomme das nicht auf die Reihe!!


Ich möchte nach einer gewissen Zeit das sich das Interrupt von alleine 
auslöst! Mein code wird in WIN AVR als Falsch angezeigt was könnte es 
sein?


# define F_CPU 1000000L        // 1MHz CPU clock

# include <util/delay.h>        // Bibliotheken
# include <avr/io.h>

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

int main (void)          // Hauptteil

{
  DDRB  |= 0xff;
  PORTB |= 0xff;
  DDRC  |= 0xff;
  PORTC |= 0xff;
  DDRD  |= 0xff;
  PORTD |= 0xff;



  while (1)          // Endlosschleife
  {



PORTC =0x00;
_delay_ms (200);  //PORT C Beginn des Lauflichts


PORTC &= ~_BV (PC0) ;  // Port C0 an 100ms warten
_delay_ms (100) ;
PORTC |= _BV (PC0) ;      // PORT C0 aus 100 ms warten
PORTC &= ~_BV (PC1) ;  // PORT PC1 an 100 ms warten
_delay_ms (100) ;
PORTC |= _BV (PC1) ;      // PORT PC1 aus 100ms warten
PORTC &= ~_BV (PC2) ;  // PORT PC2 an 100 ms warten
_delay_ms (100) ;
PORTC |= _BV (PC2) ;      // // PORT PC2 aus 100ms warten
PORTC &= ~_BV (PC3) ;  // PORT PC3 an 100ms warten
_delay_ms (100) ;
PORTC |= _BV (PC3) ;      // // PORT PC3 aus 100ms warten
PORTC &= ~_BV (PC4) ;  // PORT PC4 an 100ms warten
_delay_ms (100) ;
PORTC |= _BV (PC4) ;      // // PORT PC4 aus 100ms warten
PORTC &= ~_BV (PC5) ;  // PORT PC5 an 100ms warten
_delay_ms (100) ;
PORTC |= _BV (PC5) ;      // // PORT PC5 aus 100ms warten
PORTC &= ~_BV (PC6) ;  // PORT PC6 an 100ms warten
_delay_ms (100) ;
PORTC |= _BV (PC6) ;      // PORT PC6 aus 100ms warten


PORTB =0x00;
_delay_ms (200); // PORTB Beginn des Lauflichts

PORTB &= ~_BV (PB0) ;  // PORT PB0 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB0) ;      // PORT PB0 aus 100ms warten
PORTB &= ~_BV (PB1) ;  // PORT PB1 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB1) ;      // PORT PB1 aus 100ms warten
PORTB &= ~_BV (PB2) ;  // PORT PB2 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB2) ;      // PORT PB2 aus 100ms warten
PORTB &= ~_BV (PB3) ;  // PORT PB3 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB3) ;      // PORT PB3 aus 100ms warten
PORTB &= ~_BV (PB4) ;  // PORT PB4 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB4) ;      // PORT PB4 aus 100ms warten
PORTB &= ~_BV (PB5) ;  // PORT PB5 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB5) ;      // PORT PB5 aus 100ms warten
PORTB &= ~_BV (PB6) ;  // PORT PB6 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB6) ;      // PORT PB6 aus 100ms warten
PORTB &= ~_BV (PB7) ;  // PORT PB7 an 100ms warten
_delay_ms (100) ;
PORTB |= _BV (PB7) ;       // PORT PB7 aus

PORTD =0x00;
_delay_ms (200);          // PORT D Beginn des Lauflichts

PORTD &= ~_BV (PD0) ;  // PORT PD0 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD0) ;      // PORT PD0 aus 100ms warten
PORTD &= ~_BV (PD1) ;  // PORT PD1 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD1) ;      // PORT PD1 aus 100ms warten
PORTD &= ~_BV (PD2) ;  // PORT PD2 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD2) ;      // PORT PD2 aus 100ms warten
PORTD &= ~_BV (PD3) ;  // PORT PD3 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD3) ;      // PORT PD3 aus 100ms warten
PORTD &= ~_BV (PD4) ;  // PORT PD4 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD4) ;      // PORT PD4 aus 100ms warten
PORTD &= ~_BV (PD5) ;  // PORT PD5 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD5) ;      // PORT PD5 aus 100ms warten
PORTD &= ~_BV (PD6) ;  // PORT PD6 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD6) ;      // PORT PD6 aus 100ms warten
PORTD &= ~_BV (PD7) ;  // PORT PD7 an 100ms warten
_delay_ms (100) ;
PORTD |= _BV (PD7) ;       // PORT PD7 aus




// globale Variablen

volatile uint8_t flag;

int main() {

// IO konfigurieren

    DDRB = 0xFF;
    DDRC = 0xFF;
    DDRD = 0xFF;

// Timer2 konfigurieren

    TCCR2  = 6;                     // Vorteiler 256 -> ~65ms 
Überlaufperiode
    TIMSK |= (1<<TOIE2);            // Timer Overflow Interrupt 
freischalten

// Interrupts freigeben

    sei();

// Endlose Hauptschleife

    while(1) {
        if (flag == 1) { // Neuer Timerzyklus ?
            flag = 0;

            // hier steht jetzt in Normalfall ein grosser Programmblock 
;-)
            PORTD ^= (1 << PD5);    // LED toggeln
        }
    }
}



ISR( TIMER2_OVF_vect ) {
    flag = 1;
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Egsler wrote:
> Mein code wird in WIN AVR als Falsch angezeigt was könnte es
> sein?
Genauer geht's nicht?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was schon mal definitiv falsch ist, ist die Tatsache, dass es in 
Deinem Programm zwei Funktionen mit dem Namen main() gibt, wobei die 
eine sogar innerhalb der anderen definiert ist!

Außerdem solltest auch Du die Formatierungsoptionen diese Forums für 
C-Code nutzen!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Egsler (Gast)

>Hi Versuche mich gerade an Interrupts in C an einem Atmel Atmega8 und

Vielleicht versuchst du erstmal die Forenregeln zu lesen, um 
festzustellen, dass lange Quelltexte ind den Anhang gehören. Auch nicht 
falsch Netiquette.

>Ich möchte nach einer gewissen Zeit das sich das Interrupt von alleine
>auslöst!

Ist ein Timer, dann lies mal was zum Thema Interrupt.

MFG
Falk

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.