corone
14.04.2007, 18:51
Hallo ale miteinander. Seit gestern nachmittag versuche ich verzweifelt auf meinem RN-Control ein kleines Programm zum Laufen zu bringen. Es soll in der Hauptschleife die LED am PortC.4 blinken lassen (tut es auch) und wenn ich den Interrupt 0 auslöse die LED am PortC.0 blinken lassen (tut es nicht).
Ich habe jetzt viele Stunden dieses und etliche andere Foren gewälzt, Tutorials, Datenblätter und Google gequält, aber ich finde die Lösung einfach nicht... Könnt ihr bitte mal kurz in meinen Code schauen und mir sagen, wo der Fehler liegt?
Quellcode:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
int main(void)
{
/*###Initialisierungsphase###*/
//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
DDRC |= 0x11; //10001000 -> PORTC.4 ist blinkende LED im Hauptprogramm, PORTC.0 ist Anzeige des Interrupts
DDRD |= 0x00; //00000000 -> PORTD.2 ist Interrupt0 (Der ausgelöst werden soll)
//Variablen
uint8_t counter;
//Interrupts initialisieren - ist der Kram hier richtig?
MCUCR = ~(1<<ISC01);
MCUCR = (1<<ISC00);
GICR = (1<<INT0);
sei();
//Interruptroutine, die ausgelöst werden soll - aber nicht wird
ISR(INT0_vect)
{
for(uint8_t i=0; i<5; i++)
{
PORTC |= (1<<0);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
PORTC &= ~(1<<0);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
}
}
while(1)
{
PORTC |= (1<<4);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
PORTC &= ~(1<<4);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
{
}
}
return 1;
}
Compilerausgabe:
> "make.exe" all
-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Size before:
interrupts.elf :
section size addr
.text 228 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 1980 0
.stabstr 1866 0
Total 4074
Converting to AVR Extended COFF: interrupts.cof
avr-objcopy --debugging --change-section-address .data-0x800000 --change-section-address .bss-0x800000 --change-section-address .noinit-0x800000 --change-section-address .eeprom-0x810000 -O coff-ext-avr interrupts.elf interrupts.cof
Warning: file C:/DOCUME~1/EWEDDI~1/LOCALS~1/Temp/cc0Eeaaa.s not found in symbol table, ignoring
Warning: ignoring function __vectors() outside any compilation unit
Warning: ignoring function __bad_interrupt() outside any compilation unit
Size after:
interrupts.elf :
section size addr
.text 228 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 1980 0
.stabstr 1866 0
Total 4074
Errors: none
-------- end --------
> Process Exit Code: 0
> Time Taken: 00:01
Ich weiß, dass sich dieser Effekt über Timer oder sonstwas viel einfacher erreichen ließe, aber ich will verstehen, wie ich externe Interrupts auslöse. Bin für jede Hilfe sehr dankbar!
Gruß
Corone
Ich habe jetzt viele Stunden dieses und etliche andere Foren gewälzt, Tutorials, Datenblätter und Google gequält, aber ich finde die Lösung einfach nicht... Könnt ihr bitte mal kurz in meinen Code schauen und mir sagen, wo der Fehler liegt?
Quellcode:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
int main(void)
{
/*###Initialisierungsphase###*/
//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
DDRC |= 0x11; //10001000 -> PORTC.4 ist blinkende LED im Hauptprogramm, PORTC.0 ist Anzeige des Interrupts
DDRD |= 0x00; //00000000 -> PORTD.2 ist Interrupt0 (Der ausgelöst werden soll)
//Variablen
uint8_t counter;
//Interrupts initialisieren - ist der Kram hier richtig?
MCUCR = ~(1<<ISC01);
MCUCR = (1<<ISC00);
GICR = (1<<INT0);
sei();
//Interruptroutine, die ausgelöst werden soll - aber nicht wird
ISR(INT0_vect)
{
for(uint8_t i=0; i<5; i++)
{
PORTC |= (1<<0);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
PORTC &= ~(1<<0);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
}
}
while(1)
{
PORTC |= (1<<4);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
PORTC &= ~(1<<4);
//wait 16*65536
counter = 0;
while(counter < 16)
{
counter++;
_delay_loop_2(65535);
}
{
}
}
return 1;
}
Compilerausgabe:
> "make.exe" all
-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Size before:
interrupts.elf :
section size addr
.text 228 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 1980 0
.stabstr 1866 0
Total 4074
Converting to AVR Extended COFF: interrupts.cof
avr-objcopy --debugging --change-section-address .data-0x800000 --change-section-address .bss-0x800000 --change-section-address .noinit-0x800000 --change-section-address .eeprom-0x810000 -O coff-ext-avr interrupts.elf interrupts.cof
Warning: file C:/DOCUME~1/EWEDDI~1/LOCALS~1/Temp/cc0Eeaaa.s not found in symbol table, ignoring
Warning: ignoring function __vectors() outside any compilation unit
Warning: ignoring function __bad_interrupt() outside any compilation unit
Size after:
interrupts.elf :
section size addr
.text 228 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 1980 0
.stabstr 1866 0
Total 4074
Errors: none
-------- end --------
> Process Exit Code: 0
> Time Taken: 00:01
Ich weiß, dass sich dieser Effekt über Timer oder sonstwas viel einfacher erreichen ließe, aber ich will verstehen, wie ich externe Interrupts auslöse. Bin für jede Hilfe sehr dankbar!
Gruß
Corone