Guten Tag,
ich habe mit meinem mini-Programm ein Problem.
Jedes mal nach dem Neustarten oder Reseten des Kontrollers wird die Interrupt-Funktion ausgeführt und erst dann das Hauptprogramm.
Nun habe ich schon gelesen ,dass man in Assembler die erste Speicheradresse überspringen muss, um das zu unterbinden.
Aber ich finde nichts ,wie ich sowas in "C" machen kann.
Kann mir vlt. jemand helfen?
Vielen Dank!
Code:
/*
* Ampel.c
*
* Created: 07.08.2013 10:36:06
* Author: en
*/
#define F_CPU 1600000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// eigene Bezeichnungen
#define rot PC0
#define gelb PC1
#define gruen PC2
#define ein 1
#define aus 0
//volatile unsigned char _taster=1;
ISR (INT1_vect)
{
_delay_ms(80);
PORTC |= (1 << PC4);
_delay_ms(1000);
PORTC &=~(1<<PC4);
}
void rot_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << rot);} // Setzen
else {PORTC &= ~(1 << rot);} // Rücksetzen
//_delay_ms(1000);
};
void gelb_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << gelb);} // Setzen
else {PORTC &= ~(1 << gelb);} // Rücksetzen
//_delay_ms(1000);
};
void gruen_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << gruen);} // Setzen
else {PORTC &= ~(1 << gruen);} // Rücksetzen
//_delay_ms(1000);
};
int main(void)
{ cli();
GICR |= (1 << INT1);
MCUCR |= (1 << ISC11);
//PORT A als Ausgang
PORTC = 0x00;
DDRA = 0xFF;
//PORT C als Ausgang
PORTC = 0x00;
DDRC = 0xFF;
//PORT D als Eingang
DDRD = 1<<PD3;
PORTD = 1<<PD3;
SREG |= (1<<7);
while(1)
{
rot_schalten(ein);
_delay_ms(1000);
gelb_schalten(ein);
_delay_ms(600);
rot_schalten(aus);
gelb_schalten(aus);
gruen_schalten(ein);
_delay_ms(1000);
gruen_schalten(aus);
gelb_schalten(ein);
_delay_ms(600);
gelb_schalten(aus);
}
}
Lesezeichen