- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 6 von 6

Thema: mutmaßlicher absturz nach _delay_ms

  1. #1

    mutmaßlicher absturz nach _delay_ms

    Anzeige

    Praxistest und DIY Projekte
    Hallo, ich habe es mit gcc-avr und libc-avr noch nicht geschafft eine Zeit zur warten, der controller scheint mir aubzustürzen.
    Code:
    //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]

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    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:
    Code:
    PORTB |= (1<<3);
    _delay_ms(1);
    PORTB &= ~(1<<3);
    Gruß, CowZ[/code]

  3. #3
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    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))

    Code:
    #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

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    <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 ?
    Da ich eh mein STK500 neben mir liegen habe, hab ich folgendes ausprobiert:
    Code:
    #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
    Software is like s e x: its better when its free.
    Linus Torvald

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress