Forum: Compiler & IDEs delay funktioniert einfach nicht


von tommi (Gast)


Lesenswert?

hi,
also ich habe heute mit gaaaanz einfachen schaltungen die delay_ms(x); 
funktion getestet.... also mit ner led blinkschaltung :P

ich habe einen atmel attiny 13 mit 20mhz fmax....
also mein code sieht so aus...

#include <avr/io.h>
#include <util/delay.h> // nicht
#include <avr/delay.h> //nicht util und avr im selben code, sondern habe 
das 2mal probiert..
#define F_CPU 20000000UL //hier habe ich fmax angegeben... stimmt das?ja 
oder?


void main(void)
{
DDRB = 0xff;
int i;
while(1);
{
PORTB = 0x01;
for(i = 0;i<84;i++)
{
_delay_ms(12);
}
PORTB = 0x02;
for(i=0;i<84;i++)//für ca. ne sekunde pro led
{
_delay_ms(12);
}

}

}

also wenn ich dass so anhänge, passiert entweder gar nichts, oder ein 
led leuchtet durchgehend und das andere gar nicht,

hab ich irgendwo einen fehler? hoffentlich könnt ihr mir 
weiterhelfen....


mfg

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> #define F_CPU 20000000UL //hier habe ich fmax angegeben... stimmt das?
Da solltest du die tatsächlich verwendetete Taktfrequenz angeben.
Welchen Oszillator verwendest du?

von Johannes M. (johnny-m)


Lesenswert?

tommi wrote:
> #define F_CPU 20000000UL //hier habe ich fmax angegeben... stimmt das?ja
> oder?
Ob das stimmt, kannst nur Du selber sagen, weil hier im Forum niemand 
außer Dir weiß, ob Du tatsächlich einen 20 MHz-Quarz dranhängen hast. 
Wenn nicht, dann solltest Du entweder tatsächlich einen solchen 
dranhängen und die Fusebits entsprechend setzen oder aber 
(wahrscheinlich am sinnvollsten) im Programm die Frequenz angeben, mit 
der der µC auch wirklich läuft!

BTW:
Wenn Du mal so ungefähr 20 Sekunden wartest, müsste sich nach meiner 
Vermutung etwas ändern...

von holger (Gast)


Lesenswert?

while(1); //hier bleibt er stehen!

Das ";" muß weg.

von PillePalle (Gast)


Lesenswert?

Das #define muss vor das #include :P
sonst weiß delay.h nicht welche Taktfrequenz

von Johannes M. (johnny-m)


Lesenswert?

holger wrote:
> while(1); //hier bleibt er stehen!
>
> Das ";" muß weg.
Das ist goldrichtig!

PillePalle wrote:
> Das #define muss vor das #include :P
> sonst weiß delay.h nicht welche Taktfrequenz
Das auch!

von tommi (Gast)


Lesenswert?

okay, daweil habt ihr mir sehr geholfen, und ich bin auch draufgekommen 
dass ich nicht mit 20mhz arbeite.....
also das problem ist, dass ich derzeit gar nicht mit einem 
quarzosszilator arbeite sondern den prozessor nur via franzis lehrpaket 
µc isp programmierung programmiere und dann mit steckbrett und drähte 
die leds anschließe, wie kann ich nun am besten die frequenz rausfinden, 
außer mit nem oszilloskop...?
also mit dem programm....
ahja ich bin via rs232 schnittstelle verbunden....

mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Zwei Wege:

1/ Studieren
Handbuch lesen, Schaltung betrachten, Fuses auslesen und mit Datenblatt 
vergleichen. Du kannst auch probieren, welche Baudraten funktionieren 
und  dann in dem Datenblatt unter UART nachsehen, bei welchen 
Einstellungen des Baudratenregisters der AVR dann laufen muss.

2/ Probieren
Annehmen dass der AVR mit 10 MHz läuft. Dann ein 1 Hz Blinken 
programmieren. Wenn es dann 10x langsamer blinkt, läuft der AVR statt 
mit 10 MHz mit 1 MHt. Die 10 MHz/1 MHz sollte man noch gut von Hand 
stoppen können. Du kannst auch eine andere Frequenz als 10 MHz 
probieren.

von tommi (Gast)


Lesenswert?

hi, okay ich habs jetzt einfach ausprobiert, also naja mehr oder 
weniger...
ich hab einfach die frequenz die ich hatte durch die vorige 
"periodendauer" diviert und mit der frequenz funktioniert es :) danke 
auf jedenfall...

eine frage hätt ich jedoch noch...

das passt hier in den thread vl. nicht ganz rein, aber wie kann ich so 
ein LED display ansteuern, also ich hab mir das datenblatt mal genau 
angesehn, aber werd da irgendwie nicht schlauer....

es wäre dieses:
VISHAY - TDSL3150 - LED DISPLAY

also ich sehe wo der eingang pro segment ist, jedoch nicht wo gnd oder 
vcc wäre...

also vl. weiß jemand was...


danke schon mal :)

mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

tommi wrote:

> VISHAY - TDSL3150 - LED DISPLAY
>
> also ich sehe wo der eingang pro segment ist, jedoch nicht wo gnd oder
> vcc wäre...

Das hat kein Vcc und kein GND in dem Sinn. Schau dir mal den Artikel 
AVR-Tutorial: 7-Segment-Anzeige an. Das TDSL3150 hat Common Anode 
(gemeinsame Anode).

Datenblatt (Pinbelegung s. Seite 4 oben)
http://sigma.octopart.com/24701/datasheet/Vishay-TDSL3150.pdf

von Karl H. (kbuchegg)


Lesenswert?

Sowas findest du immer im Datenblatt

http://download.siliconexpert.com/pdfs/2008/07/31/semi_ap/2/vsh/led%20displays/83122.pdf

> also ich sehe wo der eingang pro segment ist, jedoch nicht wo gnd oder
> vcc wäre...

Auf Seite 4 ist die Pinbelegung.
Pin 3 bzw. 8 sind A, also die gemeinsame Anode

von B e r n d W. (smiley46)


Lesenswert?

Datenblatt des TDSL3150 lesen. Die gemeinsame Anode (Pin 3 und Pin 8) 
auf Plus. Die 8 Kathoden (einzelne Segmente) über z.B. 470 Ohm jeweils 
auf einen Prozessor Port. Gibt die CPU Das Signal Null auf einen 
Ausgang, dann leuchtet dieses eine Display Segment. Leider hat der 
ATtiny13 zu wenig Leitungen, um alle Segmente einzeln anzusteuern.

Eventuell solltest Du einen ATtiny 44 verwenden. Ansonsten ist ein 
Schieberegister wie z.B. 74HC595 notwendig oder ein Displaytreiber mit 
seriellem Eingang.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.