PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mutmaßlicher absturz nach _delay_ms



Stein
05.05.2007, 16:01
Hallo, ich habe es mit gcc-avr und libc-avr noch nicht geschafft eine Zeit zur warten, der controller scheint mir aubzustürzen.


//Alle Lampen an
cli(PORTB,1);
cli(PORTB,2);
cli(PORTB,3);
_delay_ms(1);
//ein aus..
cli(PORTB,3);


Die lampe geht aber nicht aus.

F_CPU ist definiert..
hat jemand ahnung?[/code]

CowZ
05.05.2007, 18:31
Hi,
kenne den Befehl cli zwar gerade nicht,

aber wie möchtest du mit dem Befehl cli(PORTB, 3) die Lampe gleichzeitig an und auch wieder ausschalten?

edit: ist cli nicht eigentlich der Befehl um die Interrupts auszuschalten?
was du brauchst ist vllt sowas:


PORTB |= (1<<3);
_delay_ms(1);
PORTB &= ~(1<<3);


Gruß, CowZ[/code]

Stein
06.05.2007, 08:18
Ja, ich habe den Code wohl etwas unüberlegt ins forum gestellt. mit sbi mach ich die Lampe wieder asu. Wenn ich den delay weglasse geht sie auch aus.

sbi und cbi sind makros die genauso wie du meintest einzelne bits eines Registers (und jeder anderen Variable) an, bzw. ausstellen kann.


PORTB |= (1<<3);
_delay_ms(1);
PORTB &= ~(1<<3);

ja, aber genau dass ist mein Problem. Sogar mir _delay_ms(0); führt er nachher keine Befehle mehr aus.

izaseba
06.05.2007, 11:33
woran erkennst Du, daß die LED nicht ausgeht, wie sieht das ganze Programm aus ?
ist es eine Endlosschleife, um blik,blink zu machen, oder was ?
Wenn ja, sollte hinter PORTB &= ~(1<<3); noch ein _delay_ms hin, sonst erkennst Du nicht, wenn die LED aus ist, bau da noch eine for schleife ein, um aus 1 ms sagen wir mal 200 zu machen, damit man noch was erkennen kann.
welche Optimierung hast Du eingeschaltet ?
Bei _delay_ms sollte man schon -Os nehmen

Gruß Sebastian

Stein
26.05.2007, 09:39
Hallo,
Ja, das progamm soll ersteinmal nur blinken, da ich sonst noch nichts mit dem gcc hingekiegt habe. Hier ist das Programm, es zweigt immer die LEDs 0 und 2 an und led1 aus. (Das habe ich mit allen optimierungs optionen ausprobiert(auch wenn ich mit schon gedacht habe das es mit -O3 nicht besser klappt als mit -O2))



#define __AVR_ATmega8__
#define F_CPU 4000000UL // 4MHz

#include <avr/io.h>
#include <compat/deprecated.h>
#include <inttypes.h>
#include <util/delay.h>


unsigned char c,d,e;

main(){
char in;
outp(DDRB , 0x07); /* PortB als Ausgang 0000 0111*/
outp(DDRD, 0xF3); /* eingang 1111 0011*/
outp(PORTD, 0x0c); /* pull-up ein 0000 1100*/

sbi(PORTB,1);

while(1) {
/* on */
cbi (PORTB,0);

/* wait a short time */
for(c=0;c<=100;c++)
_delay_ms(2.2);

sbi (PORTB,1);
/* wait a short time */
for(c=0;c<=100;c++)
_delay_ms(2.2);


}
}

Gruß stein

izaseba
26.05.2007, 11:54
<compat/deprecated.h>

Ich hoffe, Dir ist klar, was deprecated heißt, da haben sich die Entwickler was bei gedacht.


_delay_ms(2.2);
Ohne nachgeguckt zu haben, erwartet _delay_ms nicht long als Argument ? :-k
Da ich eh mein STK500 neben mir liegen habe, hab ich folgendes ausprobiert:



#define F_CPU 1000000L
#include <avr/io.h>
#include<util/delay.h>

int main(void) {

uint8_t a;
DDRC = (1<<PC0);
PORTC |=(1<<PC0);
while(1) {
for(a=0;a<200;a++)
_delay_ms(2);
PORTC &=~(1<<PC0);
for(a=0;a<200;a++)
_delay_ms(2);
PORTC |=(1<<PC0);
}
return 0;
}
Blinkt wie verrückt mit Optimierung -Os

Gruß Sebastian