PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kapiere _delay nicht



Jokill
12.03.2007, 18:09
Also ich hab folgendes Programm:



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


int main(void)
{
_delay_ms(10);
DDRB=0x01;


return(0);
}


Dann müsste doch eine Lampe an Port B leuchten. Macht sie aber nicht.

s.o.
12.03.2007, 18:13
Du musst PORTB die Pull ups noch setzen.

Eventuell noch eine Endlosschleife, einbauen...

Grüße

wkrug
12.03.2007, 18:13
Wie ist den deine Lampe angesteuert ?

Wenn zum leuchten eine 1 am Ausgang gebraucht wird solltest Du noch:
PORTB=0x01;
in deinen Code einfügen.

Jokill
12.03.2007, 18:45
Also es ist so, wenn ich im obrigen Code das "_delay_ms(10);" weglasse leuchtet eine Lampe auf. Ich glaub der bleibt da bei delay hängen.

Nächstes Problem: Hab es mit einer for-Schleife probiert aber die überspringt er irgendwie.
z.B


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


int main(void)
{
int i;
for(i=1;i>0;i++)
{
PORTB=0x00;
DDRB=0x01;
}



return(0);
}

Es leuchtet keine Lampe auf. Nur mit dem Schleifeninhalt schon.

s.o.
12.03.2007, 19:07
Hallo,

ist ja auch klar...

es muss heißen:
for(i=1;i<0;i++){

aber gleich besser ist:
while(1){


Grüße

Jokill
12.03.2007, 19:36
Danke für die Hilfe.
OK, Schleife funktioniert, aber delay geht immer noch net. Hab keine Ahnung was ich noch machen kann.

Mfg Jokill

s.o.
12.03.2007, 19:57
ich nehme mal an, dass du das ganze nicht so 100 Prozent genau brauchst.

Mach eine Schleife die hochzählt, innenrein NOPs (no operation). Schau am besten im Wiki, Rubrik inline assembler, da ist das beschrieben.

Achja: 10ms sind ja auch wenig, nimm mal 500ms dass du was siehst ;)

Grüße

s.o.

Reeper
12.03.2007, 20:09
ich nehme mal an, dass du das ganze nicht so 100 Prozent genau brauchst.

Mach eine Schleife die hochzählt, innenrein NOPs (no operation). Schau am besten im Wiki, Rubrik inline assembler, da ist das beschrieben.

Achja: 10ms sind ja auch wenig, nimm mal 500ms dass du was siehst ;)

Grüße

s.o.

Beachte:
The maximal possible delay is 262.14 ms / F_CPU in MHz.
Also bei 1MHz: max 262,14ms. 500ms ist zu hoch.

Jokill
13.03.2007, 18:15
Habs jetzt mal mit Schleife probiert und klappt immer noch nicht (es tritt keine Verzögerung auf):



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

int main()
{


int i;

for (i=0; i<50; i++)
{
(void) (int * volatile) &i;
}

DDRB=0x01;
return 0;
}


Ich flipp langsam aus. Kann mir vielleicht nicht einer einen funktionierenden code posten? ](*,) :-s

mfg Jokill

s.o.
13.03.2007, 19:04
wundert mich nicht. Er hängt sich oben ja schon in der Schleife auf, dann kann er auch nix ausgeben...

Jokill
13.03.2007, 19:18
Warum hängt der sich in der schleife auf. Ist ein Beispiel von https://www.roboternetz.de/wissen/index.php/Warteschleife

s.o.
13.03.2007, 20:20
Du hast recht, die hängt sich nicht auf.

Aber nur ein paar Tipps für die Proggerzukunft mit avr-gcc.

Das main-proggi sollte immer in einer endlosschleife sein.
while(1)...


int main()
{

while(1){
int i;

for (i=0; i<50; i++)
{
(void) (int * volatile) &i;
}

DDRB=0x01;
PORTB=0x01;
}
return 0;
}

Zudem musst du die Pullups(==>PortC) setzen, damit der Ausgang high wird.

Grüße

jagdfalke
13.03.2007, 20:22
ja, du wartest in der Schleife und tust garnix. erst wenn die schleife zuende ist wird dein port gesetzt.

du brauchst eher sowas


while(1) {
if(LED an) {
machs aus
} else {
machs an
}
delay
}

s.o.
13.03.2007, 20:30
Lieber jagdfalke,

ich denke er will erstmal das die Geschichte nur leuchtet^^

Prinzipell, wenn es blinken soll dann einfach so wie es mein "Vorfalke" gesagt hat...

Grüße

jagdfalke
13.03.2007, 20:31
jaja auch logik will gelernt sein :D ich ich muss grad was sagen mit meinen blöden make files :D

Jokill
13.03.2007, 20:39
Genau, dann müsste der doch zuerst in der schleife warten und dann verspätet die LEDs anmachen. Tut er aber nicht.
Warum muss ich PORTC auf High setzen, der hat doch damit nichts zu tun.

Jokill
13.03.2007, 21:01
Nach ein bischen rumprobieren hab ich nun gemerkt das die for-schleife nur einmal durchläuft und nicht beendet wird. Wie kann das sein?

jagdfalke
13.03.2007, 22:20
das widerspricht sich doch oder? 1-Mal durchlaufen und nicht beendet werden? Geht nicht, außer so:


for(int i=0; i<10; i++) {
//CODE IN DER FOR-SCHLEIFE
while(1) {

}
}

Jokill
14.03.2007, 16:29
Weiß ich auch nicht. Zumindest führt er die Anweisungen nach der Schleife nicht aus.
Muss ich beim hochladen irgendetwas beachten. Hab mir nämlich das Blinkbeispiel von https://www.roboternetz.de/wissen/index.php/HEX_Beispiel-Dateien_für_AVR geholt. Und da leuchtet nur eine Lampe und es müsste eigentlich blinken.
Hab ein STK500 mit einem Atmega8515. Kann man da was rumschalten?

jagdfalke
14.03.2007, 16:55
poste mal deinen code, bin zwar auch kein C-Spezialist hab aber durch Java gelernt, dass es meist nur an Kleinigkeiten hängt. Also her mit dem Code.

SprinterSB
14.03.2007, 18:15
Hab mir nämlich das Blinkbeispiel von https://www.roboternetz.de/wissen/index.php/HEX_Beispiel-Dateien_für_AVR geholt. Und da leuchtet nur eine Lampe und es müsste eigentlich blinken.
Hab ein STK500 mit einem Atmega8515. Kann man da was rumschalten?

Den Code für den ATmega8515 habe ich nicht getestet, weil ich diesen µC nicht habe. Allerdings sollte er funktionieren.

Wenn dieser Code nicht geht: Bist du sicher, daß der Progger nicht zB an der RESET-Leitung zieht, daß die Versorge hoch genug ist und der Taktgeber funktioniert/richtig anschwingt?

Bist du ebenso sicher, daß dein Code auch für einen ATmega8515 erzeugt wird?

Mit folgendem Code muss ein Blinken sichtbar sein, ansonsten stimmt was mit deiner Hardware/Build-Umgebung nicht


#include <avr/io.h>

int main()
{
// Blinke an PortB0
DDRB |= (1 << 0);

while (0==0)
{
uint32_t i;

for (i=0; i < 1000000; i++)
{
asm volatile (" ");
}

PORTB ^= (1 << 0);
}
}

Jokill
14.03.2007, 22:21
Hallo, Code hat nicht funktioniert.
Also Spannung ist hoch genug(12V). Wie seh ich wie der Progger verbunden ist?
Schwingquarz hab ich im STK500 keinen drin, Controller kann doch selbst Takt generieren.

Mfg Jokill

vklaffehn
14.03.2007, 23:07
Compiliert er den Code denn richtig? Evtl. ist beim Comipler die Optimierung aus und der Code wird zu groß?

SprinterSB
15.03.2007, 09:38
Kann eigentlich nicht sein, selbt nichtoptimiert ist der Code nicht sooo groß (etwa vergleichbar mit BASCOM-Code).

Zudem geht auch das vorcompilierte hex-Beispiel nicht.

Weil das Programmieren des µC offenbar funktioniert, ist vielleicht der µC gefrittet oder die LED geht nicht, ist nicht an Port B0 angeschlossen oder sonst was.

Unten hab ich das Beispiel von oben übersetzt für den ATmega8515.

Wenn das nicht geht liegt es definitiv an deiner Hardware.

Jokill
15.03.2007, 19:18
Mit dem Code funktionierts auch nicht. Hab mir bei AVR Studio ein neues Projekt gemacht und die hex-Datei hinzugefügt. Wenn ich nun flashen will kommt folgender Fehler (Frequenz ist aber richtig eingestellt):

Jokill
15.03.2007, 19:21
Und noch was: Beim Register "Fuses" ist beim Kästchen "Serial program downloading (SPI) enabled; [SPIEN=0]" ein Fragezeichen.

Jokill
16.03.2007, 15:10
So, hab jetzt alles mögliche rumgestellt, aber jetzt gehts =D>
Danke für die Hilfe.